Передать переменную в шаблон поля из поля предварительной обработки темы ()


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

Я использую модуль Параграфов в Drupal 7, так что это может сбить меня с толку, но я чувствую, что я действительно близок. Вот простой пример:

Функция предварительной обработки в моем template.php :

function merge_preprocess_field(&$variables) {
    $element = $variables['element'];
  if (isset($element['#field_name'])) {
    if ($element['#field_name'] == 'field_title') {
      $variables['test_title'] = $variables['items'][0]['#markup'];
    }
  }
}

Имя шаблона, который я использую, это paragraphs-item--full-text.tpl.php.

field_title называется ли имя поля внутри пакета абзацев full-text.

Все, что я прочитал до сих пор, указывает на то, что я должен иметь доступ к переменной $variables['test_title'] в моем шаблоне таким образом:

<?php print render($test_title); ?>

Он не печатается даже после очистки кэша. Он даже появляется в массиве, когда я krumo($variables);. Я что-то упускаю?

 5
Author: kiamlaluno, 2015-04-17

1 answers

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

Во-первых, я создал функцию, которая позволила бы мне создавать функции предварительной обработки для типов сущностей:

function merge_preprocess_entity(&$vars, $hook) {
  $function = 'merge_preprocess_' . $vars['entity_type'];
  if (function_exists($function)) {
    $function($vars, $hook);
  }
}

Это позволило мне создать функцию предварительной обработки для элементов абзацев. Затем я использовал ту же идею для создания функций предварительной обработки для отдельных элементов абзацев:

function merge_preprocess_paragraphs_item(&$vars, $hook) {
  $elements = $vars['elements'];

  $function = 'merge_preprocess_paragraphs_item__' . $elements['#bundle'];
  if (function_exists($function)) {
    $function($vars, $hook);
  }
}

Теперь я могу задать переменные, доступные в шаблонах элементов абзацев, например:

function merge_preprocess_paragraphs_item__smaller_full_width_text(&$vars, $hook) {

  if ($vars['content']['field_cta']) {

    $field_cta = !empty($vars['content']['field_cta'])? $vars['content']['field_cta'][0]['entity']['field_collection_item']: '';

    foreach ($field_cta as $field_cta) {

        // Make the CTA url available to the rest of the block
        $vars['content']['cta_url'] = $field_cta['field_link'][0]['#markup'];

        // Set character limit for CTA Text
        $vars['content']['cta_text'] = truncate_utf8($field_cta['field_link_text'][0]['#markup'], 24, TRUE, FALSE);

    }
  }
}
 2
Author: bgrobertson, 2015-05-01 12:56:39