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で異なるパラメーター値を使用するたびにキャッシュをクリアする必要があります。
この引数を動的に渡す正しい方法は何ですか?
ローカルアクションとローカルタスクは非常に似ているため、 [ローカルタスクの動作のカスタマイズ を見て、を指定することにより、ローカルアクションに動的ルートパラメーターを渡すことができました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')
);
}
}
キャッシュの問題 なので、公式の修正を待っているので、問題のページでアクションを再構築することで解決しました。
function my_module_preprocess_page(&$variables) {
if (\Drupal::routeMatch()->getRouteName() == 'view.affiliated_content.page_1') {
\Drupal::service('plugin.manager.menu.local_action')->clearCachedDefinitions();
}
}