在 MODX 中使用预挂钩设置 select 字段选项标签

set select field option tags with prehook in MODX

在 MODX Revo 站点中,我有一个 FormIt 表单,其中有一个 select 字段,应该如下所示:

<select name="arrangement" id="arrangement">
<option value="0" [[!+fi.arrangement:FormItIsSelected=`0`]]>Arrangement 0</option>
<option value="1" [[!+fi.arrangement:FormItIsSelected=`1`]]>Arrangement 1</option>
<option value="2" [[!+fi.arrangement:FormItIsSelected=`2`]]>Arrangement 2</option>

我想使用名为 'getArrangements' 的 FormIt prehook 设置选项。

prehook 在 FormIt 表单定义中调用,在表单标签之前:

[[!FormIt?
   &preHooks=`getMaxYear,getArrangements` 

我成功地使用第一个调用的 prehook 'getMaxYear' 设置了一个简单输入字段的值,我很清楚它是如何工作的,但是对于 select 字段,事情就不太清楚了。根据 MODX RTFM,它应该通过 json-encoding 数组来完成,例如:

$hook->setValue('hobbies',json_encode(array('music','films','books')));

我从 select HTML 中删除了选项标签并创建了一个名为 'getArrangements' 的片段:

<?php
$arrangements = array(  '0' => 'Arrangement 0', 
                        '1' => 'Arrangement 1', 
                        '2' => 'Arrangement 2'); 
$hook->setValue('arrangement',json_encode($arrangements));
return true;

这不会产生错误,但会留下一个空的 select 字段。

我一定是忽略了这里的某些东西,我可以想象我尝试这样做的方式是行不通的。但我现在卡住了。

有人能给我指出正确的方向来完成这个吗?

FormItIsSelected 想要一个数值数组,而您使用了一个关联数组。使用以下代码 select 选项 0.

<?php
$arrangements = array('0'); 
$hook->setValue('arrangement',json_encode($arrangements));
return true;

可能我的最终解决方案对其他有相同问题的人有用: 我制作了一个名为 'getArrangementOptions':

的片段
$arrangements = array(  '0' => 'Arrangement 0', 
                        '1' => 'Arrangement 1', 
                        '2' => 'Arrangement 2'); 
$output = '';
foreach ($arrangements as $key => $value) {
    $output .= '<option value="'.$key.'" [[!+fi.arrangement:FormItIsSelected=`'.$key.'`]]>'.$value.'</option>';
}
return $output;

并在 select 标签内调用它:

<select name="arrangement" id="arrangement">
    [[!getArrangementOptions]]
</select>

谈何容易:)