上节咱们只是创建了小插件,可是数据是模拟的,咱们但愿将数据存储起来,那么咱们就须要经过关联表将数据与视频表关联并保存,下面咱们打开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'] = []; } }