Перш за все, кілька пояснень. Припустимо, у вас є html сторінка з коментарями, які ви не хочете показувати відвідувачам сайту. Як їх прибрати? Природно, це можна зробити за допомогою будь-якого текстового редактора 🙂 Але це не найкращий варіант 😉
HTML коментарі допомагають читати розмітку під час розробки, особливо якщо макет сторінки розбитий на кілька частин. Тобто відкриває тег може перебувати в одному файлі, а закриває - в іншому. У таких випадках коментар близько закриває тега може дійсно заощадити ваш час.
З іншого боку, наявність таких коментарів в розмітці хоч і трохи, але збільшує розмір сторінки, та показувати їх відвідувачам якось неправильно.
Загальна ідея
Для того, щоб якимось чином змінити сторінку нам потрібно отримати доступ до її вмісту. В PHP для цього передбачені функції управління виводу . Вони дозволяють перехопити дані, які скрипт відправляє браузеру і якимось чином їх змінити.
На практиці це означає, що перед початком виведення нам потрібно викликати функцію ob_start, і в її першому параметрі вказати ім'я функції, яка буде обробляти дані. А в кінці скрипта потрібно викликати функцію ob_end_flush, яка відправить дані браузеру.
Сам функція видалення коментарів з HTML розмітки може виглядати якось так:
function removeHtmlComments ($ html) {return preg_replace ( '/<!--(.*?)-->/', '', $ html); }Як бачите, в ній за допомогою регулярного виразу ми замінюємо HTML коментарі на порожній рядок.
Ідея, сподіваюся, зрозуміла. Переходимо до прикладів.
«Чистий» PHP
<? Php ob_start ( 'removeHtmlComments'); include 'header.php'; include 'content.php'; include 'footer.php'; ob_end_flush (); ?>Код, звичайно, буде залежати від структури вашого застосування, але загальний принцип не змінюється - створюєте буфер перед формуванням сторінки і потім очищаєте.
Yii фреймворк
Тут завдання можна вирішити кількома способами. Я приведу один з найпростіших. Додайте в масив в файлі конфігурації (main.php) два елементи:
return array (... 'onBeginRequest' => function ($ event) {return ob_start (function ($ html) {return preg_replace ( '/<!--(.*?)-->/', '', $ html) ;});}, 'onEndRequest' => function ($ event) {return ob_get_flush ();} ...);Тут використовуються вбудовані події фреймворка - onBeginRequest і onEndRequest. Перша подія відбувається на початку обробки запиту, друге - перед її завершенням.
Примітка. Якщо ви плануєте використовувати фреймворк Yii, дуже рекомендую ознайомитися з подіями більш детально .
З більшістю інших фреймворків ситуація аналогічна. Деталі реалізації, звичайно, будуть відрізнятися, але якщо ви знаєте в якій послідовності відбувається обробка запиту, то зможете легко визначити, де саме потрібно викликати ob_start і ob_get_flush.
CMS (WordPress)
Багато системи управління контентом, також як і фреймворки, надають можливість виконати потрібний код на різних етапах обробки запиту. Правда є свої нюанси.
Розглянемо як приклад WordPress. У більшості випадків для вирішення нашої задачі буде досить в файл functions.php теми додати такий код.
function removeHtmlComments ($ html) {return preg_replace ( '/<!--(.*?)-->/', '', $ html); } Function bufferStart () {ob_start ( 'removeHtmlComments'); } Function bufferEnd () {ob_end_flush (); } Add_action ( 'get_header', 'bufferStart'); add_action ( 'wp_footer', 'bufferEnd');Тут використовуються дві події get_header і wp_footer. Такий код буде працювати, але проблема в тому, що обидві події викликаються з файлів теми, яка може мати довільну структуру. Простіше кажучи, тема може не викликати ці події.
У таких випадках можна використовувати власні події. Для цього потрібно знайти відкриває і закриває теги <html>.
Перед відкриває додаємо
do_action ( 'my_theme_output_begin');після закриває -
do_action ( 'my_theme_output_end');Тепер у нас є дві події, які можна використовувати для створення і очищення буфера.
Якщо є питання або зауваження, пишіть!
Успіхів!
Як їх прибрати?Php'; ob_end_flush (); ?