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

how to define getName[field]Options() method in octobercms

我在尝试使用时遇到错误

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

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

如果我使用中继器 getnamefieldOptions 方法效果很好..所以如果我使用中继器,该方法是

getBacaanOptions(){ }

希望我说的够清楚了..

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

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

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

  color:
      label: 'Color'  
      type: dropdown

  manufacturer:
      label: 'Manufacturer' 
      type: dropdown

然后在汽车模式下添加方法;

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

因为字段类型是下拉列表,所以该方法应该总是 return 结果为格式为数组的结果:Value => Label

如果没有选项 return 一个空数组。

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

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

更新

1.Add json 列到您的数据库 table $table->json('temakebum')->nullable();

2.Add protected $jsonable = [ 'temakebum '] 在您的模型定义中

3.Using 我上面提到的命名约定将 getBacaanOptions() 方法添加到您的模型

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

5.Create 部分在您的控制器目录中并检查路径是否与 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] 中设置正确的 select 名称)

@Raja Khoury - 感谢您让他了解下拉菜单的工作原理...

对于像manufacturer这样的普通字段,我们可以使用这种方法,但是对于复杂的字段,我们需要使用不同的方法

我们需要在各自的模型中定义这个methods

First for normal fields there is simple approach get[fieldname]Options

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

Second specific method name approach

fields.yaml

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

inside your model

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

Third General Approach

inside your model

public function getDropdownOptions($fieldName, $value, $formData)
{
    if ($fieldName == 'temakebum[bacaan]') {
        return ['all' => 'All', ...];
    }
    else {
        return ['' => '-- none --'];
    }
}

并将字段设为JSON并将其存储为单列数组中的@ Raja Khoury 已经在不同的问题中回答了它,您可以从那里获取 reference

如果它对你有用,请也为他的答案投上一票:)