создать собственный контроллер бэк-офиса на пользовательском модуле в prestashop - PullRequest
0 голосов
/ 14 октября 2019

Во-первых, я перепробовал все вопросы и ответы, связанные с этой темой. Кроме того, я попробовал связанные вопросы и попытался решить их, но безуспешно. Поэтому, пожалуйста, внимательно прочитайте мой вопрос.

1) i want to create a custom controller on custom module in prestashop without tab.and get browser url Link.

2) how to create a controller url link with tocken on twig file. 

Я успешно создал модуль и установил в мой PS.

Я создаю контроллер [Checkstatus.php]

путь к файлу module/mymodule/contollers/admin/Checkstatus.php

<?php

class CheckstatusController extends  ModuleAdminController {

    public function __construct()
    {
        $this->page_name = 'checkstatus'; // page_name and body id
        echo "sfg";
        parent::__construct();
    }

    public function init()
    {
        parenrt::init();
    }
    public function demoAction()
    {
        return $this->render('@Modules/your-module/templates/admin/demo.html.twig');
    }

}

мой пользовательский модуль

<?php


if (!defined('_PS_VERSION_')) {
exit;
}

class MyModule extends  PaymentModule
{
    public function __construct()
    {
        $this->name = 'MyCustomModule';
        $this->tab = 'payments XYZ';
        $this->version                = '1.0';
        $this->author                 = 'XYZ Technologies';
        $this->bootstrap              = true;
        $this->displayName            = 'XYZ';
        $this->description            = 'XYZ.';
        $this->confirmUninstall       = 'Are you sure you want to uninstall XYZ module?';
        $this->ps_versions_compliancy = array('min' => '1.7.0', 'max' => _PS_VERSION_);
        $this->allow_countries        = array('CH', 'LI', 'AT', 'DE');
        $this->allow_currencies       = array('CHF', 'EUR');

        parent::__construct();

    }

