X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Fviews%2Fsrc%2FPlugin%2Fviews%2Fjoin%2FFieldOrLanguageJoin.php;fp=web%2Fcore%2Fmodules%2Fviews%2Fsrc%2FPlugin%2Fviews%2Fjoin%2FFieldOrLanguageJoin.php;h=44734d450e34992b8b0f63ee9795d2f5367a06a2;hp=0000000000000000000000000000000000000000;hb=9917807b03b64faf00f6a1f29dcb6eafc454efa5;hpb=aea91e65e895364e460983b890e295aa5d5540a5 diff --git a/web/core/modules/views/src/Plugin/views/join/FieldOrLanguageJoin.php b/web/core/modules/views/src/Plugin/views/join/FieldOrLanguageJoin.php new file mode 100644 index 000000000..44734d450 --- /dev/null +++ b/web/core/modules/views/src/Plugin/views/join/FieldOrLanguageJoin.php @@ -0,0 +1,106 @@ + '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)"; + } + } + +}