drupal 8サイトで、paragraphsモジュールを使用しています。段落の1つに、オートコンプリートフィールドを含むフィールドがあります。コンテンツタイプの小さなリストを参照するように設定されています。たとえば、「ニュース、イベント、製品、画像」は、オートコンプリートで参照される4つです。
別の段落では、このオートコンプリートが含まれていますが、「コンテンツタイプの選択」というフィールドがあり、すべてのコンテンツタイプがリストされています。これはコンテンツタイプで使用されます。誰かが新しいコンテンツを追加すると、すべてのコンテンツタイプのリストがチェックボックスとオートコンプリートフィールドとして表示されます。
私の目標は、「コンテンツタイプの選択」フィールドから選択した結果のみをオートコンプリートフィールドに表示することです。
したがって、ユーザーが[コンテンツタイプを選択]フィールドから[ニュース]/[イベント]/[製品]/[画像]を選択すると、オートコンプリートは選択されたノードのみを表示します。ニュースを選択すると、データの入力を開始したときにニュースのみが表示されます。ニュースとイベントを選択すると、両方が表示されます。 [なし]を選択すると、カスタムメッセージが表示されます。
私は周りを見回してgetReferenceableEntitiesを上書きする方法を見つけましたが、2つの変数を渡す方法がわかりません。1つはチェックボックスフィールドから、もう1つは入力されたオートコンプリート値です。
フォームにチェックボックスと検索値の両方を送信させるためにJSが関与するのではないかと思いますが、どこから始めればよいのかわかりません。
正確なUXはわかりませんが、条件付きフィールドとエンティティ参照ビューといくつかのhook_views_pre_view
を組み合わせることで、必要なことを達成できると思います。
最初にエンティティ参照である表示を持つ新しいビューを作成します。参照: エンティティ参照表示のビュータイプを作成する方法
2番目、コンテンツエンティティ参照ビューをデータソースとして使用するようにノードのオートコンプリートフィールドを構成します
注:フォームを他の方法で設定している場合(ノードフォームの表示ではない)、これをコードで設定する必要があります-便利な例はありません。
最後に、ユーザーがコンテンツタイプの選択を行うと、その値がどこかに(セッション、コンテンツ上など)保存され、hook_views_pre_view
フックを介して選択にアクセスできるようになります。
/**
* Implements hook_views_pre_view().
*
* @param ViewExecutable $view
* @param QueryPluginBase $query
* @return void
*/
function MY_MODULE_views_pre_view(ViewExecutable $view, $display_id, array &$args) {
// Get the content type choice from wherever you stored it
$content_type = "SOME_TYPE";
// add a filter to the brand view for the supplier's ICs
if($view->id() == 'MY_CUSTOM_VIEW' && $view->getDisplay()->display['id'] == 'entity_reference_1') {
$args = [$content_type];
}
}
MYMODULE/src/EntityAutoCompleteMatcher.php:
class EntityAutocompleteMatcher extends \Drupal\Core\Entity\EntityAutocompleteMatcher {
/**
* Gets matched labels based on a given search string.
*/
public function getMatches($target_type, $selection_handler, $selection_settings, $string = '') {
$matches = [];
$options = [
'target_type' => $target_type,
'handler' => $selection_handler,
'handler_settings' => $selection_settings,
];
$handler = $this->selectionManager->getInstance($options);
if (isset($string)) {
// Get an array of matching entities.
$match_operator = !empty($selection_settings['match_operator']) ? $selection_settings['match_operator'] : 'CONTAINS';
$entity_labels = $handler->getReferenceableEntities($string, $match_operator, 10);
// Loop through the entities and convert them into autocomplete output.
foreach ($entity_labels as $values) {
foreach ($values as $entity_id => $label) {
$entity = \Drupal::entityTypeManager()->getStorage($target_type)->load($entity_id);
$entity = \Drupal::entityManager()->getTranslationFromContext($entity);
// Only return bundle types we want.
if ($entity->bundle() == 'page') {
$matches[] = ['value' => $label, 'label' => $label];
}
}
}
}
return $matches;
}
}
さらに作業を行う必要がありますが、これは、参照されるエンティティの返されたリストをどこで制御できるかを示しています。
見る: