В работе с 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-&gt;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;amp;$vraiables){ #заменить my_theme на имя своей темы $node = $variables['node']; if($node-&gt;type = 'my_type'){ $wrapper = entity_metadata_wrapper('node',$node); $my_field = $wrapper-&gt;my_field-&gt;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-&gt;field_term-&gt;name-&gt;value();
т.е. если поле являет ссылкой на другую сущность(например user id или term tid или node nid, тогда она автоматически подгружает поля данной сущности, и дает возможность пользоваться ими.
Еще один пример:
Допустим нам нужно получить значение поля, пропущенное через функцию check_plain();
$wrapper = entity_metadata_wrapper('node',$node); $my_field = $wrapper-&gt;my_field-&gt;value(array('sanitize' =&gt; 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()
Надеюсь данная статья поможет в дальнейшем найти более лучшие решения…