CakePHP Несколько полей ввода w / saveAll () HABTM несколько записей Вставка не сохраняется - PullRequest
0 голосов
/ 10 февраля 2011

Я нашел несколько очень полезных руководств и постов на StackOverflow по этой теме, но я полностью застрял в одной точке.

Все ниже работает за исключением моих данных HABTM Zip .

Вот мой код:

<?php for ($i = 1; $i <= 3; $i++) { // 3 fields at a time ?>

     <?php echo $this->Form->input('Plan.' . $i . '.plan_detail_id', array(
    'options' => $plans_list,
    'type'    => 'select',
    'empty'   => '-- Select a the Plan Detail --',
    'label'   => 'Select a the Plan Detail'
)); ?>

    <?php echo $this->Form->input('Plan.' . $i . '.monthly_cost', array('label' => 'Monthly Cost')); ?>
    <?php echo $this->Form->input('Plan.' . $i . '.dental_cost', array('label' => 'Dental Cost')); ?>
    <?php echo $this->Form->input('Plan.' . $i . '.age_id', array('label' => 'Select an Age Range', 'empty' => '-- Select an Age Range --')); ?>
    <?php echo $this->Form->input('Plan.' . $i . '.applicant_id', array('label' => 'Applicant Type', 'empty' => '-- Select an Applicant Type  --')); ?>
    <?php echo $this->Form->input('Plan.' . $i . '.state_id', array('label' => 'Select a State', 'empty' => '-- Select a State --')); ?>
    <?php echo $this->Form->input('"$i".Zip', array(
    'type'     => 'select',
    'multiple' => 'true',
    'label'    => 'Select the Zips'
));
<?php } // end for() ?>

Мой контроллер работает следующим образом:

function bulk_add() {
    if (!empty($this->data)) {
        $this->Plan->create();
        if ($this->Plan->saveAll($this->data, array('validate' => 'false'))) {
            $this->Session->setFlash(__('The plan has been saved', true));
            $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash(__('The plan could not be saved. Please, try again.', true));
        }
    }
    $ages = $this->Plan->Age->find('list', array('order' => array('Age.name ASC')));
    $applicants = $this->Plan->Applicant->find('list', array('order' => array('Applicant.name ASC')));
    $states = $this->Plan->State->find('list', array('order' => array('State.name ASC')));
    $zips = $this->Plan->Zip->find('list', array('order' => array('Zip.title ASC')));

    $this->set(compact('planDetails', 'ages', 'applicants', 'states', 'zips'));

    $plans_list = array();
    $plans = $this->Plan->PlanDetail->find('all', array('order' => array('PlanDetail.name ASC')));
    foreach ($plans as $row) {
        $plans_list["{$row['PlanDetail']['id']}"] = "{$row['PlanDetail']['name']} - {$row['PlanDetailNote']['name']}";
    }
    $this->set('plans_list', $plans_list);
}

Ответы [ 3 ]

1 голос
/ 11 февраля 2011

День 3:)

Я не могу сделать так, чтобы мой массив (с несколькими записями) НЕ индексировался численно. Для сохранения правильности работы saveAll () в нескольких таблицах необходим массив с ключами.

У меня есть полный дамп данных ниже с числовым индексированным массивом, и каким-то образом он должен быть проиндексирован ключами (я могу заставить его работать правильно, но ТОЛЬКО при вставке одной записи) ..

Мой взгляд для bulk_add

<?php for ($i = 1; $i <= 2; $i++) { ?>
<table>
  <tr>
  <td><?php echo $this->Form->input("$i.plan_detail_id", array(
    'options' => $plans_list,
    'type'    => 'select',
    'empty'   => '-- Select a the Plan Detail --',
    'label'   => 'Select a the Plan Detail'
));
?></td>
    <td><?php echo $this->Form->input("$i.monthly_cost", array('label' => 'Monthly Cost')); ?></td>
    <td><?php echo $this->Form->input("$i.dental_cost", array('label' => 'Vision Cost')); ?></td>
    <td><?php echo $this->Form->input("$i.age_id", array('label' => 'Select an Age Range', 'empty' => '-- Select an Age Range --')); ?></td>
    <td><?php echo $this->Form->input("$i.applicant_id", array('label' => 'Applicant Type', 'empty' => '-- Select an Applicant Type  --')); ?></td>
    <td><?php echo $this->Form->input("$i.state_id", array('label' => 'Select a State', 'empty' => '--   Select a State --')); ?></td>
    <td>

    <?php echo $this->Form->input("$i.Zip", array('multiple' => 'true')); ?>
</td>
  </tr>
</table>
<?php } // end for() ?>
<?php
echo $this->Form->end(__('Submit', true));
?>

Код моего контроллера:

function bulk_add() {
    if (!empty($this->data)) {
        $this->Plan->create();
        if ($this->Plan->saveAll($this->data, array('atomic' => 'false'))) {
            // Debug
            debug($this->data);
            $this->Session->setFlash(__('The plan has been saved', true));
            $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash(__('The plan could not be saved. Please, try again.', true));
        }
    }
    $ages = $this->Plan->Age->find('list', array('order' => array('Age.name ASC')));
    $applicants = $this->Plan->Applicant->find('list', array('order' => array('Applicant.name  ASC')));
    $states = $this->Plan->State->find('list', array('order' => array('State.name ASC')));

$zips = $this->Plan->Zip->find('list', array('order' => array('Zip.title ASC')));
    $this->set(compact('planDetails', 'ages', 'applicants', 'states', 'zips'));

    $plans_list = array();
    $plans = $this->Plan->PlanDetail->find('all', array('order' => array('PlanDetail.name ASC')));
    foreach ($plans as $row) {
        $plans_list["{$row['PlanDetail']['id']}"] = "{$row['PlanDetail']['name']} - {$row['PlanDetailNote']['name']}";
    }
    $this->set('plans_list', $plans_list);
}

Вот дамп отладки:

Array
(
[Plan] => Array
    (
        [1] => Array
            (
                [plan_detail_id] => 36
                [monthly_cost] => 0
                [dental_cost] => 0
                [age_id] => 14
                [applicant_id] => 1
                [state_id] => 1
            )

        [2] => Array
            (
                [plan_detail_id] => 36
                [monthly_cost] => 0
                [dental_cost] => 0
                [age_id] => 2
                [applicant_id] => 4
                [state_id] => 1
            )

    )

[1] => Array
    (
        [1] => Array
            (
                [Zip] => Array
                    (
                        [0] => 487
                        [1] => 486
                        [2] => 485
                        [3] => 484
                        [4] => 483
                    )

            )

    )

[2] => Array
    (
        [2] => Array
            (
                [Zip] => Array
                    (
                        [0] => 485
                        [1] => 484
                        [2] => 483
                    )

            )

    )
* * Тысяча двадцать-одина)
0 голосов
/ 11 февраля 2011

Похоже, вы неправильно ввели свои входные имена, если хотите сохранить много строк.Возможно, вам нужны «$ i.Plan.field» и «$ i.Zip»

0 голосов
/ 10 февраля 2011

$ this-> форма-> вход ( 'Zip'); его в книге

поиск найти ('список') для вас хороший хак foreach.

...