Вы здесь

Верстка Entity Reference полей Drupal 7

Всем добра! Решил описать путь, который сам прошел, не найдя на русском предметной информации по сабжу.

В node--foo.tpl мы можем вывести отрендеренное друпалом поле вот так:

<?php print render($content['field_foo']); ?>

field_foo это поле типа Entity Reference, в моем случае оно связывает материал node--foo с материалом node--bar, т.е. мы имеем дело со связью нода-нода.

Что делать, если верстка поля, подготовленная рендером друпала, не устраивает? в node--bar.tpl.php мы можем изменить верстку, и эта новая верстка будет справедлива для всех материалов типа bar.

Допустим, у нас есть поле speaker_photo (Image). В node--bar.tpl.php

 <?php print render($content['field_speaker_photo']); ?>

Подготовленный render() HTML будет такой:

<div class="field field-name-field-speaker-photo field-type-image field-label-hidden field-wrapper">
    <img typeof="foaf:Image" src="path" alt="alt" height="200" width="200">
</div>

Мне понадобилось привести верстку к такому виду (по два изображения в блоке-родителе):

<div id="foo-parent">
    <div class="field field-name-field-speaker-photo field-type-image field-label-hidden field-wrapper">
        <img typeof="foaf:Image" src="path" alt="alt" height="200" width="200">
    </div>
    <div class="field field-name-field-speaker-photo field-type-image field-label-hidden field-wrapper">
        <img typeof="foaf:Image" src="path" alt="alt" height="200" width="200">
    </div>
</div>

Делать что-то в node--bar.tpl.php не имеет смысла, ибо он имеет дело с конкретной нодой (полем в ноде), необходимые манипуляции решил делать в node--foo.tpl.php (можно и в template темы сделать).

Если в node--foo.tpl.php сделаем вот так для Entity Reference поля

<?php print render($content['field_foo']); ?>

обнаружим уже приведенный HTML из node--bar.tpl.php

Что же скрывается в $content? Никто не мешает посмотреть

<?php dsm($content);

Видим, что $content['field_foo'] включает в себя немало разнообразного бобра, загвоздка здесь в том, что мы не знаем ID связанных нод для доступа к значениям (URI изображения).

Спасти может field_get_items();

<?php
//returns the field
$field_foo = field_get_items('node', $node, 'field_foo');
dsm($field_foo);
dsm ($field_foo[0]['entity']->field_speaker_photo['und'][0]['uri']);

Таким образом мы можем достучаться до любого поля привязанной ноды. Devel и Krumo наглядно это демонстрируют.

Теперь, когда мы разобрались с получением значений, сделаем это в цикле, для получения URI изображения из каждой привязанной ноды.

<?php
$i = 0;
$uri = [];
foreach ($field_foo as $f) {

    $field_foo = field_get_items('node', $node, 'field_foo');
    $uri[$i] = file_create_url($field_lectors[$i]['entity']->field_speaker_photo['und'][0]['uri']);
    $i++;               
}
dsm($uri);

в $uri все URI, ура, хитро сверстать теперь не проблема.

UPD #1

Мне понадобилось использовать для изображения стили (admin/config/media/image-styles), делюсь рецептом (если вы следовали повествованию, то у вас имеются только URI оригинального файла, и подразумевается, что они будут вставлены в атрибут src тега img).

После того, как в $field_foo вернулся ответ функции field_get_items(); делаем вот что:

<?php
$speaker[$i] = field_view_value('node', $node, 'field_foo', $field_foo[$i]['entity']->field_speaker_photo['und'][0],
                            array(
                                'type' => 'image',
                                'settings' => array(
                                    'image_style' => 'lector',
                                    //'image_link' => 'content',
                                ),
                            ));

Теперь к изображению применяется стиль lector. Для других полей суть та же.
Для вывода прогоняем через рендер:

<?php
print (render($speaker[$i]));

А для вывода по два изображения в div сделал так:

$count = 1;
$i = 0;
                    foreach( $speaker as $key ) 
                    {
                        if ($count%2 == 1)
                        {  
                             echo '<div class="lector-line">';
                        }
                        echo '<div class="lector">';

                        print (render($speaker[$i]));

                        echo '</div>';
                        if ($count%2 == 0)
                        {
                            echo "</div>";
                        }
                        $i++;
                        $count++;
                    }
                    if ($count%2 != 1) echo "</div>";
2
4
31.03.2016 - 01:20

Комментарии

Аватар пользователя xandeadx
xandeadx – 31.03.2016 - 10:27

Почему просто не темизировать поле field_speaker_photo?

Аватар пользователя synapse
synapse – 31.03.2016 - 16:40

в материалах, в которых поле подтягивается из привязанной ноды, оно имеет одну верстку. в своем родном материале вывод иной

Аватар пользователя al77ex1
al77ex1 – 02.04.2016 - 23:08

Много конечно получилось приседаний. Но мне все-таки не понятно чем не устроил рендер без стилей.
<?php print render($content['field_speaker_photo'][0]); ?>

Аватар пользователя synapse
synapse – 03.04.2016 - 01:00

не устраивал html, мне нужно было вот так

<div id="line">
    <div class="field">
        <img typeof="foaf:Image" src="path" alt="alt" height="200" width="200">
    </div>
    <div class="field>
        <img typeof="foaf:Image" src="path" alt="alt" height="200" width="200">
    </div>
</div>

print render() подгоняет вывод в соответствии с настройками в отображении материала, в коде же c помощью field_view_value можно задавать свои

или я суть вопроса не уловил