【问题标题】:Undefined variable: yii2未定义变量:yii2
【发布时间】:2016-01-22 12:05:30
【问题描述】:

尝试使用 yii2-dynamicform 创建动态表单时出错。在创建方法时它工作正常,但在更新时显示错误。我有两张桌子一张是 1.供应商& 2.vendors_more_categories

供应商和供应商_more_categories 之间的关系是 1-* 我刚刚推荐了 https://github.com/wbraganca/yii2-dynamicform 这个链接。

<?php

namespace app\controllers;
namespace backend\controllers;
use Yii;
use app\models\Vendors;
use app\models\VendorsSearch;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\web\UploadedFile;
use yii\filters\AccessControl;
use app\models\VendorsMoreCategories;
use backend\models\Model;
use yii\web\Response;
use yii\widgets\ActiveForm;
use yii\helpers\ArrayHelper;
/**
 * VendorsController implements the CRUD actions for Vendors model.
 */
class VendorsController extends Controller
{
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['index','create', 'update', 'delete'],
                'rules' => [
                    [
                        'actions' => ['index','create', 'update', 'delete'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'delete' => ['post'],
                ],
            ],
        ];
    }

    /**
     * Lists all Vendors models.
     * @return mixed
     */
    public function actionIndex()
    {
        $searchModel = new VendorsSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }

    /**
     * Displays a single Vendors model.
     * @param integer $id
     * @return mixed
     */
    public function actionView($id)
    {
        return $this->render('view', [
            'model' => $this->findModel($id),
        ]);
    }

    /**
     * Creates a new Vendors model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     * @return mixed
     */
    public function actionCreate()
    {
        $model = new Vendors();
        $modelsVendorsMoreCategories = [new VendorsMoreCategories];
        if($model->load(Yii::$app->request->post())){        

            $modelsVendorsMoreCategories = Model::createMultiple(VendorsMoreCategories::classname());
            Model::loadMultiple($modelsVendorsMoreCategories, Yii::$app->request->post());


            // validate all models
            $valid = $model->validate();
            $valid = Model::validateMultiple($modelsVendorsMoreCategories) && $valid;

            if ($valid) {
                $transaction = \Yii::$app->db->beginTransaction();
                try {
                    if ($flag = $model->save(false)) {
                        foreach ($modelsVendorsMoreCategories as $modelVendorsMoreCategories) {
                            $modelVendorsMoreCategories->vmc_ven_id = $model->ven_id;
                            if (! ($flag = $modelVendorsMoreCategories->save(false))) {
                                $transaction->rollBack();
                                break;
                            }
                        }
                    }
                    if ($flag) {
                        $transaction->commit();

                        $model->file = UploadedFile::getInstance($model, 'file');
                        $save_file = '';
                        if($model->file){
                            $imagename = Vendors::find()->orderBy('ven_id DESC')->one();
                            $imagename=$imagename->ven_id+1;
                            $imagepath = 'images/imgvendors/'; // Create folder under web/uploads/logo
                            $model->ven_business_logo = $imagepath.$imagename.'.'.$model->file->extension;
                            $save_file = 1;
                        }
                        if ($model->save(false)) {
                            if($save_file){
                                $model->file->saveAs($model->ven_business_logo);
                            }
                            return $this->redirect(['view', 'id' => $model->ven_id]);
                        }                        
                    }
                } catch (Exception $e) {
                    $transaction->rollBack();
                }
            }            
        }else {
            return $this->render('create', [
                'model' => $model,
                'modelsVendorsMoreCategories' => (empty($modelsVendorsMoreCategories)) ? [new VendorsMoreCategories] : $modelsVendorsMoreCategories
            ]);
        }
    }

    /**
     * Updates an existing Vendors model.
     * If update is successful, the browser will be redirected to the 'view' page.
     * @param integer $id
     * @return mixed
     */
    public function actionUpdate($id)
    {
        $model = $this->findModel($id);
        //print_r($model->attributes);

        $modelsVendorsMoreCategories = $model->ven_id;   

        if($model->load(Yii::$app->request->post())){          
            $oldIDs = ArrayHelper::map($modelsVendorsMoreCategories, 'id', 'id');
            $modelsVendorsMoreCategories = Model::createMultiple(VendorsMoreCategories::classname(), $modelsVendorsMoreCategories);
            Model::loadMultiple($modelsVendorsMoreCategories, Yii::$app->request->post());
            $deletedIDs = array_diff($oldIDs, array_filter(ArrayHelper::map($modelsVendorsMoreCategories, 'id', 'id')));

            // validate all models
            $valid = $model->validate();
            $valid = Model::validateMultiple($modelsVendorsMoreCategories) && $valid;

            if ($valid) {
                $transaction = \Yii::$app->db->beginTransaction();
                try {
                    if ($flag = $model->save(false)) {
                        if (! empty($deletedIDs)) {
                            Address::deleteAll(['id' => $deletedIDs]);
                        }
                        foreach ($modelsVendorsMoreCategories as $modelVendorsMoreCategories) {
                            $modelVendorsMoreCategories->vmc_ven_id = $model->ven_id;
                            if (! ($flag = $modelVendorsMoreCategories->save(false))) {
                                $transaction->rollBack();
                                break;
                            }
                        }
                    }
                    if ($flag) {
                        $transaction->commit();
                        $model->file = UploadedFile::getInstance($model, 'file');
                        $save_file = '';
                        if($model->file){
                            $imagepath = 'images/imgvendors/'; // Create folder under web/uploads/logo
                            $model->ven_business_logo = $imagepath.$model->ven_id.'.'.$model->file->extension;
                            $save_file = 1;
                        }

                        if ($model->save(false)) {
                            if($save_file){
                                $model->file->saveAs($model->ven_business_logo);
                            }
                            return $this->redirect(['view', 'id' => $model->ven_id]);
                        }                        

                    }
                } catch (Exception $e) {
                    $transaction->rollBack();
                }
            }

        }else {
            return $this->render('update', [
                'model' => $model,
                'modelsVendorsMoreCategories' => (empty($modelsVendorsMoreCategories)) ? [new VendorsMoreCategories] : $modelsVendorsMoreCategories
            ]);
        }
    }

    /**
     * Deletes an existing Vendors model.
     * If deletion is successful, the browser will be redirected to the 'index' page.
     * @param integer $id
     * @return mixed
     */
    public function actionDelete($id)
    {
        $this->findModel($id)->delete();

        return $this->redirect(['index']);
    }

    /**
     * Finds the Vendors model based on its primary key value.
     * If the model is not found, a 404 HTTP exception will be thrown.
     * @param integer $id
     * @return Vendors the loaded model
     * @throws NotFoundHttpException if the model cannot be found
     */
    protected function findModel($id)
    {
        if (($model = Vendors::findOne($id)) !== null) {
            return $model;
        } else {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
    }
    //Function used for deleting the images
    public function actionDeleteimg($id, $field)
    {

        $img = $this->findModel($id)->$field;
        if($img){
            if (!unlink($img)) {
                return false;
            }
        }

        $img = $this->findModel($id);
        $img->$field = NULL;
        $img->update();

        return $this->redirect(['update', 'id' => $id]);
    }
    //Function used for getting more sub categories for vendor
    public function actionGetSubCategories()
    {
        $mbcid=$_GET['ven_main_category_id'];
        $sbcid=$_GET['ven_sub_category_id'];
        echo $mbcid;
    }
    public function actionLists($id)
    {
        $countVendors = Vendors::find()->where(['ven_contact_person_id' => $id])->count();
        $vendors = Vendors::find()->where(['ven_contact_person_id' => $id])->all();
        if ($countVendors > 0) {
            foreach ($vendors as $vendor) {
                echo "<option value='" . $vendor->ven_id . "'>" . $vendor->ven_company_name . "</option>";
            }
        } else {
            echo "<option></option>";
        }
    }

}

