添加多语言到模块 PrestaShop

Adding multilangage to module PrestaShop

我创建了用于在 lef 列中显示字符串的简单模块,它可以工作,但我想将其扩展为在我的商店中以所有可用语言添加此文本的可能性。现在我的模块配置页面我只有字符串输入,我如何在这个按钮旁边添加语言选择以及如何将它保存到数据库中?

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

class Sometext extends Module
{
protected $config_form = false;

public function __construct()
{
    $this->name = 'sometext';
    $this->tab = 'front_office_features';
    $this->version = '1.0.0';
    $this->author = 'AgnesTom';
    $this->need_instance = 1;

    /**
     * Set $this->bootstrap to true if your module is compliant with bootstrap (PrestaShop 1.6)
     */
    $this->bootstrap = true;

    parent::__construct();

    $this->displayName = $this->l('sometext');
    $this->description = $this->l('some text in left column');
}

/**
 * Don't forget to create update methods if needed:
 * http://doc.prestashop.com/display/PS16/Enabling+the+Auto-Update
 */
public function install()
{
    Configuration::updateValue('SOMETEXT_TEXT', false);

    return parent::install() &&
        $this->registerHook('header') &&
        $this->registerHook('backOfficeHeader') &&
        $this->registerHook('displayLeftColumn');
}

public function uninstall()
{
    Configuration::deleteByName('SOMETEXT_TEXT');

    return parent::uninstall();
}

/**
 * Load the configuration form
 */
public function getContent()
{
    /**
     * If values have been submitted in the form, process.
     */
    if (((bool)Tools::isSubmit('submitSometextModule')) == true) {
        $this->postProcess();
    }

    $this->context->smarty->assign('module_dir', $this->_path);

    $output = $this->context->smarty->fetch($this->local_path.'views/templates/admin/configure.tpl');

    return $output.$this->renderForm();
}

/**
 * Create the form that will be displayed in the configuration of your module.
 */
protected function renderForm()
{
    $helper = new HelperForm();

    $helper->show_toolbar = false;
    $helper->table = $this->table;
    $helper->module = $this;
    $helper->default_form_language = $this->context->language->id;
    $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG', 0);

    $helper->identifier = $this->identifier;
    $helper->submit_action = 'submitSometextModule';
    $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false)
        .'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name;
    $helper->token = Tools::getAdminTokenLite('AdminModules');

    $helper->tpl_vars = array(
        'fields_value' => $this->getConfigFormValues(), /* Add values for your inputs */
        'languages' => $this->context->controller->getLanguages(),
        'id_language' => $this->context->language->id,
    );

    return $helper->generateForm(array($this->getConfigForm()));
}

/**
 * Create the structure of your form.
 */
protected function getConfigForm()
{
    return array(
        'form' => array(
            'legend' => array(
            'title' => $this->l('Settings'),
            'icon' => 'icon-cogs',
            ),
            'input' => array(
                array(
                    'col' => 3,
                    'type' => 'text',
                    'prefix' => '<i class="icon icon-envelope"></i>',
                    'desc' => $this->l('Enter a text'),
                    'name' => 'SOMETEXT_TEXT',
                    'label' => $this->l('Email'),
                ),
            ),
            'submit' => array(
                'title' => $this->l('Save'),
            ),
        ),
    );
}

/**
 * Set values for the inputs.
 */
protected function getConfigFormValues()
{
    return array(
        'SOMETEXT_TEXT' => Configuration::get('SOMETEXT_TEXT', 'Some text here'),
    );
}

/**
 * Save form data.
 */
protected function postProcess()
{
    $form_values = $this->getConfigFormValues();

    foreach (array_keys($form_values) as $key) {
        Configuration::updateValue($key, Tools::getValue($key));
    }
}

/**
* Add the CSS & JavaScript files you want to be loaded in the BO.
*/
public function hookBackOfficeHeader()
{
    if (Tools::getValue('module_name') == $this->name) {
        $this->context->controller->addJS($this->_path.'views/js/back.js');
        $this->context->controller->addCSS($this->_path.'views/css/back.css');
    }
}

/**
 * Add the CSS & JavaScript files you want to be added on the FO.
 */
public function hookHeader()
{
    $this->context->controller->addJS($this->_path.'/views/js/front.js');
    $this->context->controller->addCSS($this->_path.'/views/css/front.css');
}

public function hookDisplayLeftColumn()
{
   $some_string = Configuration::get('SOMETEXT_TEXT');
    if (isset($some_string)) {
    $this->context->smarty->assign('some_string', $some_string);
        return $this->display(__FILE__, '/views/templates/front/front.tpl');
    }
}

}

我会这样改:

<?php

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

class Sometext extends Module
{
    protected $config_form = false;

    public function __construct()
    {
        $this->name = 'sometext';
        $this->tab = 'front_office_features';
        $this->version = '1.0.0';
        $this->author = 'AgnesTom';
        $this->need_instance = 1;

        /**
         * Set $this->bootstrap to true if your module is compliant with bootstrap (PrestaShop 1.6)
         */
        $this->bootstrap = true;

        parent::__construct();

        $this->displayName = $this->l('sometext');
        $this->description = $this->l('some text in left column');
    }

