[Предлагаю решение] Темизация страниц VIEWS в Drupal 7

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

Доброго времени суток.

В общем весь интернет переползал но так и не нашел сегодня ни одного решения того, как темезировать не вьюху а страницу где она выводится. Проблема в том, что у неё нету NID и один метод темизация через alias. Но тут сразу вытекает другая проблема, как темизировать если урл на кириллице, и немного поломав голову я сварганил какое-никакое решение.

Допустим у нас есть такая вьюха:

Как видно:
1. Адрес на кириллице, соответственно подхватить алиас не удастся. Либо нужно делать его английским и английскому добавлять еще русский алиас. Но мне показалось это далеко не выход.
2. Машинное имя. Это то на что я сделал упор. У каждой вьюхе оно свое и на это я решил ловить.

Собственно добавляем в template.php своей темы код:

function THEME-NAME_preprocess_page(&$variables) {
  if (!empty($variables['page']['#views_contextual_links_info']['views_ui']['view_display_id'])) {
    $variables['theme_hook_suggestions'][] = 'page__views__' . $variables['page']['#views_contextual_links_info']['views_ui']['view_display_id'];
  }
}

И начинаем пользоваться.
Чтобы темизировать страницу вьюхи с картинки выше, достаточно создать теймплейт: page--views--video.tpl.php

Для создание других page--views--[Machine Name].tpl.php

Еще пример: Для вьюхи с машинным именем best_video темплейт будет такой: page--views--best_video.tpl.php

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

ВложениеРазмер
Иконка изображения views.jpg321 КБ
Модули и темы:
Тип материала:
Версия Drupal:
0 Thanks

Комментарии

Аватар пользователя Shok211
Shok211 6 лет назад

Информативно. Правда именно это написано в документации к модулю

Аватар пользователя Niklan
Niklan 6 лет назад
Shok211 написал:

Ну гугл ничего не дал. А в инфе только темизация самой вьюхи.
Даже если написано, ничего, соображалку хоть включил и тем кто будет искать в дальнейшем поможет.

Аватар пользователя lionman
lionman 5 лет назад

А если у меня уже есть функция
function TEMA_preprocess_page(&$vars, $hook) {
if (isset($vars['node'])) {
$vars['theme_hook_suggestions'][] = 'page__'. str_replace('_', '--', $vars['node']->type);
}}

