You are here

fft.module in Field Formatter Template 7

Same filename and directory in other branches
  1. 8.2 fft.module
  2. 8 fft.module

Field formatter template.

File

fft.module
View source
<?php

/**
 * @file
 * Field formatter template.
 */

/**
 * Implements hook_menu().
 */
function fft_menu() {
  $items['admin/config/content/fft'] = array(
    'title' => 'Field Formmater Template',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'fft_config_form',
    ),
    'access arguments' => array(
      'administer site configuration',
    ),
  );
  return $items;
}

/**
 * Implements hook_form().
 */
function fft_config_form($form, &$form_state) {
  $form['fft_store_dir'] = array(
    '#type' => 'textfield',
    '#title' => t('Formmater template directory'),
    '#default_value' => fft_store_dir(),
    '#description' => t('Configure directory store field formatter template.'),
  );
  return system_settings_form($form);
}

/**
 * Implements hook_field_formatter_info().
 */
function fft_field_formatter_info() {
  $field_types = array_keys(field_info_field_types());
  return array(
    'fft_field' => array(
      'label' => t('Formatter Template'),
      'field types' => $field_types,
      'settings' => array(
        'template' => '',
        'image_style_1' => '',
        'image_style_2' => '',
        'settings' => '',
      ),
    ),
  );
}

/**
 * Get real path with token.
 *
 * @param string $file
 *   File path. Use with {module-name} {theme-name} {theme} {fft}.
 * @param string $template_file
 *    The template file.
 *
 * @return string
 *    Real path.
 */
function fft_realpath($file, $template_file = '') {
  $file = trim($file);
  if (strpos($file, '{') === FALSE) {
    return $file;
  }
  if (strpos($file, '{fft}') !== FALSE) {
    $theme_path = dirname($template_file);
    $file = str_replace('{fft}', $theme_path, $file);
    return $file;
  }
  if (strpos($file, '{theme}') !== FALSE) {
    $theme_default = $GLOBALS['conf']['theme_default'];
    $theme_path = drupal_get_path('theme', $theme_default);
    $file = str_replace('{theme}', $theme_path, $file);
    return $file;
  }
  $matches = array();
  $types = array(
    'module',
    'theme',
    'library',
  );
  foreach ($types as $type) {
    $pattern = '/\\{' . $type . '-(.+)\\}/';
    preg_match($pattern, $file, $matches);
    if ($type == "library") {
      if (count($matches) > 1 && ($path = libraries_get_path($matches[1])) != '') {
        $file = str_replace($matches[0], $path, $file);
        return $file;
      }
    }
    else {
      if (count($matches) > 1 && ($path = drupal_get_path($type, $matches[1])) != '') {
        $file = str_replace($matches[0], $path, $file);
        return $file;
      }
    }
  }
  return $file;
}

/**
 * Clear up string.
 *
 * @param string $str
 *    The input string.
 *
 * @return string
 *    Cleanup string.
 */
function fft_cleanup_header_comment($str) {
  return trim(preg_replace("/\\s*(?:\\*\\/|\\?>).*/", '', $str));
}

/**
 * Get avaiables templates.
 *
 * @return array
 *   List of Field formatter template.
 */
function fft_get_templates() {
  static $page_templates = NULL;
  if (!$page_templates) {
    $files = file_scan_directory(fft_store_dir(), '/^.*\\.php$/');
    foreach ($files as $full_path => $file) {
      $file_content = file_get_contents($full_path);
      $header = array();
      if (!preg_match('|Template Name:(.*)$|mi', $file_content, $header)) {
        continue;
      }
      $template_file = str_replace(fft_store_dir() . "/", '', $file->uri);
      $page_templates['templates'][$template_file] = fft_cleanup_header_comment($header[1]);
      $settings = array();
      if (preg_match('%/\\*Settings:(.*?)\\*/%s', $file_content, $settings)) {
        $page_templates['settings'][$template_file] = trim($settings[1]);
      }
    }
  }
  return $page_templates;
}

