Ajax для контроллера

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

Аватар пользователя teqwer teqwer 22 декабря 2017 в 18:22

Всем привет!

Создал контроллер в котором выполняется код (для примера):

<?phpclass www extends ControllerBase{
  public function dbk() {

    $response = new AjaxResponse ();
    $response->addCommand(new AlertCommand('Hello World'));
    return $response;

    }
}?>

Создал маршрут для контроллера а также ссылку с классом "use-ajax".
При клике по ссылке выводиться модальное окно, все работает нормально.

При вставке ссылки в окно браузера и переходе напрямую на страницу контроллера получаю просто белое окно (см. картинку).
Как выводить сообщение при переходе по ссылке напрямую?

Заранее благодарю!

ВложениеРазмер
Иконка изображения sshot-1.png16.7 КБ

Лучший ответ

Комментарии

Аватар пользователя bumble bumble 24 декабря 2017 в 8:30

Ну, да - 1 роут динамический, 2* маршрута. Не правильно выразился.

*В 8ке это круче реализовано.

В 7ке делали так (по тем же спасибкам):
https://github.com/DrupalRu/drupal.ru/blob/dev/profiles/drupalru/modules...
https://github.com/DrupalRu/drupal.ru/blob/dev/profiles/drupalru/modules...

Аватар пользователя teqwer teqwer 23 декабря 2017 в 14:38

bumble wrote:

Обычно, создается 2 роута - для js (ajax), и для обычного (nojs).

Вот пример: http://befused.com/drupal/modal-nojs


Большое спасибо за пример, пригодится для других целей.
Для моей задачи не подходит, т.к. ссылки у меня уже сформированы.

Хочу добиться схожей реализации как на этом форуме.

Здесь при нажатии на кнопку "Спасибо" из темы форума, выполняется определенная функция и добавляется "спасибо" автору комментария.

При прямом переходе по ссылке (вставке в окно браузера), например
https://drupal.ru/tnx/comment/nojs/703912/vUSDw9EmCK16woNJol_p-RoPHS7_Xt...
выполняется та же функция и происходит редирект назад в тему и выводиться сообщение.

Как такое реализовать в контроллере drupal 8?
Такой вариант (например) не подходит:

<?php    $response = new AjaxResponse ();
    
$selector '.profile';
    
$response->addCommand(new RemoveCommand($selector));
    
$response = new \Symfony\Component\HttpFoundation\RedirectResponse($url);
    return 
$response?>

так как выполниться только одна функция, в зависимости от порядка выполнения.

Добавление к ссылкам "?destination=node/___" и использования кода:

<?php    $response = new AjaxResponse ();
    
$selector '.profile';
    
$response->addCommand(new RemoveCommand($selector));
    return 
$response?>

выполнит код по клику на ссылке, но при переходе напрямую редиректа не осуществит.

Аватар пользователя gun_dose gun_dose 23 декабря 2017 в 17:09
1

Долго что ли ссылки переделать? Если долго, то можно намутить скрипт, который будет блокировать правый и средний клик по этим ссылкам.

Аватар пользователя teqwer teqwer 23 декабря 2017 в 17:31

gun_dose wrote:

Долго что ли ссылки переделать? Если долго, то можно намутить скрипт, который будет блокировать правый и средний клик по этим ссылкам.


Спасибо за совет!
Получается реализовать на 8-ке такую фичу как тут с кнопкой "спасибо" не получиться?

Может все-таки можно, использовать роут с двумя аргументами, один из которых будет использоваться в "?destination=node/___" и при переходе напрямую делать редирект как здесь?

P.S. Информации по "?destination=..." для 8-ки - ноль. Вообще непонятно как им пользоваться?

Аватар пользователя gun_dose gun_dose 23 декабря 2017 в 19:03
1

Аргументов может бытт любое количество. Вам надо два - айдишник ноды и nojs. Типа /thanks/45/nojs по клику на такую ссылку с классом use-ajax nojs преобразуется в ajax и ваш контроллер поймёт, что ответ надо отсылать аякс-респонсом. Ну и айдишник, думаю, по нему и так всё ясно.