上節咱們只是創建了小插件,可是數據是模擬的,咱們但願將數據存儲起來,那麼咱們就須要經過關聯表將數據與視頻表關聯並保存,下面咱們打開Builder,建立演員表javascript
【database】php
【Models】css
【Models】——【Forms】前端
【Models】——【Lists】java
【Models】——【Backend Menu】數據庫
【Models】——【Controllers】測試
【Models】——【Backend Menu】設置URLui
刷新頁面,而後選擇視頻,能夠進入演員編輯頁面:this
添加演員數據:spa
由於咱們前期使用了repeater字段存儲演員信息,此次咱們將用數據庫存儲演員信息。因此須要將演員這個字段從視頻表中刪除。
下面咱們將要創建一箇中間表格做爲視頻和演員的中間表實現多對多的關聯
接下來就須要創建視頻和演員表的多對多的關係、
File:pluginsraiseinfomoviesmodelsMovie.php
public $belongsToMany = [ 'genres' => [ 'Raiseinfo\Movies\Models\Genre', // 模型 'table' => 'raiseinfo_movies_movies_genres', // 中間表 'order' => 'genre_title' ], 'actors' => [ 'Raiseinfo\Movies\Models\Actor', // 模型 'table' => 'raiseinfo_movies_actors_movies', // 中間表 'order' => 'name' ] ];
File:pluginsraiseinfomoviesmodelsActor.php
public $belongsToMany = [ 'movies' => [ 'Raiseinfo\Movies\Models\Movie', // 模型 'table' => 'raiseinfo_movies_actors_movies', // 中間表 'order' => 'name' ] ];
經過上述的代碼修改,就實現了Movies和Actors表的多對多的關聯關係。
下面修改部件,實現數據保存
首先須要準備數據變量,給小部件使用
File:pluginsraiseinfomoviesformwidgetsActorbox.php
public function render() { $this->prepareVars(); dump($this->vars['actors']); return $this->makePartial('widget'); } public function prepareVars() { $this->vars['id'] = $this->model->id; $this->vars['actors'] = Actor::all()->lists('name','id'); }
接下來就能夠修改插件了pluginsraiseinfomoviesformwidgetsactorboxpartials_widget.htm
<style type="text/css"> .select2-container { width: 100% !important; display: block; } </style> <select class="s2" multiple> <?php foreach($actors as $key => $value): ?> <option value="<?php echo $key ?>"><?php echo $value ?></option> <?php endforeach; ?> </select> <script type="text/javascript"> $(document).on('render',function () { $('.s2').select2({ placeholder: 'Add Actors', tags: true }) }); </script>
如今顯示了演員表中的全部演員的名,可是,沒有顯示全部演員的姓。咱們須要在Actor中作適當修改:pluginsraiseinfomoviesmodelsActor.php
/** * 訪問器的命名對應的就是full_name * @return string */ public function getFullNameAttribute() { return $this->name." ".$this->lastname; }
File:pluginsraiseinfomoviesformwidgetsActorbox.php
public function prepareVars() { $this->vars['id'] = $this->model->id; $this->vars['actors'] = Actor::all()->lists('full_name','id'); }
這樣顯示的就會有姓和名了。
爲了在前端頁面上顯示演員的信息,咱們須要對select進行設置
File:pluginsraiseinfomoviesformwidgetsActorbox.php
public function prepareVars() { $this->vars['id'] = $this->model->id; $this->vars['actors'] = Actor::all()->lists('full_name','id'); $this->vars['name'] = $this->formField->getName().'[]'; }
File:pluginsraiseinfomoviesformwidgetsactorboxpartials_widget.htm
<select class="s2" name="<?php echo $name ?>" multiple> <?php foreach($actors as $key => $value): ?> <option value="<?php echo $key ?>"><?php echo $value ?></option> <?php endforeach; ?> </select>
File:themesraiseinfopagesmovie-single.htm
<h3>演員</h3> {% for actor in record.actors %} {{ actor.name }} {{ actor.lastname }} {% endfor %}
刷新前端頁面:
經過上面的測試,咱們已經知道,演員信息已經存儲到數據庫了,在前端也顯示出來。下面咱們刷新後臺頁面,打開編輯視頻信息。咱們發現存儲的演員信息並無顯示在Select中。
這是由於咱們沒有設置顯示選定的值。
File:pluginsraiseinfomoviesformwidgetsActorbox.php
public function prepareVars() { $this->vars['id'] = $this->model->id; $this->vars['actors'] = Actor::all()->lists('full_name','id'); $this->vars['name'] = $this->formField->getName().'[]'; // 下面一行 $this->vars['selectedValues'] = $this->getLoadValue(); }
File:pluginsraiseinfomoviesformwidgetsactorboxpartials_widget.htm
<select class="s2" name="<?php echo $name ?>" multiple> <?php foreach($actors as $key => $value): ?> <option value="<?php echo $key ?>" <!-- 下面這一行 --> <?php echo in_array($key,$selectedValues) ? 'selected="selected"' : '' ?> > <?php echo $value ?> </option> <?php endforeach; ?> </select>
好的,如今咱們已經能夠顯示已選擇的演員了,可是,咱們若是編輯一個沒有設置演員的視頻:
解決問題的辦法是:
File:pluginsraiseinfomoviesformwidgetsActorbox.php
public function prepareVars() { $this->vars['id'] = $this->model->id; $this->vars['actors'] = Actor::all()->lists('full_name','id'); $this->vars['name'] = $this->formField->getName().'[]'; if(!empty($this->getLoadValue())){ $this->vars['selectedValues'] = $this->getLoadValue(); }else{ $this->vars['selectedValues'] = []; } }