如何在octobercms中定义getName [field] Options()方法

时间:2018-02-07 01:59:42

标签: octobercms octobercms-plugins octobercms-backend

尝试使用

时出错
get*field*Options() method 

field: name[field]

我试图使用:

getName[field]Options() method but it return an error.

我该如何做到这一点?

fields.yaml

temakebum[tema]:                    
        tab: 'Kebaktian Umum & Komisi'             
        label: Tema
        oc.commentPosition: ''
        span: full
        type: text
temakebum[bacaan]:
        label: 'Bahan Bacaan'
        oc.commentPosition: ''
        span: full
        type: dropdown
        tab: 'Kebaktian Umum & Komisi' 
temakebum[pujian]:
        label: Pujian
        oc.commentPosition: ''
        span: full
        type: text
        tab: 'Kebaktian Umum & Komisi' 

在模特中

public function getTemakebum[bacaan]Options() { 
  $bacaan = Db::table('mismaiti_mywarta_jadwlibdh')->where('group','umumraya')->pluck('bacaan','bacaan');
  return $bacaan;
}

我需要将这几个字段作为数组放入数据库表中..它更像是转发器小部件..但转发器要求用户点击添加新项目按钮..我不希望用户点击添加新按钮,但默认情况下我想要它

如果我使用转发器getnamefieldOptions方法运行良好..所以如果我使用转发器方法是

getBacaanOptions(){ }
希望我说得够清楚......

2 个答案:

答案 0 :(得分:1)

不是 getName[field]Options()而是使用get[FieldName]Options()

如果您的模型Car并且您有一个名为Manufacturer的字段(列),则方法名称为getManufacturerOptions()

汽车模型的fields.yaml文件应如下所示;

  color:
      label: 'Color'  
      type: dropdown

  manufacturer:
      label: 'Manufacturer' 
      type: dropdown

然后在Car模式中添加方法;

public function getManufacturerOptions() {

    return [
        'volkswagen' => 'Volkswagen',
        'ford'       => 'Ford',
        'toyota'     => 'Toyota'
    ];

  // Or return ManufacturerModel::all()->pluck('name','id');
}

public function getColorOptions() {

    return [
        'black'    => 'Black', 
        'white'    => 'White'
    ];
}

因为字段类型是下拉列表,所以方法应始终以格式返回结果:Value => Label

如果没有选项则返回一个空数组。

fields.yaml中定义选项时,无需在模型中添加方法

  color:
      label: 'Color' 
      type: dropdown
      options:
          black: Black
          white: White

更新

1.将json列添加到数据库表$table->json('temakebum')->nullable();

2.在模型定义中添加protected $jsonable = [ 'temakebum ']

3.使用上面提到的命名约定将getBacaanOptions()方法添加到模型中

4.保持您的fields.yaml文件字段不变,现在解决方法是将字段类型从下拉列表更改为部分temakebum[bacaan]字段并填充选项

5.在您的控制器目录中创建一个部分并检查路径是否与fields.yaml文件中的路径匹配

到目前为止fields.yaml看起来像这样

  temakebum[tema]:
          label: Tema 
          type: text
  temakebum[bacaan]:
          label: 'Bahan Bacaan' 
          type: partial
          path: $/authorName/pluginName/controllers/pluginControllerName/bacaan.htm
  temakebum[pujian]:
          label: Pujian 
          type: text

你的bacaan.htm部分是这样的:

<?php
$fieldOptions = $model->getBacaanOptions(); // See here we are fetching values
$Temakebum = json_decode($model->attributes['temakebum'], true)  ?: [];
?>
<select class="form-control custom-select" name="YourModelHere[temakebum][bacaan]">
    <?php foreach( $fieldOptions as $key=>$label) { ?>
        <option value="<?= $key ?>" <?php echo ( $Temakebum['bacaan'] == $key) ? "selected" : '';  ?> ><?= $label ?></option>
    <?php } ?>
</select>

(确保在部分YourModelHere [temakebum] [bacaan]中设置正确的选择名称)

答案 1 :(得分:1)

@Raja Khoury - 感谢让他了解下拉工作的方式......

我们可以将此方法用于<messageHidden inputs="$scope.inputs"/> 等常规字段,但对于复杂字段,我们需要使用不同的方法

我们需要在相应的模型中定义此manufacturer

  

methods首先是简单方法获取[fieldname]选项

normal fields
  

第二次public function get[fieldname]Options($value, $formData) { return ['all' => 'All', ...]; } 方法

specific method name

fields.yaml

status: label: Blog Post Status type: dropdown options: listBacaan

inside your model
  

第三一般方法

public function listBacaan($fieldName, $value, $formData) { return ['key1' => 'data1', ...]; }

inside your model

将字段设为 JSON 并将其存储为数组在单列 @Raja Khoury 中已经回答了不同的问题,你可以从那里获取参考Octobercms: How can I make a repeater field jsonable because I am creating this repeater field into a different plugin

如果它对你有用,请向他的答案进行投票:)