Вы здесь

Программная смена форматера поля

1

Я сделал несколько кастомных форматтеров поля изображения. Они должны включаться при просмотре ноды для field_image в зависимости от выбранного при заполнении параметра в выпадающем списке.

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

Версия Drupal: 
7.x
Категория: 
Field API
Вопрос задан 11.08.2015 - 08:42
Аватар пользователя shu
shu
178

Ответы

0

При заполнении ноды выбирается, где и как выводить картинки. Либо по умолчанию, либо вверху всех полей, либо в виде таблицы (картинка слева, текст справа).
В этом модуле добавляется новый форматтер поля, который можно использовать для форматирования любых полей изображений в виде таблицы.
Если при создании ноды выбирается вывод в виде таблицы, то к полю с картинками применяется данный форматер.

<?php

/**
 * Implements hook_node_view().
 */
function my_node_view($node, $view_mode, $langcode) {
    if($node->type == 'blog'){

        // если выбрана опция выводить сверху, то поле с картинкой выводится выше контента
        if($view_mode == 'full' && $node->field_image_view['und'][0]['value'] == 'Вывести сверху' && isset($node->field_blog_image)){ 
            $node->content['field_blog_image']['#weight'] = -1;
        }

        // если выбрана опция "Картинка справа текст", то к отображению применяется форматтер 'my_image_right_text'             
        elseif ($view_mode == 'full' && $node->field_image_view['und'][0]['value'] == 'Картинка справа текст' && isset($node->field_blog_image)) {  
            $display = array(           
                'label' => 'hidden',
                'type' => 'my_image_right_text',  // какой форматер использовать для отображения поля
            );
            $field_image = field_view_field('node', $node, 'field_blog_image', $display);
            unset($node->content['field_blog_image']);
            $node->content['field_blog_image'] = $field_image;
            $node->content['field_blog_image']['#weight'] = 1;
        }

    }
}

/**
 * Implements hook_field_formatter_info().
 * Создаём новый форматтер
 */
function my_field_formatter_info() {
  return array(
    'my_image_right_text' => array(
      'label' => t('Картинка слева, текст справа'), // название форматера
      'field types' => array('image'),              // для какого поля может использоваться
      'settings' => array(                          
            'pic_size' => 'thumbnail',              // размер картинки по умолчанию
      ),
    ),
  );
}

/**
 * Implements hook_field_formatter_settings_form().
 * Форма редактирования форматтера
 */
function my_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {

    $display = $instance['display'][$view_mode];
    $settings = $display['settings'];
    $element = array();
    //Add your select box

    $element['pic_size'] = array(
        '#type'           => 'select',                          // Use a select box widget
        '#title'          => t('Image size'),                   // Widget label
        '#description'    => t('Select size of image'),         // Helper text
        '#default_value'  => $settings['pic_size'],             // Get the value if it's already been set
        '#options'        => image_style_options(),
    );

    return $element;
}


/**
 * Implements hook_field_formatter_settings_summary().
 * Форма для вывода информации о выбранном форматере
 */
function my_field_formatter_settings_summary($field, $instance, $view_mode) {
    $display = $instance['display'][$view_mode];
    $settings = $display['settings'];
    $summary = t('Use a @size image with a caption text', array(
        '@size'     => $settings['pic_size'],
    )); 
    return $summary;
}


/**
 * Implements hook_field_formatter_view(). 
 * 
 */
function my_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
    $element = array();                 // инициализируем переменную
    $settings = $display['settings'];   // получаем настройки
    $size = $settings['pic_size'];      // получаем размер пресета

    switch ($display['type']) {
        case 'my_image_right_text':     // имя форматера
            $header = array(            // заголовок для таблицы
                array('data' => t('Blog image')),
                array('data' => t('Blog image caption text')),
            );
            $rows = array();            // начинаем формировать строки в таблице
            foreach ($items as $key => $image) {
                $caption = $image['image_field_caption']['value'];  // используется модуль Image Field Caption, чтобы делать подписи к картинкам            
                $img_attributes = array(
                    'path' => image_style_url($display['settings']['pic_size'], $image['uri']),
                );
                $img_style = theme('image', $img_attributes);
                $img_original_url = file_create_url($image['uri']);

                // ссылка на картинку, которая открывается в colorbox
                $img_colorbox = l($img_style, $img_original_url, array('html' => TRUE, 'attributes' => array('class' => array('colorbox'), 'title' => $caption))); 

                $rows[] = array(
                    array('data' => $img_colorbox),
                    array('data' => $caption),
                );
            }
            $table = theme('table', array( //выводим таблицу
                'header' => $header,
                'rows' => $rows,
            ));
            $element[0]['#markup'] = $table;
        break;
    }

    return $element;
}

?>
Ответ дан 12.08.2015 - 17:31
Аватар пользователя shu
shu
178
-1

Копай instance поля.

Ответ дан 11.08.2015 - 09:21
Аватар пользователя SAM
SAM
212
-1

я тоже спрашивал и пока пусто http://dru.io/question/2216
и по английски http://drupal.stackexchange.com/questions/162988/user-can-choose-image-f...
но на тостере ответили
https://toster.ru/q/228298

Ответ дан 11.08.2015 - 09:50

на тостере не ответили, как именно это можно сделать...

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