0

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

它有 5 个相关联的表(请参阅下面的详细信息)。该系统将有 1 页,其中每个表格有 5 个表格。(详见下文)。

表格 1:表格提案
表格 2:表格客户 FK 提案
_id 表格 3:表格产品 FK客户 ID
表格 4:表格规范 FK 产品 ID(产品)
表格 5:表格附录 FK 产品 ID(产品)

在哪里:

建议有一个客户。
----------v---------
客户beongsTo提案并且有许多产品。
----------v---------
产品属于客户,并且有许多规格和附录
----------v------------
规格属于产品。
附录属于产品。

表格 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 循环。

我想一次全部保存,但有可能吗?

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

非常感谢您为我提供的所有帮助,我真的很感激!


[编辑]

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

提案.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
            )
        );
}

客户端.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
            )
        );
}

产品.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
            )
        );
}

规范.php:

<?php
class Specification extends AppModel {

    public $actsAs = array('Containable');

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

附录.php:

<?php
class Appendice extends AppModel {

    public $actsAs = array('Containable');

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

1 回答 1

0

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

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

您还应该检查 sql 输出

echo $this->element('sql_dump');

编辑:

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

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

正如我之前所说,您应该尝试从一个关系开始,让它发挥作用。之后,让另一个工作会容易得多。因此,请尝试注释掉除您的 Proposal 和 Client 模型之外的所有内容。然后尝试只保存这两个。

于 2013-02-19T11:56:46.410 回答