Темизация Field Collection.

Главные вкладки

Аватар пользователя webpavilion webpavilion 7 ноября 2012 в 22:50

Честно сказать мне не очень нравится то что нагородили в D7 но прогресс не остановить заказчики требуют самых новых версий, отказываться от денег глупо, приходится ковыряться. В CCK 3.x были удобные multigroup поля, заменить в D7 их можно только на field_group_multiple или field_collection. Собственно при темизации последнего и возникло ощущение "удаления гланд через анальное отверстие".

В template.php:

<?php
function MYTHEM_field__field_steps($variables) {
  if (
$variables['element']['#field_type'] == 'field_collection') {
    foreach (
$variables['items'] as $item) {
      
$item array_shift($item['entity']['field_collection_item']);

      

$fields = array ();

      foreach (array(

'field_step_image''field_step_text') as $field) {
        
$fields[] = $item[$field];
      }

      

$output_items[] = render ($fields);
    }

    return 

theme('item_list', array ('type'=>'ol','items'=>$output_items));
  }
}
?>

Код выше немного упрощен но в целом выглядит именно так. tpl шаблоны использовать совсем не хотелось поскольку полей около полусотни и вывод некоторых немного отличается (то есть проще проверить в switch чем потом править десяток файлов)

Скажите насколько подобное решение корректно? Можно ли сделать лучше/правильнее?

Комментарии

Аватар пользователя PVasili PVasili 7 ноября 2012 в 23:04

"Делайте" поля из field_collection прямо в материале, а не по отдельности каждое. И лучше использовать сразу field_collection_field_get_entity().

Аватар пользователя webpavilion webpavilion 8 ноября 2012 в 0:09

Немного переписал пример, render() вызывается только один раз для каждой коллекции полей.
field_collection_field_get_entity() вернет тоже что и $variables['items'] чем лучше?

Аватар пользователя PVasili PVasili 5 декабря 2013 в 19:26

Сделано что через гланды - то через гланды.
Но лучше использовать field-collection-item--имя_поля_коллекции.tpl.php.
Образец field-collection-item.tpl.php в папке модуля.