/**
 * Implements hook_field_formatter_settings_form().
 */
function fft_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
  $display = $instance['display'][$view_mode];
  $settings = $display['settings'];
  $form = array();

  // Show select box for the option set.
  $fft_templates = fft_get_templates();
  $optionsets = $fft_templates['templates'];
  $fft_templates['settings'][$settings['template']] = $settings['settings'];
  $form['#attached']['js'][] = fft_realpath('{module-fft}/fft.js');
  $form['#attached']['js'][] = array(
    'data' => array(
      'fft' => $fft_templates['settings'],
    ),
    'type' => 'setting',
  );
  $form['template'] = array(
    '#title' => t('Template'),
    '#type' => 'select',
    '#options' => $optionsets,
    '#default_value' => $settings['template'],
    '#attributes' => array(
      'class' => array(
        'fft-template',
      ),
    ),
  );
  switch ($field['type']) {
    case 'image':
      $form['image_style_1'] = array(
        '#type' => 'select',
        '#title' => t('Image Styles 1'),
        '#options' => image_style_options(),
        '#default_value' => $settings['image_style_1'],
      );
      $form['image_style_2'] = array(
        '#type' => 'select',
        '#title' => t('Image Styles 2'),
        '#options' => image_style_options(),
        '#default_value' => $settings['image_style_2'],
      );
      break;
  }
  $settings_des[] = t('Add settings extras for template, one setting per line with syntax key = value.');
  $settings_des[] = t('Support array like key[] = value or key[name] = value.');
  $settings_des[] = t('Support add css and js with syntax css = pathtofile.css and js = pathtofile.css');
  $settings_des[] = t('Add multi css js with syntax css[] = pathtofile1.css, css[] = pathtofile2.css');
  $settings_des[] = t('Support path tokens:');
  $settings_des[] = t('-- <strong>{fft}</strong>: path to folder of selected template');
  $settings_des[] = t('-- <strong>{library-name}</strong>: path to folder of library "name"');
  $settings_des[] = t('-- <strong>{module-name}</strong>: path to folder of module "name"');
  $settings_des[] = t('-- <strong>{theme-name}</strong>: path to folder of theme "name"');
  $settings_des[] = t('-- <strong>{theme}</strong>: path to folder of current default theme');
  $form['settings'] = array(
    '#type' => 'textarea',
    '#title' => t('Settings Extras'),
    '#default_value' => $settings['settings'],
    '#attributes' => array(
      'class' => array(
        'fft-settings',
      ),
    ),
  );
  $form['settings_des'] = array(
    '#type' => 'fieldset',
    '#title' => t('More Information'),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
  );
  $form['settings_des']['info'] = array(
    '#type' => 'markup',
    '#markup' => nl2br(implode("\r\n", $settings_des)),
  );
  return $form;
}

/**
 * Implements hook_field_formatter_settings_summary().
 */
function fft_field_formatter_settings_summary($field, $instance, $view_mode) {
  $display = $instance['display'][$view_mode];
  $settings = $display['settings'];
  $summary = t('Formatter Template');
  if (isset($settings['template'])) {
    $fft_template = fft_get_templates();
    foreach ($fft_template['templates'] as $name => $title) {
      if ($settings['template'] == $name) {
        $summary = t('Formatter Template: @name', array(
          $title,
        ));
      }
    }
  }
  return $summary;
}

/**
 * Implements hook_field_formatter_view().
 */
