definition['relationship table'])) { $this->table = $this->definition['relationship table']; } if (isset($this->definition['relationship field'])) { // Set both realField and field so custom handler can rely on the old // field value. $this->realField = $this->field = $this->definition['relationship field']; } } /** * {@inheritdoc} */ public function usesGroupBy() { return FALSE; } /** * {@inheritdoc} */ protected function defineOptions() { $options = parent::defineOptions(); // Relationships definitions should define a default label, but if they // aren't get another default value. if (!empty($this->definition['label'])) { // Cast the label to a string since it is an object. // @see \Drupal\Core\StringTranslation\TranslatableMarkup $label = (string) $this->definition['label']; } else { $label = !empty($this->definition['field']) ? $this->definition['field'] : $this->definition['base field']; } $options['admin_label']['default'] = $label; $options['required'] = ['default' => FALSE]; return $options; } /** * {@inheritdoc} */ public function buildOptionsForm(&$form, FormStateInterface $form_state) { parent::buildOptionsForm($form, $form_state); unset($form['admin_label']['#fieldset']); $form['admin_label']['#weight'] = -1; $form['required'] = [ '#type' => 'checkbox', '#title' => $this->t('Require this relationship'), '#description' => $this->t('Enable to hide items that do not contain this relationship'), '#default_value' => !empty($this->options['required']), ]; } /** * {@inheritdoc} */ public function query() { // Figure out what base table this relationship brings to the party. $table_data = Views::viewsData()->get($this->definition['base']); $base_field = empty($this->definition['base field']) ? $table_data['table']['base']['field'] : $this->definition['base field']; $this->ensureMyTable(); $def = $this->definition; $def['table'] = $this->definition['base']; $def['field'] = $base_field; $def['left_table'] = $this->tableAlias; $def['left_field'] = $this->realField; $def['adjusted'] = TRUE; if (!empty($this->options['required'])) { $def['type'] = 'INNER'; } if (!empty($this->definition['extra'])) { $def['extra'] = $this->definition['extra']; } if (!empty($def['join_id'])) { $id = $def['join_id']; } else { $id = 'standard'; } $join = Views::pluginManager('join')->createInstance($id, $def); // use a short alias for this: $alias = $def['table'] . '_' . $this->table; $this->alias = $this->query->addRelationship($alias, $join, $this->definition['base'], $this->relationship); // Add access tags if the base table provide it. if (empty($this->query->options['disable_sql_rewrite']) && isset($table_data['table']['base']['access query tag'])) { $access_tag = $table_data['table']['base']['access query tag']; $this->query->addTag($access_tag); } } /** * {@inheritdoc} */ public function calculateDependencies() { $dependencies = parent::calculateDependencies(); // Add the provider of the relationship's base table to the dependencies. $table_data = $this->getViewsData()->get($this->definition['base']); $dependencies['module'][] = $table_data['table']['provider']; return $dependencies; } } /** * @} */