field_collection_views.module in Field Collection Views 8
Same filename and directory in other branches
Module implementing a field-collection views formatter.
File
field_collection_views.moduleView source
<?php
/**
* @file
* Module implementing a field-collection views formatter.
*/
/**
* Implements hook_field_formatter_info().
*/
function field_collection_views_field_formatter_info() {
return array(
'field_collection_views_view' => array(
'label' => t('Views field-collection items'),
'field types' => array(
'field_collection',
),
'settings' => array(
'name' => 'field_collection_view',
'display_id' => 'default',
'add' => t('Add'),
),
),
);
}
/**
* Implements hook_field_formatter_view().
*/
function field_collection_views_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
$element = array();
$settings = $display['settings'];
switch ($display['type']) {
case 'field_collection_views_view':
$args = '';
$i = 1;
foreach ($items as $delta => $item) {
if ($i == 1) {
$args .= $item['value'];
}
else {
$args .= '+' . $item['value'];
}
$i++;
}
$view_name = isset($settings['name']) ? $settings['name'] : 'field_collection_view';
$display_id = isset($settings['display_id']) ? $settings['display_id'] : 'default';
$entity_uri = entity_uri($entity_type, $entity);
$entity_uri = $entity_uri['path'];
$field_path = 'field-collection/' . strtr($field['field_name'], array(
'_' => '-',
));
$add_path = $field_path . '/add/' . $entity_uri;
$content = views_embed_view($view_name, $display_id, $args, $add_path);
$element[0] = array(
'#markup' => $content,
);
if (empty($items)) {
field_collection_field_formatter_links($element, $entity_type, $entity, $field, $instance, $langcode, $items, $display);
}
break;
}
return $element;
}
/**
* Implements hook_field_formatter_settings_form().
*/
function field_collection_views_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
$display = $instance['display'][$view_mode];
$settings = isset($form_state['values']['fields'][$field['field_name']]['settings_edit_form']) ? $form_state['values']['fields'][$field['field_name']]['settings_edit_form']['settings'] : $display['settings'];
$views = array(
'' => t('-- Please select --'),
) + _field_collection_views_get_views();
$views_keys = array_keys($views);
$selected_view = isset($settings['name']) ? $settings['name'] : (isset($views_keys[0]) ? $views_keys[0] : '');
$elements['name'] = array(
'#type' => 'select',
'#title' => t('Select a view'),
'#options' => $views,
'#default_value' => $selected_view,
//'#description' => t('The machine name of the view to embed.'),
'#ajax' => array(
'event' => 'change',
'callback' => '_field_collection_views_views_dropdown_callback',
'wrapper' => 'views-replace',
),
);
$elements['display_id'] = array(
'#prefix' => '<div id="views-replace">',
'#suffix' => '</div>',
'#type' => 'select',
'#title' => t('Display'),
'#options' => _field_collection_views_get_views_displays($selected_view),
'#default_value' => isset($settings['display_id']) ? $settings['display_id'] : '',
);
$elements['add'] = array(
'#type' => 'textfield',
'#title' => t('Add link title'),
'#default_value' => $settings['add'],
'#description' => t('Leave the title empty, to hide the link.'),
);
return $elements;
}
/**
* Implements hook_field_formatter_settings_summary().
*/
function field_collection_views_field_formatter_settings_summary($field, $instance, $view_mode) {
$display = $instance['display'][$view_mode];
$settings = $display['settings'];
$links = array_filter(array_intersect_key($settings, array_flip(array(
'name',
'display_id',
))));
if ($links) {
return '<em>Embed View:</em> ' . check_plain(implode(', ', $links));
}
else {
return t('Not showing any view.');
}
}
/**
* Implements hook_views_api().
*/
function field_collection_views_views_api() {
return array(
'api' => 3,
'path' => drupal_get_path('module', 'field_collection_views') . '/views',
);
}
/**
* Ajax callback, triggered when view is changed.
*/
function _field_collection_views_views_dropdown_callback($form, $form_state) {
$location = $form_state['triggering_element']['#array_parents'];
array_pop($location);
$location[] = 'display_id';
$item = drupal_array_get_nested_value($form, $location);
return $item;
}
/**
* Helper function to get all views.
*/
function _field_collection_views_get_views() {
$enabled_views = array();
$views = views_get_enabled_views();
foreach ($views as $view) {
if ($view->base_table == 'field_collection_item') {
$enabled_views[$view->name] = $view->name;
}
}
ksort($enabled_views);
return $enabled_views;
}
/**
* Helper function to get all view displays.
*/
function _field_collection_views_get_views_displays($view_name) {
if (empty($view_name)) {
// No view.
return array();
}
$views = views_get_enabled_views();
if (!isset($views[$view_name])) {
return array();
}
$view = $views[$view_name];
if (empty($view->display)) {
// This view is broken.
return array();
}
foreach ($view->display as $id => $display) {
$displays[$id] = $id . ': ' . $display->display_title;
}
return $displays;
}
Functions
Name | Description |
---|---|
field_collection_views_field_formatter_info | Implements hook_field_formatter_info(). |
field_collection_views_field_formatter_settings_form | Implements hook_field_formatter_settings_form(). |
field_collection_views_field_formatter_settings_summary | Implements hook_field_formatter_settings_summary(). |
field_collection_views_field_formatter_view | Implements hook_field_formatter_view(). |
field_collection_views_views_api | Implements hook_views_api(). |
_field_collection_views_get_views | Helper function to get all views. |
_field_collection_views_get_views_displays | Helper function to get all view displays. |
_field_collection_views_views_dropdown_callback | Ajax callback, triggered when view is changed. |