Не используйте PHP фильтр!

Аватар пользователя fairrandir

Вольный и дополненный перевод https://drupal.stackexchange.com/questions/2509/what-are-the-downsides-of-using-php-filter-code-in-blocks-nodes-views-args-et

На форуме некоторые товарищи, иногда рекомендуют для решения задачи использовать встроенный в ядро PHP фильтр, или Views PHP. Никогда так не делайте! И вот почему:

  1. Данный код пишется в базу, поэтому его нельзя будет отследить через систему контроля версий, например git. (если вы не используете систему контроля версий в разработке - это тоже плохо).
  2. Поля с php-фильтром не кэшируются.
  3. Код в php-фильтре выполняется через eval(). Код через eval работает медленнее, не кэшируется opcache-м, а на некоторых хостингах eval может быть отключен из соображений безопасности.
  4. Не информативные сообщения об ошибках. Что-то типа error in eval() on line 4. Где этот кусок кода, что с ним делать?
  5. Проблемы с обновлением модулей. Обновление модуля - и у вас куча ошибок, которые сложно найти и исправить.
  6. Сложно писать и поддерживать такой код. В обычном textfield - нет форматирования как в IDE, да и шрифт не моноширинный. Копировать туда-обратно тоже заколебаться можно.
  7. Человеческий фактор. Всегда существует возможность ошибки в конфигурации, которая позволит не доверенным пользователям заюзать php-фильтр. ОЙ!
  8. Безопасность в целом. Любой сайт могут взломать, но присутствие на сайте php-фильтра может сделать последствия взлома гораздо тяжелее. XSS, SQL-инъекция - и вот вас уже shell прямо в базе. =)
  9. Сложности деплоя. Нельзя просто обновить файлы на сервере. Надо лезть в админку, и копипастить код в нужные места. Хотя обычно в PHP-фильтр пишут прямо на продакте. Не стоит работать на продакте.
  10. Повышается цена ошибки. Одна небольшая опечатка в сквозном блоке - и всё пропало, шеф.
  11. Многие разработчики высказываются против использования php-фильтра. Например: пользователь @Stepankov в своей записи в блоге высказывался против PHP-фильтра ещё в 2013-м (!) году.

Хорошо, PHP-фильтр использовать не стоит. А что же тогда делать?

  1. Через template_preprocess хуки.
  2. Можно создать свой токен и вставлять его с помощью  token_filter
  3. Можно создавать вычисляемые поля с помощью  computed_field. Этот модуль даже сам подскажет вам, какое название функции использовать.
  4. Если используется Display Suite - можно написать своё Display Suite поле
  5. Ещё варианты, тысячи их! В зависимости от задачи.
Тип материала:
Версия Drupal:
8 Спасибо

Комментарии

Аватар пользователя bumble
bumble 4 месяца назад 1

На главной

Аватар пользователя fairrandir
fairrandir 4 месяца назад

Спасибо. Хотя на пост не тянет, скорее шпаргалка, как и куда отсылать рекомендаторов.

0 Спасибо
Аватар пользователя bumble
bumble 4 месяца назад

Норм. Будет что новичкам почитать.

0 Спасибо
Аватар пользователя Studio VIZA
Studio VIZA 4 месяца назад

Новички пока нос не разобьют, не пошевелятся.

0 Спасибо
Аватар пользователя Виктор Степаньков ака RxB
Виктор Степаньк... 4 месяца назад

Как-то черезчур похоже на копипасту моей старой статьи.
Даже обороты мои.

0 Спасибо
Аватар пользователя fairrandir
fairrandir 4 месяца назад

Забавно. А можно ссылочку?

0 Спасибо
Аватар пользователя fairrandir
fairrandir 1 месяц назад

Добавил ссылку на вопрос на SO в топик, на основе которого я и писал данный пост, + добавил ваше упоминание. Посты действительно очень схожи, но это не более, чем совпадение - соображения-то во всех случаях общие. =)

0 Спасибо
Аватар пользователя Studio VIZA
Studio VIZA 4 месяца назад
Виктор Степаньков ака RxB написал:
Как-то черезчур похоже

Свято место же.

0 Спасибо
Аватар пользователя bsyomov
bsyomov 4 месяца назад 2

У меня есть своя более короткая версия:
Есть только две причины использовать php filter - глупость и лень.
И в обоих случаях, заниматься разработкой вам не стоит.

