class IcalFieldsWizard in Views iCal 8
The 'Ical Fields' row plugin
This displays fields one after another, giving options for inline or not.
Plugin annotation
@ViewsRow(
  id = "ical_fields_wizard",
  title = @Translation("iCal fields row wizard"),
  help = @Translation("Generate ical events with the iCal library."),
  theme = "views_view_ical_fields",
  display_types = {"feed"}
)
Hierarchy
- class \Drupal\Component\Plugin\PluginBase implements DerivativeInspectionInterface, PluginInspectionInterface- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait- class \Drupal\views\Plugin\views\PluginBase implements DependentPluginInterface, ContainerFactoryPluginInterface, TrustedCallbackInterface, ViewsPluginInterface- class \Drupal\views\Plugin\views\row\RowPluginBase- class \Drupal\views\Plugin\views\row\Fields- class \Drupal\views_ical\Plugin\views\row\IcalFieldsWizard
 
 
- class \Drupal\views\Plugin\views\row\Fields
 
- class \Drupal\views\Plugin\views\row\RowPluginBase
 
- class \Drupal\views\Plugin\views\PluginBase implements DependentPluginInterface, ContainerFactoryPluginInterface, TrustedCallbackInterface, ViewsPluginInterface
 
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
Expanded class hierarchy of IcalFieldsWizard
File
- src/Plugin/ views/ row/ IcalFieldsWizard.php, line 40 
- Contains \Drupal\views_ical\Plugin\views\row\Fields.
Namespace
Drupal\views_ical\Plugin\views\rowView source
class IcalFieldsWizard extends Fields {
  // What is the point of this?
  /**
   * Render a row object. This usually passes through to a theme template
   * of some form, but not always.
   *
   * @param object $row
   *   A single row of the query result, so an element of $view->result.
   *
   * @return string
   *   The rendered output of a single row, used by the style plugin.
   */
  public function render($row) {
    $renderer = $this
      ->getRenderer();
    $style = $this->view
      ->getStyle();
    $style_options = $style->options;
    /** @var \Drupal\Core\Field\FieldDefinitionInterface[] $field_storage_definitions */
    //    $field_storage_definitions = $style->entityFieldManager->getFieldStorageDefinitions($this->view->field[$options['date_field']]->definition['entity_type']);
    $entity_field_manager = $style
      ->getEntityFieldManager();
    if (!isset($style_options['date_field'])) {
      // If this is not set for some reason (dev is just starting out to create
      // a view?), don't try to render. We can't have an event without a date.
      return;
    }
    $field_storage_definitions = $entity_field_manager
      ->getFieldStorageDefinitions($this->view->field[$style_options['date_field']]->definition['entity_type']);
    //$date_field = $this->view->field[$options['date_field']];
    $date_field_definition = $field_storage_definitions[$this->view->field[$style_options['date_field']]->definition['field_name']];
    /** @var string $date_field_type */
    $date_field_type = $date_field_definition
      ->getType();
    $events = [];
    $user_timezone = \date_default_timezone_get();
    // Make sure the events are made as per the configuration in view.
    /** @var string $timezone_override */
    $timezone_override = $this->view->field[$style_options['date_field']]->options['settings']['timezone_override'];
    if ($timezone_override) {
      $timezone = new \DateTimeZone($timezone_override);
    }
    else {
      $timezone = new \DateTimeZone($user_timezone);
    }
    // Use date_recur's API to generate the events.
    // Recurring events will be automatically handled here.
    if ($date_field_type === 'date_recur') {
      $this
        ->addDateRecurEvent($events, $row, $timezone, $style_options);
    }
    else {
      if ($date_field_type === 'datetime') {
        $this
          ->addDateTimeEvent($events, $row, $timezone, $style_options);
      }
      else {
        if ($date_field_type === 'daterange') {
          // TODO: are date ranges separate date field types?
          $this
            ->addDateRangeEvent($events, $row, $timezone, $style_options);
        }
        else {
          if ($date_field_type === 'daterange_all_day') {
            throw new \Exception('daterange_all_day fields not supported.');
            //$this->helper->addEvent($events, $row , $timezone, $this->options);
          }
          else {
            if ($date_field_type === 'smartdate') {
              $this
                ->addSmartDateEvent($events, $row, $timezone, $style_options);
            }
          }
        }
      }
    }
    $calendar = $this->view
      ->getStyle()
      ->getCalendar();
    if (!empty($events)) {
      foreach ($events as $event) {
        if ($event) {
          $calendar
            ->addComponent($event);
        }
      }
    }
    return [
      '#theme' => $this
        ->themeFunctions(),
      '#view' => $this->view,
      '#options' => $this->options,
      '#row' => $row,
      '#field_alias' => isset($this->field_alias) ? $this->field_alias : '',
      '#event' => $events,
    ];
  }
  /**
   * Creates an event with default data.
   *
   * Event summary, location and description are set as defaults.
   *
   * @param \Drupal\Core\Entity\ContentEntityInterface $entity
   *   The entity to be used for default data.
   * @param array $field_mapping
   *   Views field option and entity field name mapping.
   *   Example:
   *   [
   *     'date_field' => 'field_event_date',
   *     'summary_field' => 'field_event_summary',
   *     'description_field' => 'field_event_description',
   *   ]
   *   End of example.
   *  @param \Drupal\views\ResultRow $row
   *    The values retrieved from a single row of a view's query result.
   *
   * @return \Eluceo\iCal\Component\Event
   *   A new event.
   *
   * @see \Drupal\views_ical\Plugin\views\style\Ical::defineOptions
   */
  protected function createDefaultEvent(ContentEntityInterface $entity, array $field_mapping, ResultRow $row) : Event {
    if (isset($field_mapping['uid_field']) && ($field_mapping['uid_field'] == 'nid' || $field_mapping['uid_field'] == 'nothing')) {
      // If the Uid field is the nid, access with the id method.
      $uid = $entity
        ->id();
      if (isset($this->view->field[$field_mapping['uid_field']]->options['alter']['alter_text']) && $this->view->field[$field_mapping['uid_field']]->options['alter']['alter_text']) {
        // I need rewrite of the UID field to happen here.
        // This is really hacky, It would be really nice to find a way to render as the row.
        $alter_text = $this->view->field[$field_mapping['uid_field']]->options['alter']['text'];
        $fields = array_keys($this->view->field);
        foreach ($fields as $field) {
          if ($entity
            ->hasField($field)) {
            if ($entity
              ->get($field)
              ->getDataDefinition()
              ->getType() == 'created') {
              $settings = $this->view->field['created']->options['settings'];
              [
                'custom_date_format',
              ];
              if ($settings['date_format'] == 'custom') {
                $field_value = \Drupal::service('date.formatter')
                  ->format($entity
                  ->get($field)
                  ->getString(), 'custom', $settings['custom_date_format']);
              }
              else {
                $field_value = \Drupal::service('date.formatter')
                  ->format($entity
                  ->get($field)
                  ->getString(), $settings['date_format']);
              }
            }
            else {
              $field_value = $entity
                ->get($field)
                ->getString();
            }
            $alter_text = str_replace("{{ {$field} }}", $field_value, $alter_text);
          }
        }
        $uid = $alter_text;
      }
    }
    else {
      if (isset($field_mapping['uid_field']) && $field_mapping['uid_field'] != 'none' && $entity
        ->hasField($field_mapping['uid_field']) && !$entity
        ->get($field_mapping['uid_field'])
        ->isEmpty()) {
        $uid = $entity
          ->get($field_mapping['uid_field'])
          ->getString();
      }
      else {
        $uid = null;
      }
    }
    $event = new Event($uid);
    // Summary field.
    if (isset($field_mapping['summary_field']) && isset($this->view->field[$field_mapping['summary_field']])) {
      // TODO: We repeat something similar to this 3 times. I like my code like I like my wine, DRY.
      $renderer = $this
        ->getRenderer();
      $summaryField = $entity->{$field_mapping['summary_field']}
        ->view();
      if ($renderer
        ->hasRenderContext()) {
        $html = $renderer
          ->render($summaryField);
      }
      else {
        $html = $renderer
          ->renderPlain($summaryField);
      }
      $html = new Html2Text((string) $html);
      $event
        ->setSummary($html
        ->getText());
    }
    // URL field
    if (isset($field_mapping['url_field']) && $entity
      ->hasField($field_mapping['url_field'])) {
      if ($field_mapping['url_field'] == 'body' && !$entity
        ->get('body')
        ->isEmpty()) {
        $url = $entity
          ->get('body')
          ->getValue()[0]['value'];
        $event
          ->setUrl($url);
      }
      else {
        $url = $entity
          ->get($field_mapping['url_field'])
          ->getValue()[0]['uri'];
        $event
          ->setUrl($url);
      }
    }
    // Rrule field.
    if (isset($field_mapping['rrule_field'])) {
      if ($field_mapping['rrule_field'] == 'body') {
        $rrule = $entity
          ->get('body')
          ->getValue()[0]['value'];
        $event
          ->addRecurrenceRule($rrule);
      }
      else {
        $helper = $entity->field_recur[0]
          ->getHelper();
        $rrules = $helper
          ->getRules();
        $exdates = $helper
          ->getExcluded();
        // Parse EXDATEs.
        if ($exdates) {
          foreach ($exdates as $exdate) {
            if ($exdate) {
              $event
                ->addExDate($exdate);
            }
          }
        }
        // Calculate 2 years from today for limiting infinitely recurring dates.
        $two_years_out = date('c', strtotime('+2 years'));
        // Parse rrules into usable bits.
        foreach ($rrules as $key => $rule) {
          $parts = $rule
            ->getParts() ?? '';
          $frequency = $parts['FREQ'] ?? '';
          $byday = $parts['BYDAY'] ?? '';
          $until = $parts['UNTIL'] ?? date_create($two_years_out);
          $count = $parts['COUNT'] ?? '';
          $interval = $parts['INTERVAL'] ?? '';
          // Set recurrence rule
          $recurrenceRule = new RecurrenceRule();
          if ($frequency) {
            $recurrenceRule
              ->setFreq($frequency);
          }
          if ($byday) {
            $recurrenceRule
              ->setByDay($byday);
          }
          if ($until) {
            $recurrenceRule
              ->setUntil($until);
          }
          if ($count) {
            $recurrenceRule
              ->setCount($count);
          }
          if ($interval) {
            $recurrenceRule
              ->setInterval($interval);
          }
          $event
            ->addRecurrenceRule($recurrenceRule);
        }
      }
    }
    // URL field
    if (isset($field_mapping['url_field']) && $entity
      ->hasField($field_mapping['url_field'])) {
      if ($field_mapping['url_field'] == 'body' && !$entity
        ->get('body')
        ->isEmpty()) {
        $url = $entity
          ->get('body')
          ->getValue()[0]['value'];
        $event
          ->setUrl($url);
      }
      else {
        $url = $entity
          ->get($field_mapping['url_field'])
          ->getValue()[0]['uri'] ?? '';
        $event
          ->setUrl($url);
      }
    }
    // Location field
    if (isset($field_mapping['location_field']) && isset($this->view->field[$field_mapping['location_field']])) {
      $locationField = $entity->{$field_mapping['location_field']}
        ->view();
      if ($renderer
        ->hasRenderContext()) {
        $html = $renderer
          ->render($locationField);
      }
      else {
        $html = $renderer
          ->renderPlain($locationField);
      }
      $html = new Html2Text((string) $html);
      $event
        ->setLocation($html
        ->getText());
    }
    // Description field
    if (isset($field_mapping['description_field']) && isset($this->view->field[$field_mapping['description_field']])) {
      $descriptionField = $entity->{$field_mapping['description_field']}
        ->view();
      if ($renderer
        ->hasRenderContext()) {
        $html = $renderer
          ->render($descriptionField);
      }
      else {
        $html = $renderer
          ->renderPlain($descriptionField);
      }
      $html = new Html2Text((string) $html);
      $event
        ->setDescription($html
        ->getText());
    }
    // Transparency - This isn't a real field, but a default setting applied to all events.
    if (isset($field_mapping['default_transparency']) && $field_mapping['default_transparency']) {
      if ($field_mapping['default_transparency'] == Event::TIME_TRANSPARENCY_OPAQUE) {
        $event
          ->setTimeTransparency(Event::TIME_TRANSPARENCY_OPAQUE);
      }
      else {
        $event
          ->setTimeTransparency(Event::TIME_TRANSPARENCY_TRANSPARENT);
      }
    }
    $event
      ->setUseTimezone(TRUE);
    return $event;
  }
  /**
   * Create an event based on a daterange field.
   *
   * @param array $events
   * @param \Drupal\Core\Entity\ContentEntityInterface $entity
   * @param \DateTimeZone $timezone
   * @param array $field_mapping
   */
  public function addDateRangeEvent(array &$events, ResultRow $row, \DateTimeZone $timezone, array $field_mapping) : void {
    $entity = $this
      ->getEntity($row);
    $utc_timezone = new \DateTimeZone('UTC');
    $datefield_values = $entity
      ->get($field_mapping['date_field'])
      ->getValue();
    // TODO: make these separate functions
    // Loop over the values to support multiple cardinality dates, which can
    // represent multiple events.
    foreach ($entity
      ->get($field_mapping['date_field'])
      ->getValue() as $date_entry) {
      // generate the event.
      $event = $this
        ->createDefaultEvent($entity, $field_mapping, $row);
      // Set the start time
      $start_datetime = new \DateTime($date_entry['value'], $utc_timezone);
      $start_datetime
        ->setTimezone($timezone);
      $event
        ->setDtStart($start_datetime);
      // Loop over field values so we can support daterange fields with multiple cardinality.
      if (!empty($date_entry['end_value'])) {
        $end_datetime = new \DateTime($date_entry['end_value'], $utc_timezone);
        $end_datetime
          ->setTimezone($timezone);
        $event
          ->setDtEnd($end_datetime);
        // If this is a date_all_day field, pull the all day option from that.
        if ($date_all_day = false) {
          // TODO: implement
        }
        else {
          if (isset($field_mapping['no_time_field']) && $field_mapping['no_time_field'] != 'none') {
            $all_day = $entity
              ->get($field_mapping['no_time_field'])
              ->getValue();
            if ($all_day && isset($all_day[0]['value']) && $all_day[0]['value']) {
              $event
                ->setNoTime(true);
            }
          }
        }
      }
      //else {
      // is DTEND is not a required field, but if it is not included, nor
      // is duration (which we are not using here), then the event's duration
      // is taken to be one day. But do we need to explicitly define that here?
      // Do calendar apps handle that? https://tools.ietf.org/html/rfc5545#section-3.6.1
      //}
      $events[] = $event;
    }
  }
  /**
   * Create an event based on a datetime field
   *
   * @param array $events
   * @param \Drupal\Core\Entity\ContentEntityInterface $entity
   * @param \DateTimeZone $timezone
   * @param array $field_mapping
   */
  public function addDateTimeEvent(array &$events, ResultRow $row, \DateTimeZone $timezone, array $field_mapping) : void {
    $entity = $this
      ->getEntity($row);
    $utc_timezone = new \DateTimeZone('UTC');
    $datefield_values = $entity
      ->get($field_mapping['date_field'])
      ->getValue();
    // If an end date field was defined, then the content model is most likely
    // using two, single cardinality fields for a start and an end date.
    if (isset($field_mapping['end_date_field']) && $field_mapping['end_date_field'] != 'none') {
      // generate the event
      $event = $this
        ->createDefaultEvent($entity, $field_mapping, $row);
      // set the start time.
      $date_entry = $datefield_values[0];
      $start_datetime = new \DateTime($date_entry['value'], $utc_timezone);
      $start_datetime
        ->setTimezone($timezone);
      $event
        ->setDtStart($start_datetime);
      // Set the end time
      $end_date_field_values = $entity
        ->get($field_mapping['end_date_field'])
        ->getValue();
      $end_date_entry = $end_date_field_values[0];
      $end_datetime = new \DateTime($end_date_entry['value'], $utc_timezone);
      $end_datetime
        ->setTimezone($timezone);
      $event
        ->setDtEnd($end_datetime);
      // All day events.
      if (isset($field_mapping['no_time_field']) && $field_mapping['no_time_field'] != 'none') {
        $all_day = $entity
          ->get($field_mapping['no_time_field'])
          ->getValue();
        if ($all_day && isset($all_day[0]['value']) && $all_day[0]['value']) {
          $event
            ->setNoTime(TRUE);
        }
      }
      $events[] = $event;
    }
  }
  /**
   * Create an event based on a smartdate field.
   *
   * @param array $events
   *   The array of events that will be output.
   * @param \Drupal\Core\Entity\ContentEntityInterface $row
   *   The views result being processed.
   * @param \DateTimeZone $timezone
   *   A timezone object to use for output.
   * @param array $fieldMapping
   *   An array of mappings to specify which entity fields to use for output.
   */
  public function addSmartDateEvent(array &$events, \Drupal\views\ResultRow $row, \DateTimeZone $timezone, array $fieldMapping) : void {
    $entity = $this
      ->getEntity($row);
    $datefieldValues = $entity
      ->get($fieldMapping['date_field'])
      ->getValue();
    $processed_rules = [];
    foreach ($datefieldValues as $delta => $datefieldValue) {
      $dateValue = $datefieldValues[$delta]['value'];
      $dateEndValue = $datefieldValues[$delta]['end_value'];
      $dateRrule = $datefieldValues[$delta]['rrule'];
      $dateTZ = $datefieldValues[$delta]['timezone'] ?: $timezone;
      if (in_array($dateRrule, $processed_rules)) {
        continue;
      }
      // Generate the event.
      $event = $this
        ->createDefaultEvent($entity, $fieldMapping, $row);
      // Set the start time.
      $startDatetime = new \DateTime();
      $startDatetime
        ->setTimestamp(trim($dateValue));
      $startDatetime
        ->setTimezone($dateTZ);
      $event
        ->setDtStart($startDatetime);
      // Set the end time.
      $endDatetime = new \DateTime();
      $endDatetime
        ->setTimestamp(trim($dateEndValue));
      $endDatetime
        ->setTimezone($dateTZ);
      $event
        ->setDtEnd($endDatetime);
      // Can the date be considered all-day?
      if (SmartDateTrait::isAllDay($startDatetime
        ->getTimestamp(), $endDatetime
        ->getTimestamp(), $dateTZ)) {
        $event
          ->setNoTime(TRUE);
      }
      // Determine recurring rules.
      if ($dateRrule) {
        $smartDateRrule = SmartDateRule::load($dateRrule);
        // Gets the rule text.
        $recurRuleObject = $smartDateRrule
          ->getAssembledRule();
        // eluceo/ical has functionality to support recurring rules, however,
        // that appears to require that we parse our already ical formatted rule
        // into components, and feed them into methods to set each one.
        // So for us it's more convenient to set it as a custom property.
        $icalRrule = new RecurrenceRule();
        if ($recurRuleObject
          ->getFreq()) {
          $freqId = $recurRuleObject
            ->getFreq();
          // Recurr/Rule stores freqs as numbers 0 - 6. We need to convert it
          // back to a string. There has to be something that does this for us...
          $freqsArray = [
            0 => 'YEARLY',
            1 => 'MONTHLY',
            2 => 'WEEKLY',
            3 => 'DAILY',
            4 => 'HOURLY',
            5 => 'MINUTELY',
            6 => 'SECONDLY',
          ];
          $freq = $freqsArray[$freqId];
          $icalRrule
            ->setFreq($freq);
        }
        if ($recurRuleObject
          ->getInterval()) {
          $icalRrule
            ->setInterval($recurRuleObject
            ->getInterval());
        }
        if ($recurRuleObject
          ->getCount()) {
          $icalRrule
            ->setCount($recurRuleObject
            ->getCount());
        }
        if ($recurRuleObject
          ->getByDay()) {
          $icalRrule
            ->setByDay(implode(',', $recurRuleObject
            ->getByDay()));
        }
        if ($recurRuleObject
          ->getUntil()) {
          $icalRrule
            ->setUntil($recurRuleObject
            ->getUntil());
        }
        $event
          ->setRecurrenceRule($icalRrule);
      }
      $events[] = $event;
    }
  }
  /**
   * {@inheritdoc}
   */
  public function addEvent(array &$events, ResultRow $row, \DateTimeZone $timezone, array $field_mapping) : void {
    // All code moved to field-specific methods.
  }
  /**
   * {@inheritdoc}
   */
  public function addDateRecurEvent(array &$events, ResultRow $row, \DateTimeZone $timezone, array $field_mapping) : void {
    /** @var \Drupal\date_recur\Plugin\Field\FieldType\DateRecurItem[] $field_items */
    $entity = $this
      ->getEntity($row);
    $field_items = $entity->{$field_mapping['date_field']};
    foreach ($field_items as $index => $item) {
      /** @var \Drupal\date_recur\DateRange[] $occurrences */
      $occurrences = $item
        ->getHelper()
        ->getOccurrences();
      $future_events = [];
      foreach ($occurrences as $occurrence) {
        $event = $this
          ->createDefaultEvent($entity, $field_mapping, $row);
        /** @var \DateTime $start_datetime */
        $start_datetime = $occurrence
          ->getStart();
        $start_datetime
          ->setTimezone($timezone);
        $event
          ->setDtStart($start_datetime);
        /** @var \DateTime $end_datetime */
        $end_datetime = $occurrence
          ->getEnd();
        $end_datetime
          ->setTimezone($timezone);
        $event
          ->setDtEnd($end_datetime);
        $current_date = date_create();
        // Only include future occurrences and only the first one because we will rely on rrules.
        if ($start_datetime > $current_date) {
          $future_events[] = $event;
        }
      }
    }
    // We only want the soonest upcoming date in the case of recurring dates.
    array_reverse($future_events);
    $events[] = array_shift($future_events);
  }
  /**
   * Gets the entity for a corresponding row.
   *
   * @param \Drupal\views\ResultRow $row
   * @return \Drupal\Core\Entity\EntityInterface|null
   */
  public function getEntity($row) {
    if ($this->view->storage
      ->get('base_table') == 'node_field_data') {
      // TODO, Change how this is being accessed so it's not using private properties
      $entity = $row->_entity;
    }
    else {
      if ($this->view->storage
        ->get('base_table') == 'search_api_index_default_content_index') {
        $entity = $row->_object
          ->getValue();
      }
      else {
        throw new Exception('Base table type not supported. At the moment, Views iCal only supports nodes and Search API indexes');
      }
    }
    return $entity;
  }
  /**
   * Gets the renderer services.
   * @return \Drupal\Core\Render\RendererInterface|mixed
   */
  protected function getRenderer() {
    if (!isset($this->renderer)) {
      $this->renderer = \Drupal::service('renderer');
    }
    return $this->renderer;
  }
}Members
| Name   | Modifiers | Type | Description | Overrides | 
|---|---|---|---|---|
| DependencySerializationTrait:: | protected | property | An array of entity type IDs keyed by the property name of their storages. | |
| DependencySerializationTrait:: | protected | property | An array of service IDs keyed by property name used for serialization. | |
| DependencySerializationTrait:: | public | function | 1 | |
| DependencySerializationTrait:: | public | function | 2 | |
| Fields:: | protected | property | Does the row plugin support to add fields to its output. Overrides RowPluginBase:: | |
| Fields:: | public | function | Provide a form for setting options. Overrides RowPluginBase:: | 1 | 
| Fields:: | protected | function | Information about options for all kinds of purposes will be held here. Overrides RowPluginBase:: | 1 | 
| Fields:: | public | function | Perform any necessary changes to the form values prior to storage.
There is no need for this function to actually store the data. Overrides RowPluginBase:: | |
| IcalFieldsWizard:: | public | function | Create an event based on a daterange field. | |
| IcalFieldsWizard:: | public | function | ||
| IcalFieldsWizard:: | public | function | Create an event based on a datetime field | |
| IcalFieldsWizard:: | public | function | ||
| IcalFieldsWizard:: | public | function | Create an event based on a smartdate field. | |
| IcalFieldsWizard:: | protected | function | Creates an event with default data. | |
| IcalFieldsWizard:: | public | function | Gets the entity for a corresponding row. | |
| IcalFieldsWizard:: | protected | function | Gets the renderer services. Overrides PluginBase:: | |
| IcalFieldsWizard:: | public | function | Render a row object. This usually passes through to a theme template
of some form, but not always. Overrides RowPluginBase:: | |
| MessengerTrait:: | protected | property | The messenger. | 29 | 
| MessengerTrait:: | public | function | Gets the messenger. | 29 | 
| MessengerTrait:: | public | function | Sets the messenger. | |
| PluginBase:: | protected | property | Configuration information passed into the plugin. | 1 | 
| PluginBase:: | public | property | Plugins's definition | |
| PluginBase:: | public | property | The display object this plugin is for. | |
| PluginBase:: | public | property | Options for this plugin will be held here. | |
| PluginBase:: | protected | property | The plugin implementation definition. | 1 | 
| PluginBase:: | protected | property | The plugin_id. | |
| PluginBase:: | protected | property | Stores the render API renderer. | 3 | 
| PluginBase:: | public | property | The top object of a view. | 1 | 
| PluginBase:: | public | function | Calculates dependencies for the configured plugin. Overrides DependentPluginInterface:: | 14 | 
| PluginBase:: | public static | function | Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface:: | 62 | 
| PluginBase:: | constant | A string which is used to separate base plugin IDs from the derivative ID. | ||
| PluginBase:: | public | function | Clears a plugin. Overrides ViewsPluginInterface:: | 2 | 
| PluginBase:: | protected | function | Do the work to filter out stored options depending on the defined options. | |
| PluginBase:: | public | function | Filter out stored options depending on the defined options. Overrides ViewsPluginInterface:: | |
| PluginBase:: | public | function | Returns an array of available token replacements. Overrides ViewsPluginInterface:: | |
| PluginBase:: | public | function | Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface:: | |
| PluginBase:: | public | function | Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface:: | |
| PluginBase:: | public | function | Gets the definition of the plugin implementation. Overrides PluginInspectionInterface:: | 3 | 
| PluginBase:: | public | function | Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface:: | |
| PluginBase:: | public | function | Returns the plugin provider. Overrides ViewsPluginInterface:: | |
| PluginBase:: | public | function | Adds elements for available core tokens to a form. Overrides ViewsPluginInterface:: | |
| PluginBase:: | public | function | Returns a string with any core tokens replaced. Overrides ViewsPluginInterface:: | |
| PluginBase:: | constant | Include entity row languages when listing languages. | ||
| PluginBase:: | constant | Include negotiated languages when listing languages. | ||
| PluginBase:: | public | function | Initialize the plugin. Overrides ViewsPluginInterface:: | 8 | 
| PluginBase:: | public | function | Determines if the plugin is configurable. | |
| PluginBase:: | protected | function | Makes an array of languages, optionally including special languages. | |
| PluginBase:: | public | function | Return the human readable name of the display. Overrides ViewsPluginInterface:: | |
| PluginBase:: | public static | function | Moves form elements into fieldsets for presentation purposes. Overrides ViewsPluginInterface:: | |
| PluginBase:: | public static | function | Flattens the structure of form elements. Overrides ViewsPluginInterface:: | |
| PluginBase:: | public static | function | Returns substitutions for Views queries for languages. | |
| PluginBase:: | protected | function | Fills up the options of the plugin with defaults. | |
| PluginBase:: | public | function | Returns the summary of the settings in the display. Overrides ViewsPluginInterface:: | 6 | 
| PluginBase:: | public | function | Provide a full list of possible theme templates used by this style. Overrides ViewsPluginInterface:: | 1 | 
| PluginBase:: | public static | function | Lists the trusted callbacks provided by the implementing class. Overrides TrustedCallbackInterface:: | 6 | 
| PluginBase:: | public | function | Unpack options over our existing defaults, drilling down into arrays
so that defaults don't get totally blown away. Overrides ViewsPluginInterface:: | |
| PluginBase:: | public | function | Returns the usesOptions property. Overrides ViewsPluginInterface:: | 8 | 
| PluginBase:: | public | function | Validate that the plugin is correct and can be saved. Overrides ViewsPluginInterface:: | 6 | 
| PluginBase:: | protected | function | Replaces Views' tokens in a given string. The resulting string will be sanitized with Xss::filterAdmin. | 1 | 
| PluginBase:: | constant | Query string to indicate the site default language. | ||
| PluginBase:: | public | function | Constructs a PluginBase object. Overrides PluginBase:: | |
| RowPluginBase:: | protected | property | Denotes whether the plugin has an additional options form. Overrides PluginBase:: | 1 | 
| RowPluginBase:: | public | function | Allow the style to do stuff before each row is rendered. | 4 | 
| RowPluginBase:: | public | function | Add anything to the query that we might need to. Overrides PluginBase:: | 2 | 
| RowPluginBase:: | public | function | Returns the usesFields property. | 4 | 
| RowPluginBase:: | public | function | Validate the options form. Overrides PluginBase:: | 1 | 
| StringTranslationTrait:: | protected | property | The string translation service. | 1 | 
| StringTranslationTrait:: | protected | function | Formats a string containing a count of items. | |
| StringTranslationTrait:: | protected | function | Returns the number of plurals supported by a given language. | |
| StringTranslationTrait:: | protected | function | Gets the string translation service. | |
| StringTranslationTrait:: | public | function | Sets the string translation service to use. | 2 | 
| StringTranslationTrait:: | protected | function | Translates a string to the current language or to a given language. | |
| TrustedCallbackInterface:: | constant | Untrusted callbacks throw exceptions. | ||
| TrustedCallbackInterface:: | constant | Untrusted callbacks trigger silenced E_USER_DEPRECATION errors. | ||
| TrustedCallbackInterface:: | constant | Untrusted callbacks trigger E_USER_WARNING errors. | 
