【问题标题】:How to merge two forms with two different models in one form in CakePHP 3.5?如何在 CakePHP 3.5 中将两种不同模型的两种形式合并为一种形式?
【发布时间】:2018-02-18 13:11:49
【问题描述】:

我是 CakePHP 的初学者,我正在使用 3.5 版。我真的被它弄糊涂了。我的问题是我想合并来自 2 个不同模型的两个表单。就我而言,我想将客户端事务添加表单和服务详细信息添加表单合并在一个表单中。以下是我的代码:

add.ctp(我在服务明细添加表单中合并添加客户端事务表单)

<div class="serviceDetail form large-9 medium-8 columns content">
<?= $this->Form->create($clientTransaction) ?>
<fieldset>
    <legend><?= __('Add Client Transaction') ?></legend>
    <?php
        echo $this->Form->control($serviceDetail->client_transaction->client->id, ['options' => $clients]);
        echo $this->Form->control($serviceDetail->client_transaction->client->transaction_date, ['timeFormat' => 12, 'disabled' => false]);
        echo $this->Form->control($serviceDetail->client_transaction->client->status, ['type' => 'hidden', 'value' => 0]);
    ?>
</fieldset>
<?= $this->Form->create($serviceDetail) ?>
<fieldset>
    <legend><?= __('Add Service Detail') ?></legend>
    <?php
        echo $this->Form->control('service_id', ['options' => $service,  'empty' => true]);
        echo $this->Form->control('user_id', ['options' => $users, 'empty' => true, 'label'=> ['text' => 'Barber']]);
        echo $this->Form->control('client_transaction_id', ['options' => $clientTransaction, 'empty' => true]);
    ?>
</fieldset>
<?= $this->Form->button(__('Submit')) ?>
<?= $this->Form->end() ?>

在我的 service_detail 控制器中

public function add()
{
    $this->paginate = [
        'contain' => ['Service', 'Users', 'ClientTransaction']
    ];
    $clientTransaction = $this->ServiceDetail->ClientTransaction->newEntity();
    $serviceDetail = $this->ServiceDetail->newEntity();
    if ($this->request->is('post')) {
        $clientTransaction = $this->ServiceDetail->ClientTransaction->patchEntity($clientTransaction, $this->request->getData());
        $serviceDetail = $this->ServiceDetail->patchEntity($serviceDetail, $this->request->getData());
        if ($this->ServiceDetail->ClientTransaction->save($clientTransaction) && $this->ServiceDetail->save($serviceDetail)) {
            $this->Flash->success(__('The transaction has been added.'));

            return $this->redirect(['action' => 'add']);
        }
        $this->Flash->error(__('Please, try again.'));
    }
    $service = $this->ServiceDetail->Service->find('list', ['limit' => 200]);
    $users = $this->ServiceDetail->Users->find('list',['limit' => 200, 'valueField' => 'first_name'])->where(['position' => 2]);
    $clientTransaction = $this->ServiceDetail->ClientTransaction->find('list', ['limit' => 200]);
    $clients = $this->ServiceDetail->ClientTransaction->Clients->find('list', ['limit' => 200]);
    $serviceDetail = $this->paginate($this->ServiceDetail);
    $this->set(compact('serviceDetail', 'service', 'users', 'clientTransaction'));
}

【问题讨论】:

  • 过去这里已经回答过很多次了。阅读associations 上的手册部分,并在此处搜索关联。
  • 能否请您提一下client_transaction和service_detail表之间的关系,表示hasOne或hasMany或belongsTo?
  • client_transaction 有很多服务细节。问题是我想将它合并为一个 add.ctp 表单。出现错误。现在我对如何做到这一点感到困惑

标签: cakephp cakephp-3.0 cakephp-3.x cakephp-3.4


【解决方案1】:

做这样的事情:

$serviceDetail = $this->ServiceDetail->newEntity(
    $this->request->getData(), [
        'associated' => ['ClientTransaction']
    ]
);

https://book.cakephp.org/3.0/en/orm/saving-data.html#converting-request-data-into-entities

对于您的页面,请遵循以下模式: https://book.cakephp.org/3.0/en/views/helpers/form.html#creating-inputs-for-associated-data

【讨论】:

    猜你喜欢
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2011-02-03
    • 2017-04-04
    • 1970-01-01
    • 2013-06-12
    相关资源
    最近更新 更多