首页 > 解决方案 > PrestaShop:使用 ObjectModel 保存 MultiSelect

问题描述

我正在尝试通过添加多选选项来扩展制造商类。这就是它的样子:

 public function renderForm()
{
    global $shopOptions;
    $this->fields_form_override = array(
        array(
            'type' => 'select',
            'label' => $this->l('Shops'),
            'name' => 'shops',
            'class' => 'chosen',
            'multiple' => true,
            'required' => true,
            'options' => array(
                'query' => $shopOptions,
                'id' => 'id',
                'name' => 'name'
            ),
        ),

     );
    return parent::renderForm();

}

数据在这里检索:

public function __construct() {
    parent::__construct();

    global $shopOptions;
    $shopSQL = 'SELECT id_test_shop, name FROM '._DB_PREFIX_.'test_shop WHERE active=1';
    $result = Db::getInstance()->ExecuteS($shopSQL);
    foreach ($result as $row) {
        $shopOptions[] = array(
            "id" => (int)$row["id_test_shop"],
            "name" => $row["name"]
        );
    }

}

然后我修改了 Manufacturer.php 中的定义变量,如下所示:

$definition["fields"]["shops"] = array('type' => self::TYPE_STRING)

这一切似乎都有效,但保存在数据库中的值是空白的,可能是因为它不知道如何处理多选值。

我基本上是想在数据库中放置一个像“1,2,3”这样的字符串。因此,我尝试修改 processsave 功能:

public function processSave()
{
    if (Tools::isSubmit('submitAddManufacturer')) {
        $_POST['shops'] = implode(',', Tools::getValue('shops'));
    }

    return parent::processSave();
}

但这只会让它崩溃,并显示“未定义的索引:商店 []”。

有谁知道我如何让它将选择值的 id 作为内爆字符串保存到数据库中?

谢谢!

标签: phpprestashop

解决方案


我认为您需要修改/创建Manufacturer.php文件的方法addupdate并使用它们将数据保存到新属性$this->shops中。像这样的东西:

public function add($auto_date = true, $null_values = false)
{
    if($shops = Tools::getValue('shops')) {
        $this->shops = implode(',', $shops);
    }

    return parent::add($auto_date, $null_values);
}

与更新类似:

public function update($null_values = false)
{
    if($shops = Tools::getValue('shops')) {
        $this->shops = implode(',', $shops);
    }

    return parent::update($null_values);
}

推荐阅读