CakePHP 4多个复选框

问题描述

我想用数组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,"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选项,用于提供选择值的选项名为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),]
    );
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...