'field_or_language_join', * 'table' => 'node__field_tags', * 'left_field' => 'nid', * 'field' => 'entity_id', * 'extra' => [ * [ * 'field' => 'deleted', * 'value' => 0, * 'numeric' => TRUE, * ], * [ * 'left_field' => 'langcode', * 'field' => 'langcode', * ], * [ * 'field' => 'bundle', * 'value' => ['news', 'page'], * ], * ], * ]; * @endcode * * The resulting join condition for this example would be the following: * * @code * ON node__field_tags.deleted = 0 * AND ( * node_field_data.langcode = node__field_tags.langcode * OR node__field.tags.bundle IN ['news', 'page'] * ) * @endcode * * @see views_field_default_views_data() * * @ingroup views_join_handlers * * @ViewsJoin("field_or_language_join") */ class FieldOrLanguageJoin extends JoinPluginBase { /** * {@inheritdoc} */ protected function joinAddExtra(&$arguments, &$condition, $table, SelectInterface $select_query, $left_table = NULL) { if (empty($this->extra)) { return; } if (is_array($this->extra)) { $extras = []; foreach ($this->extra as $extra) { $extras[] = $this->buildExtra($extra, $arguments, $table, $select_query, $left_table); } // Remove and store the langcode OR bundle join condition extra. $language_bundle_conditions = []; foreach ($extras as $key => $extra) { if (strpos($extra, '.langcode') !== FALSE || strpos($extra, '.bundle') !== FALSE) { $language_bundle_conditions[] = $extra; unset($extras[$key]); } } if (count($extras) > 1) { $condition .= ' AND (' . implode(' ' . $this->extraOperator . ' ', $extras) . ')'; } elseif ($extras) { $condition .= ' AND ' . array_shift($extras); } // Tack on the langcode OR bundle join condition extra. if (!empty($language_bundle_conditions)) { $condition .= ' AND (' . implode(' OR ', $language_bundle_conditions) . ')'; } } elseif (is_string($this->extra)) { $condition .= " AND ($this->extra)"; } } }