Как проверить наличие переменных $tabs, $site_name или $logo - кодом в template.php темы?

Аватар пользователя strelkov.av strelkov.av 31 июля в 21:36

Добрый день, создаю кастомный темплэйт для Drupal 7, и есть необходимость - в зависимости от наличия на странице вкладок, или включенное или выключенного состояния отображения названия/логотипа - добавлять определенный класс в body или не добавлять

Другими словами, если в админке например включенно отображение логотипа сайта, то в body добавить класс with-logotype, или например если я перешёл на страницу /user где автоматом для неавторизованного пользователя появляются 3 вкладки (регистрация, вход, забыли пароль) - то добавить with-tabs

Аналогичную задачу я делаю также для наличия или отсутствия блоков в определенных регионах, но там вроде как всё просто

<?php
function mytemplate_preprocess_html(&$variables) {
  if (!empty(
$variables['page']['triptych_first'])
    || !empty(
$variables['page']['triptych_middle'])
    || !empty(
$variables['page']['triptych_last'])) {
    
$variables['classes_array'][] = 'with-triptych';
  }
}
?>

Но если смотреть на page.tpl.php в modules/system

<?php
/**
 * @file
 * Default theme implementation to display a single Drupal page.
 *
 * The doctype, html, head and body tags are not in this template. Instead they
 * can be found in the html.tpl.php template in this directory.
 *
 * Available variables:
 *
 * General utility variables:
 * - $base_path: The base URL path of the Drupal installation. At the very
 *   least, this will always default to /.
 * - $directory: The directory the template is located in, e.g. modules/system
 *   or themes/bartik.
 * - $is_front: TRUE if the current page is the front page.
 * - $logged_in: TRUE if the user is registered and signed in.
 * - $is_admin: TRUE if the user has permission to access administration pages.
 *
 * Site identity:
 * - $front_page: The URL of the front page. Use this instead of $base_path,
 *   when linking to the front page. This includes the language domain or
 *   prefix.
 * - $logo: The path to the logo image, as defined in theme configuration.
 * - $site_name: The name of the site, empty when display has been disabled
 *   in theme settings.
 * - $site_slogan: The slogan of the site, empty when display has been disabled
 *   in theme settings.
 *
 * Navigation:
 * - $main_menu (array): An array containing the Main menu links for the
 *   site, if they have been configured.
 * - $secondary_menu (array): An array containing the Secondary menu links for
 *   the site, if they have been configured.
 * - $breadcrumb: The breadcrumb trail for the current page.
 *
 * Page content (in order of occurrence in the default page.tpl.php):
 * - $title_prefix (array): An array containing additional output populated by
 *   modules, intended to be displayed in front of the main title tag that
 *   appears in the template.
 * - $title: The page title, for use in the actual HTML content.
 * - $title_suffix (array): An array containing additional output populated by
 *   modules, intended to be displayed after the main title tag that appears in
 *   the template.
 * - $messages: HTML for status and error messages. Should be displayed
 *   prominently.
 * - $tabs (array): Tabs linking to any sub-pages beneath the current page
 *   (e.g., the view and edit tabs when displaying a node).
 * - $action_links (array): Actions local to the page, such as 'Add menu' on the
 *   menu administration interface.
 * - $feed_icons: A string of all feed icons for the current page.
 * - $node: The node object, if there is an automatically-loaded node
 *   associated with the page, and the node ID is the second argument
 *   in the page's path (e.g. node/12345 and node/12345/revisions, but not
 *   comment/reply/12345).
 *
 * Regions:
 * - $page['help']: Dynamic help text, mostly for admin pages.
 * - $page['highlighted']: Items for the highlighted content region.
 * - $page['content']: The main content of the current page.
 * - $page['sidebar_first']: Items for the first sidebar.
 * - $page['sidebar_second']: Items for the second sidebar.
 * - $page['header']: Items for the header region.
 * - $page['footer']: Items for the footer region.
 *
 * @see template_preprocess()
 * @see template_preprocess_page()
 * @see template_process()
 * @see html.tpl.php
 *
 * @ingroup themeable
 */
?>

Вроде как возможные контекстные переменные описаны, но похоже тот же $logo, $site_name и $tabs не доступны в template.php

Т.к. я пробовал добавить

<?php
function mytemplate_preprocess_html(&$variables) {
  if (!empty(
$variables['logo'])) {
    
$variables['classes_array'][] = 'with-logo';
  }
}
?>

Но на выходе класса нет, как при активном логотипе, так и не активном. Хотя скорее всего я не верно работаю уже с такого рода переменными, и нужно как то в хуке по другому их проверить.
Но к сожалению я не программист, и не могу это проверить

У кого есть опыт, подскажите пожалуйста

Лучший ответ

Аватар пользователя charOFF charOFF 31 июля в 22:40
1

То, что доступно в page.tpl.php, доступно через $variables в THEME_preprocess_page. В THEME_preprocess_html массив $variables уже другой. В нем нет ни 'logo', ни 'tabs'.
Как получить нужные значения можно подсмотреть в системной функции template_preprocess_page()
Например, для лого будет так

<?php
function mytemplate_preprocess_html(&$variables) {
  if (!empty(
theme_get_setting('logo'))) {
    
$variables['classes_array'][] = 'with-logo';
  }
}
?>

Совет. Просматривать содержимое переменных без отладчика можно с помощью функций dpm() или dpr() из модуля devel.

Комментарии

Аватар пользователя charOFF charOFF 31 июля в 22:40
1

То, что доступно в page.tpl.php, доступно через $variables в THEME_preprocess_page. В THEME_preprocess_html массив $variables уже другой. В нем нет ни 'logo', ни 'tabs'.
Как получить нужные значения можно подсмотреть в системной функции template_preprocess_page()
Например, для лого будет так

<?php
function mytemplate_preprocess_html(&$variables) {
  if (!empty(
theme_get_setting('logo'))) {
    
$variables['classes_array'][] = 'with-logo';
  }
}
?>

Совет. Просматривать содержимое переменных без отладчика можно с помощью функций dpm() или dpr() из модуля devel.

Аватар пользователя strelkov.av strelkov.av 31 июля в 23:52

Большое спасибо, сделал по следующему

<?php
  
if (!empty(theme_get_setting('logo'))) {
    
$variables['classes_array'][] = 'with-logo';
  }

  if (!empty(

menu_primary_local_tasks())) {
    
$variables['classes_array'][] = 'with-tabs';
  }
?>

Вроде всё работает