【问题讨论】:

  • name modelsVendorsMoreCategories 有一些拼写错误。检查相应的操作。
  • 您好,谢谢您的回复,您可以检查我的代码吗,我没有得到您的答案。
  • 渲染_form文件时是否传递$modelsVendorsMoreCategories变量?
  • 我将其渲染为 - return $this->render('update', [ 'model' => $model, 'modelsVendorsMoreCategories' => (empty($modelsVendorsMoreCategories)) ? [new VendorsMoreCategories ] : $modelsVendorsMoreCategories ]);

标签: yii2 yii-extensions yii2-advanced-app yii-components


【解决方案1】:

您访问 modelsVendorsMoreCategories[0](作为数组的元素)

  'model'=> $modelsVendorsMoreCategories[0], 

在您的 DinamicForm 小部件中,但当您更新模型时,您将此值作为 $modelsVendorsMoreCategories 传递

   $modelsVendorsMoreCategories = $model->ven_id;  

(看起来不是一个数组,你必须确保这个对象包含一个数组,该数组的索引为 0))

'modelsVendorsMoreCategories' => (empty($modelsVendorsMoreCategories)) ? 
       [new VendorsMoreCategories] : $modelsVendorsMoreCategories
        ]);

【讨论】:

  • 我已经更新了一个答案。看来你在数组中没有合适的数组元素。
  • 我指的是github.com/wbraganca/yii2-dynamicform这个教程他们采取了 $modelCustomer = $this->findModel($id); $modelsAddress = $modelCustomer->地址;像这样,但“地址”在哪里定义?
  • 我不知道 braganza,我不知道你想做什么,但我建议你检查一下这个内容是否符合你的需要.. 尝试 var_dump($modelsVendorsMoreCategories) 之前呈现检查内容。
