2014-11-15 2 views
1

Ситуация У меня есть пользовательский модуль, который использует hook_field_formatter_info(), чтобы добавить «фантастическую» опцию в поле изображения в режиме управления типом контента. Когда этот параметр выбран, я хочу иметь возможность окружать поле ENTIRE в пользовательских div и разметке. Я хочу, чтобы решение было крючком в моем настраиваемом модуле, а не переопределением шаблона.Как обернуть поле в пользовательскую разметку?

Пользователь хочет, чтобы отображение поля изображения являлось «причудливым» вариантом. Они проверяют его в раскрывающемся списке и выбирают сохранение из типов содержимого «Управление отображаемой страницей администратора». Теперь на этом узле типа контента должна быть настраиваемая разметка, окружающая все поле, даже если есть несколько изображений, новая разметка должна окружать ВСЕ изображения, а не каждое отдельное изображение.

hook_field_formatter_view hook_field_formatter_view, кажется, требует его вывода быть массивом, и я не могу показаться, чтобы быть в состоянии обернуть вывод в DIV.

Шаблон переопределяет Я не могу просто сделать field.tpl.php для конкретной области, потому что, как я первоначально упоминал, что я должен быть в состоянии переключать темы и модуль по-прежнему работать как обычно. Если не существует способа заставить мой модуль переопределить любое поле, в котором указанное поле имеет значение hook_field_formatter_info().

/** 
* Implements hook_field_formatter_view(). 
*/ 
function bootstrap_modal_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) { 
    $element = array(); 

    foreach ($items as $delta => $item) { 
    if ($index === NULL || $index === $delta) { 
     $element[$delta] = array(
     '#theme' => 'bootstrap_modal_image_formatter', 
     '#item' => $item, 
     '#entity_type' => $entity_type, 
     '#entity' => $entity, 
     '#node' => $entity, // Left for legacy support. 
     '#field' => $field, 
     '#display_settings' => $display['settings'], 
     '#delta' => $delta, 
    ); 
    } 
    } 


    // $element = '<div id="CUSTOMDIVSTUFF">' . $element . '</div>'; 

    return $element; 
} 

А вот функция #theme:

function theme_bootstrap_modal_image_formatter($variables) { 

    $item = $variables['item']; 
    $entity_type = $variables['entity_type']; 
    $entity = $variables['entity']; 
    $field = $variables['field']; 
    $settings = $variables['display_settings']; 

    $image = array(
    'path' => $item['uri'], 
    'alt' => isset($item['alt']) ? $item['alt'] : '', 
    'title' => isset($item['title']) ? $item['title'] : '', 
    'style_name' => $settings['bootstrap_modal_node_style'], 
); 

    if (isset($item['width']) && isset($item['height'])) { 
    $image['width'] = $item['width']; 
    $image['height'] = $item['height']; 
    } 

    if (isset($item['attributes'])) { 
    $image['attributes'] = $item['attributes']; 
    } 

    // Allow image attributes to be overridden. 
    if (isset($variables['item']['override']['attributes'])) { 
    foreach (array('width', 'height', 'alt', 'title') as $key) { 
     if (isset($variables['item']['override']['attributes'][$key])) { 
     $image[$key] = $variables['item']['override']['attributes'][$key]; 
     unset($variables['item']['override']['attributes'][$key]); 
     } 
    } 
    if (isset($image['attributes'])) { 
     $image['attributes'] = $variables['item']['override']['attributes'] + $image['attributes']; 
    } 
    else { 
     $image['attributes'] = $variables['item']['override']['attributes']; 
    } 
    } 

    $entity_title = entity_label($entity_type, $entity); 

    if ($style_name = $settings['bootstrap_modal_image_style']) { 
    $path = image_style_url($style_name, $image['path']); 
    } 
    else { 
    $path = file_create_url($image['path']); 
    } 

    $caption = 'some value'; 
    $gallery_id = 'some value'; 

    return theme('bootstrap_modal_imagefield', array('image' => $image, 'path' => $path, 'title' => $caption, 'gid' => $gallery_id)); 
} 

работал над этим в течение нескольких дней, я тону здесь.

ответ

0

Это возможно через HOOK_process_field(). Используйте этот крючок, чтобы определить новый файл шаблона для вашего поля, добавив его в массив theme_hook_suggestions (поместите файл шаблона в каталог вашего модуля, потому что вы хотели изменить тему, как вы упомянули). More info about field template suggestions.

Затем вам нужно будет добавить путь к модулю реестра drupal, чтобы он отобрал файл шаблона. Demo.

0

я узнал, что это было:

function bootstrap_modal_field_formatter_view($entity_type, $entity, $field, $instance,  $langcode, $items, $display) { 
    $element = array(
    '#prefix' => '<div class="wrapper">', 
    '#suffix' => '</div>', 
);