CakePHP 4多个复选框

时间:2020-08-25 21:21:28

标签: cakephp cakephp-4.x

我想用数组JournalEntry [strategy] [strategies_conditions]填充复选框组

然后我想选择JournalEntry [journal_entries_strategy_conditions]

中包含的复选框。

我显示了复选框,但未正确链接到nameid的正确字段

这是我在edit.php中拥有的代码

<?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,
    "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-2">
                  <input type="checkbox" name="strategy_id[]" value="2" id="strategy-id-2">{
    "id": 3,
    "strategy_id": 5,
    "name": "zxcad",
    "level": "0",
    "created": "2020-08-01T21:21:11+00:00",
    "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',
    'timezone' => 'UTC',
    'fixedNowTime' => false

},
'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',
            'timezone' => 'UTC',
            'fixedNowTime' => false
        
        },
        'modified' => object(Cake\I18n\FrozenTime) {

            'time' => '2020-08-25 20:51:42.000000+00:00',
            'timezone' => 'UTC',
            'fixedNowTime' => false
        
        },
    
    }
],
'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',
        'timezone' => 'UTC',
        'fixedNowTime' => false
    
    },
    'modified' => object(Cake\I18n\FrozenTime) {

        'time' => '2020-08-01 21:21:11.000000+00:00',
        'timezone' => 'UTC',
        'fixedNowTime' => false
    
    },
    'strategies_conditions' => [
        (int) 0 => object(App\Model\Entity\StrategiesCondition) {

            'id' => (int) 1,
            'strategy_id' => (int) 5,
            'name' => 'zxcasd',
            'level' => '0',
            'created' => object(Cake\I18n\FrozenTime) {

                'time' => '2020-08-01 21:21:11.000000+00:00',
                'timezone' => 'UTC',
                'fixedNowTime' => false
            
            },
            'modified' => object(Cake\I18n\FrozenTime) {

                'time' => '2020-08-01 21:21:11.000000+00:00',
                'timezone' => 'UTC',
                'fixedNowTime' => false
            
            },
            '[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,
            'strategy_id' => (int) 5,
            'name' => 'zxcasd',
            'level' => '0',
            'created' => object(Cake\I18n\FrozenTime) {

                'time' => '2020-08-01 21:21:11.000000+00:00',
                'timezone' => 'UTC',
                'fixedNowTime' => false
            
            },
            'modified' => object(Cake\I18n\FrozenTime) {

                'time' => '2020-08-01 21:21:11.000000+00:00',
                'timezone' => 'UTC',
                'fixedNowTime' => false
            
            }
        
        },
        (int) 2 => object(App\Model\Entity\StrategiesCondition) {

            'id' => (int) 3,
            'strategy_id' => (int) 5,
            'name' => 'zxcad',
            'level' => '0',
            'created' => object(Cake\I18n\FrozenTime) {

                'time' => '2020-08-01 21:21:11.000000+00:00',
                'timezone' => 'UTC',
                'fixedNowTime' => false
            
            },
            'modified' => object(Cake\I18n\FrozenTime) {

                'time' => '2020-08-01 21:21:11.000000+00:00',
                'timezone' => 'UTC',
                'fixedNowTime' => false
            
            },
            
        }
    ],

},
'[new]' => false,

这是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'
        ]
    ],
    'timeframe' => '',
    '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',
    'pair' => '',
    'buy_sell' => '',
    'personal_notes' => '',
    'entry_date_time' => '',
    'entry_price' => '',
    'strategy_id' => '5',
    'journal_entries_strategy_conditions' => [
        (int) 0 => [
            'strategies_condition_id' => '1'
        ],
        (int) 1 => [
            'strategies_condition_id' => '2'
        ]
    ],
    'timeframe' => '',
    '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' => ''
]

1 个答案:

答案 0 :(得分:1)

没有selected选项,用于提供选择值的选项名为valvalue,并且与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
]

或者在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),
        ]
    );
}
相关问题