function fft_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
  $element = array();
  $settings = $display['settings'];
  $data = array();
  switch ($field['type']) {
    case 'image':
    case 'file':
      $data = $items;
      foreach ($data as $key => $item) {
        $data[$key]['path'] = file_create_url($item['uri']);
        if ($field['type'] == 'image') {
          for ($i = 1; $i <= 2; $i++) {
            if (!empty($settings["image_style_{$i}"])) {
              $data[$key]["path_{$i}"] = fft_field_styled_image_url($item['uri'], $settings["image_style_{$i}"]);
              $dimensions = array(
                "width" => $item['width'],
                "height" => $item['height'],
              );
              image_style_transform_dimensions($settings["image_style_{$i}"], $dimensions);
              $data[$key]["width_{$i}"] = $dimensions["width"];
              $data[$key]["height_{$i}"] = $dimensions["height"];
            }
          }
        }
      }
      break;
    case 'text':
    case 'text_long':
    case 'text_with_summary':
      foreach ($items as $key => $item) {
        $data[] = array(
          'text' => $item['safe_value'],
        );
      }
      break;
    case 'taxonomy_term_reference':
      foreach ($items as $key => $item) {
        $term = taxonomy_term_load($item['tid']);
        $data[] = (array) $term;
      }
      break;
    case 'field_collection':
      $ids = field_collection_field_item_to_ids($items);
      $data = field_collection_item_load_multiple($ids);
      break;
    case 'entityreference':
      $ids = array();
      foreach ($items as $key => $item) {
        $ids[] = $item['target_id'];
      }
      $data = entity_load($field['settings']['target_type'], $ids);
      break;
    default:
      $data = $items;
      break;
  }
  if (!empty($data)) {
    $template_file = fft_store_dir() . "/" . $settings['template'];
    $settings_extras = drupal_parse_info_format($settings['settings']);
    $attached = array();
    foreach (array(
      'js',
      'css',
      'library',
    ) as $item) {
      if (isset($settings_extras[$item])) {
        foreach ((array) $settings_extras[$item] as $key => $value) {
          if (is_string($value)) {
            $attached[$item][] = fft_realpath($value, $template_file);
          }
          else {
            $attached[$item][] = $value;
          }
        }
      }
    }
    $settings_extras = $attached + $settings_extras;
    $settings_extras['image_style_1'] = $settings['image_style_1'];
    $settings_extras['image_style_2'] = $settings['image_style_2'];
    $output = fft_render($template_file, array(
      'data' => $data,
      'entity' => $entity,
      'settings' => $settings_extras,
    ));
    $element[0] = array(
      '#markup' => $output,
      '#attached' => $attached,
    );
  }
  return $element;
}

/**
 * Get image url with then style name.
 *
 * @param string $image_uri
 *   Image uri.
 * @param string $style
 *   Image style name.
 *
 * @return string
 *   Return image url.
 */
function fft_field_styled_image_url($image_uri, $style) {
  $image_filepath = image_style_path($style, $image_uri);
  if (!file_exists($image_filepath)) {
    image_style_create_derivative(image_style_load($style), $image_uri, $image_filepath);
  }
  return file_create_url($image_filepath);
}

/**
 * Render template with variables.
 *
 * @param string $template_file
 *   Template name.
 * @param array $variables
 *   Variables for template.
 *
 * @return string
 *   Rendered template.
 */
function fft_render($template_file, $variables) {
  if (!is_file($template_file)) {
    return "";
  }
  $render_fn = function_exists('phptemplate_render_template') ? 'phptemplate_render_template' : 'theme_render_template';
  return $render_fn($template_file, $variables);
}

/**
 * Get store directory.
 *
 * @return string
 *   Path of store dicrectory.
 */
function fft_store_dir() {
  return variable_get('fft_store_dir', "sites/all/formatter");
}

Functions

Namesort descending Description
fft_cleanup_header_comment Clear up string.
fft_config_form Implements hook_form().
fft_field_formatter_info Implements hook_field_formatter_info().
fft_field_formatter_settings_form Implements hook_field_formatter_settings_form().
fft_field_formatter_settings_summary Implements hook_field_formatter_settings_summary().
fft_field_formatter_view Implements hook_field_formatter_view().
fft_field_styled_image_url Get image url with then style name.
fft_get_templates Get avaiables templates.
fft_menu Implements hook_menu().
fft_realpath Get real path with token.
fft_render Render template with variables.
fft_store_dir Get store directory.