Не работают cli скрипты.

Здравствуйте. Добавили на сайт плагин, созданный точно по документации. Плагин должен выполняться по Cronу. И тут начинается проблема - при тестовом вызове плагина, через командную строку, командой:

php [путь к папке проэкта на сервере]/cli.php shop ZakazApiModuleUpdate

Команда принимается, но ничего больше не происходит. Для теста, создал минимальный плагин, с одной функцией - вывод текстового файла - результат тот же. Плагин добавлен в модуль ShopScript, и прописан в файле "wa-config/apps/shop/plugins.php". Судя по логу WebAssyst не может найти файлы плагина:

"Error: Class shopZakazApiModuleUpdateCli not found".

При этом, в админке сайта плагин отображается корректно.

Подскажите пожалуйста, в чём может быть проблема?

2 ответа

  • 2
    Эмиль 24 августа 2017 10:07 #

    1) Проверьте что файл есть и доступен

    2) Почистите кэш если файл до этого раньше получался (простого очищения кэша в инсталлере недостаточно - ищите нужный файл в wa-cache)

    3) Проверьте что внутри файла он правильно назван (втч регистр)

    • +1
      Roman Viziryakin Roman Viziryakin 26 августа 2017 01:12 #

      Спасибо огромное, за ответ, правда решение сам уже нашёл. Да, действительно, проблема была в кэше. Но, появилась другая, которую я, хоть и решил, но - дико криво. Скрипт, при запуске не видит ни одного файла класса. Мне пришлось вручную прописать require, чтобы скрипт заработал, на все файлы, включая мои классы, модели, и прочее. Не подскажете, в чём может быть проблема?

  • 2
    Михаил Ушенин Webasyst 28 августа 2017 10:14 #
    Class shopZakazApiModuleUpdateCli

    Как минимум, имя класса плагина сформировано не по документации. Должно быть хотя бы shopZakazPluginApiModuleUpdateCli. Ну, и слово Module выглядит сомнительным в имени класса. Ваш класс точно оперирует модулями? В документации нет примеров имён классов с этим словом, насколько я помню.

    • +1
      Roman Viziryakin Roman Viziryakin 3 сентября 2017 09:46 #
      Ну, и слово Module выглядит сомнительным в имени класса.

      ZakazApiModule - это название самого плагина. И я не вижу ни одной адекватной причины, почему я не могу называть свой плагин модулем. Кроме того, в документации НЕТ информации о том, что нужно писать слово Plugin в имени cli-класса.

      <?php class shopBrandsUpdateCli extends waCliController { public function execute() { // Код, который должен запуститься при вызове скрипта // Можно использовать модели и любые другие классы приложения } }


      • +1
        Михаил Ушенин Михаил Ушенин Webasyst 3 сентября 2017 18:36 #
        ZakazApiModule - это название самого плагина.

        Выглядит очень необычно. Хотя, возможно, и такой идетификатор имет право на жизнь. Но он может создать вам проблемы в неожиданных местах. Чтобы не бороться с лишними сложностями, измените идентификатор на строку в нижнем регистре, как у всех остальных плагинов.

        в документации НЕТ информации о том, что нужно писать слово Plugin в имени cli-класса

        Возможно, это пока что недостаточно чётко сформулировано в документации, но все PHP-классы плагина должны быть именованы по правилу [app_id][Plugin_id]Plugin... Допускаю, что, возможно, сработает и без слова Plugin, но не исключено, что в будущем это допущение может быть отменено. Посмотрите, например, как сформировано имя класса CLI-контроллера для плагина yandexmarket.

        Над документацием поработаем, чтобы требования, запреты и рекомендации в ней были сформулированы более чётко и внятно.

        • +1
          Roman Viziryakin Roman Viziryakin 3 сентября 2017 21:46 #

          Я пока эксперементировал, перевёл весь модуль из плагина в приложение. Уже переписал всё, что возможно, но движок выдаёт какую-то дичь. Начиная с того, что всё ещё не подключаются автоматически модели бд и классы, заканчивая чудесами с бекэндом. Вот пример:

          Название модуля - zakaz;
          Название контроллера - zakazBackend.Controller.php, название класса в этом файле - zakazBackendController. Внутри функция execute();
          Название файла шаблона - BackendDefault.html;

          Приложение прописано в app.php - "'zakaz' => true,"; и в routing.php:
          "2 => array(
          'url' => '*',
          'app' => 'merillion',
          'module' => 'backend'
          ),"

          Итог - белый экран, и 500 ошибка в консоли. При этом, если прописать zakazBackend.Actions.php и zakazBackendActions, с той же самой функцией execute(), что вообще противоречит документации, всё работает! А функцию, которая в таком случае должна запускаться - defaultAction() он полностью игнорирует! А ещё, запросы, отправляемые скриптом перенаправляются не к действию, а на страницу шаблона. Т.е. при нажатии на кнопку (пример из документации):

          <a class="count" href="?action=delete&id={$r.id}"></a>
          

          Он начнёт искать шаблон DeleteBackend.html.

          • +1
            Roman Viziryakin Roman Viziryakin 3 сентября 2017 22:05 #

            Блин, закосячил, не то скопировал. Имел в виду, что в routing.php:

            "3 => array(
            'url' => '*',
            'app' => 'zakaz',
            'module' => 'backend'

            ),"

            Собственно вот этот тестовый проект, сделанный, вроде как полностью по документации. При открытии страницы в панели управления у меня только белый фон, и сообщение о 500 ошибке в консоли. А в логах вообще пусто.

            • +1
              Михаил Ушенин Михаил Ушенин Webasyst 4 сентября 2017 10:19 #

              Файл routing.php используется только для разбора ЧПУ во фронтенде. У вашего приложения нет фронтенда, значит, и этот файл вам не нужен.

              В бекенде используются правила разбора URL по умолчанию — по GET-параметрам:

              • если есть параметр module, то используется экшен или контроллер из указанного модуля; если не указан, то модулем экшена или контроллера является модуль backend;
              • если указан параметр action, то исопльзуется экшен или контроллер с таким идентификатором
              При открытии страницы в панели управления у меня только белый фон, и сообщение о 500 ошибке в консоли. А в логах вообще пусто.

              Включите логирование об ошибках PHP.

          • +2
            Михаил Ушенин Михаил Ушенин Webasyst 4 сентября 2017 09:53 #


            Название контроллера - zakazBackend.Controller.php, название класса в этом файле - zakazBackendController.

            В имени файла часть controller должна быть написана в нижнем регистре.


            Внутри функция execute();
            Название файла шаблона - BackendDefault.html;

            У конроллеров нет своих шаблонов по умолчанию. Шаблоны по умолчанию есть только у экшенов, которые оформляются в виде PHP-файлов с именами на xxx.actions.php и xxx.action.php. Чтобы в контроллере использовать шаблон, его нужно явно подключить в коде контроллера, либо выполнить экшен внутри контроллера. А если вам нужен шаблон, то, возможно, вам нужен не чистый контроллер, а просто экшен.

            А функцию, которая в таком случае должна запускаться - defaultAction() он полностью игнорирует!

            Метод defaultAction() нужен только при использовании множественного класса экшенов с именем файла на xxx.actions.php. Если используется одиночный экшен или контроллер, то имя его основного метода — execute().

            А ещё, запросы, отправляемые скриптом перенаправляются не к действию, а на страницу шаблона.

            У шаблона нет страницы. Шаблон может быть шаблоном по умолчанию для какого-то экшена или макета. Либо шаблон может явно подключаться в коде контроллера (потому что у контроллеров нет шаблонов, подключаемых по умолчанию).

            при нажатии на кнопку (пример из документации): <a class="count" href="?action=delete&id={$r.id}"></a>
            Он начнёт искать шаблон DeleteBackend.html

            Наверное, вы перепутали: для экшена с таким URL должен подбираться шаблон с именем BackendDelete.html. Сначала имя модуля (Backend — модуль по умолчанию, если в URL явно не указан другой), потом имя экшена/контроллера (Delete в вашем примере).

            • +1
              Roman Viziryakin Roman Viziryakin 4 сентября 2017 11:15 #

              Спасибо. Вы действительно помогли разобраться. Но всё ещё осталась ошибка с тем, что приложение не видит классы и модули. Видимо, я снова накосячил с названиями. Смотрите:

              Класс - zakazSsaddinfo, имя файла класса - zakazSsaddinfo.class.php.
              Модель - shop_categoryModel extends waModel, имя файла модели - zakazShop_category.model.php.

              Видимо, я что-то не так делаю.

              • +2
                Михаил Ушенин Михаил Ушенин Webasyst 4 сентября 2017 14:23 #
                Модель - shop_categoryModel extends waModel, имя файла модели - zakazShop_category.model.php

                Имя класса не соответствует имени файла.

                Да и классы моделей стоит создавать только для собственных таблиц приложения. Если вы хотите обращаться к данным другого приложения, то инициализируйте это другое приложение в своём PHP-коде функцией

                wa('shop'); //инициализируем приложение с идентификатором 'shop'

                и потом создавайте и используйте экземпляры его классов:

                $shop_category_model = new shopCategoryModel();
                $shop_category_model->...();
                • +1
                  Roman Viziryakin Roman Viziryakin 4 сентября 2017 17:40 #

                  О боже... Оно заработало! Спасибо вам огромное, после подключения таблиц шопскрипта через

                  wa('shop');

                  и привода таблиц приложения и их моделей к нужным именам, у меня, заработало всё. В.т.ч. и классы сами с радостью подключились...

                  Ещё раз спасибо за помощь!

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите