October CMS - 快速入门 14 保存Form Widget的数据

上节咱们只是创建了小插件,可是数据是模拟的,咱们但愿将数据存储起来,那么咱们就须要经过关联表将数据与视频表关联并保存,下面咱们打开Builder,建立演员表javascript

【database】php

clipboard.png

【Models】css

clipboard.png

【Models】——【Forms】前端

clipboard.png

【Models】——【Lists】java

clipboard.png

【Models】——【Backend Menu】数据库

clipboard.png

【Models】——【Controllers】测试

clipboard.png

【Models】——【Backend Menu】设置URLui

clipboard.png

刷新页面,而后选择视频,能够进入演员编辑页面:this

clipboard.png

添加演员数据:spa

clipboard.png

由于咱们前期使用了repeater字段存储演员信息,此次咱们将用数据库存储演员信息。因此须要将演员这个字段从视频表中删除。

clipboard.png

下面咱们将要创建一个中间表格做为视频和演员的中间表实现多对多的关联

clipboard.png

接下来就须要创建视频和演员表的多对多的关系、

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');
    
}

clipboard.png

接下来就能够修改插件了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>

clipboard.png

如今显示了演员表中的全部演员的名,可是,没有显示全部演员的姓。咱们须要在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');
    
}

clipboard.png

这样显示的就会有姓和名了。

为了在前端页面上显示演员的信息,咱们须要对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 %}

刷新前端页面:

clipboard.png

经过上面的测试,咱们已经知道,演员信息已经存储到数据库了,在前端也显示出来。下面咱们刷新后台页面,打开编辑视频信息。咱们发现存储的演员信息并无显示在Select中。

clipboard.png

这是由于咱们没有设置显示选定的值。
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>

clipboard.png

好的,如今咱们已经能够显示已选择的演员了,可是,咱们若是编辑一个没有设置演员的视频:

clipboard.png

解决问题的办法是:
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'] = [];
    }
}

clipboard.png

相关文章
相关标签/搜索