问题描述
我想用数组JournalEntry [strategy] [strategies_conditions]填充复选框组
然后我想选择JournalEntry [journal_entries_strategy_conditions]
中包含的复选框。<?PHP
echo $this->Form->control('journal_id',['options' => $journals]);
echo $this->Form->control('ticket_number');
echo $this->Form->control('strategy_id',['options' => $strategies,'empty' => true,'onChange' => 'getComboA(this)']);
debug($journalEntry);
?>
<div id="stategy-condition">
<?PHP echo $this->Form->control('journal_entries_strategy_conditions.strategies_condition_id',[
'type' => 'select','multiple' => 'checkBox','options' => $journalEntry[strategy][strategies_conditions],'selected' => $journalEntry[journal_entries_strategy_conditions]
]); ?>
</div>
有了这个,我得到了输出,如您所见,它使用object
作为<label>
,并且<input value="1"
设置为id
值
<div class="input select">
<label for="strategy-id">Strategy</label>
<input type="hidden" name="strategy_id" value="">
<div class="checkBox">
<label for="strategy-id-0">
<input type="checkBox" name="strategy_id[]" value="0" id="strategy-id-0">{
"id": 1,"strategy_id": 5,"name": "zxcasd","level": "0","created": "2020-08-01T21:21:11+00:00","modified": "2020-08-01T21:21:11+00:00"
}</label>
</div>
<div class="checkBox">
<label for="strategy-id-1">
<input type="checkBox" name="strategy_id[]" value="1" id="strategy-id-1">{
"id": 2,"modified": "2020-08-01T21:21:11+00:00"
}</label>
</div>
<div class="checkBox">
<label for="strategy-id-2">
<input type="checkBox" name="strategy_id[]" value="2" id="strategy-id-2">{
"id": 3,"name": "zxcad","modified": "2020-08-01T21:21:11+00:00"
}</label></div></div>
以下是数据:
object(App\Model\Entity\JournalEntry) {
'id' => (int) 20,'journal_id' => (int) 1,'ticket_number' => 'sdfsdfsdf','strategy_id' => (int) 5,'timeframe' => '','created' => object(Cake\I18n\FrozenTime) {
'time' => '2020-08-25 20:51:42.000000+00:00','timezone' => 'UTC','fixedNowTime' => false
},'modified' => object(Cake\I18n\FrozenTime) {
'time' => '2020-08-25 20:51:42.000000+00:00','journal_entries_strategy_conditions' => [
(int) 0 => object(App\Model\Entity\JournalEntriesstrategyCondition) {
'id' => (int) 8,'journal_entry_id' => (int) 20,'strategies_condition_id' => (int) 1,'created' => object(Cake\I18n\FrozenTime) {
'time' => '2020-08-25 20:51:42.000000+00:00','fixedNowTime' => false
},'modified' => object(Cake\I18n\FrozenTime) {
'time' => '2020-08-25 20:51:42.000000+00:00',}
],'strategy' => object(App\Model\Entity\Strategy) {
'id' => (int) 5,'user_id' => (int) 1,'name' => 'zxcasd','description' => 'zxcasd','one_hundred_Trades' => (int) 0,'created' => object(Cake\I18n\FrozenTime) {
'time' => '2020-08-01 21:21:11.000000+00:00','fixedNowTime' => false
},'modified' => object(Cake\I18n\FrozenTime) {
'time' => '2020-08-01 21:21:11.000000+00:00','strategies_conditions' => [
(int) 0 => object(App\Model\Entity\StrategiesCondition) {
'id' => (int) 1,'level' => '0','created' => object(Cake\I18n\FrozenTime) {
'time' => '2020-08-01 21:21:11.000000+00:00','fixedNowTime' => false
},'modified' => object(Cake\I18n\FrozenTime) {
'time' => '2020-08-01 21:21:11.000000+00:00','[new]' => false,'[accessible]' => [
'strategy_id' => true,'name' => true,'level' => true,'created' => true,'modified' => true,'strategy' => true
]
},(int) 1 => object(App\Model\Entity\StrategiesCondition) {
'id' => (int) 2,'fixedNowTime' => false
}
},(int) 2 => object(App\Model\Entity\StrategiesCondition) {
'id' => (int) 3,'name' => 'zxcad',}
],},
这是edit.PHP的请求日期
[
'journal_id' => '1','ticket_number' => 'test con','pair' => '','buy_sell' => '','personal_notes' => '','entry_date_time' => '','entry_price' => '','strategy_id' => '5','journal_entries_strategy_conditions' => [
'strategies_condition_id' => [
(int) 0 => '1'
]
],'position_size' => '','sl' => '','tp' => '','market_conditions' => '','entry_toughts' => '','close_date_time' => '','close_price' => '','profit' => '','fees' => '','high_price' => '','low_price' => '','exit_thoughts' => '','feeling_before' => '','feeling_after' => ''
]
add.PHP
[
'journal_id' => '1','ticket_number' => 'sdfdsf','journal_entries_strategy_conditions' => [
(int) 0 => [
'strategies_condition_id' => '1'
],(int) 1 => [
'strategies_condition_id' => '2'
]
],'feeling_after' => ''
]
解决方法
没有selected
选项,用于提供选择值的选项名为val
或value
,并且与options
选项一样,它期望使用平坦的{{ 1}}数组(如果要为key => value
元素提供属性,则是一个例外,在这种情况下,可以使用带有<option>
和text
键的嵌套数组)。
对于value
,数组键将用于options
元素的<option>
属性,而数组值将用于元素的内容。
对于value
,该数组值将用于与value
数组的键进行匹配,即AFAICT,您需要一个options
数组。
通常使用strategies_condition_id
查找器准备选择控件的值,您会在烘焙的控制器中看到它。但是,由于您具有嵌套的关联,因此这不一定可行,并且最好在事后转换数据,这可以使用集合轻松完成。
例如在您的视图模板中:
list
<div id="stategy-condition">
<?php echo $this->Form->control('journal_entries_strategy_conditions',[
'type' => 'select','multiple' => 'checkbox','options' =>
collection($journalEntry['strategy']['strategies_conditions'])
->combine('id','name')
->toArray(),'value' =>
collection($journalEntry['journal_entries_strategy_conditions'])
->extract('strategies_condition_id')
->toArray()
]); ?>
</div>
调用应建立一个类似以下的集合:
combine()
和[
1 => 'zxcasd',2 => 'zxcasd',3 => 'zxcad',]
应该导致包含以下内容的集合:
extract()
这将导致选中第一个复选框。
就控件名称问题而言,有很多解决方法,例如,可以使用自定义模板对输入名称进行硬编码:
[
0 => 1
]
- Cookbook > Views > Helpers > Form > Options for Control
- Cookbook > Views > Helpers > Form > Customizing the Templates FormHelper Uses
或者在echo $this->Form->control('journal_entries_strategy_conditions',[
'type' => 'select',// ...
'templates' => [
'checkbox' =>
'<input
type="checkbox"
name="journal_entries_strategy_conditions[][strategies_condition_id]"
value="{{value}}"
{{attrs}}>',]
]);
类中使用beforeMarshal
回调在编组(修补)之前转换数据:
JournalEntriesTable
这将转换以下数据:
public function beforeMarshal(
\Cake\Event\EventInterface $event,\ArrayObject $data,\ArrayObject $options
) {
if (isset($data['journal_entries_strategy_conditions']['strategies_condition_id']) {
$ids = $data['journal_entries_strategy_conditions']['strategies_condition_id'];
$conditions = [];
foreach ($ids as $id) {
$conditions[] = [
'strategies_condition_id' => $id,];
}
$data['journal_entries_strategy_conditions'] = $conditions;
}
}
收件人:
'journal_entries_strategy_conditions' => [
'strategies_condition_id' => [
'1','2'
],],
甚至手动创建单个复选框,您可以在其中对每个表单控件的各个方面进行适当控制,包括名称:
'journal_entries_strategy_conditions' => [
[
'strategies_condition_id' => '1'
],[
'strategies_condition_id' => '2'
]
],
这将创建名称属性,例如:
echo $this->Form->label('journal_entries_strategy_conditions');
echo $this->Form->hidden('journal_entries_strategy_conditions',['value' => '']);
$selectedIds = collection($journalEntry['journal_entries_strategy_conditions'])
->extract('strategies_condition_id')
->toArray();
foreach ($journalEntry['strategy']['strategies_conditions'] as $index => $condition) {
echo $this->Form->control(
"journal_entries_strategy_conditions.{$index}.strategies_condition_id",[
'type' => 'checkbox','hiddenField' => false,'label' => $condition['name'],'value' => $condition['id'],'checked' => in_array($condition['id'],$selectedIds,true),]
);
}