Всё, до меня дошло) У меня в форме экшн не указан и по этому у меня в результате был html всей страницы
Спасибо!
Форум ReadyScript Сообщения от Игорь
Страницы 1
Всё, до меня дошло) У меня в форме экшн не указан и по этому у меня в результате был html всей страницы
Спасибо!
JSON для блока:
Экшн контроллера:
public function actionIndex()
{
if ($this->isMyPost()) {
$email = $this->request('email', TYPE_STRING);
if ($this->api->subscribeUser($email, $this->getParam('list_id'))) {
$this->view->assign('success', t('Вы успешно подписались на рассылку новостей'));
} else {
$this->view->assign('error', t('Произошла ошибка в процессе подписки на рассылку'));
}
if ($this->url->isAjax()) {
$this->result->checkAjaxOutput(true); // Форсим AJAX
$this->result->addSection('test', 'Foo'); // Пробуем всунуть секцию
return $this->result->setTemplate($this->getParam('indexTemplate'));
}
}
return $this->result
->setTemplate($this->getParam('indexTemplate'));
}
Да возвращается JSON, но только в блок контроллере нет метода wrapOutput() - из-за этого возвращается HTML всей страницы и только в месте блока - JSON строка.
function getOutput()
{
$this->result['html'] = $this->getHtml();
if ($this->controller->url->isAjax() && $this->checkAjaxOutput) {
/*===== Смотрим на условие ниже =====*/
if ($this->controller instanceof \RS\Controller\Front || $this->controller instanceof \RS\Controller\Admin\Front) {
// Это работает толька для фронт и бек контроллеров, как видно из условия
$this->controller->wrapOutput(false);
}
return json_encode($this->result);
} else {
if ($this->noAjaxRedirect !== null) {
$this->controller->redirect($this->noAjaxRedirect);
}
return isset($this->result['html']) ? $this->result['html'] : '';
}
}
Вот и получается, что блок не может вернуть чистый JSON.
Для чего это может быть нужно:
Например, у нас на сайте есть форма подписки на рассылку. Для этой формы я сделал блок, который выводит эту самую форму и обрабатывает её отправку. Я хочу сделать отправку через AJAX запрос и с фронт котроллером это очень удобно делать, потому что можно добавить любую доп. информацию в секции (статус, код ошибки и т.п.). А для блока приходится искать в html с результатом нужный блок и заменять старый html новым. Не говоря о том, что не доступна информация из секций.
Понятно, что можно сделать отдельный фронт контроллер, который будет обрабатывать форму и возвращать JSON, но, по моему, если бы блок отдавал JSON в ответ на AJAX - было бы очень круто!
Во фронт контроллере можно добавить секцию к ответу и если это аякс запрос, то в возвращаемом JSON будет эта секция. Но вот блок-контроллер всегда возвращает HTML - можно как-то получить JSON результат со спец секциями для блока?
Здравствуйте, столкнулся с тем, что нужно добавить дополнительное поле в Orm объект catalog-product. Для этого у API есть событие orm.init.КОРОТКОЕ_ИМЯ_ORM_ОБЪЕКТА. Однако в базе поле хранится в сериализованом виде, а для работы с объектом product его нужно обратно преобразовать в массив. Отсюда и необходимость в дополнительном событии по типу orm.afterobjectload.КОРОТКОЕ_ИМЯ_ORM_ОБЪЕКТА. Тем более у RS::ORM::AbstractObject есть такой метод. Будет достаточно в этом классе сгенерировать новое событие. Например так:
public function afterObjectLoad()
{
/**
* Event: orm.afterobjectload
* paramtype \RS\Orm\AbstractObject
*/
\RS\Event\Manager::fire('orm.afterobjectload.' . $this->getShortAlias(), $this);
}
И во всех потомках этого класса в методе afterObjectLoad (если он там переопределен) вызывать:
parent::afterObjectLoad()
Возможно я упускаю какие-то трудности в реализации, но отсутствие такого событие показалось как минимум странным. Если можно изменить данные объекта перед самой записью в базу, то почему нельзя изменить его и сразу после получения из базы?
Страницы 1
Форум ReadyScript Сообщения от Игорь