tamtakoe Posted October 31, 2012 Share Posted October 31, 2012 Делаю модуль. Там скрипт 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 More sharing options...
sors Posted October 31, 2012 Share Posted October 31, 2012 <?php include(dirname(__FILE__).'/../../config/config.inc.php'); include(dirname(__FILE__).'/../../init.php'); ... В 1.5 лучше использовать контроллеры Link to comment Share on other sites More sharing options...
tamtakoe Posted October 31, 2012 Author Share Posted October 31, 2012 Пишу под 1.5. А как делать с контроллерами? Link to comment Share on other sites More sharing options...
sors Posted November 1, 2012 Share Posted November 1, 2012 http://svn.prestashop.com/branches/1.5.x/modules/mailalerts/controllers/front/actions.php Контроллер как раз для ajax Link to comment Share on other sites More sharing options...
tamtakoe Posted November 7, 2012 Author Share Posted November 7, 2012 Почему-то при этом способе перестают работать относительные пути... 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 More sharing options...
Евгений Медведев Posted November 7, 2012 Share Posted November 7, 2012 Пути естественно будут меняться так как контекст вызова некоторых скриптов становится другой. А без контроллеров запустить корректно ajax приложение нельзя. При порождении контроллера модуля инициируются классы предков где в конструкторах и прописана загрузка среды Престы. Это основной правило для версий 1.4 и 1.5 Link to comment Share on other sites More sharing options...
sors Posted November 7, 2012 Share Posted November 7, 2012 В MymoduleActionModuleFrontController Mymodule - имя модуля Action - действие (такое же как название файла) Этот класс является потомком ModuleFrontController, а тот в свою очередь - FrontController и методы будут соответствующие. И init и initContent не возвращают ничего. По идее в init происходит подготовка, загрузка классов и т.п. В initContent переменным smarty присваиваются значения. Раз у вас нет контента (только аякс), то обрабатывайте все в postProcess и завершайте скрипт die Link to comment Share on other sites More sharing options...
tamtakoe Posted November 7, 2012 Author Share Posted November 7, 2012 (edited) Да, 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 November 7, 2012 by tamtakoe (see edit history) Link to comment Share on other sites More sharing options...
sors Posted November 8, 2012 Share Posted November 8, 2012 В action.php инклудить модуль не нужно. Можно использовать его так $this->module Путь к модулю будет такой $this->module->getLocalPath() В шаблоне, чтобы вызвать action: $link->getModuleLink('mymodule', 'action', ['param' => 'value']) При включении ЧПУ ссылки тоже изменятся. Link to comment Share on other sites More sharing options...
Евгений Медведев Posted November 8, 2012 Share Posted November 8, 2012 Да, postProcess работает как надо! А где можно почитать описание методов FrontController? В официальной документации не нашел, а лезть в сам класс... Много времени уйдет, чтобы разобраться. Знаете, есть такая шутка по поводу освоения новых предметов и т.п.: "Когда все традиционные методы освоения исчерпаны, обратитесь к руководству пользователя" :-). В нашем случае таким руководством является исходный код. Link to comment Share on other sites More sharing options...
sors Posted November 8, 2012 Share Posted November 8, 2012 Можно при помощи phpDoc сгенерировать документацию Link to comment Share on other sites More sharing options...
tamtakoe Posted November 8, 2012 Author Share Posted November 8, 2012 Не самый удобочитаемый код в Престе... И написан в нерациональном стиле function() } ... } и куча устаревших вещей. Хотя, наверное, для опенсорсного проекта это норма) Link to comment Share on other sites More sharing options...
Евгений Медведев Posted November 8, 2012 Share Posted November 8, 2012 (edited) Можно при помощи phpDoc сгенерировать документацию Про phpDoc или Doxigen и т.п. для генерации документации по Престе можно забыть. Там крайне мало комментариев к коду и они бесполезные. Уже проверял на версиях 1.3 и 1.4. Для 1.5 можно посмотреть здесь http://smartceo.ru/ps_api/ но не долго (через пару недель удалю). Edited November 8, 2012 by Евгений Медведев (see edit history) Link to comment Share on other sites More sharing options...
tamtakoe Posted November 8, 2012 Author Share Posted November 8, 2012 Полезность документации очень просто проверить: найти в ней интересующую вещь. Мне, например, интересно для чего нужна функция getContent() и когда она вызывается в модуле. Поиск по документации ничего толкового не выдал( Link to comment Share on other sites More sharing options...
Recommended Posts