fft.module in Field Formatter Template 7
Same filename and directory in other branches
Field formatter template.
File
fft.moduleView 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
Name | 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. |