0

CakePHP 2.3を使って商用提案システムを立ち上げようとしています。

関連する 5 つのテーブルがあります (以下の詳細を参照)。このシステムには、テーブルごとに 5 つのフォームがある 1 ページがあります。(以下の詳細を参照してください)。

フォーム 1: 表の提案
フォーム 2: テーブルのクライアント FK 提案
_id フォーム 3: テーブルの製品 FK クライアント_id
フォーム 4: テーブルの仕様 FK product_id (製品の)
フォーム 5: テーブルの付録 FK product_id (製品の)

どこ:

提案には、1 つのクライアントがあります。
----------v----------クライアント
は提案に属し、多くの製品を持っています。 ----------v----------製品 はクライアントに属し、多くの仕様と付録があります。 ----------v---------- 仕様は商品に属します。 付録は製品に属します。





フォーム 4 は複数の行を持つことができるため、より多くの入力を生成するために foreach ループ内にあります。様式 5 も同様です。

私は認めます、それはかなりトリッキーです:)

これが最終的に選んだ解決策ですが、もっと良い方法があるかもしれません。たとえば、多段階のフォームを作成することはできますが、配置するのはかなり難しいようです。とにかく、私は提案を受け入れます。

その間、私たちはこれを機能させることができると確信しているので、ここに詳細があります. テーブルごとにモデルを作成し、適切な接続を作成しました。各モデルで、包含可能な動作を有効にしました: 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'); ?>

そして最後に、デバッグ ($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
            )
        );
}

仕様.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'
            )
        );
}
4

1 に答える 1

0

データを保存すると、どのような出力が得られますか?

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

sql-output も確認する必要があります

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

編集:

編集後、一見すると、関係が間違っているように見えます。本の例をチェックしてください: http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html

たとえば hasOne: もう一方のモデルには外部キーが含まれています。

前に述べたように、1 つのリレーションから始めて、それを機能させるようにしてください。その後、他の作業を行うのがはるかに簡単になります。そのため、Proposal と Client モデル以外のすべてをコメントアウトしてみてください。次に、その 2 つだけを保存してみてください。

于 2013-02-19T11:56:46.410 に答える