2016-01-22 164 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頁面。 –