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

相關文章
相關標籤/搜索