Создание форматтера для CCK-поля

09.05.2012
Share on FacebookShare on TwitterShare on GooglePlusShare on Linkedin
Автор:

CCK-форматтеры - это куски кода, позволяющие выводить поля так как пожелаем. Часто возникает ситуация, когда веб разработчику существующих форматтеров для выполнения той или иной задачи недостаточно. В статье я рассмотрю создание форматтера для поля nodereference, и он будет просто добавлять якорь к ссылке.

Первым делом объявляем форматтер, вызывая хук hook_field_formatter_info():

/** 
 * Implements of hook_field_formatter_info(). 
 * 
 * Here we define an array with the options we will provide in display fields page
 * The array keys will be used later in hook_theme and theme_
 */ 

function example_field_formatter_info() { 
  $formatters = array( 
    'nodereference_anchor' => array( 
      // The name that the user will choose in the display fields configuration page.
      'label' => t('Link(with anchor)'), 
      // An array with the types of cck fields that the formatter supports.
      'field types' => array('nodereference'), 
      'description' => t('Displays a link to the referenced node with anchor.'),
    ), 
  ); 
  return $formatters; 
}

Хук возвращает массив массивов всех объявленных в этом модуле форматтеров.

Далее, в hook_theme() объявляем функцию темизации, которая будет отвечать за вывод поля:

/** 
 * Implements hook_theme(). 
 * 
 * We declare our theme functions according to the array keys in  hook_field_formatter_info.
 */ 
function example_theme() {  
  return array(  
    'example_formatter_nodereference_anchor' => array(  
      'arguments' => array('element' => NULL),  
    ),  
  );  
}

Ну, и сама функция темизации:

/* 
 * Theming functions for our formatter. 
 * 
 * And here we do our magic. You can use dsm($element) to see what you have to play with (requires devel module).
 */ 
function theme_example_formatter_nodereference_anchor($element) {
  $output = '';  
  if (!empty($element['#item']['nid']) && is_numeric($element['#item']['nid']) && ($title = _nodereference_titles($element['#item']['nid']))) {  
    $output = l($title, 'node/'. $element['#item']['nid'], array('fragment' => 'example-anchor')); 
  }  
  return $output;  
}

Как видим, все как бы просто и понятно. Тем не менее, эта простота избавит от необходимости написания большого объема кода в template.php, который впоследствии было бы тяжело поддерживать.

example.tar_1.gz
1 vote, Rating: 5
Share on FacebookShare on TwitterShare on GooglePlusShare on Linkedin

Также по теме

1

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

2

В предыдущем посте я приводил пример использования Ctools modal API с помощью одной формы. В этом же я рассмотрю использование еще одного мощного инструмента,...

3

Изначально идея #states заключалась в возможности создания динамических форм без написания JavaScript кода как такового. 

4

XML-RPC – простой протокол вызова удаленных процедур. XML-RPC является прародителем одного из популярных протоколов SOAP и, не смотря на свой возраст (реализован в 1998 году), XML-RPC не канул в...

5

В статье предоставлена информация о возможностях работы с платформой Titanium Appcelerator. Мы т...

Need a quote? Let's discuss the project

Are you looking for someone to help you with your Drupal Web Development needs? Let’s get in touch and discuss the requirements of your project. We would love to hear from you.

Join the people who have already subscribed!

Want to be aware of important and interesting things happening? We will inform you about new blog posts on Drupal development, design, QA testing and more, as well news about Drupal events.

No charge. Unsubscribe anytime