Вед-дев, Сео, Манимейкинг

Урок по Drupal 7 создание своих форматов

Собственное форматирование (custom formatters) - это хороший способ контроля вывода ваших полей. В этом уроке я буду использовать пример, в котором URL страницы пользователя в Facebook будет вводиться в input и выводиться в виде кнопки по выбору админа, а также с возможностью открытия ссылки в новом окне. Для начала нам нужно создать наброски скелета модуля. Нам нужно будет создать следующие файлы:

  • facebooklink.info
  • facebooklink.module

Первый файл, facebooklink.info будет очень простым:

name = Facebook Link
description = "Add a formatter to textfields that allows Admins to determine how links will be displayed"
package = Fields
core = 7.x
files[] = facebooklink.module

Мы даем имя и описание нашему модулю, а также указываем, что он написан для Drupal 7. Это сгруппирует наш модуль со всеми остальными. Последняя строчка указывает местонахождение самого модуля.

facebooklink.module - это место, где будет происходить весь кодинг. Здесь будут использоваться 4 хука (hooks) которые необходимы для работы собственного форматирования (custom formatters).

  • hook_field_formatter_info() - этот хук говорит друпалу к каким полям применяется наше форматирование и какие настройки оно имеет.
  • hook_field_formatter_settings_form() - при помощи этого хука мы говорим друпалу как генерировать форму с настройками.
  • hook_field_formatter_settings_summary() - отображает выбранные настройки на странице управление отображением (manage display).
  • hook_field_formatter_view() - в этом хуке мы делаем собственное форматирование поля.

Когда создаете файл модуля, не забудьте вставить в него стандартный хедер и описание:

/**
 * @file
 * adds a formatter for text fields that creates a facebook button
 *
 */

Начинаем с нашего первого хука facebooklink_field_formatter_info

/**
 * Implements hook_field_formatter_info().
 */

function facebooklink_field_formatter_info() {
  return array(
    'facebooklink_formatter' => array( //Machine name of the formatter
      'label' => t('Facebook Link'),
      'field types' => array('text'), //This will only be available to text fields
      'settings'  => array( //Array of the settings we'll create
        'pic_size' => 'small', //give a default value for when the form is first loaded
        'tooltip' => 'Link to user Facebook page', //ditto
      ),
    ),
  );
}

Здесь мы делаем друпал уведомленным о нашем форматировании давая ему машинное имя, лейбл и типы полей к которому оно будет применяться, а также настройки, которые мы планируем дать админу. Наш модуль может содержать любое количество собственных форматов (custom formatters) и их настроек.

Следующий хук facebooklink_field_formatter_settings_form

/**
 * Implements hook_field_formatter_settings_form().
 */

function facebooklink_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
  //This gets the view_mode where our settings are stored
  $display = $instance['display'][$view_mode];
  //This gets the actual settings
  $settings = $display['settings'];
  //Initialize the element variable
  $element = array();
  //Add your select box
  $element['pic_size'] = array(
    '#type'           => 'select',                           // Use a select box widget
    '#title'          => t('Button Size'),                   // Widget label
    '#description'    => t('Select what size of FB button'), // Helper text
    '#default_value'  => $settings['pic_size'],              // Get the value if it's already been set
    '#options'        => array(
      'small'  => 'Small',
      'medium' => 'Medium',
      'large'  => 'Large',
    ),
  );
  $element['tooltip'] = array(
    '#type'           => 'textfield',                        // Use a textbox
    '#title'          => t('Tool Tip'),                      // Widget label
    '#description'    => t('This text will appear when a user mouses over.'),  // helper text
    '#default_value'  => $settings['tooltip'],               // Get the value if it's already been set
  );
  return $element;
}

Теперь мы говорим друпалу о том, как должна выглядеть наша форма когда кто-нибудь нажимает на кнопку настройки форматирования (settings). Форма будет иметь дроп даун лист с лейблом "Button size" с тремя опциями (по умолчанию small) и текстовое поле с лейблом "Tool Tip".

Идем дальше, хук facebooklink_field_formatter_settings_summary

/**
 * Implements hook_field_formatter_settings_summary().
 */

function facebooklink_field_formatter_settings_summary($field, $instance, $view_mode) {
  $display = $instance['display'][$view_mode];
  $settings = $display['settings'];
  $summary = t('Use a @size Facebook button with the tooltip of "@tooltip"', array(
    '@size'     => $settings['pic_size'],
    '@tooltip'  => $settings['tooltip'],
  )); // we use t() for translation and placeholders to guard against attacks
  return $summary;
}

Этот хук несет исключительную ответственность за резюме (summary) форматирования на странице "управление отображением" (manage display) для выбранного типа материала. Наше резюме будет отображать выбранные нами настройки.

Теперь реальное мясо. Этот хук будет делать форматирование нашей ссылки hook_field_formatter_view.

/**
 * Implements hook_field_formatter_view().
 */

function facebooklink_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
  $element = array(); // Initialize the var
  $settings = $display['settings']; // get the settings
  $size = $settings['pic_size']; // The Size setting selected in the settings form
  $tooltip = $settings['tooltip']; // The tool tip assigned in settings
  // Create the image - Note that I'm storing the images in our module but they could be anywhere
  $image = '<img src="/' . drupal_get_path('module', 'facebooklink') . 'fb-' . $size . '.png">';
  foreach ($items as $delta => $item) {
    $fb = $item['safe_value']; // Getting the actual value
  }
  $options = array(
    'html'        => TRUE, // This tells Drupal that we're sending HTML, not plain text, otherwise it would encode it
    'attributes'  => array(
      'title' => $tooltip, // This sets our tooltip
      ),
    );
  if(isset($fb)) {
    $link = l($image, $fb, $options); // Create the Link
    $element[0]['#markup'] = $link; // Assign it to the #markup of the element
  }
  return $element;
}

Эта функция собирает все наши настройки и делает форматирование. В этом уроке были использованые базовые фукнции для создания собственного форматирования поля.



Комментарии (0)

Подписаться

Подписка на RSS-лента последние записи из Блога

Комменты

  • Olzhas 10 месяцев 2 недели назад
    Спасибо. С Новым Годом! 
  • Den 11 месяцев 2 недели назад
    В первой функции, при создании переменной $li_previous нужно поменять '←' с NULL, в $li_next сделать тоже самое. 
  • Гость 11 месяцев 2 недели назад
    Если все ровно так как было описано, то нет никаких сомнений что домен увел сам регистратор. Потому что вероятность того 
  • Валерий 1 год 1 неделя назад
    да можно делать импорт-экспорт только лишь в оболочке на входя на mysql сервер 
  • admin 1 год 1 неделя назад
    Валерий, а зачем вам именно так делать экспорт? Если я не ошибаюсь, то там нет какой-либо команды чтобы сделать экспорт 
  • Валерий 1 год 1 неделя назад
    захожу на mysql через ssh по команде  
  • admin 1 год 1 неделя назад
    Добрый вечер, какой у вас клиент? 
  • Валерий 1 год 1 неделя назад
    Здравстуйте, есть команда чтобы сделать экспорт базы внутри mysql клиента? 
  • Eduard 1 год 3 недели назад
    Видать, домен хороший был. Заявление пробывали писать на мошенника? 
  • Stas 1 год 2 месяца назад
    Ошибка в ключе квантификатора - replace(/будешь|пить/ig, "хлеб"); Указать -g для прохода по всем совпадениям!