Это сообщение находится в тёмной материи. Вы можете изменить настройки просмотра тёмной материи в личном кабинете.
Это сообщение находится в тёмной материи. Вы можете изменить настройки просмотра тёмной материи в личном кабинете.
0 Спасибо
Это сообщение находится в тёмной материи. Вы можете изменить настройки просмотра тёмной материи в личном кабинете.
0 Спасибо
Это сообщение находится в тёмной материи. Вы можете изменить настройки просмотра тёмной материи в личном кабинете.
0 Спасибо
Это сообщение находится в тёмной материи. Вы можете изменить настройки просмотра тёмной материи в личном кабинете.
0 Спасибо
Это сообщение находится в тёмной материи. Вы можете изменить настройки просмотра тёмной материи в личном кабинете.
0 Спасибо
Это сообщение находится в тёмной материи. Вы можете изменить настройки просмотра тёмной материи в личном кабинете.
0 Спасибо
Это сообщение находится в тёмной материи. Вы можете изменить настройки просмотра тёмной материи в личном кабинете.
0 Спасибо
Это сообщение находится в тёмной материи. Вы можете изменить настройки просмотра тёмной материи в личном кабинете.
0 Спасибо
Это сообщение находится в тёмной материи. Вы можете изменить настройки просмотра тёмной материи в личном кабинете.
0 Спасибо
Это сообщение находится в тёмной материи. Вы можете изменить настройки просмотра тёмной материи в личном кабинете.
0 Спасибо
Это сообщение находится в тёмной материи. Вы можете изменить настройки просмотра тёмной материи в личном кабинете.
0 Спасибо
Это сообщение находится в тёмной материи. Вы можете изменить настройки просмотра тёмной материи в личном кабинете.
0 Спасибо
Это сообщение находится в тёмной материи. Вы можете изменить настройки просмотра тёмной материи в личном кабинете.
0 Спасибо
Это сообщение находится в тёмной материи. Вы можете изменить настройки просмотра тёмной материи в личном кабинете.
0 Спасибо
Это сообщение находится в тёмной материи. Вы можете изменить настройки просмотра тёмной материи в личном кабинете.
0 Спасибо
Это сообщение находится в тёмной материи. Вы можете изменить настройки просмотра тёмной материи в личном кабинете.
0 Спасибо
Это сообщение находится в тёмной материи. Вы можете изменить настройки просмотра тёмной материи в личном кабинете.
0 Спасибо
Это сообщение находится в тёмной материи. Вы можете изменить настройки просмотра тёмной материи в личном кабинете.
0 Спасибо
Аватар пользователя xakd
xakd 4 месяца назад

"4. Не информативные сообщения об ошибках. Что-то типа error in eval() on line 4. Где этот кусок кода, что с ним делать?" - Это реально вписано в причины? Что ж это за разработчик такой тупой, что не может проверить свой код в другом месте перед тем как вставлять его? Разработчик тире идиот?
И даже если идиот - 4-ю строчку потом так сложно проверить? Куда информативнее то? Конкретная строчка указана, где ошибка.

0 Спасибо
Аватар пользователя xakd
xakd 4 месяца назад

"5. Проблемы с обновлением модулей. Обновление модуля - и у вас куча ошибок, которые сложно найти и исправить." - голословный бред же, ну что за фигня то?

0 Спасибо
Аватар пользователя fairrandir
fairrandir 4 месяца назад

Пример из жизни - обновилась мажорная версия модуля, потерялась обратная совместимость. Какие-то умельцы вставили PHP-код в панели, для встраивания Яндекс.карт на НЕКОТОРЫЕ страницы. При обновлении модуля - эти страницы больше не открываются. Вот было весело переписывать их все искать и переводить на нормальный код.

0 Спасибо
Аватар пользователя xakd
xakd 4 месяца назад

Вот бы если в computed_field они бы это написали - проблем бы не было. Ой. Или бы ли бы. Ты же советуешь этот механизм, так ведь?

0 Спасибо
Аватар пользователя gun_dose
gun_dose 4 месяца назад

В той ситуации надо было написать Ctools Custom Content Type - совершенно хрестоматийный случай их применения.

А что касается компьютэд филд, так по мне этот модуль та ещё галдэша. Лучше высчитать нужные поля в hook_entity_presave

0 Спасибо
Аватар пользователя xakd
xakd 4 месяца назад

Да кто спорит, что есть разные варианты. Только бесит, что какое то фанатье упёртое считает, что один из вариантов неправилен, потому что слишком прост( а на деле других причин тут не просматривается).
Ведь если так все просто - вписать пару строк кода в php-фильтр в виде - то что ж я за профи, мне надо написать модуль для решения элементарной задачи, а php-фильтр я не могу использовать, потому что я такой крутой.
Вот такой подход вызывает рвоту.

0 Спасибо
Это сообщение находится в тёмной материи. Вы можете изменить настройки просмотра тёмной материи в личном кабинете.
Аватар пользователя xakd
xakd 4 месяца назад
fairrandir написал:
Код в php-фильтре выполняется через eval(). Код через eval работает медленнее, не кэшируется opcache-м, а на некоторых хостингах eval может быть отключен из соображений безопасности.

fairrandir написал:
Хорошо, PHP-фильтр использовать не стоит. А что же тогда делать?

fairrandir написал:
Можно создавать вычисляемые поля с помощью  computed_field. Этот модуль даже сам подскажет вам, какое название функции использовать.

ОХРЕНЕТЬ!! А в computed_field чем исполняется код по-твоему? Святым духом? Да там eval ужасный выполняет код, аллё.
Нельзя использовать php-фильтр, потому что там ужасный eval - юзайте computed_field потому что там хороший eval? Тьфу блин, а выглядело так что ты изучил вопрос

0 Спасибо
Аватар пользователя xakd
xakd 4 месяца назад

Что упс то? Eval не видим?

0 Спасибо
Аватар пользователя fairrandir
fairrandir 4 месяца назад
<?php
if (function_exists($compute_func)) {
  
$compute_func($entity_field$entity_type$entity$field$instance$langcode$items);
}
?>

В своем модуле, определяется функция, которая называется, например, computed_field_field_rating_current_compute. В данной функции и происходит собственно вычисление, без всякого eval.

0 Спасибо
Аватар пользователя xakd
xakd 4 месяца назад

Ты дураками то всех не считай, а? А если я в php-фильтре вызову функцию из модуля, все ок? Ты тут про eval писал, так вот он

<?php    // Execute the display code.
    
$display_output NULL;
    if (
$display_in_code) {
      
$display_output $display_func($field$entity_field_item$entity_lang$langcode$entity);
    }
    else {
      eval(
$field['settings']['display_format']);
    }
?>

и вот

<?php  if (isset($settings['code'])) {
      eval(
$settings['code']);
    }
?>

То есть если я в php-фильтре вызову функцию, то все ок что ли? Что за бред?

Я вот проверил, в computed_field вызвал пару функций - user_load(1) а потом user_save - и все ок, другой теперь пароль у user#1.
Но это конечно же ерунда, можно юзать

0 Спасибо
Аватар пользователя gun_dose
gun_dose 4 месяца назад

Сегодня ты используешь пхп-фильтр, а завтра будешь сайты на хостинг по фтп закачивать.

0 Спасибо
Аватар пользователя xakd
xakd 4 месяца назад

А как надо? )

0 Спасибо
Аватар пользователя gun_dose
gun_dose 4 месяца назад

гитом конечно, а как же ещё?

0 Спасибо
Аватар пользователя Andruxa
Andruxa 4 месяца назад

magallanes или capistrano, например
ну или jenkins для тех кто знает толк

0 Спасибо
Аватар пользователя gun_dose
gun_dose 4 месяца назад

Ну оно же так или иначе в глубине души базируется на гите))

0 Спасибо
Аватар пользователя Andruxa
Andruxa 4 месяца назад

git там используется на этапе формирования-сборки того, что собираемся деплоить. Сам деплой - это уже не гит.
Выкатывать на прод командой git pull - тоже не хорошо.

0 Спасибо
Аватар пользователя gun_dose
gun_dose 4 месяца назад

Чекаут предпочтительнее?

0 Спасибо
Аватар пользователя Andruxa
Andruxa 4 месяца назад

оба хуже

0 Спасибо
Аватар пользователя jsv
jsv 4 месяца назад

Ну по ftp например.
Не подскажете, в чем проблема по ftp файлы закачивать?

0 Спасибо