CakePHP 2.3:在一个页面中一次保存多个表格中的多个表格

时间:2013-02-19 08:32:31

标签: cakephp

我正在尝试使用CakePHP 2.3建立商业提案系统。

它有5个相关的表格(详见下文)。 该系统将有1页,每页有5个表格。 (详见下文)。

表格1:表格提案
表格2:表格客户FK proposal_id
表格3:表格产品FK client_id
表格4:表格规格FK product_id(产品)

表格5:表格附录FK product_id(产品)

其中:

提案 hasOne 客户 ---------- ---------- v
客户 beongsTo 提案和 hasMany 产品 ---------- ---------- v
产品属于客户和 hasMany 规格&附录。
---------- ---------- v
规格属于产品。
附录 belongsTo 产品。

表单4可以有多行,因此它位于foreach循环内部以生成更多输入。表格5相同。因为1个产品可以有多个规格和附录。

我承认,这很棘手:)

这是我最终选择的解决方案,但也许有更好的解决方案。例如,我可以制作一个多步骤的形式,但似乎很难实施。无论如何,我愿意接受建议。

与此同时,我相信我们可以做到这一点,所以这里有详细信息。对于每个表,我创建了一个模型并进行了适当的连接。在每个模型中,我都启用了可包含的行为:public $actsAs = array('Containable');

现在这里是ProposalsController.php:

function admin_edit($id=null){
        $this->loadModel('Proposal','Client','Product', 'Specification', 'Appendice');
        $this->Proposal->contain('Proposal','Client','Product', 'Specification', 'Appendice');

        if ($this->request->is('put') || $this->request->is('Post')) {
            $data = $this->request->data;
            if (!empty($data)) {
                // Use the following to avoid validation errors:
                // unset($this->Proposal->Client->validate['proposal_id']);
                // $this->Proposal->saveAssociated($data);
                // $this->Session->setFlash("Le contenu a bien été édité");
                // $this->redirect(array('action' => 'index', $data['Product']['id']));
                debug($data);
            }
        }
        elseif($id){
            $this->Proposal->id = $id;
            $this->request->data = $this->Proposal->read(null,$id);
        }
    }

此编辑操作有很多错误,因为在这种情况下我不知道如何正确设置它。原谅我,但我给你一个原始代码:)。我希望这个admin_function能够添加或编辑,但在这种情况下,我不知道如何处理它。

视图admin_edit.ctp:

<hr/>
<h1>Proposition</h1>
<hr/>

<?php echo $this->Form->create('Product'); ?>

<?php echo $this->Form->input('Proposal.name', array('label' => "Nom de la proposition")); ?>
<?php echo $this->Form->input('Proposal.created', array('label' => "Date de création")); ?>
<?php echo $this->Form->input('Proposal.due', array('label' => "Date d'échéance")); ?>
<?php echo $this->Form->input('Proposal.content', array('label' => "Termes & conditions")); ?>

<hr/>
<h1>Client</h1>
<hr/>

<?php echo $this->Form->input('Client.name', array('label' => "Nom du client")); ?>
<?php echo $this->Form->input('Client.project', array('label' => "Nom du projet")); ?>
<?php echo $this->Form->input('Client.address', array('label' => "Adresse")); ?>
<?php echo $this->Form->input('Client.phone', array('label' => "Téléphone")); ?>
<?php echo $this->Form->input('Client.email', array('label' => "Email")); ?>
<?php echo $this->Form->hidden('Client.proposal_id'); ?>

<hr/>
<h1>Produit</h1>
<hr/>

<?php echo $this->Form->input('Product.0.name', array('label' => "Nom du produit")); ?>
<?php echo $this->Form->input('Product.0.reference', array('label' => "Référence")); ?>
<?php echo $this->Form->input('Product.0.image', array('label' => "Image")); ?>
<?php echo $this->Form->input('Product.0.pu', array('label' => "Prix Unitaire")); ?>
<?php echo $this->Form->input('Product.0.quantity', array('label' => "Quantité")); ?>
<?php echo $this->Form->input('Product.0.ce', array('label' => "CE")); ?>
<?php echo $this->Form->input('Product.0.nf', array('label' => "NF")); ?>
<?php echo $this->Form->input('Product.0.rohs', array('label' => "RoHS")); ?>
<?php echo $this->Form->hidden('Product.0.client_id'); ?>

<hr/>
<h1>Spécifications :</h1>
<hr/>

<?php
foreach (range(0,1) as $i):
    $a=$i+1;
    echo '<p>Spécification '.$a.'</p>';
    echo $this->Form->input('Specification.'.$i.'.name', array('label' => "Nom de la spécification"));
    echo $this->Form->input('Specification.'.$i.'.value', array('label' => "Valeur de la spécification"));
    echo $this->Form->hidden('Specification.'.$i.'.product_id');
endforeach;
?>

<hr/>
<h1>Annexes :</h1>
<hr/>

<?php
foreach (range(0,1) as $j):
    $b=$j+1;
    echo '<p>Annexe '.$b.'</p>';
    echo $this->Form->input('Appendice.'.$j.'.name', array('label' => "Image"));
    echo $this->Form->input('Appendice.'.$j.'.content', array('label' => "Description de l'annexe"));
    echo $this->Form->hidden('Appendice.'.$j.'.product_id');