То код нужно вставить вот так:
function TEMA_preprocess_page(&$vars, $hook) {
if (isset($vars['node'])) {
$vars['theme_hook_suggestions'][] = 'page__'. str_replace('_', '--', $vars['node']->type);
}{
if (!empty($variables['page']['#views_contextual_links_info']['views_ui']['view_display_id'])) {
$variables['theme_hook_suggestions'][] = 'page__views__' . $variables['page']['#views_contextual_links_info']['views_ui']['view_display_id'];
}
}

ИЛИ ИЗМЕНИТЬ НАЗВАНИЕ ФУНКЦИИ

Аватар пользователя Niklan
Niklan 5 лет назад

Да. Просто добавить код из моей функции в вашу.

Аватар пользователя lionman
lionman 5 лет назад

Ну почему не работает, не могу понять.Может я что то не правильно делаю. Создал представление страница. Адрес node/%/image
Машинное имя zavimage

Вставляю код в свою функцию.

Создаю шаблон - копию шаблона page--zavedeniya.tpl
Называю её page--views--zavimage.tpl

Почистил все кэше. Но при переходе на страницу node/%/image шаблон все равно берется с главного шаблона page.tpl

Аватар пользователя drupby
drupby 5 лет назад

в препроцесс добавь

if (arg(0) == 'node' && is_numeric(arg(1)) && arg(2) == 'image' ) {
  $variables['theme_hook_suggestions'][] = 'page__views__' . 'image';
}

то что до этого добавлял убери

Аватар пользователя lionman
lionman 5 лет назад

Да что такое все равно не получается.

Функция в template

function corporateclean_preprocess_page(&$vars, $hook) {
    if (isset($vars['node'])) {  
        $vars['theme_hook_suggestions'][] = 'page__'. str_replace('_', '--', $vars['node']->type);
    }
        if (arg(0) == 'node' && is_numeric(arg(1)) && arg(2) == 'image' ) {
  $variables['theme_hook_suggestions'][] = 'page__views__' . 'image';
}
}

Путь:/node/%/image
Машинное имя:zavimage

КОНТЕКСТНЫЕ ФИЛЬТРЫ
Содержимое: Nid

Созданный файл page--views--image.tpl.php
Код в этом файле

<!-- #header -->
<div id="header-zav">
        <!-- #header-inside -->
    <div id="header-inside-zav" class="container_12 clearfix">
        <!-- #header-inside-left -->
           <div id="maza"></div>
       <div id="header-inside-left-zav" class="grid_9">
           
           <div id="zagolovokzav">
            <?php print render($title_prefix); ?>
            <?php if ($title): ?>
            <h1><?php print $title ?></h1>
            <?php endif; ?>
            <?php print render($title_suffix); ?>
           </div>
           <div id="mainfield-zav">
            <?php print render($page['mainfield_zav']); ?>
           </div>
          <div id="mainmenu-zav">
          <?php print render($page['mainmenu_zav']); ?>
          </div>
           </div><!-- EOF: #header-inside-left -->
       <div id="header-inside-right-zav" class="grid_3">
           <div id="idzav">0000001</div>
           <div id="imgzav">
           <?php print render($page['main_photo_zav']); ?>
           </div>
           </div>
           </div><!-- EOF: #header-inside -->

</div><!-- EOF: #header -->

<!--Polosa pod menu-->
<div id="podmenu-zav"></div>

<!-- #header-menu -->

            <div id="navigation-zav" class="clearfix">
            <?php print render($page['fix_menu_zav']); ?>
            </div>
                       
<!-- EOF: #header-menu -->

<!-- #content -->
<div id="content">
        <!-- #content-inside -->
    <div id="content-inside-zav" class="container_12 clearfix">
   
        <?php if ($page['sidebar_first']) :?>
        <!-- #sidebar-first -->
        <div id="sidebar-first" class="grid_3">
                <?php print render($page['sidebar_first']); ?>
        </div><!-- EOF: #sidebar-first -->
        <?php endif; ?>
       
        <?php if ($page['sidebar_first'] && $page['sidebar_second']) { ?>
        <div class="grid_6">
        <?php } elseif ($page['sidebar_first'] || $page['sidebar_second']) { ?>
        <div id="main" class="grid_9">
                <?php } else { ?>
        <div id="main" class="grid_12">    
        <?php } ?>
           
            <?php if (theme_get_setting('breadcrumb_display','corporateclean')): print $breadcrumb; endif; ?>
           
            <?php if ($page['highlighted']): ?><div id="highlighted"><?php print render($page['highlighted']); ?></div><?php endif; ?>
       
            <?php if ($messages): ?>
            <div id="console" class="clearfix">
            <?php print $messages; ?>
            </div>
            <?php endif; ?>
     
            <?php if ($page['help']): ?>
            <div id="help">
            <?php print render($page['help']); ?>
            </div>
            <?php endif; ?>
           
            <?php if ($action_links): ?>
            <ul class="action-links">
            <?php print render($action_links); ?>
            </ul>
            <?php endif; ?>
           
                       
           
            <?php if ($tabs): ?><?php print render($tabs); ?><?php endif; ?>
           
            <?php print render($page['content']); ?>
         
            <?php print $feed_icons; ?>
           
        </div><!-- EOF: #main -->
       
        <?php if ($page['sidebar_second']) :?>
        <!-- #sidebar-second -->
        <div id="sidebar-second" class="grid_3">
                <?php print render($page['sidebar_second']); ?>
        </div><!-- EOF: #sidebar-second -->
        <?php endif; ?>  

    </div><!-- EOF: #content-inside -->

</div><!-- EOF: #content -->

<!-- #footer -->    
<div id="footer">
        <!-- #footer-inside -->
    <div id="footer-inside" class="container_12 clearfix">
   
        <div class="footer-area grid_4">
        <?php print render($page['footer_first']); ?>
        </div><!-- EOF: .footer-area -->
       
        <div class="footer-area grid_4">
        <?php print render($page['footer_second']); ?>
        </div><!-- EOF: .footer-area -->
       
        <div class="footer-area grid_4">
        <?php print render($page['footer_third']); ?>
        </div><!-- EOF: .footer-area -->
       
    </div><!-- EOF: #footer-inside -->

</div><!-- EOF: #footer -->

<!-- #footer-bottom -->    
<div id="footer-bottom">

        <!-- #footer-bottom-inside -->
    <div id="footer-bottom-inside" class="container_12 clearfix">
        <!-- #footer-bottom-left -->
        <div id="footer-bottom-left" class="grid_8">
       
            <?php print theme('links__system_secondary_menu', array('links' => $secondary_menu, 'attributes' => array('class' => array('secondary-menu', 'links', 'clearfix')))); ?>
           
            <?php print render($page['footer']); ?>
           
        </div>
        <!-- #footer-bottom-right -->
        <div id="footer-bottom-right" class="grid_4">
       
                <?php print render($page['footer_bottom_right']); ?>
       
        </div><!-- EOF: #footer-bottom-right -->
       
    </div><!-- EOF: #footer-bottom-inside -->
   
    <!-- #credits -->  
    <div id="credits" class="container_12 clearfix">
        <div class="grid_12">
        </div>
    </div>
    <!-- EOF: #credits -->

</div><!-- EOF: #footer -->

Что может быть не так. Чистил все кэши.

Аватар пользователя drupby
drupby 5 лет назад
lionman написал:
Да что такое все равно не получается.

в таком случае используй вместо $variables $vars

Аватар пользователя lionman
lionman 5 лет назад

Ну и так же написан $vars

function corporateclean_preprocess_page(&$vars, $hook) {
    if (isset($vars['node'])) {  
        $vars['theme_hook_suggestions'][] = 'page__'. str_replace('_', '--', $vars['node']->type);
    }
        if (arg(0) == 'node' && is_numeric(arg(1)) && arg(2) == 'image' ) {
  $variables['theme_hook_suggestions'][] = 'page__views__' . 'image';
}
}
Аватар пользователя Niklan
Niklan 5 лет назад
 $variables['theme_hook_suggestions'][] = 'page__views__' . 'image';

на

 $vars['theme_hook_suggestions'][] = 'page__views__' . 'image';
Аватар пользователя lionman
lionman 5 лет назад

ИИИИИИХУУУУУУУУУ. ЗАРАБОТАЛО. Всем огромное спасибо. Надо изучать php)))))

А если к примеру у меня будет еще один тип материала, и у него тоже будет представление с адресом node/%/image - шаблон будет браться тоже с файла page--views--image.tpl.php ?

Аватар пользователя Niklan
Niklan 5 лет назад
lionman написал:

Он берется по машинному имени вьюхи. Если там та же самая вьюха, то да, шаблон тот же будет.

Аватар пользователя lionman
lionman 5 лет назад

Но в этом коде я машинное имя вообще не использовал. Машинное имя вьюхи вообще zavimage Шаблон у меня называется page--views--image.tpl.php
а код в template написан выше. И допустим у меня будет еще одна вьюха в виде странице для этого типа материала, допустим новости. И чтобы подкинулся шаблон и для этой странице нужно просто прописать еще одну функции в template

Аватар пользователя drupby
drupby 5 лет назад
lionman написал:
А если к примеру у меня будет еще один тип материала,

значит загрузи ноду и проверь ее тип

function corporateclean_preprocess_page(&$vars, $hook) {
    if (isset($vars['node'])) {  
        $vars['theme_hook_suggestions'][] = 'page__'. str_replace('_', '--', $vars['node']->type);
    }
        if (arg(0) == 'node' && is_numeric(arg(1)) && arg(2) == 'image' ) {
          $node = node_load(arg(1));
         
          $vars['theme_hook_suggestions'][] = 'page__views__' . 'image'__$node->type;
         
}
}

если типов много используй шаблоны page--views--image--type

Аватар пользователя lionman
lionman 5 лет назад

Все спасибо. Просто задал вопрос сразу, чтобы не было косяков потом)))

Аватар пользователя drugget
drugget 3 года назад

На мой взгляд более универсальный вариант:

<?php
function THEMENAME_preprocess_page(&$vars) {
  if (!empty(
$vars['page']['#views_contextual_links_info']['views_ui']['view_name'])) {
    
$vars['theme_hook_suggestions'][] = 'page__views__' $vars['page']['#views_contextual_links_info']['views_ui']['view_name'];
    
$vars['theme_hook_suggestions'][] = 'page__views__' $vars['page']['#views_contextual_links_info']['views_ui']['view_name'] . '__' $vars['page']['#views_contextual_links_info']['views_ui']['view_display_id'];
  }
}
?>

Тогда для вьюх буду работать:
page--views--[view_name].tpl.php
page--views--[view_name]--[view_display_id].tpl.php

Аватар пользователя chelwolf
chelwolf 3 года назад

Использую ваш вариант, подскажите, у меня есть сейчас кусок в темлейте, где уже препроцесс организован:
<?php
function uyrgiitheme_preprocess_page(&$variables, $hook) {
if (isset($variables['node'])) {
$variables['theme_hook_suggestions'][] = 'page__type__'. $variables['node']->type;
$variables['theme_hook_suggestions'][] = "page__node__" . $variables['node']->nid;
}
}
?>

Я добавляю ваш код и это начинает выглядеть так:
<?php
function uyrgiitheme_preprocess_page(&$variables, $hook) {
if (!empty($vars['page']['#views_contextual_links_info']['views_ui']['view_name'])) {
$vars['theme_hook_suggestions'][] = 'page__views__' . $vars['page']['#views_contextual_links_info']['views_ui']['view_name'];
$vars['theme_hook_suggestions'][] = 'page__views__' . $vars['page']['#views_contextual_links_info']['views_ui']['view_name'] . '__' . $vars['page']['#views_contextual_links_info']['views_ui']['view_display_id'];
}
if (isset($variables['node'])) {
$variables['theme_hook_suggestions'][] = 'page__type__'. $variables['node']->type;
$variables['theme_hook_suggestions'][] = "page__node__" . $variables['node']->nid;
}
}
?>

Однако это не работает, подскажите в чём проблема в моём случае? В качестве шаблона использую page--views--news--eventnews.tpl.php, где news - имя имя общего вьюса, eventnews - имя страницы в рамках данного вьюса

Аватар пользователя chelwolf
chelwolf 3 года назад

Господи как же это круто - спасибо вам огромное, до этого приходилось решать данную задачу путём больших физических затрат и массового клепания шаблонов (вьюсы выводили программно в разных частях страницы), а сейчас крутотень!!!