Я создал форму, которая сохраняет дату и меню, заказанные клиентом. Благодаря этому вопросу: cakephp 3.x сохранение нескольких сущностей - newEntities Я создал свою собственную форму.
Проблема, которая у меня сейчас есть, заключается в том, что мне нужно выбрать для каждой даты и меню клиента. Есть ли способ выбрать клиента только один раз для всех новых дат и меню?
Сначала мой код, который очень похож на ответ, который я связал:
OrdersController.php
{
$order = $this->Orders->newEntity();
if ($this->request->is('post')) {
$orders = $this->Orders->newEntities($this->request->getData());
debug($order);
foreach ($orders as $order)
{
$this->Orders->save($order);
}
$this->Flash->success(__('The order has been saved.'));
return $this->redirect(['action' => 'index']);
$this->Flash->error(__('The order could not be saved. Please, try again.'));
}
$customers = $this->Orders->Customers->find('list', ['limit' => 200]);
$menuItems = $this->Orders->MenuItems->find('list', ['limit' => 200]);
$this->set(compact('order', 'customers', 'menuItems'));
}
add.ctp
<fieldset>
<legend><?= __('Neue Bestellung') ?></legend>
<?php
echo $this->Form->control('0.customer_id', array('label' => __('Kunde',true)));
echo $this->Form->control('0.date', array('label' => __('Datum',true), ['empty' => true]));
echo $this->Form->control('0.menu_item_id', array('label' => __('Menü',true), 'empty' => true));
echo $this->Form->control('1.customer_id', array('label' => __('Kunde',true)));
echo $this->Form->control('1.date', array('label' => __('Datum',true), ['empty' => true]));
echo $this->Form->control('1.menu_item_id', array('label' => __('Menü',true), 'empty' => true));
?>
</fieldset>
Я знаю, что мне нужно изменить это
echo $this->Form->control('0.customer_id', array('label' => __('Kunde',true)));
echo $this->Form->control('1.customer_id', array('label' => __('Kunde',true)));
но я не знаю во что. Сначала я подумал, что если я буду использовать customer_id без номера
echo $this->Form->control('customer_id', array('label' => __('Kunde',true)));
или как это
echo $this->Form->control('0.1.customer_id', array('label' => __('Kunde',true)));
это будет работать, но я не работаю. Вероятно, потому что он не знает, где его сохранить, потому что в первом примере ему не хватает номера индекса, а во втором - я создал новый индекс? Я новичок в программировании, так что, возможно, я совершенно не прав, но думаю, именно поэтому это не работает.
Если я сделаю это, как я объяснил выше, это не сохранит ценность для клиента. Как выбрать клиента и сохранить для него несколько дат и меню?
EDIT
Поскольку я не объяснил это точно, я пытаюсь снова.
Моя цель - создать форму, в которой должны быть сохранены несколько дат и меню для клиента. Внутри формы я хочу выбрать 1 клиента, который я получаю вместе с customer_id. После этого я хочу выбрать несколько дат (дата) и меню (menu_item_id) для этого выбранного клиента. Если я нажимаю «Отправить», я хочу получить несколько заказов для выбранного покупателя.
* * Пример тысяча тридцать-семь:
Я выбираю клиента (John Sample), и теперь я выбираю для него дату (01.01.2019) и меню 7. После этого я выбираю дату (02.02.2019) и меню 6. После этого я выбираю дату ( 03.02.2019) и Меню 2.
Если я сохраню сейчас, я хочу видеть, что Заказчик, которого я выбрал (Джон Сэмпл), заказал на Даты 01.01.2019, 02.01.2019, 03.01.2019 и какие меню он заказал на Дату.
* * Пример тысяча сорок-одиной: * +1042 *
Заказчик: Джон Сэмпл | Дата: 01.01.2019 | Меню: 7
Заказчик: Джон Сэмпл | Дата: 02.01.2019 | Меню: 6
Заказчик: Джон Сэмпл | Дата: 03.01.2019 | Меню: 2
Проблема, с которой я столкнулся сейчас, в том, что я не знаю, как это сделать. Я знаю, что мог бы просто выбрать нового Клиента для каждой Даты и Меню, как это:
<fieldset>
<legend><?= __('Neue Bestellung') ?></legend>
<?php
echo $this->Form->control('0.customer_id', array('label' => __('Kunde',true)));
echo $this->Form->control('0.date', array('label' => __('Datum',true), ['empty' => true]));
echo $this->Form->control('0.menu_item_id', array('label' => __('Menü',true), 'empty' => true));
echo $this->Form->control('1.customer_id', array('label' => __('Kunde',true)));
echo $this->Form->control('1.date', array('label' => __('Datum',true), ['empty' => true]));
echo $this->Form->control('1.menu_item_id', array('label' => __('Menü',true), 'empty' => true));
?>
</fieldset>
но это не то, что я хочу сделать. Потому что в конце я хочу сохранить до 7 заказов и не хочу каждый раз выбирать клиента.
Это возвращает меня к моему Вопросу, как я могу сохранить одного Клиента, выбрать в форме и сохранить для него несколько Дат и Меню?
Надеюсь, это немного прояснило мой Вопрос.
РЕДАКТИРОВАТЬ 2
Таблица моего заказа:
OrdersTable.php
class OrdersTable extends Table
{
/**
* Initialize method
*
* @param array $config The configuration for the Table.
* @return void
*/
public function initialize(array $config)
{
parent::initialize($config);
$this->setTable('orders');
$this->setDisplayField('id');
$this->setPrimaryKey(['id']);
$this->belongsTo('Customers', [
'foreignKey' => 'customer_id',
]);
$this->belongsTo('MenuItems', [
'foreignKey' => 'menu_item_id',
]);
$this->belongsTo('Bills', [
'foreignKey' => 'bill_id',
]);
}
/**
* Default validation rules.
*
* @param \Cake\Validation\Validator $validator Validator instance.
* @return \Cake\Validation\Validator
*/
public function validationDefault(Validator $validator)
{
$validator
->integer('id')
->allowEmptyString('id', 'create');
$validator
->date('date')
->allowEmptyDate('date');
$validator
->boolean('bestellt')
->allowEmptyString('bestellt', false);
return $validator;
}
/**
* Returns a rules checker object that will be used for validating
* application integrity.
*
* @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
* @return \Cake\ORM\RulesChecker
*/
public function buildRules(RulesChecker $rules)
{
$rules->add($rules->existsIn(['customer_id'], 'Customers'));
$rules->add($rules->existsIn(['menu_item_id'], 'MenuItems'));
$rules->add($rules->existsIn(['bill_id'], 'Bills'));
return $rules;
}
}