как подключить AJAX

Главные вкладки

Аватар пользователя DoctorMED DoctorMED 23 марта 2018 в 11:15

привет Wink

Второй день мучаюсь с подключением 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'] = '';
    }
}?>

Комментарии

Аватар пользователя bumble bumble 23 марта 2018 в 11:34

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;
?>
Аватар пользователя DoctorMED DoctorMED 23 марта 2018 в 11:37

Я же после етого проверяю есть ли в базе такая нода:

<?php
$values_n 
= \Drupal::entityQuery('node')->condition('nid'$next_node)->execute();
    
$values_p = \Drupal::entityQuery('node')->condition('nid'$prev_node)->execute();
?>
Аватар пользователя bumble bumble 23 марта 2018 в 11:42

Ну, это не проверка, на самом деле, а реальный запрос. 0 - можно не проверять 100%.
А вот, всякого рода проверки типа "Статус публикации", "Тип материала" и т.п. - очень даже стоило бы делать.

На орге где-то был модуль, для 7ки - точно, возможно и на 8ку. Посмотрите как там реализовано.
Есть еще такая штука как Examples, там очень много примеров на различные задачи. Очень советую подсматривать туда.