Jump to content

Как работать с ajax в prestashop?


Recommended Posts

Делаю модуль. Там скрипт mymoduleajax.php вызывается асинхронным запросом и должен сохранять введенные пользователем данные в БД, но не получается подключить его к ядру, чтобы вызывать нужные методы.

 

Делаю так:

В mymodule.php (скрипт модуля)

<?php
if (!defined('_PS_VERSION_'))
	exit;

class MyModule extends Module {
	Настройки модуля и т.п.
	...

	public function AjaxCall($data) {
		запись в БД
	}
}
?>

 

В mymoduleajax.php

<?php
Обработка данных js-скрипта
$data = $result
...

include_once(dirname(__FILE__).'/mymodule.php');
//Загрузка обрывается т.к.  if (!defined('_PS_VERSION_')) в mymodule.php не срабатывает
//Если строчку убрать, то лезут ошибки
$mymodule = new MyModule();
$mymodule->AjaxCall($data);
?>

 

Как надо сделать, чтобы заработало?

Link to comment
Share on other sites

Почему-то при этом способе перестают работать относительные пути...

No such file or directory in W:\domains\presta152\www\modules\mymodule\controllers\front\action.php

и приходится использовать getcwd() или dirname(__FILE__), но это пол беды.

 

Теперь возникает вопрос что дальше?

Создал класс class MymoduleActionModuleFrontController extends ModuleFrontController

Как понимаю, движком вызываются все его методы при определенных событиях. Методы init() и initContent(), думаю, вызываются всегда, причем init() ничего не возвращает, а initContent() возвращает то что напечатает скрипт. Как раз он мне и подходит, но тут загвоздка: если использовать его одного, то после моих данных он дописывает html-код престашоповского футера. Если же использовать вместе с init(), то просто выдает предупреждение:

Call to a member function getCategoryLink() on a non-object in W:\domains\presta152\www\modules\blockcategories\blockcategories.php on line 153 (казалось бы, причем здесь этот модуль, с которым никак не конфликтую)

 

Может что-то не так делаю?

Link to comment
Share on other sites

Пути естественно будут меняться так как контекст вызова некоторых скриптов становится другой. А без контроллеров запустить корректно ajax приложение нельзя. При порождении контроллера модуля инициируются классы предков где в конструкторах и прописана загрузка среды Престы. Это основной правило для версий 1.4 и 1.5

Link to comment
Share on other sites

В MymoduleActionModuleFrontController

  • Mymodule - имя модуля
  • Action - действие (такое же как название файла)

Этот класс является потомком ModuleFrontController, а тот в свою очередь - FrontController и методы будут соответствующие.

И init и initContent не возвращают ничего. По идее в init происходит подготовка, загрузка классов и т.п. В initContent переменным smarty присваиваются значения. Раз у вас нет контента (только аякс), то обрабатывайте все в postProcess и завершайте скрипт die

Link to comment
Share on other sites

Да, postProcess работает как надо! А где можно почитать описание методов FrontController? В официальной документации не нашел, а лезть в сам класс... Много времени уйдет, чтобы разобраться.

 

И как тогда лучше прописывать пути? Во-первых в js. Не писать же url: 'http://presta152/index.php?fc=module&module=mymodule&controller=action'

 

Во-вторых, в action.php

define('PS_MODULE_DIR', dirname(__FILE__).'/../../'); или

define('PS_MODULE_DIR', getcwd()._MODULE_DIR_');

Edited by tamtakoe (see edit history)
Link to comment
Share on other sites

В action.php инклудить модуль не нужно. Можно использовать его так $this->module

Путь к модулю будет такой $this->module->getLocalPath()

 

В шаблоне, чтобы вызвать action:

$link->getModuleLink('mymodule', 'action', ['param' => 'value'])

 

При включении ЧПУ ссылки тоже изменятся.

Link to comment
Share on other sites

Да, postProcess работает как надо! А где можно почитать описание методов FrontController? В официальной документации не нашел, а лезть в сам класс... Много времени уйдет, чтобы разобраться.

 

Знаете, есть такая шутка по поводу освоения новых предметов и т.п.: "Когда все традиционные методы освоения исчерпаны, обратитесь к руководству пользователя" :-). В нашем случае таким руководством является исходный код.

Link to comment
Share on other sites

Не самый удобочитаемый код в Престе... И написан в нерациональном стиле

function()

}

...

}

и куча устаревших вещей.

Хотя, наверное, для опенсорсного проекта это норма)

Link to comment
Share on other sites

Можно при помощи phpDoc сгенерировать документацию

 

 

Про phpDoc или Doxigen и т.п. для генерации документации по Престе можно забыть. Там крайне мало комментариев к коду и они бесполезные. Уже проверял на версиях 1.3 и 1.4. Для 1.5 можно посмотреть здесь http://smartceo.ru/ps_api/ но не долго (через пару недель удалю).

Edited by Евгений Медведев (see edit history)
Link to comment
Share on other sites

Полезность документации очень просто проверить: найти в ней интересующую вещь. Мне, например, интересно для чего нужна функция getContent() и когда она вызывается в модуле. Поиск по документации ничего толкового не выдал(

Link to comment
Share on other sites

×
×
  • Create New...