Правильная работа с полями (filds) Drupal 7

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

Для начала посмотрим что мы делаем для вывода конкретного поля в модуле или  например node.tpl.php

Неправильное решение:

print $node->field_name['und'][0]['value'];

Что это нам даст?

Поле с именем $field_name, но мы сталкиваемся с кучей ошибок когда дело доходит до мультиязычных сайтов, ведь для стандартных полей с<span class=»Apple-converted-space»> </span>нейтральным языком<strong><span class=»Apple-converted-space»> </span></strong>ключ und подходит, а вот к примеру если ихзменить язык поля на русский все поломается .

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

print $node->field_name['ru'][0]['value'];

Получается придется писать условия для языка, использовать функции request_path() и request_uri() для анализа URL адреса текущей страницы или же пользоваться глобальной переменной $language->language для уточнения языка, и тут же условия, а поле переводимое или нет?ведь может быть цифровое поле которое нет смысла переводить?

Эту цепочку вопросов со сложными решениями прервет одна функция: entity_metadata_wrapper($bundle-type, $bundle);

Приведу пример вызова для node.tpl.php к примеру для типа материала с именем my_type. В файле tamplate.php (писать код обработчик в файле шаблона не целесообразно, в связи с чем пишем функции в template.php где создаем необходимые переменные шаблонов)

function my_theme_template_preorocess_node(&amp;$vraiables){ #заменить my_theme на имя своей темы
    $node = $variables['node'];
    if($node->type = 'my_type'){
        $wrapper = entity_metadata_wrapper('node',$node);
        $my_field = $wrapper->my_field->value(); # Получаем значение поля my_field
        $variables['my_value'] = $my_field; #Передаем значение my_field в node.tpl.php как переменную $my_value
    }
}

И так мы получили значение поля — и можем не задумываться с языковыми настройками.

Так же у entity_metadata_wrapper есть много хороших особенностей, к примеру если поле является ссылкой на термин таксономии тогда мы можем получить поля таксономии(например имя) следующим способом:

$wrapper = entity_metadata_wrapper('node',$node);
$term_name = $wrapper->field_term->name->value();

т.е. если поле являет ссылкой на другую сущность(например user id или term tid или node nid, тогда она автоматически подгружает поля данной сущности, и дает возможность пользоваться ими.

Еще один пример:

Допустим нам нужно получить значение поля, пропущенное через функцию check_plain();

$wrapper = entity_metadata_wrapper('node',$node);
$my_field = $wrapper->my_field->value(array('sanitize' => true));

Более подробнее об этой функции можете найти информацию на в официальной документации http://drupal.org/node/1021556   (Все как обычно в убогом состоянии и не дописано)

Что касается темизации полей:

Для темизации полей скопируйте файл из  /modules/field/theme/field.tpl.php в папку с вашей темой, переименуйте ее в соответствии со следующими шаблонами (шаблоны проверяются по приоритету сначала то что выше в списке, затем следующий и т.д. пока не найдет нужный, если не находит, использует системный)

  • field—ИМЯ_ПОЛЯ—ТИП_МАТЕРИАЛА.tpl.php
  • field—ТИП_МАТЕРИАЛА.tpl.php
  • field—ИМЯ_ПОЛЯ.tpl.php
  • field.tpl.php

Так же доступны preprocess функции для предварительной обрабтки полей:

template_preprocess_field(),template_process_field()

Надеюсь данная статья поможет в дальнейшем найти более лучшие решения…

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *