Как определить POST-запрос для Drupal 8?

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

Аватар пользователя pingvin156 pingvin156 31 марта 2018 в 10:23

Подскажите, как определить POST-запрос для DRUPAL8?
Для формирования GET используется MODULE.routing.yml, затем через AJAX вызывается уже непосредственно в JS-коде... А как поступить, если мне нужен POST-запрос. AJAX переопределил под POST, но получаю ошибку "POST <адрес> 404 (Not Found)", как будто в MODULE.routing.yml я его не определил

Комментарии

Аватар пользователя pingvin156 pingvin156 31 марта 2018 в 10:55

Не совсем то. У меня проблема заключается в том, что GET-запрос не может слишком длинную строку (параметр может быть большим, идет описание заказа), а такое в теории у меня может быть, поэтому я хочу сделать из GET-запроса POST-запрос..
Сам POST-запрос я сделал из GET-Запроса на JS, однако URL для Друпала стал неизвестен, о чем говорит ошибка. Иными словами мне надо объявить URL, который вызовет выполнение функции на сервере так же, как это выполнял ранее GET-запрос.

Аватар пользователя pingvin156 pingvin156 31 марта 2018 в 11:07

Схематично:

$.ajax({
type: 'POST',
url: '/my_modul/kakoeto_nazvanie/', // URL на который отправляеться запрос
success: updateHod, // Функция которая будет вызвана в случае ответа от сервера
dataType: 'json', //Тип данных полученных от сервера
data: 'js=1' //Pass a key/value pair
});

/my_modul/kakoeto_nazvanie/ - вот это надо как-то определить

Аватар пользователя pingvin156 pingvin156 31 марта 2018 в 17:44

Да, функция есть, вот что в роутинге:
article.OrderAccept:
path: '/article/OrderAccept/{txtOrder}/{txtPurses}'
defaults:
_controller: '\Drupal\article\Controller\OrderController::Accept'
requirements:
_access: 'TRUE'

Аватар пользователя gun_dose gun_dose 31 марта 2018 в 18:09

У вас метод с большой буквы называется. Так нельзя. Переименуйте метод, а потом пробуйте дебажить. В начале просто откройте указанный роут в браузере, а метод пусть выведет какой-нибудь хэлловорлд. Так вы поймёте, работает ли контроллер вообще. А потом, как заработает, уже наворачивайте плюшки.

А ещё советую установить друпал-консоль. Одной командой drupal gcon вам сгенерируется и роут, и контроллер.

Аватар пользователя pingvin156 pingvin156 31 марта 2018 в 18:33

Я переделываю GET в POST - контроллер есть и он работает.
Сделал все с прописных букв. Вызвал напрямую - ругается на отсутствие параметров, что понятно.
Ошибка при выполнении
Controller "Drupal\article\Controller\OrderController::Accept()" requires that you provide a value for the "$txtOrder" argument (because there is no default value or because there is a non optional argument after this one).

Из js я вызываю вот так, возникает 500 ошибка:
-------

$.ajax({
type: 'POST',
url: '/article/orderaccept',
success: function (data) {
debugger;
},
dataType: 'json',
data: 'txtOrder='+ordertext+'&txtPurses='+pursestext
});

Мб что не так

Аватар пользователя sas@drupal.org sas@drupal.org 31 марта 2018 в 12:42

/my_modul/kakoeto_nazvanie/ определяется через routing
И еще возможно Вам стоит воспользоваться стандартным ajax framework https://api.drupal.org/api/drupal/core!core.api.php/group/ajax/8.5.x
Кое что интересное и может пригодиться по ajax есть еще здесь https://www.drupal.org/project/examples -> ajax

Аватар пользователя pingvin156 pingvin156 31 марта 2018 в 18:04

Определено:
article.OrderAccept:
path: '/article/OrderAccept/{txtOrder}/{txtPurses}'
defaults:
_controller: '\Drupal\article\Controller\OrderController::Accept'
requirements:
_access: 'TRUE'
Мб надо параметры убрать или для POST как-то иначе определяются?

Аватар пользователя pingvin156 pingvin156 1 апреля 2018 в 13:05

RuntimeException: Controller "Drupal\article\Controller\OrderController::Accept()" requires that you provide a value for the "$txtOrder" argument (because there is no default value or because there is a non optional argument after this one). in Drupal\Core\Controller\ControllerResolver->doGetArguments() (line 165 of C:\OpenServer\domains\lbcoins.com\core\lib\Drupal\Core\Controller\ControllerResolver.php).

Аватар пользователя gun_dose gun_dose 1 апреля 2018 в 14:09
3

Так вы роут без аргумента вызываете. Если он не нужен, то уберите его из определения роута и из аргументов метода. Либо задайте ему значение по умолчанию в определении метода, типа
function access($arg = NULL) { ...}

Аватар пользователя gun_dose gun_dose 1 апреля 2018 в 17:48

pingvin156 wrote:

path: '/article/OrderAccept/{txtOrder}/{txtPurses}'

Соответственно вам нужно отправлять запрос на урл /article/OrderAccept/аргумент/аргумент 2

Вместо слов "аргумент" и "аргумент2" и должны быть ваши аргументы.

Аватар пользователя pingvin156 pingvin156 1 апреля 2018 в 19:36

Вот в этом и проблема. У меня так сделано. Это же GET запрос, как я понимаю? Я столкнулся с ситуацией, когда длина строки заказа может быть очень большой в теории, поэтому хочу переделать под POST, чтобы не отсылать параметры в строке

Аватар пользователя gun_dose gun_dose 1 апреля 2018 в 20:01

Это не гет запрос, а урл. Если не собираетесь передавать аргументы в урле запроса, то во-первых уберите всё что в фигурных скобках в ймл-файле, во вторых, уберите аргументы из метода контроллера.

Аватар пользователя pingvin156 pingvin156 1 апреля 2018 в 20:14

А как я передам параметры?
Вот запрос у меня такой на JS:
$.ajax({
type: 'POST',
url: '/article/orderaccept',
success: function (data) {
debugger;
},
dataType: 'json',
data: 'txtOrder='+ordertext+'&txtPurses='+pursestext
});
В data - параметры

Аватар пользователя gun_dose gun_dose 1 апреля 2018 в 20:26
1

Они же у вас из аякса идут в теле пост-запроса, соответственно в контроллере их можно достать приблизительно так:

<?php
\Drupal::requestStack()->getCurrentRequest()->request->all();
?>

На выходе должен быль ассоциативный массив с данными пост-запроса.

Аватар пользователя gun_dose gun_dose 1 апреля 2018 в 20:59

Да, можно и так, только это не процедура, а метод, т.к. контроллер - это класс)) но это уже сугубо терминология.

Аватар пользователя pingvin156 pingvin156 1 апреля 2018 в 21:07

Ну да) Так точнее. Каждый метод - это проца или функция, но не каждая проца или функция - метод))
Спасибо большое! Очень помог разобраться