我正在尝试获取节点页面的内容类型值(用户当前正在访问的内容类型值--让我们称之为CT-1).并将该值作为变量输入到不同内容类型的node.html.twig模板(CT-2)中。此CT-2模板正在视图输出中使用,显示在CT-1页上.这是我的密码。
function custom_mods_preprocess_node(array &$variables, $hook) {
if ($node = \Drupal::request()->attributes->get('node')) {
$variables['pageNodeType'] = $node->getType();
}
}然后我把pageNodeType变量打印到CT-2's node.html.twig模板中。
{% if pageNodeType == 'TYPE' %}
TEST
{% endif %}这一切都完美地工作在页面加载。但是当使用AJAX (通过公开过滤器)过滤视图输出时,pageNodeType变为空,因此"if语句“与CT-2模板中断。
在ajax更新之后,我能做些什么来保持这个变量的活动呢?
我试过利用..。
\Drupal::request()->headers->get('referer');..to提取前一页,但通过这种方法获得Content似乎是一项相当大的任务。有没有更好的方法。
谢谢!!
编辑:可能也与这篇文章有关。但没有答案?在钩子中使用ajax获取当前节点的视图_视图_查询_更改
发布于 2020-04-24 20:42:51
嗯,这是我想出来的.而且它可以按需要工作。如果这种方法有问题,请随时批评。我的后端技能还有很多需要改进的地方。谢谢!
function custom_mods_preprocess_node(array &$variables, $hook) {
// Get the current page's content type on page load
$node = \Drupal::routeMatch()->getParameter('node');
if ($node instanceof \Drupal\node\NodeInterface) {
$variables['pageNodeType'] = $node->getType();
}
// Keeps the type available if an AJAX call happens
if (\Drupal::routeMatch()->getRouteName() == 'views.ajax') {
$previousUrl = \Drupal::request()->headers->get('referer');
$fake_request = Request::create($previousUrl);
$url_object = \Drupal::service('path.validator')->getUrlIfValid($fake_request->getRequestUri());
if ($url_object) {
$route_params = $url_object->getRouteParameters();
$ent_id = $route_params['entity_id'];
$node = \Drupal\node\Entity\Node::load($ent_id);
$variables['pageNodeType'] = $node->getType();
}
}https://drupal.stackexchange.com/questions/293093
复制相似问题