    /**
     * Don't forget to create update methods if needed:
     * http://doc.prestashop.com/display/PS16/Enabling+the+Auto-Update
     */
    public function install()
    {

        $languages = Language::getLanguages(false);

        foreach ($languages as $lang)
        {
            //$values[] = Tools::getValue('SOMETEXT_TEXT_'.$lang['id_lang']);
            Configuration::updateValue('SOMETEXT_TEXT_'.$lang['id_lang'], '');
        }

        return parent::install() &&
            $this->registerHook('header') &&
            $this->registerHook('backOfficeHeader') &&
            $this->registerHook('displayLeftColumn');
    }

    public function uninstall()
    {
        $languages = Language::getLanguages(false);

        foreach ($languages as $lang)
        {
            //$values[] = Tools::getValue('SOMETEXT_TEXT_'.$lang['id_lang']);
            Configuration::deleteByName('SOMETEXT_TEXT_'.$lang['id_lang']);
        }

        return parent::uninstall();
    }

    /**
     * Load the configuration form
     */
    public function getContent()
    {
        /**
         * If values have been submitted in the form, process.
         */
        if (((bool)Tools::isSubmit('submitSometextModule')) == true) {
            $this->postProcess();
        }

        //$this->context->smarty->assign('module_dir', $this->_path);

        //$output = $this->context->smarty->fetch($this->local_path.'views/templates/admin/configure.tpl');

        //return $output.$this->renderForm();
        $this->context->smarty->assign('form', $this->renderForm());
        return $this->display(__FILE__, '/views/templates/admin/configure.tpl');
    }

    /**
     * Create the form that will be displayed in the configuration of your module.
     */
    protected function renderForm()
    {
        $helper = new HelperForm();

        $helper->show_toolbar = false;
        $helper->table = $this->table;
        $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT'));
        $helper->default_form_language = $this->context->language->id;
        $helper->module = $this;
        //$helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG', 0);
        $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0;

        $helper->identifier = $this->identifier;
        $helper->submit_action = 'submitSometextModule';
        $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false)
            .'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name;
        $helper->token = Tools::getAdminTokenLite('AdminModules');

        $helper->tpl_vars = array(
            'fields_value' => $this->getConfigFormValues(), /* Add values for your inputs */
            'languages' => $this->context->controller->getLanguages(),
            'id_language' => $this->context->language->id,
        );

        return $helper->generateForm(array($this->getConfigForm()));
    }

    /**
     * Create the structure of your form.
     */
    protected function getConfigForm()
    {
        return array(
            'form' => array(
                'legend' => array(
                'title' => $this->l('Settings'),
                'icon' => 'icon-cogs',
                ),
                'input' => array(
                    array(
                        'col' => 3,
                        'type' => 'text',
                        'prefix' => '<i class="icon icon-envelope"></i>',
                        'desc' => $this->l('Enter a text'),
                        'name' => 'SOMETEXT_TEXT',
                        'label' => $this->l('Email'),
                        'lang' => true
                    ),
                ),
                'submit' => array(
                    'title' => $this->l('Save'),
                ),
            ),
        );
    }

    /**
     * Set values for the inputs.
     */
    protected function getConfigFormValues()
    {

        $languages = Language::getLanguages(false);
        $values = array();

        foreach ($languages as $lang)
        {
            if(Tools::getValue('SOMETEXT_TEXT_'.$lang['id_lang'])) $values['SOMETEXT_TEXT'][$lang['id_lang']] = Tools::getValue('SOMETEXT_TEXT_'.$lang['id_lang']);
        }
        return $values;

    }

    /**
     * Save form data.
     */
    protected function postProcess()
    {
        $form_values = $this->getConfigFormValues();

        foreach ($form_values['SOMETEXT_TEXT'] as $k=>$key) {  
            Configuration::updateValue('SOMETEXT_TEXT_'.$k, $key);
        }
    }

    /**
    * Add the CSS & JavaScript files you want to be loaded in the BO.
    */
    public function hookBackOfficeHeader()
    {
        if (Tools::getValue('module_name') == $this->name) {
            $this->context->controller->addJS($this->_path.'views/js/back.js');
            $this->context->controller->addCSS($this->_path.'views/css/back.css');
        }
    }

    /**
     * Add the CSS & JavaScript files you want to be added on the FO.
     */
    public function hookHeader()
    {
        $this->context->controller->addJS($this->_path.'/views/js/front.js');
        $this->context->controller->addCSS($this->_path.'/views/css/front.css');
    }

    public function hookDisplayLeftColumn()
    {
       $some_string = Configuration::get('SOMETEXT_TEXT_'.$this->context->language->id);
        if (isset($some_string)) {
        $this->context->smarty->assign('some_string', $some_string);
            return $this->display(__FILE__, '/views/templates/front/front.tpl');
        }
    }
}