    /**
    * Install this module and register the following Hooks:
    *
    * @return bool
    */
    public function install()
    {
        if (Shop::isFeatureActive()) {
            Shop::setContext(Shop::CONTEXT_ALL);
        }

        Db::getInstance()->execute('
                CREATE TABLE IF NOT EXISTS `' . _DB_PREFIX_ . 'MyCustomModule` (
                `id` int(11) NOT NULL AUTO_INCREMENT,
                `customer_id` int(255) NOT NULL,
                `MyCustomModule` int(255) DEFAULT NULL,
                `lastcheck_date` date,
                `add_date` date,
                PRIMARY KEY (`id`)
        ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
        ');

        return parent::install() && $this->registerHook('Statusbtnoncustomerview');
    }
    /**
     * Uninstall this module and remove it from all hooks
     *
     * @return bool
     */
    public function uninstall()
    {
        return parent::uninstall() && $this->uninstallDb() && $this->unregisterHook('Statusbtnoncustomerview');
    }

    public function uninstallDb()
    {
        return Db::getInstance()->execute('DROP TABLE IF EXISTS '._DB_PREFIX_.'MyCustomModule');
    }

    public function hookStatusbtnoncustomerview()
    {
        /**
         * Verify if this module is enabled
         */
        if (!$this->active) {
            return;
        }
        return $this->fetch('module:MyCustomModule/views/templates/hook/personal_information.html.twig');
    }
    /**
     * Returns a string containing the HTML necessary to
     * generate a configuration screen on the admin
     *
     * @return string
     */
    public function getContent()
    {
        $output = null;
        if (Tools::isSubmit('submit'.$this->name)) {

            // get configuration fields value
            $MyCustomModule_Account_Data = strval(Tools::getValue('MyCustomModule_Account_Data'));
            $credit_Checkbox =  strval(Tools::getValue('credit_Checkbox_1'));
            $interval_Month = strval(Tools::getValue('Interval_Month'));

            if (
                !$MyCustomModule_Account_Data ||
                empty($MyCustomModule_Account_Data) ||
                !Validate::isGenericName($MyCustomModule_Account_Data)
            ) {
                $output .= $this->displayError($this->l('Please Enter MyCustomModule Account Data.'));
            } else{

                // Update configuration fields value
                Configuration::updateValue('MyCustomModule_Account_Data', $MyCustomModule_Account_Data);
                Configuration::updateValue('credit_Checkbox_1', $credit_Checkbox);
                Configuration::updateValue('Interval_Month', $interval_Month);


                // Display message after successfully submit value
                $output .= $this->displayConfirmation($this->l('Settings updated'));
            }
        }

        return $output.$this->displayForm();
    }
    /**
     * Display a form
     *
     * @param array $params
     * @return form html using helper form
     */
    public function displayForm()
    {
        // Get default language
        $defaultLang = (int)Configuration::get('PS_LANG_DEFAULT');
        $credit_Checkbox = [
            [
                'id'=>1,
                'name'=>'',
                'val' => 1
            ]
        ];
        // Init Fields form array
        $fieldsForm[0]['form'] = [
            'legend' => [
                'title' => $this->l('Configuration'),
            ],
            'input' => [
                [
                    'type' => 'text',
                    'label' => $this->l('MyCustomModule Account Data'),
                    'name' => 'MyCustomModule_Account_Data',
                    'required' => true
                ],
                [

                    'type'=>'checkbox',
                    'label'=> $this->l('credit'),
                    'name'=>'credit_Checkbox',
                    'values'=>[
                        'query'=>$credit_Checkbox,
                        'id'=>'id',
                        'name'=>'name'
                    ]

                ],
                [
                    'type' => 'html',
                    'html_content' => '<input type="number" min="0" step="1" value="'.Configuration::get('Interval_Month').'" name="Interval_Month">',
                    'label' => $this->l('interval Month'),
                    'name' => 'Interval_Month',
                    'size' => 20
                ],
            ],
            'submit' => [
                'title' => $this->l('Save'),
                'class' => 'btn btn-default pull-right'
            ]
        ];


        $helper = new HelperForm();

        // Module, token and currentIndex
        $helper->module = $this;
        $helper->name_controller = $this->name;
        $helper->token = Tools::getAdminTokenLite('AdminModules');
        $helper->currentIndex = AdminController::$currentIndex.'&configure='.$this->name;

        // Language
        $helper->default_form_language = $defaultLang;
        $helper->allow_employee_form_lang = $defaultLang;

        // Title and toolbar
        $helper->title = $this->displayName;
        $helper->show_toolbar = true;        // false -> remove toolbar
        $helper->toolbar_scroll = true;      // yes - > Toolbar is always visible on the top of the screen.
        $helper->submit_action = 'submit'.$this->name;
        $helper->toolbar_btn = [
            'save' => [
                'desc' => $this->l('Save'),
                'href' => AdminController::$currentIndex.'&configure='.$this->name.'&save'.$this->name.
                    '&token='.Tools::getAdminTokenLite('AdminModules'),
            ],
            'back' => [
                'href' => AdminController::$currentIndex.'&token='.Tools::getAdminTokenLite('AdminModules'),
                'desc' => $this->l('Back to list')
            ]
        ];

        // Load current value
        $helper->fields_value['MyCustomModule_Account_Data'] = Configuration::get('MyCustomModule_Account_Data');
        $helper->fields_value['credit_Checkbox_1'] = Configuration::get('credit_Checkbox_1');
        $helper->fields_value['Interval_Month'] = Configuration::get('Interval_Month');


        return $helper->generateForm($fieldsForm);
    }


}

Я пытаюсь этот URL: http://localhost/prestashop/admin482vzxnel/index.php?module=mymodule&controller=checkstatus

Ошибка получения:

Page not found
The controller checkstatus is missing or invalid.

Спасибо

1 Ответ

0 голосов
/ 14 октября 2019

Чтобы включить класс в модуль, вы можете использовать php require. После включения в основной файл модуля вы можете создать экземпляр своего класса в своем модуле. Для назначения переменной, которую вы можете использовать в шаблоне, есть функция $this->context->smarty->assig().

Код, приведенный ниже, является просто примером того, как включить и использовать класс в пользовательском модуле Controller.

Дажеedit в hookStatusbtnoncustomerview() является примером того, как получить ссылку на модуль и ссылку на его метод, поэтому возьмите приведенный ниже код, такой как он есть, только пример

    require_once (dirname(__FILE__)).'contollers/admin/Checkstatus.php';

            class MyModule extends  PaymentModule
            {
                public function __construct()
                {
                    $this->name = 'MyCustomModule';
                    $this->tab = 'payments XYZ';
                    $this->version                = '1.0';
                    $this->author                 = 'XYZ Technologies';
                    $this->bootstrap              = true;
                    $this->displayName            = 'XYZ';
                    $this->description            = 'XYZ.';
                    $this->confirmUninstall       = 'Are you sure you want to uninstall XYZ module?';
                    $this->ps_versions_compliancy = array('min' => '1.7.0', 'max' => _PS_VERSION_);
                    $this->allow_countries        = array('CH', 'LI', 'AT', 'DE');
                    $this->allow_currencies       = array('CHF', 'EUR');

                    $this->checkController = null;

                    parent::__construct();

                }

                 private function _useCheckstatus(){

                      $this->checkController = new CheckstatusController();


                }

                public function MyMethod (){

                   $this->_useCheckstatus();
                   $this->checkController->demoAction();

                }

        public function hookStatusbtnoncustomerview()
            {
                /**
                 * Verify if this module is enabled
                 */
                if (!$this->active) {
                    return;
                }

                $this->context->smarty->assign(
                         array(
                           'my_module_name' => Configuration::get('MyCustomModule'),
                           'my_module_link' => $this->context->link->getModuleLink('MyCustomModule', 'mymethod'),
                           'token' => Tools::getToken(false)
                    )
                   );

                return $this->fetch('module:MyCustomModule/views/templates/hook/personal_information.html.twig');
            }
        .........

непросто исследовать, какPrestashop работает, поэтому мой совет: посмотрите на код из других модулей и возьмите пример из них.

Вместо этого, если вам нужно переопределить Core Prestashop Controller в вашем модуле, вы должны поместить файл переопределения в /MyModule / переопределение / контроллеры / администратор / ModuleAdminController.php. установка / сброс модуля поместит этот файл в папку root / override / controllers / admin /, и переопределение станет активным. просто не забудьте очистить кэш PS в «дополнительных настройках -> производительность»

...