Вы здесь

Как в DS вывести иконку если поле имеет значение?

0

Привет!
У материала есть поле Фотогалерея, которое видно только в режиме "Содержимое полностью". Хочу в режиме "Анонса" выводить определенную иконку, которая будет выводится только если в материале была добавлена Фотогалерея. По аналогии как на РБК:

Разобрался как это сделать с помощью стандартного шаблона, но в моем случае оказалось что Анонс создан на DS и логические переменные, которые я создал в template.php в слоях DS не доступны. К тому же в слоях весь контент уже находится в переменной $ds_content и добавить туда что-то свое уже проблематично.
Поэтому хочу спросить, можно ли создать в DS кастомное поле с кодом которое проверяло поле "Фотогалерея" и выводило div-метку? Или может есть какое-то логичное решение. Буду рад любому предложению.

P.S.
Прошу прощения, если заголовок не совсем отражает суть вопроса целиком.

Версия Drupal: 
7.x
Категория: 
Theming
Связанные проекты: 
Display Suite
Вопрос задан 24.08.2017 - 18:34
Аватар пользователя pr0g
pr0g
36

Ответы

1

Разобрался как это сделать с помощью стандартного шаблона, но в моем случае оказалось что Анонс создан на DS и логические переменные, которые я создал в template.php в слоях DS не доступны.

Сделать аналогично для DS. Всё это проходит через hook_preprocess_HOOK(). Если у стандартного он hook_preprocess_node() то у DS будет hook_preprocess_LAYOUT_NAME(). Точно также добавить нужные переменные\классы и подправить шаблон, если требуется, переопределив его у себя, если он не объявлен в вашей теме\модуле.

Ответ дан 25.08.2017 - 08:38
Аватар пользователя Niklan
Niklan
445

Спасибо за ответ. Буду пробовать.
У меня только один вопрос. В шаблоне DS есть переменная $ds_content, можно с ней как-то манипулировать? Или же надо создавать свои переменные и полностью переписывать шаблон.

Комментарий оставлен 25.08.2017 - 13:55

Через этот самый хук и можно манипулировать. Можете почитать про hook_theme() https://niklan.net/blog/151 Хоть и для 8-ки, но там разницы очень мало в устройстве, в 7-ке такое же на 90%. Вам должен быть полезен раздел про конкретно препроцессы.

Комментарий оставлен 25.08.2017 - 16:34

Прочитал я вашу статью, но пока мало представляю как ее применить в моем случае.
Хук hook_preprocess_HOOK() должен работать в template.php?
В DS я использую слой ds_1col (судя по названию папки). Объявил в template.php следующую функцию:

function tb_rave_preprocess_ds_1col(&$vars) {
  dpm($vars);
}

но результата нет и ошибок тоже нет, возможно я не правильно задал имя слоя в DS.

Комментарий оставлен 25.08.2017 - 20:54

Ну если тема называется tb_rave и layout ds_1col, то должно работать.

Сбрасывали ли кэш? Попробуйте написать аналогичный хук только для page или html, посмотреть, вызывается ли код из данного файла вообще. Как вариант, у DS есть hook_ds_layout_info() можно там объявить кастомную препроцесс функцию и пользоваться. Есть подозрения что ваш код вызывается раньше DS, возможно у DS вес выше.

Комментарий оставлен 26.08.2017 - 10:32

Если у тебя Drupal 7.33 и выше включи theme_debug
http://xandeadx.ru/blog/drupal/779

Можно через drush

drush vset theme_debug true

Обычно по атрибуту class у html элемента, можно легко разобраться какой шаблон используется.

Комментарий оставлен 27.08.2017 - 10:08

Спасибо за совет. Недавно увидел статью про theme_debug и подумывал ее попробовать.
Пока пробую написать модуль для формата отображения поля.

Комментарий оставлен 28.08.2017 - 12:27
0

Спасибо всем за советы. Решил вопрос с помощью написания своего формата отображения для полей Изображения и Youtube.
Функционал модуля простой, вместо вывода содержимого поля, форматтер выводит выбранную иконку "Photo" или "Video". Так же не надо писать логику для проверки имеет ли поле значение.
Привожу листинг код модуля:

iconformat.info

name = Iconformat
description = "Add a formatter to image and youtube fields that allows Admins to determine how icon will be displayed"
package = Fields
core = 7.x
files[] = iconformat.module

iconformat.module

<?php
/**
 * @file
 * adds a formatter for image and youtube fields that creates a icon photo or video
 */

/**
 * Implements hook_field_formatter_info().
 */
function iconformat_field_formatter_info() {
  return array(
    'iconformat_formatter' => array( //Machine name of the formatter
      'label' => t('Icon format'),
      'field types' => array('image', 'youtube'), //This will only be available to image and youtube fields
      'settings'  => array( //Array of the settings we'll create
        'icon_view' => 'photo', //give a default value for when the form is first loaded
      ),
    ),
  );
}

/**
 * Implements hook_field_formatter_settings_form().
 */
function iconformat_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
  //This gets the view_mode where our settings are stored
  $display = $instance['display'][$view_mode];
  //This gets the actual settings
  $settings = $display['settings'];
  //Initialize the element variable
  $element = array();
  //Add your select box
  $element['icon_view'] = array(
    '#type'           => 'select',                           // Use a select box widget
    '#title'          => t('View icon'),                   // Widget label
    '#description'    => t('Select what views for icon'), // Helper text
    '#default_value'  => $settings['icon_view'],              // Get the value if it's already been set
    '#options'        => array(
      'photo'  => 'Photo',
      'video' => 'Video',
    ),
  );

  return $element;
}

/**
 * Implements hook_field_formatter_settings_summary().
 */
function iconformat_field_formatter_settings_summary($field, $instance, $view_mode) {
  $display = $instance['display'][$view_mode];
  $settings = $display['settings'];
  $summary = t('Use a @view for views icon', array(
    '@view'     => $settings['icon_view'],
  )); // we use t() for translation and placeholders to guard against attacks
  return $summary;
}

/**
 * Implements hook_field_formatter_view().
 */
function iconformat_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
  $element = array(); // Initialize the var
  $settings = $display['settings']; // get the settings
  $icon = $settings['icon_view']; // The Size setting selected in the settings form
  // Create the image - Note that I'm storing the images in our module but they could be anywhere
  $image = '<img src="/' . drupal_get_path('module', 'iconformat') . '/' .  $icon . '.png">';
  $element[0]['#markup'] = $image; // Assign it to the #markup of the element
  return $element;
}

Результат:

Ответ дан 28.08.2017 - 21:53
Аватар пользователя pr0g
pr0g
36