Улучшаем Social Buttons

Модуль Social Buttons позволяет прикрутить кнопки социальных сетей к любой entity, используя Field API. Давайте взглянем на исходный код. Возьмем кнопку для Facebook:

<div class="fb-like" data-layout="button_count" data-send="false" data-show-faces="false" data-width="1"></div>

Чего здесь не хватает? Ссылки на материал, ведь мы хотим поставить лайк не на всю страницу. Таким образом, нужно дать возможность ввести ссылку на текущую entity, напомню, кнопки - это Field, следовательно их можно пристегнуть к любой entity.

Для этого используем токены. Наш код будет вылядеть так:

<div class="fb-like" data-layout="button_count" data-send="false" data-show-faces="false" data-url="[node:url]" data-width="1"></div>

Изменим social_buttons.info - добавим строчку:

name = Social Buttons
description = Social Buttons Field with token support and improvements.
core = 7.x
dependencies[] = token

Модифицируем код:

/**

 * Implements of hook_field_formatter_view().

 */


function social_buttons_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
  $element = array();
  foreach ($instance['settings'] as $vendor => $button) {
    if (!empty($button)) {
      $buttons[] = token_replace($button, array($entity_type => $entity));
    }  
  }

  $element[0] = array('#theme' => 'social_buttons', '#buttons' => $buttons);
  return $element;
}

Наконец добавляем списки токенов для форм добавления кнопок:

  // Setting the form text areas for embed code.
  for ($i = 0; $i <= $count; $i++) {
    $knob = isset($button[$i]) ? $button[$i] : "";
    $form["button-{$i}"] = array(
      '#type' => 'textarea',
      '#title' => t("button-@i code <em>@new</em>", array('@i' => $i, '@new' => $i >= $count ? t('(ADD ANOTHER)') : '')),
      '#default_value' => $knob,
      '#attributes' => array('class' => array("social-buttons-textarea button-{$i}")),
      '#prefix' => "<div class='social-button-code'>",
      '#suffix' => "<div class='social-button-{$i}-preview preview'>" . t("Button-@i preview", array('@i' => $i)) . "<div class='social-button-{$i}-code code'>{$knob}</div></div></div>"
    );
    $form["tokens-{$i}"] = array(
                '#theme' => 'token_tree',
                '#token_types' => array('node'), // The token types that have specific context. Can be multiple token types like 'term' and/or 'user'
                '#global_types' => TRUE,
                '#click_insert' => TRUE, // A boolean whether to include the 'Click this token to insert in into the the focused textfield' JavaScript functionality. Defaults to TRUE.
    );

  }