[Решено] Drupal 7 добавление новых отображений

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

Аватар пользователя oploshka oploshka 8 октября 2014 в 12:48

есть модуль который добавляет отображения

<?phpfunction Mymodyle_entity_info_alter(&$entity_info) {
  $entity_info['node']['view modes']['work'] = array(
    'label' => t('work'),
    'custom settings' => TRUE,
  );
}?>

здесь все хорошо и понятно. Отображение work включено, позволяет скрывать поля и изменять их вывод и тп.
(страница /admin/structure/types/manage/[тип материала]/display/work вместо work можно вставить и teaser -> анонс)
Дальше сохраняем и смотрим на тип вывода work, так понимаю адрес должен быть www.сайт.ru/node/[номер ноды]/work или я тут ошибаюсь?
В общем отображение берется из того что настроено "по умолчанию".
Подскажите какой адрес должен быть для просмотра именно этого отображения или что сделано не так.

Комментарии

Аватар пользователя drupby drupby 8 октября 2014 в 13:03

"oploshka" wrote:
так понимаю адрес должен быть www.сайт.ru/node/[номер ноды]/work или я тут ошибаюсь?

если сделаешь вьюс с таким путем, то будет, а так создавай вьюс и выводи там ноды с указанным в настройках вью модом

Аватар пользователя Ujean Ujean 8 октября 2014 в 14:57

$my_view = node_view($node, 'work');
print render($my_view);
А можно действительно указать во вьюс что берешь именно этот дисплей
Для этого в view в Show: выбираешь Rendered entity, в следующем окошке в View mode выбираешь свой дисплей work

Аватар пользователя oploshka oploshka 8 октября 2014 в 15:30

хотелось бы обойтись без вьюса, а просто темизацией и не делать двойную загрузку материала. Правильнее перефразировать вопрос:
где можно темизировать обращение к node_view($node, 'full') и сделать его node_view($node, 'work'), когда в конце адреса есть /work

Аватар пользователя oploshka oploshka 8 октября 2014 в 15:45

Как вариант можно темизировать node.tpl.php (переменную $content, обойдя ее следующим образом):

<?php foreach ($content as $key=> $value){
  if (isset(
$content[$key]['#view_mode'])){$content[$key]['#view_mode']="work";}
}
?>

но хотелось бы все тоже самое но где нибудь в темплейте или в модуле.

Аватар пользователя oploshka oploshka 8 октября 2014 в 17:17

В общем решение нашел. Перечислю их все:
1 Создаем представление (модуль views) с контекстным фильтром и выводим содержимое
Формат -> Показать:Содержимое | Анонс.
2 Правим node.tpl.php, вырезаем из нее print render($content) и вставляем

<?php $my_view node_view($node'teaser');
print 
render($my_view);?>

3 Вставляем код сверху в node.tpl.php

<?php foreach ($content as $key=> $value){
  if (isset(
$content[$key]['#view_mode'])){$content[$key]['#view_mode']="work";}
}
?>

4 Создаем модуль или редактируем темплейт

<?php function hook_entity_view_mode_alter(&$view_mode$context) {
  if (
$context['entity_type'] == 'node'){
    if (
Arg(0)=="node" && Arg(2)=="work"){
      
$view_mode="work";
    }
  }
}
?>