usesFields; } /** * {@inheritdoc} */ protected function defineOptions() { $options = parent::defineOptions(); if (isset($this->base_table)) { $options['relationship'] = ['default' => 'none']; } return $options; } /** * Provide a form for setting options. */ public function buildOptionsForm(&$form, FormStateInterface $form_state) { parent::buildOptionsForm($form, $form_state); if (isset($this->base_table)) { $executable = $form_state->get('view')->getExecutable(); // A whole bunch of code to figure out what relationships are valid for // this item. $relationships = $executable->display_handler->getOption('relationships'); $relationship_options = []; foreach ($relationships as $relationship) { $relationship_handler = Views::handlerManager('relationship')->getHandler($relationship); // If this relationship is valid for this type, add it to the list. $data = Views::viewsData()->get($relationship['table']); $base = $data[$relationship['field']]['relationship']['base']; if ($base == $this->base_table) { $relationship_handler->init($executable, $relationship); $relationship_options[$relationship['id']] = $relationship_handler->adminLabel(); } } if (!empty($relationship_options)) { $relationship_options = array_merge(['none' => $this->t('Do not use a relationship')], $relationship_options); $rel = empty($this->options['relationship']) ? 'none' : $this->options['relationship']; if (empty($relationship_options[$rel])) { // Pick the first relationship. $rel = key($relationship_options); } $form['relationship'] = [ '#type' => 'select', '#title' => $this->t('Relationship'), '#options' => $relationship_options, '#default_value' => $rel, ]; } else { $form['relationship'] = [ '#type' => 'value', '#value' => 'none', ]; } } } /** * Validate the options form. */ public function validateOptionsForm(&$form, FormStateInterface $form_state) {} /** * Perform any necessary changes to the form values prior to storage. * There is no need for this function to actually store the data. */ public function submitOptionsForm(&$form, FormStateInterface $form_state) {} /** * {@inheritdoc} */ public function query() { if (isset($this->base_table)) { if (isset($this->options['relationship']) && isset($this->view->relationship[$this->options['relationship']])) { $relationship = $this->view->relationship[$this->options['relationship']]; $this->field_alias = $this->view->query->addField($relationship->alias, $this->base_field); } else { $this->field_alias = $this->view->query->addField($this->base_table, $this->base_field); } } } /** * Allow the style to do stuff before each row is rendered. * * @param $result * The full array of results from the query. */ public function preRender($result) {} /** * 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) { return [ '#theme' => $this->themeFunctions(), '#view' => $this->view, '#options' => $this->options, '#row' => $row, '#field_alias' => isset($this->field_alias) ? $this->field_alias : '', ]; } } /** * @} */