2016-01-22 48 views
1

enter image description here当我尝试使用yii2-dynamicform创建动态表单时出现错误。在创建方法时它工作正常,但在更新时显示错误。我有两个表一个是 1.vendors & 2.vendors_more_categories未定义的变量:yii2

关系是1 *厂商& vendors_more_categories我只是吹罚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>"; 
     } 
    } 

} 
+0

name'modelsVendorsMoreCategories'有一些错字错误。检查相应的操作。 –

+0

嗨,谢谢你的回复,你可以检查我的代码,我没有得到你的答案。 – Nayank

+0

渲染_form文件时,你传递了'$ modelsVendorsMoreCategories'变量吗? –

回答

0

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

'model'=> $modelsVendorsMoreCategories[0], 
在DinamicForm部件

但是当你更新你的模型传递为$ modelsVendorsMoreCategories这个值

$modelsVendorsMoreCategories = $model->ven_id; 

(似乎不是一个数组,你必须确定这个对象包含一个具有0索引中的正确元素的数组)

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

我没有得到你。 – Nayank

+0

我有更新的答案..看起来你没有一个适当的数组elemeny阵列。 – scaisEdge

+0

我指的是https://github.com/wbraganca/yii2-dynamicform这个教程他们拿了$ modelCustomer = $ this-> findModel($ id); $ modelsAddress = $ modelCustomer-> addresses;像这样,但'地址'定义在哪里? – Nayank

0

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

卖方模式应该包含在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]; 
} 
0

在你actionUpdate您有:

$modelsVendorsMoreCategories = $model->ven_id; 

但是你应该有:

$modelsVendorsMoreCategories = $model->nameOfMyRelation; 

得到什么是真正的名字,走在你的$模式,并期待这样的事情:

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

如果你没有做这两个表之间的关系的任何功能,写一个。如果您在这样做时遇到问题,您可以随时使用gii的模型生成器并检查供应商模型(您不需要替换它,只需预览代码)即可。

0

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

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

检查您创建针对文件夹中的文件:

控制器: 控制器将参数传递给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]; 

没有通过paramater之前,现在它传递。

+0

这回答缺乏解释,似乎与@vinod的答案似乎相似! – AxelH

+0

控制器首先将**模型和modelsVendorsMoreCategories **传递到create.php页面并渲染到_form.php页面。 –

+0

所以检查视图文件夹中的create.php页面。 –