Как правильно сделать namespace для BX.ajax.runAction?
Пытаюсь использовать контроллеры битрикса для ajax запроса к своему модулю через BX.ajax.runAction.
В корне модуля лежит .settings.php со следующим содержимым:
return [
'controllers' => [
'value' => [
'namespaces' => [
'\\Evsyukov\\Main\\Controller' => 'api',
],
],
'readonly' => true,
],
];
название модуля 'testmodules' далее /lib/controller/test.php его код
namespace Evsyukov\Main\Controller;
class Book extends Controller {
public function configureActions()
{
return [
'greet' => [
'prefilters' => [
]
]
];
}
public function addBookAction()
{
$context = Application::getInstance()->getContext();
$request = $context->getRequest();
$arRequest = $request->getPostList()->toArray();
$this->addbook($arRequest);
}
}
пытаюсь вызвать так
BX.ajax.runAction('evsyukov:main.api.book.addbook', {}
Ответы (3 шт):
В configureActions() у вас ключ greet, а метод назвали addBook, вот так должно быть. Также метод должен возвращать массив.
<?php
namespace Evsyukov\Main\Controller;
use Bitrix\Main\Application;
use Bitrix\Main\Engine\Controller;
use Bitrix\Main\Engine\ActionFilter;
class Book extends Controller {
public function configureActions()
{
return [
'addBook' => [
'prefilters' => [
new ActionFilter\Authentication(),
new ActionFilter\HttpMethod(
[
ActionFilter\HttpMethod::METHOD_GET,
ActionFilter\HttpMethod::METHOD_POST,
]
),
//new ActionFilter\Csrf(),
],
'postfilters' => []
]
];
}
public function addBookAction()
{
$context = Application::getInstance()->getContext();
$request = $context->getRequest();
$arRequest = $request->getPostList()->toArray();
return $arRequest;
}
}
Если название модуля не содержит ".", то битрикс считает, что модуль его и ищет среди своих модулей в namespace Bitrix. Чтобы для вашего модуля работал механизм контроллеров, имя модуля должно быть evsyukov.main
И в .settings.php надо добавить defaultNamespace:
return [
'controllers' => [
'value' => [
'defaultNamespace' => '\\Evsyukov\\Main\\Controller',
'namespaces' => [
'\\Evsyukov\\Main\\Controller' => 'api',
],
],
'readonly' => true,
],
В моём случае к имени метода класса к которому обращаюсь забыл приписать "Action". Дописал и всё заработало.