Сохранение нескольких сущностей для одного клиента - PullRequest
0 голосов
/ 21 июня 2019

Я создал форму, которая сохраняет дату и меню, заказанные клиентом. Благодаря этому вопросу: 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;
    }
}

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

Я наконец нашел свое решение!
add.ctp


    <?php
        /* Kunden auswählen */
            echo $this->Form->control('customer_id', array('label' => __('Kunde',true)));     
        /* Erster Tag */
            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('0.customer_id',['type' => 'hidden', 'empty' => true]);  
            echo $this->Form->control('0.bestellt');
        /* Zweiter Tag */    
            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));
            echo $this->Form->control('1.customer_id',['type' => 'hidden', 'empty' => true]);      
            echo $this->Form->control('1.bestellt');
        /* Dritter Tag */
            echo $this->Form->control('2.date', array('label' => __('Datum',true), ['empty' => true]));
            echo $this->Form->control('2.menu_item_id', array('label' => __('Menü',true), 'empty' => true));
            echo $this->Form->control('2.customer_id',['type' => 'hidden', 'empty' => true]);  
            echo $this->Form->control('2.bestellt');
        /* Vierter Tag */    
            echo $this->Form->control('3.date', array('label' => __('Datum',true), ['empty' => true]));
            echo $this->Form->control('3.menu_item_id', array('label' => __('Menü',true), 'empty' => true));
            echo $this->Form->control('3.customer_id',['type' => 'hidden', 'empty' => true]);  
            echo $this->Form->control('3.bestellt');
        /* Fünfter Tag */
            echo $this->Form->control('4.date', array('label' => __('Datum',true), ['empty' => true]));
            echo $this->Form->control('4.menu_item_id', array('label' => __('Menü',true), 'empty' => true));
            echo $this->Form->control('4.customer_id',['type' => 'hidden', 'empty' => true]);  
            echo $this->Form->control('4.bestellt');
        /* Sechster Tag */    
            echo $this->Form->control('5.date', array('label' => __('Datum',true), ['empty' => true]));
            echo $this->Form->control('5.menu_item_id', array('label' => __('Menü',true), 'empty' => true));
            echo $this->Form->control('5.customer_id',['type' => 'hidden', 'empty' => true]);          
            echo $this->Form->control('5.bestellt');
        /* Letzter Tag */
            echo $this->Form->control('6.date', array('label' => __('Datum',true), ['empty' => true]));
            echo $this->Form->control('6.menu_item_id', array('label' => __('Menü',true), 'empty' => true));
            echo $this->Form->control('6.customer_id',['type' => 'hidden', 'empty' => true]);            
            echo $this->Form->control('6.bestellt');
        ?>

Мой Javascript

$('#customer-id').change(function() {
    $('#0-customer-id').val($(this).val());
    $('#1-customer-id').val($(this).val());
    $('#2-customer-id').val($(this).val());
    $('#3-customer-id').val($(this).val());
    $('#4-customer-id').val($(this).val());
    $('#5-customer-id').val($(this).val());
    $('#6-customer-id').val($(this).val());
});

Я сейчас копирую свой customer_id в скрытые поля. Таким образом, мне, наконец, нужно выбрать моего Клиента только один раз и создать заказ на неделю.

Может быть, это не самый чистый способ сделать это, но это работает!

0 голосов
/ 21 июня 2019

Если вы хотите сохранить текущий customer_id с каждым Order, то я просто установил бы его в контроллере. Нет реальной необходимости назначать эту задачу клиентской стороне или даже доверять клиентской стороне эти данные.

Примечание : Я предполагаю, что Order.customer_id - это внешний ключ, ссылающийся на User.id, если это не так, вам необходимо выполнить соответствующие настройки.

В вашем действии контроллера:

// ...
debug($order);

// TODO: can't remember if this is the correct way - look this up.
$current_uid = $this->getRequest()->getSession()->read('User.id')

foreach ($orders as $order)
{
    // actually set the `customer_id` to the required value before persisting
    $order->customer_id = $current_uid;
    $this->Orders->save($order);
}

Если вы хотите показать его своим клиентам в представлении, добавьте $current_uid к переменным, установленным для представления, в конце действия вашего контроллера, а затем:

<fieldset>
    <legend><?= __('Neue Bestellung') ?></legend>
    <?php 
        foreach($orders as $key => $value) {
            echo $this->Form->control('${key}.customer_id', array('label' => __('Kunde',true), 'readonly' => true, 'value' => $current_uid ));
            // ...echo other fields
        }
    ?>
</fieldset>
...