Yii2 Kartik Select2 多个标签输入字符串错误

Posted

技术标签:

【中文标题】Yii2 Kartik Select2 多个标签输入字符串错误【英文标题】:Yii2 Kartik Select2 Multiple Tags Input String Error 【发布时间】:2017-03-21 04:31:40 【问题描述】:

我使用 Select2 小部件将选定的标签输入存储到 mysql 数据库。我希望像010102, 010103, 010299 这样的东西会存储在数据库表中。

这里是 view.php

    echo $form->field($model, 'SpField')->label(false)->widget(Select2::className(), [
        'data' => ArrayHelper::map(Supplierfield::find()->all(), 'sfCode', 'sfCode'),
        'options' => [
            'multiple' => true,
            'placeholder' => 'Choose tag ...',
        ],
        'pluginOptions' => [
            'tags' => true
        ]
    ]);

更新:这是模型上的相应规则

public function rules()

    return [
        [['spCode', 'SpName','SpPhone', 'SpEmail', 'SpAddress', 'SpPostcode', 'SpTown', 'SpState', 'SpDistrict','SpBumi', 'SpStatus'], 'required'],
        [['RecordStamp','SpField'], 'safe'],
        [['spCode'], 'string', 'max' => 7],
        [['SpName', 'SpEmail'], 'string', 'max' => 50],
        [['SpPhone'], 'string', 'max' => 20],
        [['SpAddress'], 'string', 'max' => 100],
        [['SpPostcode'], 'string', 'max' => 5],
        [['SpTown', 'SpState'], 'string', 'max' => 30],
        [['SpBumi', 'SpStatus'], 'string', 'max' => 15],
        [['SpDistrict'], 'string', 'max' => 50],
        [['spbalance','spfloatbalance'], 'number'],
        [['SpField'], 'string', 'max' => 255, 'message' => 'Field must be a string'],
        [['spCode'], 'unique'],
    ];

但是,为什么我会收到此错误。它说输入字段必须是一个字符串。

仅供参考:SpField 是 varchar(255) 的字段,sfCode 是 varchar(10) 的字段。

非常感谢任何帮助。

【问题讨论】:

多个 Select2 发布一个数组,您必须在验证数据之前将其设为字符串。请出示您的示范规则 @HasiburRahaman 我已经更新了这个问题。如何将其转换为字符串? 1 你可以去掉这个规则 [['SpField'], 'string', 'max' => 255, 'message' => 'Field must be a string'], 2 ) 做这个在验证之前使用 json_encode($model->SpField) 将数组转换为字符串, @HasiburRahaman 我按照你的建议做了。谢谢,现在我可以使用 json_encode 在表中保存["010101","010104","010299","010399","010501"] 之类的内容。但是,这是我应该将标签数据保存在数据库中的方式吗?因为我要在视图中显示它。 是的,你可以做到,当你想显示时,使用json_decode函数再次获取数组。 【参考方案1】:

这是我按照@HasiburRahman 的建议所做的。

1。消除模型 Supplier 中的字符串验证规则,因为小部件输入是数组形式而不是字符串。

[['SpField'], 'string', 'max' => 255, 'message' => 'Field must be a string'],

2。使用json_encode() 将输入转换为字符串并将其保存在控制器中。

    if ($model->load(Yii::$app->request->post()) && $model->save()) 
    
        $model->SpField = json_encode(Yii::$app->request->post( 'Supplier' )['SpField']); //convert the array into string
        $model->save();            
    

您可以使用 json_decode() 将其转换回数组以使用 Select2 小部件显示 $data。就我而言 它看起来像这样$data = json_decode($model->SpField);

对于像我这样的新手来说,这个工作非常好。希望这对其他人也有帮助。

【讨论】:

【参考方案2】:

用逗号值和空格对输入进行内爆

", "

用于查询数据库。

public function actionCreateOrUpdate($id)
    
        $model = $this->findModel($id);

        if ($model->load(Yii::$app->request->post())) 
            $model->SpField = implode (", ",$model->SpField);
            $model->save();
            return $this->redirect(['view', 'id' => $model->id]);
         else 
            return $this->render('create_or_update', [
                'model' => $model,
            ]);
        
    

【讨论】:

以上是关于Yii2 Kartik Select2 多个标签输入字符串错误的主要内容,如果未能解决你的问题,请参考以下文章

YII2:kartik Select2

Yii2:Gridview过滤器中的kartik\Select2下拉列表

kartik\Select2 作为 yii2\grid 中的过滤器输入

YII2:kartik Select2

Kartik Select2 - 以编程方式更改多个

Yii2. Kartik Select2 小部件宽度