【解决方案2】:

$modelsVendorsMoreCategories 应该在 actionUpdate 方法中包含 VendorsMoreCategories 模型。在此代码中 ($modelsVendorsMoreCategories = $model->ven_id) $modelsVendorsMoreCategories 包含 $model->ven_id。它是一个整数值,而不是 VendorsMoreCategories 对象。

Vendors 模型应包含 VendorsMoreCategories 模型上的关系:

class Vendors extends \yii\db\ActiveRecord 
{
    ....
    public function getVendorsMoreCategories() 
    {
        return $this->hasMany(VendorsMoreCategories::className(), 'vendor_id'=>'id']);
    }
}

然后,您应该在 actionUpdate 方法中使用该关系:

$model = $this->findModel($id);

$modelsVendorsMoreCategories = $model->vendorsMoreCategories;
if(!$modelsVendorsMoreCategories) {
    $modelsVendorsMoreCategories = [new VendorsMoreCategories];
}

【讨论】:

    【解决方案3】:

    在你的 actionUpdate 中你有:

    $modelsVendorsMoreCategories = $model->ven_id;
    

    但你应该有:

    $modelsVendorsMoreCategories = $model->nameOfMyRelation;
    

    要知道真名是什么,请进入您的 $model,然后查找类似以下内容:

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getNameOfMyRelation()
    {
        return $this->hasMany(VendorsMoreCategories::className(), ['ven_id' => 'id']);
    }
    

    如果你没有任何函数来建立这两个表的关系,写一个。如果遇到问题,您可以随时使用gii 的模型生成器并检查 Vendors 模型(您不需要替换它,只需预览代码即可)。

    【讨论】:

      【解决方案4】:

      检查视图文件夹中的 create.php 文件,传递所需的变量 _form.php 文件从这里作为:-

       <?= $this->render('_form', [
          'model' => $model,
          'modelsAddress' => $modelsAddress,
      ]) ?>
      

      【讨论】:

        【解决方案5】:

        检查您在视图文件夹中的创建文件:

        控制器: 控制器将参数传入create.php

         return $this->render('create', [
                    'model' => $model,
                    'modelsVendorsMoreCategories' => (empty($modelsVendorsMoreCategories)) ? [new VendorsMoreCategories] : $modelsVendorsMoreCategories
                ]);
        

        查看:create.php

        如果您错过了参数:'modelsVendorsMoreCategories' =>$modelsVendorsMoreCategories。 它在 _form.php 页面中显示未定义变量错误。

        <?= $this->render('_form', [
                    'model' => $model,
                    'modelsVendorsMoreCategories' =>$modelsVendorsMoreCategories
         ])?>
        

        查看:_form.php

        $modelsVendorsMoreCategories[0];
        

        在它通过之前没有通过的参数。

        【讨论】:

        • 这个答案缺乏解释,似乎与@vinod 的答案非常相似!
        • Controller 首先将 model 和 modelsVendorsMoreCategories 传入 create.php 页面并渲染到 _form.php 页面。
        • 所以检查视图文件夹中的create.php页面。
        • 您不明白,您需要编辑您的答案以提供高质量的内容,您在没有任何新输入的情况下使用了 vinod 答案,因此这不是正确的答案。不要试图获得这样的声誉,新用户会受到监控。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-25
        • 1970-01-01
        • 1970-01-01
        • 2011-06-11
        • 2021-02-27
        相关资源
        最近更新 更多