Prestashop从模块中设置多个选择并将其输入到输入中

时间:2015-01-01 13:13:39

标签: php module prestashop prestashop-1.6

我在Prestashop做一个小模块。在那个模块中,我使用了带有helperform的multiselect。所以我的代码就像这样

array(
    'type' => 'select',
    'cols' => 8,
    'class' => 'chosen-product-selct selected_products ',
    'multiple' => true,
    'label' => $this->l('Selected Products'),
    'name' => 'selected_products[]',
    'options' => array(
        'query' => $product_query,
        'id' => 'id',
        'name' => 'product_name'
    ),
    'desc' => $this->l('Select products from products list.'),
),

这里我将这些多选值保存到数据库中。但是当我进行编辑时,框中没有选择保存的值。盒子完全是空的。

获取结果我正在做这个

public function getConfigFieldsValues() {
    'selected_products[]'  => Tools::getValue('selected_products', Configuration::get('selected_products')),
}

它没有显示已经输入的值。所以有人可以告诉我如何解决这个问题吗?任何帮助和建议都会非常明显。感谢

2 个答案:

答案 0 :(得分:2)

我找到了Prestashop多选择表单助手问题的解决方案。

为了使选择框正常工作,有以下要求:

  1. 输入名称应为'[]'。例如:manufacturer_ids []
  2. $ fields_value数组应该具有相同名称的此元素:manufacturer_ids []而不是manufacturer_ids。
  3. $ fields_value数组的相应项的值应该选择值作为数组。例如:

    $ fields_value ['manufacturer_ids []'] = array(“120”,“145”);

  4. 我将提交的值保存为数据库中的sarialized字符串,所以我这样处理它:

        $selectedManufacturers = @unserialize($manufacturerIdsTakenFromDb);
        if ($selectedManufacturers === false && $selectedManufacturers !== 'b:0;') {
            $selectedManufacturers = array();
        }        
        $fields_value['manufacturer_ids[]'] = $selectedManufacturers;
    

    我在表单定义中的代码如下所示:

    array(
        'type' => 'select',
        'label' => $this->l('Manufacturers'),
        'name' => 'manufacturer_ids[]',
        'multiple' => true,
        'options' => array(
            'query' => array(
                array('key' => '1', 'name' => 'Apple'),
                array('key' => '2', 'name' => 'Samsung'),
                array('key' => '3', 'name' => 'HTC'),
            ),
            'id' => 'key',
            'name' => 'name'
        )
    ),
    

    如果您的代码满足所有这些并仍然无效,请告知我们,我们将很乐意协助您解决此问题。

答案 1 :(得分:0)

之前的答案是来自prestashop论坛的单一副本粘贴,但没有解决它,因为没有解释如何......

这里我正确解释了如何,必须以特殊方式捕获和存储值,在此示例中我演示使用单个字段存储为“1,2,3,6,8”

完整的代码和所有步骤:https://groups.google.com/forum/m/?hl=es#!topic/venenuxsarisari/z8vfPsvFFjk

这里我只放了最重要的部分..

正如前面提到的那样链接,在模型定义,类和表sql中添加了新的fiel

此方法允许以“1,2,3”存储在数据库中,因此您只能使用单个字段来关联多个选定值,更好的可能是使用groupbox 但非常困难,看一下prestachop的controllers目录中的AdminCustomers控制器类,它有一个多选组,它使用存储在单个字段中的关系表事件

然后在帮助器表单中,列表输入数组将select定义为:

在开始时不要忘记添加该行:

// aqui el truco de guardar el multiselect como una secuencia separada por comas, mejor es serializada pero bueh
$this->fields_value['id_employee[]'] = explode(',',$obj->id_employee);

这个$ obj是从该对象转到编辑时加载的先前存储值的表示,获取多选的字段的存储值,存储为“1,3,4,6”

并在字段形式的输入辅助列表中将选择倍数定义为:

            array(
                 'type' => 'select',
                'label' => $this->l('Select and employee'),
                'name' => 'id_employee_tech',
                'required' => false,
                'col' => '6',
                'default_value' => (int)Tools::getValue('id_employee_tech'),
                'options' => array(
                    'query' => Employee::getEmployees(true), // el true es que solo los que estan activos
                    'id' => 'id_employee',
                    'name' => 'firstname',
                    'default' => array(
                        'value' => '',
                        'label' => $this->l('ninguno')
                    )
                )
            ),

然后再覆盖后期处理

public function postProcess()
{
    if (Tools::isSubmit('submitTallerOrden'))
    {
        $_POST['id_employee'] = implode(',', Tools::getValue('id_employee'));
    }
    parent::postProcess();
}

这使得存储在数据库中为“1,2,3”