привет
Второй день мучаюсь с подключением ajax в кастомном модуле. Задача, чтобы можно было менять ноды вперед-назад через ajax.
<?phpfunction my_bartik_preprocess_page(&$variables) {
if(isset($variables['node']) && $variables['node']->getType() == 'node'){
# Add libraries for anonymous
$libraries['#attached']['library'][] = 'modal/modal';
$libraries['#attached']['library'][] = 'core/drupal.ajax';
render($libraries);
}
# Add library
$variables['#attached']['library'][] = 'my_bartik/library_ex';
$node = \Drupal::routeMatch()->getParameter('node');
if ($node instanceof \Drupal\node\NodeInterface) {
$nid = $node->id();
}
$next_node = $nid + 1;
$prev_node = $nid - 1;
$values_n = \Drupal::entityQuery('node')->condition('nid', $next_node)->execute();
$values_p = \Drupal::entityQuery('node')->condition('nid', $prev_node)->execute();
$options = ['absolute' => TRUE];
if (!empty($values_n)) {
$url_n = Url::fromRoute('entity.node.canonical', ['node' => ($next_node)], $options);
$link_n = Link::fromTextAndUrl("next >>", $url_n);
$link_n = $link_n->toRenderable();
$link_n['#attributes'] = array('class' => array('internal', 'use-ajax'));
$output_n = render($link_n);
$variables['next'] = $output_n;
} else {
$variables['next'] = '';
}
if (!empty($values_p)) {
$url_p = Url::fromRoute('entity.node.canonical', ['node' => ($prev_node)], $options);
$link_p = Link::fromTextAndUrl("<< prev", $url_p);
$link_p = $link_p->toRenderable();
$link_p['#attributes'] = array('class' => array('internal', 'use-ajax'));
$output_p = render($link_p);
$variables['prev'] = $output_p;
} else {
$variables['prev'] = '';
}
}?>
Комментарии
1. У Вас в препроцессе модифицируется массив $variables, а Вы зачем-то в $libraries подключаете. А потом еще и рендерите что-то...
<?php
if(isset($variables['node']) && $variables['node']->getType() == 'node'){
// Модальные окна тоже нужны?
$libraries['#attached']['library'][] = 'modal/modal';
$libraries['#attached']['library'][] = 'core/drupal.ajax';
// Зачем здесь рендер??
render($libraries);
}
?>
2. А когда будет на последней ноде, +1 - что загружать будет? Или, когда на 1й -1 в ноль сведется, что тогда?
<?php
$next_node = $nid + 1;
$prev_node = $nid - 1;
?>
Я же после етого проверяю есть ли в базе такая нода:
<?php
$values_n = \Drupal::entityQuery('node')->condition('nid', $next_node)->execute();
$values_p = \Drupal::entityQuery('node')->condition('nid', $prev_node)->execute();
?>
Ну, это не проверка, на самом деле, а реальный запрос. 0 - можно не проверять 100%.
А вот, всякого рода проверки типа "Статус публикации", "Тип материала" и т.п. - очень даже стоило бы делать.
На орге где-то был модуль, для 7ки - точно, возможно и на 8ку. Посмотрите как там реализовано.
Есть еще такая штука как Examples, там очень много примеров на различные задачи. Очень советую подсматривать туда.