CakePHP: установитеDisplayField в виртуальное поле - PullRequest
0 голосов
/ 18 мая 2019

Я следую документации для CakePHP 3.7, чтобы показать виртуальное поле в выбранном элементе управления вводом.

DeliveryNotesTable.php

public function initialize(array $config)
{
    parent::initialize($config);

    $this->setTable('delivery_notes');
    $this->setDisplayField('reference');
    $this->setPrimaryKey('id');

    $this->belongsTo('Customers', [
        'foreignKey' => 'customer_id'
    ]);
    $this->belongsTo('ShipmentReasons', [
        'foreignKey' => 'shipment_reason_id'
    ]);
    $this->belongsTo('ShipmentMethods', [
        'foreignKey' => 'shipment_method_id'
    ]);
    $this->hasMany('ItemsDeliveryNotes', [
        'foreignKey' => 'delivery_note_id'
    ]);
    $this->hasMany('ItemOrders', [
        'foreignKey' => 'delivery_note_id'
    ]);
}

protected function _getReference()
{
    return $this->deliveryNoteNumber . ' ' . $this->deliveryNoteDate;
}

Я выставляю виртуальное поле в DeliveryNote.php:

class DeliveryNote extends Entity
{
    protected $_accessible = [
        'customer_id' => true,
        'shipment_reason_id' => true,
        'deliveryNoteNumber' => true,
        'deliveryNoteDate' => true,
        'shipment_method_id' => true,
        'number_of_packages' => true,
        'weight' => true,
        'customer' => true,
        'shipment_reason' => true,
        'shipment_method' => true,
        'items_delivery_notes' => true
    ];

    protected $_virtual = [
        'reference'
    ];
}

В мой контроллер я загружаю связанные данные:

public function add($id)
{
    $itemOrder = $this->ItemOrders->newEntity();
    $itemOrder['order_id'] = $id;
    if ($this->request->is('post')) {
        $itemOrder = $this->ItemOrders->patchEntity($itemOrder, $this->request->getData());
        if ($this->ItemOrders->save($itemOrder)) {
            $this->Flash->success(__('The {0} has been saved.', 'Item Order'));

            return $this->redirect(['controller' => 'orders', 'action' => 'index']);
        }
        $this->Flash->error(__('The {0} could not be saved. Please, try again.', 'Item'));
    }
    $orders = $this->ItemOrders->Orders->find('list', ['limit' => 200]);
    $itemOrdersTypes = $this->ItemOrders->ItemOrdersTypes->find('list', ['limit' => 200]);
    $products = $this->ItemOrders->Products->find('list', ['limit' => 200, 'order' => ['Products.code' => 'ASC']]);
    $itemOrdersStates = $this->ItemOrders->ItemOrdersStates->find('list', ['limit' => 200]);
    $deliveryNotes = $this->ItemOrders->DeliveryNotes->find('list');
    $this->set(compact('itemOrder', 'orders', 'itemOrdersTypes', 'products', 'itemOrdersStates', 'deliveryNotes'));
}

наконец, в Template я создаю элемент управления select:

<?= $this->Form->control('delivery_note_id', ['options' => $deliveryNotes, 'empty' => true]); ?>

но он пуст, элементы не отображаются. Вместо этого, если я установлю:

$this->setDisplayField('id');

или в любое другое поле, поле выбора заполнено правильно. Я что-то упускаю при создании этого виртуального поля?

1 Ответ

1 голос
/ 19 мая 2019

Ваш protected function _getReference() метод должен быть установлен в классе сущности DeliveryNote

Чтение: https://book.cakephp.org/3.0/en/orm/entities.html#creating-virtual-fields

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...