endforeach;
?>

<?php echo $this->Form->end('valider'); ?>

最后,这是debug($ data)的数组结果:

array(
    'Proposal' => array(
        'name' => 'Proposition 3',
        'created' => array(
            'month' => '02',
            'day' => '19',
            'year' => '2013',
            'hour' => '08',
            'min' => '27',
            'meridian' => 'am'
        ),
        'due' => array(
            'month' => '02',
            'day' => '19',
            'year' => '2013',
            'hour' => '08',
            'min' => '27',
            'meridian' => 'am'
        ),
        'content' => 'Termes & conditions'
    ),
    'Client' => array(
        'name' => 'Client 3',
        'project' => 'Projet Client 3',
        'address' => 'Adresse Client 3',
        'phone' => 'Téléphone Client 3',
        'email' => 'Email@test.com',
        'proposal_id' => ''
    ),
    'Product' => array(
        (int) 0 => array(
            'name' => 'Produit 3',
            'reference' => 'Référence Produit 3',
            'image' => 'Image Produit 3',
            'pu' => '100.77',
            'quantity' => '1000',
            'ce' => '1',
            'nf' => '0',
            'rohs' => '0',
            'client_id' => ''
        )
    ),
    'Specification' => array(
        (int) 0 => array(
            'name' => 'Specification 1',
            'value' => 'Valeur 1',
            'product_id' => ''
        ),
        (int) 1 => array(
            'name' => 'Specification 2',
            'value' => 'Valeur 2',
            'product_id' => ''
        )
    ),
    'Appendice' => array(
        (int) 0 => array(
            'name' => 'Image annexe 1',
            'content' => 'Description de l'annexe',
            'product_id' => ''
        ),
        (int) 1 => array(
            'name' => 'Image annexe 2',
            'content' => 'Description de l'annexe',
            'product_id' => ''
        )
    )
)

所以在这个数组中,一切都在那里。我只需要获取这些数据并将它们全部保存在相应的表中。第一个问题是管理表的关联。然后是2个生成多行的foreach循环。

我想立即保存所有内容,但它是否可能?

在尝试了很多方法让它发挥作用之后,我已经完全疯了,我只是迷失了自己。我真的非常绝望,我把保存方法和请求之间的所有内容混合在一起 - >包含所有内容但无法保存的数据。无论如何,我迫切需要帮助!

非常感谢您提供的所有帮助,我非常感谢!


[编辑]

我将我的模型添加到当前帖子中以获取更多详细信息。

Proposal.php:

<?php
class Proposal extends AppModel {

    public $actsAs = array('Containable');

    public $validate = array(
        'name' => array(
            'rule'       => 'notEmpty',
            'message'    => "Veuillez préciser un titre"
        )
    ) ;

    public $hasOne = array(
        'Client' => array(
            'className'    => 'Client',
            'foreignKey'   => 'proposal_id',
            'dependent'    => true
            )
        );
}

Client.php:

<?php
class Client extends AppModel {

    public $actsAs = array('Containable');

    public $belongsTo = array(
        'Proposal' => array(
            'className'    => 'Proposal',
            'foreignKey'   => 'proposal_id'
            )
        );

    public $hasMany = array(
        'Product' => array(
            'className'     => 'Product',
            'foreignKey'    => 'client_id',
            'conditions'    => '',
            'order'         => '',
            'limit'         => '',
            'dependent'     => true
            )
        );
}

Product.php:

<?php
class Product extends AppModel {

    public $actsAs = array('Containable');

    public $belongsTo = array(
        'Client' => array(
            'className'    => 'Client',
            'foreignKey'   => 'client_id'
            )
        );

    public $hasMany = array(
        'Specification' => array(
            'className'     => 'Specification',
            'foreignKey'    => 'product_id',
            'conditions'    => '',
            'order'         => '',
            'limit'         => '',
            'dependent'     => true
            ),
        'Appendice' => array(
            'className'     => 'Appendice',
            'foreignKey'    => 'product_id',
            'conditions'    => '',
            'order'         => '',
            'limit'         => '',
            'dependent'     => true
            )
        );
}

Specification.php:

<?php
class Specification extends AppModel {

    public $actsAs = array('Containable');

    public $belongsTo = array(
        'Product' => array(
            'className'    => 'Product',
            'foreignKey'   => 'product_id'
            )
        );
}

Appendice.php:

<?php
class Appendice extends AppModel {

    public $actsAs = array('Containable');

    public $belongsTo = array(
        'ProductAppend' => array(
            'className'    => 'Product',
            'foreignKey'   => 'product_id'
            )
        );
}

1 个答案:

答案 0 :(得分:0)

保存数据时的输出是什么?

 if (!empty($this->data)) {
               $this->Proposal->save($this->data);
}

您还应该检查sql-output

  

echo $ this-&gt; element('sql_dump');

修改

在编辑之后,第一眼看来你的关系似乎是错误的。 查看书中的示例:http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html

例如hasOne:另一个模型包含外键。

正如我之前所说,你应该尝试从一个关系开始,让它发挥作用。后来,让对方工作变得容易得多。因此,请尝试评论除Proposal和Client模型之外的所有内容。然后尝试保存这两个。