Статьи

Тонкая настройка Drupal Themes с шаблонами, Arg и типами

В этой статье мы обсудим, как вы можете использовать различные функции API Drupal для достижения более детальной тематики. Мы рассмотрим предварительную обработку шаблона и изменение хуков, используя шаблоны путей, типы и аргументы (). Мы будем использовать функцию arg (), которая возвращает части текущего пути URL-адреса в Drupal и некоторое сопоставление с образцом для случаев, когда вы хотите сопоставить образец в URL. Мы также рассмотрим создание переменной для массива типов контента.

Предварительная обработка шаблона — это средство определения переменных для использования на вашей странице. Например, вы можете определить переменную класса тела. В свою очередь вы можете использовать полученный класс в вашем Sass или CSS. Хук Alter или build — это то, что запускается до визуализации страницы, так что вы можете делать такие вещи, как добавление JS или CSS на определенные страницы или типы контента.

Я объясню и продемонстрирую эти хуки и как вы можете использовать их для:

  • Добавьте класс <body> на определенную страницу для лучшей тематики
  • Добавить Javascript или CSS для определенных страниц и путей
  • Используйте подстановочные аргументы пути
  • Соответствие шаблону URL с использованием preg_match
  • Создайте массив типов контента для использования в качестве переменной в вашем аргументе
  • Использование аргументов пути в качестве параметров

Обсуждаемые здесь функции будут добавлены в файл template.php вашей темы. Хотя вы также можете использовать эти функции в пользовательском модуле, вам нужно будет указать, что эти функции не предназначены для страниц администратора, если это не ваше намерение, и я расскажу, как это сделать.

Начиная

При использовании препроцесса или изменения функций в вашей теме вы должны быть уверены, что template.php существует, но если нет, вы можете создать этот файл в корне вашей темы. Так что, если моя тема называется foobar , путь к template.php будет:

 /sites/all/themes/foobar/template.php 

Функции API предваряются именем машины вашей темы. Например, если вы используете hook_page_alter и ваша тема называется foobar, мы бы написали ее как function foobar_page_alter() . (Имя машины — это просто имя папки темы.)

Пользовательские классы тела, использующие массив типов содержимого

Класс body — это класс, который добавляется к вашему тегу HTML <body> . Например, на странице блога вы можете увидеть что-то вроде этого:

 <body class="page-node page-node-blog"> 

Вы можете использовать этот класс в своем Sass или CSS для точной настройки темы, выполнив что-то подобное для страниц блога на вашем сайте:

 .page-node-blog h1 { // custom Sass here } 

Drupal 7 поставляется с некоторыми довольно хорошими классами тела, и обычно они подходят для большинства случаев использования. Кроме того, вклада Drupal или темы Contrib, такие как Zen, добавляют расширенные и расширенные классы.

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

 <?php /** * Implements template_preprocess_html(). * * Define custom classes for theming. */ function foobar_preprocess_html(&$vars) { // Build a node types array from our targeted content types. $foo_types = array( 'landing_page', 'our_services', ); // Define the node. $node = menu_get_object(); // Use the array to add a class to those content types. if (!empty($node) && in_array($node->type, $foo_types)) { $vars['classes_array'][] = 'page-style-foobar'; } } 

Эта функция предварительно обрабатывает переменные для всего, что обычно находится перед конечным </head> HTML </head> который находится в основном шаблоне Drupal, html.tpl.php . Мы добавляем класс body, используя $vars['classes_array'] . Эта переменная отображается с <?php print $classes; ?> <?php print $classes; ?> в <body> . В нашем случае, этот класс будет отображаться только в типах контента landing_page и our_services . Теперь мы можем использовать .page-style-foobar в нашем Sass или CSS для стилизации этих страниц.

Соответствие шаблону URL

Вы также можете использовать сопоставление с образцом URL для добавления полезных пользовательских классов. Допустим, у нас есть целевая страница «Наши услуги», а затем несколько подстраниц по этому пути. Архитектура URL может выглядеть так:

 example.com/our-services - example.com/our-services/subpage-1 - example.com/our-services/subpage-2 

Мы добавим пользовательский класс тела на эти страницы, используя preg_match , regex, совпадения PHP и функцию request_uri Drupal. Еще раз, мы поместили бы это в foobar_preprocess_html как указано выше.

 <?php function foobar_preprocess_html(&$vars) { // Define the URL path. $path = request_uri(); // Add body classes to various pages for better theming. if (preg_match('|^/our-services((?:/[a-zA-Z0-9_\-]*)*)?|', $path, $matches)) { $vars['classes_array'][] = 'page-services'; } } 

Теперь вы можете использовать .page-services .some-common-element для создания тем этих страниц «наших услуг». Очевидно, у этого метода есть подводные камни, если ваша структура URL изменяется, поэтому он может соответствовать только некоторым вариантам использования.

Путь Аргументы

Еще один умный способ настроить темы для определенных частей вашего сайта — разделить их с помощью arg (). Drupal имеет тенденцию увеличивать объем скриптов и CSS, поэтому в идеале, если вы добавляете дополнительный CSS или JS и вам это не нужно для каждой страницы (что обычно делается с помощью файла .info вашей темы), вы можете использовать path arg () для добавляйте их только на те страницы, где они нужны. Например, если я хочу добавить пользовательский скрипт только на страницу регистрации в Drupal, я могу создать путь arg () if и добавить в него скрипт. Путь URL, на котором мы сосредоточимся, это / user / register, и вы увидите, как arg () разбивает структуру URL.

Здесь мы будем использовать hook_page_alter который может применить изменения к странице до ее отображения. Сначала мы определяем путь к теме и используем прикрепленную функцию Drupal.

 <?php /** * Implements hook_page_alter(). * * Add custom functions such as adding js or css. */ function foobar_page_alter(&$page, $form) { // Define the module path for use below. $theme_path = drupal_get_path('theme', 'foobar'); if (arg(0) == "user" && arg(1) == "register") { $foobar_js = array( '#attached' => array( 'js' => array( $theme_path . '/js/custom.js' => array( 'group' => JS_THEME, ), ), ), ); drupal_render($foobar_js); } } 

Обратите внимание, что в этой функции мы заменили имя нашей темы на hook, чтобы hook_page_alter стал foobar_page_alter . Число arg () обозначает позицию в пути URL. Ноль первый, один второй и так далее. Вы можете проявить творческий подход, добавив больше параметров. Допустим, вы хотели добавить JS только к пользовательской странице, но без путей под ней. Вы можете добавить NULL arg () после начального arg ().

 if (arg(0) == "user" && arg(1) == NULL) { // code here } 

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

 if (!path_is_admin(current_path())) { // code here } 

Вывод

Как видите, использование Drupal API Toolbox для тематики расширяет ваши возможности как разработчика. Приведенные выше примеры не являются окончательными, но они дают вам представление о том, что возможно. Как Drupal Themer, их использование помогло мне расширить набор трюков при создании тематики и создании сайта. Комментарии? Обратная связь? Оставь их ниже!

Ресурсы