Как правильно оформить панели?

8

Я использую Page Manager и Панели , предоставляя настраиваемые панели узлов с правилами выбора по типу (например, один вариант панели для статьи, один вариант панели для типа контента блога). Это работает гладко до сих пор, стиль также аккуратный. Но как я могу получить больше власти над рендерингом элементов?

Существует несколько способов визуализации определенных элементов: добавление полей, использование токена, использование настраиваемого представления, отрисовка только определенных полей, использование визуализированного объекта узла в режиме просмотра. использование пользовательского содержимого панели с заполнителями и т. д.

Каков наилучший подход здесь? Было бы здорово иметь возможность добавить пользовательский (что-то) элемент панели, который можно стилизовать в * .tpl.php.

Мой текущий подход заключается в использовании набора отображения, создании режимов просмотра для различных областей деталей / панелей и использовании подсказок для темы для добавления пользовательского node.tpl.php для каждого режима просмотра. Не нужно вызывать взгляды, что в значительной степени излишне ?! рендеринг, дополнительные запросы ...) и может использовать уже кэшированные объекты.

function mytheme_preprocess_node(&$vars) {
  if ($vars['node']->type == 'my_content_type' && $vars['view_mode'] == 'panel_region_left') {
    $vars['theme_hook_suggestions'][] = 'node__my_content_type__panel_region_left';
  }

  if ($vars['node']->type == 'my_content_type' && $vars['view_mode'] == 'panel_region_right') {
    $vars['theme_hook_suggestions'][] = 'node__my_content_type__panel_region_right';
  }
}

Я не уверен, насколько хорошо это будет кэшироваться и сколько ресурсов он будет потреблять. Любой совет был бы благодарен.

Андре Баумайер
источник

Ответы:

11

Как говорит официальный документ, вы можете сделать что-то вроде

Панели-pane_node-title.tpl.php

Панели-pane_panel_node_title.tpl.php

Панели-панель узел-title.tpl.php

Панели-панель-node_title.tpl.php

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

function MYTHEME_preprocess_panels_pane(&$vars) {
// get the subtype
$subtype = $vars['pane']->subtype;

// Add the subtype to the panel theme suggestions list
$vars['theme_hook_suggestions'][] = 'panels_pane__'.$subtype;

return $vars;
}

После долгих поисков по форумам я тоже нашел это,

<?php
function THEMENAME_preprocess_page(&$vars) {
    global $theme_path;
    if($panel_page = page_manager_get_current_page()){

        $target_menu = 'menu-sixth-form-college';
        $current_path = menu_get_item();

        $target_menu_links = menu_load_links($target_menu);
        foreach($target_menu_links as $links) {
            $link_paths[] = $links['link_path'];
        }
        $preferred_link_paths = $link_paths;
        // if the current link is inside menu_load_link
        if(in_array($current_path['href'], $preferred_link_paths)) {
            $vars['theme_hook_suggestions'][] = 'page__sixthform';
        }
        if($panel_page['name'] == 'page-sixth_form_college') {
            $vars['theme_hook_suggestions'][] = 'page__sixthform';
        }
    }
?>

Тема и Кеш.

Когда дело доходит до кеширования, я считаю, что Drupal будет обрабатывать для вас кеширование шаблонов как обычный кеш страниц. Если вы не думаете, что это работает, вы можете сделать что-то вроде

<?php
function my_module_function() {
  $my_data = &drupal_static(__FUNCTION__);
  if (!isset($my_data)) {
    if ($cache = cache_get('my_module_data')) {
      $my_data = $cache->data;
    }
    else {
      // Do your expensive calculations here, and populate $my_data
      // with the correct stuff..
      cache_set('my_module_data', $my_data, 'cache');
    }
  }
  return $my_data;
}
?>
niksmac
источник
Ни один из этих хуков не сработал для моей панели
AlxVallejo
Убедитесь, что Panel включена, и вы редактируете правильную папку темы. Я не знаю, что еще сегодня.
Никсмак
С помощью модуля devel вы можете kpr $ vars в функции preprocess_panels_pane? Я не могу получить какой-либо вывод.
AlxVallejo
-2

Лучший и самый простой способ добавить пользовательский контент на панели и оформить его по своему усмотрению, создать пользовательские панели содержимого, добавить свой код, используя режим фильтра в качестве php-фильтра, и инкапсулировать свой собственный php / html-контент в пользовательские теги div.

Теперь, чтобы оформить эту пользовательскую панель контента, все, что вам нужно сделать, это добавить свои собственные правила CSS для этого тега div в ваш local.css.

Если у вас есть какие-то конкретные требования, пожалуйста, укажите их здесь.

user1153986
источник
3
Я не большой поклонник кода в базе данных, и что еще хуже: PHP-код в тех областях, где он не принадлежит. Это решение на самом деле не является ни будущим, ни должным образом кэшируемым и ревизируемым (это может быть при экспорте панели, но было бы ужасно беспорядок, чтобы все настроить).
Андре Баумайер