簡體   English   中英

Prestashop 1.7.7 - 多商店上下文中的 HelperForm

[英]Prestashop 1.7.7 - HelperForm in a Multistore Context

我正在測試與 Multistore 兼容的模塊的第一個簡單版本。 它只有兩個設置,必須根據當前商店上下文(主要是單個商店)不同地保存。 現在,我知道從 1.7.8 開始,BO 表單中的每個設置都有額外的復選框,但我必須設法讓它也適用於 1.7.7。 現在,Configuration::updateValue() 和 Configuration::get() 都應該是多存儲就緒的,這意味着它們只更新或檢索當前上下文的值,所以應該沒問題。 奇怪的是,在安裝測試模塊后,如果我 go 到配置頁面,它會自動重定向到 All-Shop 上下文,如果我嘗試手動切換(從右上角的下拉列表),它會顯示空白頁。 如果我嘗試停用底部復選框“在以下上下文中激活此模塊:所有商店”,也會發生同樣的事情。

這是我的代碼:

class TestModule extends Module
{
    public function __construct()
    {
        $this->name = 'testmodule';
        $this->tab = 'front_office_features';
        $this->version = '1.0.0';
        $this->author = 'Test';
        $this->need_instance = 1;
        $this->ps_versions_compliancy = [
            'min' => '1.7.0.0',
            'max' => '1.7.8.0',
        ];
        $this->bootstrap = true;

        parent::__construct();
        $this->displayName = $this->l("Test Module");
        $this->description = $this->l('Collection of custom test extensions');
        $this->confirmUninstall = $this->l('Are you sure you want to uninstall?');

        if (!Configuration::get('TESTM_v')) {
            $this->warning = $this->l('No version provided');
        }
    }

    public function install()
    {
        if (Shop::isFeatureActive()) {
            Shop::setContext(Shop::CONTEXT_ALL);
        }

        return (
            parent::install() 
            && $this->registerHook('header')
            && $this->registerHook('backOfficeHeader')
            && Configuration::updateValue('TESTM_v', $this->version)
        ); 
    }

    public function uninstall()
    {
        if (Shop::isFeatureActive()) {
            Shop::setContext(Shop::CONTEXT_ALL);
        }

        return (
            parent::uninstall() 
            && $this->unregisterHook('header')
            && $this->unregisterHook('backOfficeHeader')
            && Configuration::deleteByName('TESTM_v')
        );
    }

    public function getContent()
    {

        // this part is executed only when the form is submitted
        if (Tools::isSubmit('submit' . $this->name)) {
            // retrieve the value set by the user
            $configValue1 = (string) Tools::getValue('TESTM_CONFIG_1');
            $configValue2 = (string) Tools::getValue('TESTM_CONFIG_2');

            // check that the value 1 is valid
            if (empty($configValue1)) {
                // invalid value, show an error
                $output = $this->displayError($this->l('Invalid Configuration value'));
            } else {
                // value is ok, update it and display a confirmation message
                Configuration::updateValue('TESTM_CONFIG_1', $configValue1);
                $output = $this->displayConfirmation($this->l('Settings updated'));
            }

            // check that the value 2 is valid
            Configuration::updateValue('TESTM_CONFIG_2', $configValue2);
            $output = $this->displayConfirmation($this->l('Settings updated'));
        }
        // display any message, then the form
        return $output . $this->displayForm();
    }

    public function displayForm()
    {    
        // Init Fields form array
        $form = [
            'form' => [
                'legend' => [
                    'title' => $this->l('Settings'),
                ],
                'input' => [
                    [
                        'type' => 'text',
                        'label' => $this->l('Custom CSS file-name.'),
                        'name' => 'TESTM_CONFIG_1',
                        'size' => 20,
                        'required' => true,
                    ],
                    [
                        'type' => 'switch',
                        'label' => $this->l('Enable custom CSS loading.'),
                        'name' => 'TESTM_CONFIG_2',
                        'is_bool' => true,
                        'desc' => $this->l('required'),
                        'values' => array(
                            array(
                                'id' => 'sw1_on',
                                'value' => 1,
                                'label' => $this->l('Enabled')
                            ),
                            array(
                                'id' => 'sw1_off',
                                'value' => 0,
                                'label' => $this->l('Disabled')
                            )
                        )
                    ],
                ],
                'submit' => [
                    'title' => $this->l('Save'),
                    'class' => 'btn btn-default pull-right',
                ],
            ],
        ];

        $helper = new HelperForm();

        // Module, token and currentIndex
        $helper->table = $this->table;
        $helper->name_controller = $this->name;
        $helper->token = Tools::getAdminTokenLite('AdminModules');
        $helper->currentIndex = AdminController::$currentIndex . '&' . http_build_query(['configure' => $this->name]);
        $helper->submit_action = 'submit' . $this->name;

        // Default language
        $helper->default_form_language = (int) Configuration::get('PS_LANG_DEFAULT');

        // Load current value into the form or take default
        $helper->fields_value['TESTM_CONFIG_1'] = Tools::getValue('TESTM_CONFIG_1', Configuration::get('TESTM_CONFIG_1'));
        $helper->fields_value['TESTM_CONFIG_2'] = Tools::getValue('TESTM_CONFIG_2', Configuration::get('TESTM_CONFIG_2'));

        return $helper->generateForm([$form]);
    }

    /**
     * Custom CSS & JavaScript Hook for FO
     */
    public function hookHeader()
    {
        //$this->context->controller->addJS($this->_path.'/views/js/front.js');
        if (Configuration::get('TESTM_CONFIG_2') == 1) {
            $this->context->controller->addCSS($this->_path.'/views/css/'.((string)Configuration::get('TESTM_CONFIG_1')));
        } else {
            $this->context->controller->removeCSS($this->_path.'/views/css/'.((string)Configuration::get('TESTM_CONFIG_1')));
        }
    }
}

如您所見,這是一個非常簡單的設置:只需加載自定義 CSS 文件並選擇是否加載它。 我已經為每個 Multistore 處理並在線搜索了紅色官方 PS 文檔,但找不到這個特定問題的答案。 我也嘗試添加:

if (Shop::isFeatureActive()) {
    $currentIdShop = Shop::getContextShopID();
    Shop::setContext(Shop::CONTEXT_SHOP, $currentIdShop);
 }

到 'displayForm()' function,但沒有結果。

先感謝您。

它似乎是一個緩存錯誤。 在嘗試了許多變體之后,我可以確認我嘗試的第一個解決方案是正確的,這意味着:

if (Shop::isFeatureActive()) {
    $currentIdShop = Shop::getContextShopID();
    Shop::setContext(Shop::CONTEXT_SHOP, $currentIdShop);
 }

需要在“displayForm()”function 的開頭添加廣告,以便在選擇單個商店時起作用。 值現在已正確保存在數據庫中。 在為“所有商店”上下文保存時,可以通過一些額外的邏輯來安排不同的行為(如果需要)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM