CakePHP: saveAll с hasOne плюс HABTM

У меня есть две модели, которые мне нужно сохранить в одной форме. Когда пользователь использует форму «/deliveries/add/», мне нужно сохранить новую доставку, а также сохранить новую лицензию, прикрепленную к этой доставке. Это отношение hasOne.

Delivery belongsTo License
License hasOne Delivery

Также в этой же форме мне нужно выбрать, какие продукты и опции продуктов включает лицензия:

License HABTM Products
License HABTM ProductOption

Проблема, с которой я сталкиваюсь, заключается в том, что CakePHP не обнаруживает, что мои отношения License/Products и License/ProductOptions являются HABTM, а помощник формы дает мне только один раскрывающийся список выбора вместо раскрывающегося списка множественного выбора. Даже если я заставлю его быть кратным в помощнике по форме, он все равно не сохранит данные и не заполнит форму редактирования правильно (даже если он выведет правильные метки для параметров продукта). Я думаю, это может иметь какое-то отношение к тому, что это такое отдаленное отношение к моей основной модели сбережений?

Я разместил соответствующий код ниже. Спасибо всем за просмотр этого для меня!

Модель доставки выглядит так:

class Delivery extends AppModel {
 var $name = 'Delivery';
 var $belongsTo = array('Company','Address','Contract','DeliveryType','License');
}

Модель лицензии выглядит следующим образом:

class License extends AppModel {
 var $name = 'License';
 var $belongsTo = 'LicenseType';
 var $hasOne = 'Delivery';
 var $hasAndBelongsToMany = array('ProductOption','Product');
}

Delivery_controller выглядит так:

function add() {
        if (!empty($this->data)) {
            if ($this->Delivery->saveAll($this->data)) {
                $this->Session->setFlash(sprintf(__('The %s has been saved', true), 'delivery'));
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(sprintf(__('The %s could not be saved. Please, try again.', true), 'delivery'));
            }
        }
        $companies      = $this->Delivery->Company->find('list');
        $addresses      = $this->Delivery->Address->find('list');
        $contracts      = $this->Delivery->Contract->find('list');
        $deliveryTypes  = $this->Delivery->DeliveryType->find('list');
        $licenses       = $this->Delivery->License->find('list');
        $licenseTypes   = $this->Delivery->License->LicenseType->find('list');
        $products       = $this->Delivery->License->Product->find('list');
        $productOptions = $this->Delivery->License->ProductOption->find('list');
        $this->set(compact('companies', 'addresses', 'contracts', 'deliveryTypes', 'licenses','licenseTypes','products','productOptions'));
    }

Представления/доставки/add.ctp выглядят так:

<div class="deliveries form">
<?= $form->create(); ?>
 <fieldset>
   <legend><?php printf(__('Add %s', true), __('Delivery', true)); ?></legend>
 <?
  echo $form->create();
  echo $form->input('Delivery.company_id');
  echo $form->input('Delivery.address_id');
  echo $form->input('Delivery.contract_id');
  echo $form->input('Delivery.delivery_date', array('dateFormat' => 'MDY', 'timeFormat' => 'none'));
  echo $form->input('Delivery.serial_number');
  echo $form->input('Delivery.description');
  echo $form->input('Delivery.comments');
  echo $form->input('Delivery.delivery_type_id');

  echo $form->input('License.license_type_id');
  echo $form->input('License.nodelocked');
  echo $form->input('License.mac_addr');
  echo $form->input('License.expiration_date', array('dateFormat' => 'MDY', 'timeFormat' => 'none'));
  echo $form->input('License.Product');
  echo $form->input('License.ProductOption');
 ?>
 </fieldset>
<?= $form->end('Add');?>
</div>

person Dan    schedule 10.05.2010    source источник


Ответы (1)


Можно ли сохранить данные по модели лицензии, а не по модели поставки?

$this->Licence->saveAll($this-data);

Тогда есть:

echo $form->create('Licence');
...
echo $form->input('Product', array('multiple'=>true));
echo $form->input('ProductOption', array('multiple'=>true));
person Botman    schedule 10.02.2011