/** * Implements Drupal\field\Plugin\Type\Formatter\FormatterInterface::viewElements(). * * * Useful values: * * $entity->date_id * If set, this will show only an individual date on a field with * multiple dates. The value should be a string that contains * the following values, separated with periods: * - module name of the module adding the item * - node nid * - field name * - delta value of the field to be displayed * - other information the module's custom theme might need * * Used by the calendar module and available for other uses. * example: 'date:217:field_date:3:test' * * $entity->date_repeat_show * If true, tells the theme to show all the computed values * of a repeating date. If not true or not set, only the * start date and the repeat rule will be displayed. */ public function viewElements(EntityInterface $entity, $langcode, array $items) { $field = $this->field; $instance = $this->instance; $settings = $this->settings; $view_mode = $this->viewMode; $weight = $this->weight; $label = $this->label; $definition = $this->getDefinition(); $formatter = $definition['id']; $elements = array(); $variables = array('entity' => $entity, 'field' => $field, 'instance' => $instance, 'langcode' => $langcode, 'items' => $items, 'dates' => array(), 'attributes' => array(), 'rdf_mapping' => array(), 'add_rdf' => module_exists('rdf')); // If there is an RDf mapping for this date field, pass it down to the theme. $rdf_mapping = array(); if (!empty($entity->rdf_mapping) && function_exists('rdf_rdfa_attributes')) { if (!empty($entity->rdf_mapping[$field['field_name']])) { $variables['rdf_mapping'] = $rdf_mapping = $entity->rdf_mapping[$field['field_name']]; } } // Give other modules a chance to prepare the entity before formatting it. drupal_alter('date_formatter_pre_view', $entity, $variables); // See if we are only supposed to display a selected // item from multiple value date fields. $selected_deltas = array(); if (!empty($entity->date_id)) { foreach ((array) $entity->date_id as $key => $id) { list($module, $nid, $field_name, $selected_delta, $other) = explode('.', $id . '.'); if ($field_name == $field['field_name']) { $selected_deltas[] = $selected_delta; } } } foreach ($items as $delta => $item) { if (!empty($entity->date_id) && !in_array($delta, $selected_deltas)) { continue; } else { $variables['delta'] = $delta; $variables['item'] = $item; $variables['dates'] = date_formatter_process($formatter, $entity, $field, $instance, $langcode, $item, $settings); $variables['attributes'] = !empty($rdf_mapping) ? rdf_rdfa_attributes($rdf_mapping, $item['value']) : array(); $output = theme('date_display_combination', $variables); if (!empty($output)) { $elements[$delta] = array('#markup' => $output); } } } return $elements; }
/** * Helper function to test attribute generation. * * @param array $expected_attributes * The expected return of rdf_rdfa_attributes. * @param array $field_mapping * The field mapping to merge into the RDF mapping config. * @param mixed $data * The data to pass into the datatype callback, if specified. */ protected function _testAttributes($expected_attributes, $field_mapping, $data = NULL) { $mapping = rdf_get_mapping('node', 'article')->setFieldMapping('field_test', $field_mapping)->getPreparedFieldMapping('field_test'); $attributes = rdf_rdfa_attributes($mapping, $data); ksort($expected_attributes); ksort($attributes); $this->assertEqual($expected_attributes, $attributes); }