Категория:
Опубликовано:

Поле с форматтером от другого материала

Extra field drupal

Например, стоит задача вывести поле из одного типа материала в другом.

Получим все настройки форматтера поля из первого материала и выведем его в качестве экстра-поля во втором.

К примеру, будем выводить поле field_page_image из материала page в материале article. Назовем его "extra_field_image".

Сначала создадим экстра-поле используя хук hook_field_extra_fields():

/**
 * Implements hook_field_extra_fields().
 */
function MY_MODULE_field_extra_fields() {
  $extra['node']['article'] = array(
    'display' => array(
      'extra_field_image' => array(
        'label'       => t('Field from page'),
        'description' => t('Field from "Page" node type'),
        'weight'      => 0,
      ),
    ),
  );
  
  return $extra;
}

Для отображения поля в том же формате что и у родительского типа материала нам нужно получить все его настройки:

// Загружаем материал из которого будем получать поле
// В этом примере - материал с NID == 1
$page = node_load(1);
$output = '';

// Получаем настройки инстанса поля из БД
$instance = db_query(
  'SELECT data FROM {field_config_instance} 
  WHERE field_name = :field_name',
  array(':field_name' => 'field_page_image'
))->fetchField();

// Записываем значения настроек дисплея "default" в переменную
if ($instance) {
  $settings = unserialize($instance);
  $output   = field_view_field('node', $page, 'field_pp_photo', $settings['display']['default']);
}

Теперь, настроим его отображение с помощью хука hook_node_view.

Воспользуемся методом отсюда:

/**
 * Implements hook_node_view().
 */
function MY_MODULE_node_view($node, $view_mode, $langcode) {
    
  static $extra_fields = array();
 
  $key = 'node:' . $node->type . ':' . $view_mode;
  if (!isset($extra_fields[$key])) {
    $extra_fields[$key] = field_extra_fields_get_display('node', $node->type, $view_mode);
  }
  
  $page = node_load($node->product->primary_product);
  $output = '';

  $instance = db_query(
    'SELECT data FROM {field_config_instance} 
    WHERE field_name = :field_name',
    array(':field_name' => 'field_page_image'
  ))->fetchField();

  if ($instance) {
    $settings = unserialize($instance);
    $output   = field_view_field('node', $page, 'field_pp_photo', $settings['display']['default']);
  }
  
  if (isset($extra_fields[$key]['extra_field_image']) && $extra_fields[$key]['extra_field_image']['visible']) {
    $node->content['extra_field_image'] = array(
      '#markup' => render($output),
      '#weight' => $extra_fields[$key]['extra_field_image']['weight'],
    );
  }
  
}

Готово.

Если настройки форматтера основного материала изменятся - автоматически они применяться и к дочернему материалу.

Если у Вас возникли вопросы, замечания, предложения или просто благодарность - пишите в комментариях.
Делитесь полезными материалами в социальных сетях.
Добавить комментарий