web-dev-qa-db-ja.com

ローカルアクションボタンを介して動的パラメーターを渡す方法は?

my_module.links.action.ymlに以下を含む local action ボタンを作成しました:

_my_module.content.action:
  route_name: node.add_page
  title: 'My action'
  deriver: 'Drupal\my_module\Plugin\Derivative\ContentByDomainLocalActions'
  appears_on:
    - view.affiliated_content.page_1
_

次に、ローカルアクションボタンがページに表示されます_admin/content/domain-content/firstdomain_local_

このURLパスの引数_firstdomain_local_を使用して、ローカルアクションボタンに渡します。

したがって、 このチュートリアル のように、getDerivativeDefinitions\Drupal::routeMatch()からパラメータを取得します。

_class CustomLocalActions extends DeriverBase {
  public function getDerivativeDefinitions($base_plugin_definition) {
    $this->derivatives['example.action_id'] = $base_plugin_definition;
    $this->derivatives['example.action_id']['title'] = "Add content";
    $domain = \Drupal::routeMatch()->getParameter('arg_0');
    $this->derivatives['example.action_id']['route_parameters'] = [
      'domain' => $domain
    ];
    return $this->derivatives;
  }
}
_

しかし、ローカルアクションボタンのパラメーターは、キャッシュをクリアした後にのみ更新されます。 URLで異なるパラメーター値を使用するたびにキャッシュをクリアする必要があります。

この引数を動的に渡す正しい方法は何ですか?

1
Kwadz

ローカルアクションとローカルタスクは非常に似ているため、 [ローカルタスクの動作のカスタマイズ を見て、を指定することにより、ローカルアクションに動的ルートパラメーターを渡すことができましたmy_module.links.action.ymlのclassパラメーター(MyClassName)とそのクラスのLocalActionDefault :: getRouteParameters()メソッドをオーバーライドします。最初に必要なキャッシュの再構築は1つだけでした。

use Drupal\Core\Menu\LocalActionDefault;
use Drupal\Core\Routing\RouteMatchInterface;

class MyClassName extends LocalActionDefault {

  public function getRouteParameters(RouteMatchInterface $route_match) {
    return array(
      'my_local_action_parameter' => $route_match->getParameter('existing_parameter_from_route')
    );
  }
}
2
user92937

キャッシュの問題 なので、公式の修正を待っているので、問題のページでアクションを再構築することで解決しました。

function my_module_preprocess_page(&$variables) {
  if (\Drupal::routeMatch()->getRouteName() == 'view.affiliated_content.page_1') {
    \Drupal::service('plugin.manager.menu.local_action')->clearCachedDefinitions();
  }
}
0
Kwadz