Как НЕ городить код в шаблоне?

Главные вкладки

Аватар пользователя Shipovnix Shipovnix 23 августа 2018 в 12:34

Друпал-мастера не рекомендуют пихать код в шаблон. В связи с этим имею вопрос: где и как можно писать код под следующую логику:
В дисплее ноды (full) сразу под body необходимо разместить несколько кнопок (субмитить их не надо, обработка js по onclick), при этом необходимо выполнить проверки значений некоторых полей ноды, ролей юзера и т.п., это влияет на количество и состав отображаемых кнопок.
В принципе, всё указанное уже работает в page--nodetype.tpl.php вполне нормально, но, судя по разного рода мнениям, это неправильный путь.

Комментарии

Аватар пользователя VasyOK VasyOK 23 августа 2018 в 12:54
1

Забейте на мнения. Вы для себя сайт делаете или для кого-то? Этот кто-то вам альтернтаивный путь может объяснить?

По делу. Несколько кнопок можно поместить в блок. А в блоке уже код нагородить. Использовать PHP фильтр - точно не правильно. Зато без генерации кода в шаблоне.

Аватар пользователя Shipovnix Shipovnix 23 августа 2018 в 13:04

VasyOK wrote:

Этот кто-то вам альтернтаивный путь может объяснить?

За этим и обратился.

VasyOK wrote:

По делу. Несколько кнопок можно поместить в блок. А в блоке уже код нагородить. Использовать PHP фильтр - точно не правильно.

А как же тогда городить код в блоке, не используя PHP?

Аватар пользователя bumble bumble 23 августа 2018 в 14:00
1

Shipovnix wrote:

не рекомендуют пихать код в шаблон

Не код, а логику.

Shipovnix wrote:

субмитить их не надо, обработка js по onclick

Есть смысл JS'ом и строить, если они только ради этого.

Shipovnix wrote:

необходимо выполнить проверки значений некоторых полей ноды, ролей юзера и т.п., это влияет на количество и состав отображаемых кнопок

Есть разные возможности вывода необходимых данных на страницу - от передачи настроек, до установки аттрибутов.

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

Аватар пользователя charOFF charOFF 23 августа 2018 в 16:31
1

Чтобы выносить код из шаблонов можно использовать препроцесс функции в template.php
https://api.drupal.org/api/drupal/modules%21node%21node.module/function/...

Например в вашем случае что-то вроде

function MY_THEME_NAME_preprocess_node(&$variables) {
  // здесь ваша логика, формируем HTML
  // и дальше добавляем его после body
  $variables['content']['body']['#suffix'] = '<div>Какой-то результирующий HMTL</div>';
}
Аватар пользователя bumble bumble 23 августа 2018 в 16:44
1

Вот не нужно так делать!
Код (HTML) должен быть в шаблонах.
В препроцессоре можно сделать проверку на, например, необходимость вывода этого суффикса.

В целом, "шаблоны" это же не просто слово - там должно находится все что можно использовать в качестве лекала. Все остальное, динамическое - должно приходить в качестве переменных.

Аватар пользователя vlucas vlucas 24 августа 2018 в 15:59
1

Поддерживаю. В препроцессоре должны приготавливаться переменные! А обёртывать их нужно в шаблоне

Аватар пользователя charOFF charOFF 24 августа 2018 в 17:26
1

В принципе, соглашусь. Тогда, если задача стоит разместить кнопки именно после body и при этом логика достаточно сложная, что есть смысл вынести ее из шаблона, то можно вынести ее в template_preprocess_field(), там проверять какие конкретно кнопки нужны, а HTML код кнопок уже выводить в field--body--content-type.tpl.php в зависимости от состояния кастомных переменных. Как вам такой вариант?

Или другой вариант, в препроцессоре проверять условия и формировать массив нужных кнопок в виде render arrray, а потом передавать его в шаблон и там выводить при помощи render(). Или это тоже будет не правильно?

Аватар пользователя adano adano 24 августа 2018 в 20:01

charOFF wrote:

Или другой вариант, в препроцессоре проверять условия и формировать массив нужных кнопок в виде render arrray, а потом передавать его в шаблон и там выводить при помощи render(). Или это тоже будет не правильно?

Не понимаю о каких кнопках речь. Такой подход верный.

Аватар пользователя gun_dose gun_dose 24 августа 2018 в 22:21
1

Код в шаблоне городить можно и нужно. Программисты затем и используют файлы, чтобы городить в них код. Но не всякий код одинаково полезен. Звучала мысль, что нельзя логику пихать в шаблон, это верно лишь отчасти, тут нужно уточнение: логические операторы вроде if, а также циклы foreach в шаблоне очень даже уместны. Уместны в шаблоне простые функции конкатенации, арифметические операции, функции форматирования (например round), а также всякие str_replace и прочее.

Неуместно только вот что: любые действия, нарушающие последовательность вывода по mvc-модели. Логика ведь такая: запросили данные из базы, обработали их, сформировали из них рендер-массив, передали его в шаблон, а шаблон уже должен нам отдать html-строку. То есть любая операция, которая не запрашивает данные из БД, теоретически уместна в шаблоне. Можно пойти дальше и продолжить эту цепочку, что операции, вызывающие функции темизации, также неуместны в шаблоне, но на практике этого хоть и стараются избегать, но всё же иногда используют, если речь не о друпал 8.

А именно в друпал 8 twig бьёт всех линейкой по рукам, не давая проворачивать такую дичь, там уже хочешь - не хочешь, а придётся делать по-нормальному. Хотя вроде бы всякие двоечники изобрели какие-то модули для бесчинств в твиге.

Отвечая на вопрос автора скажу вот что: эти кнопки без зазрения совести можно спокойно помещать в шаблон. А вот в шаблон ноды или поля - тут надо думать, ведь хардкодить последовательность полей в шаблоне ноды - моветон. Хотя всегда есть компромисное решение - захардкодить несколько принципиально важных полей, а остальные вывести через print render($content);

PS: всегда надо следить за тем, чтобы шаблон не раздувался. Хрестоматийный случай в моей практике: сайт делал глянец, шаблон node.tpl.php, а там if ($node->type ==.... и далее набор условий под все типы нод, в результате чего в шаблоне около 3000 строк, а если добавить новый тип ноды, то его вывод всегда пустой ?

Аватар пользователя bumble bumble 24 августа 2018 в 22:34
1

Уточню, действительно непонятно написал - под "логикой" имел ввиду "бизнес-логику" приложения (т.е. все что нужно высчитать / вычислить, связать с экстра-сущностями, получить из других источников или произвести обработку со значительными затратами процессорного времени).

Не зря ведь весь прогрессивный мир старается следовать петтернам из разряда MVC.

Но в таком монолите как Друпал очень сложно соорудить систему полностью следующей этой парадигме. Потому следуем в ближайшие заведения питейно-развлекательного характера.

С пятницей, кароч!

Аватар пользователя Andruxa Andruxa 25 августа 2018 в 0:30
1

Про логику в теме оформления уже написали много и правильно, добавлю следующее.
Следует различать логику, реализуемую в теме, и логику, реализуемую модулями.
Проще всего это сделать, мысленно представив, что на сайте есть несколько тем оформления, между которыми пользователь может переключаться: для левшей-правшей, близоруких-дальнозорких, ну и т.д.
Если логика будет одинакова для всех тем оформления, то её следует реализовывать модулем, а если нет, т.е. она относится именно к представлению данных для отдельной темы оформления - то тогда её надо реализовывать в теме.
Ибо, тема - это V в парадигме mvc, а модуль - как раз-таки C (но это не точно).