0

GenForm別のモデルと HABTM 関係を持つモデルがありPdfFileます。GenFormこれを使用して、インデックス ビューでチェックボックスのリストを生成します。GenFormモデルでは、次を追加しました。

public $hasAndBelongsToMany = array(
    'PdfFile' => array(
        'className' => 'PdfFile',
        'joinTable' => 'gen_forms_x_pdf_files'
    )

ここに私の見解からの断片がありGenForm index.ctpます:

<?php 
echo $this->Form->input( 'PdfFile', array('label' => 'Select some PDF files', 'multiple' => 'checkbox') );
echo $this->Form->input( 'first_name' );
echo $this->Form->input( 'last_name' );
?>

コントローラーには、基本的な保存があります。

    if ($this->request->is('post')) { // form was submitted
        $this->GenForm->create();
        if ($this->GenForm->save($this->request->data)) {
            return $this->redirect(array('action' => 'generate', $this->GenForm->id)); // assemble the PDF for this record
        } else {
            $this->Session->setFlash(__('Log entry not saved.'));
        }
    }

$this->dataすると、次のようにdebug()なります。

array(
    'PdfFile' => array(
        'PdfFile' => array(
            (int) 0 => '1',
            (int) 1 => '5'
        )
    ),
    'GenForm' => array(
        'first_name' => 'xxx',
        'last_name' => 'xxx',
        'association_id' => '1',
        'email' => ''
    )
)

すべてが完全に機能しますが、チェックボックスを検証できませんでした (少なくとも 1 つをチェックする必要があります)。したがって、この回答に従って、いくつかの変更を加えました。

index.ctpビューは次のようになりました。

<?php 
echo $this->Form->input( 'GenForm.PdfFile', array('label' => 'Select some PDF files', 'multiple' => 'checkbox') );
echo $this->Form->input( 'first_name' );
echo $this->Form->input( 'last_name' );
?>

これが私の検証ルールです:

public $validate = array(
    'PdfFile' => array(
        'rule' => array(
            'multiple', array('min' => 1)
        ), 
        'message' => 'Please select one or more PDFs'
    )
)

これは$this->data今のように見えます:

array(
    'GenForm' => array(
        'PdfFile' => array(
            (int) 0 => '1',
            (int) 1 => '5'
        ),
        'first_name' => 'xxx',
        'last_name' => 'xxx',
        'association_id' => '1',
        'email' => ''
    )
)

PdfFile検証用のチェックボックスがありますが、PdfFileデータは保存されませんが、他のフィールドはGenForm独自のテーブルに正しく保存されます。

PdfFile自動的に保存て検証されるように、私が欠けているものを誰かに教えてもらえますか?

4

2 に答える 2

2

最初のフォームは正しい

明白なことを述べますが、機能したフォームは使用するフォームです。

echo $this->Form->input('PdfFile', array(
    'label' => 'Select some PDF files', 
    'multiple' => 'checkbox'
));

「PdfFile」という名前の「フィールド」を持つようにフォームを変更しても、単純に機能しません。モデル レイヤーが存在しないフィールドのデータを削除するためです。このフォームでは、gen_forms.PdfFileフィールドが存在しないことを確認し、無視します。データ。

検証

検証エラーに対処するには、モデルで実行されている検証ルールを使用して、保存する habtm レコードの数をチェックします。検証に使用されるフィールドの名前が何であるかは問題ではありません。

<?php
class GenForm extends AppModel {

    public $validate = array(
        'dummy' => array( // <- name this whatever you like
            'atLeastOne' => array(
                'required' => true, // run always
                'rule' => array('validateAtLeastOne')
            )
        )
    );

    function validateAtLeastOne() {
        if (!isset($this->data['PdfFile'])) {
            // there is no pdf data at all, ignore this rule
            // allow other save operations to work
            return true;
        }

        $return = count(array_filter($this->data['PdfFile']['PdfFile']));
        if (!$return) {
            $this->PdfFile->invalidate('PdfFile', 'Please upload a file');
        }
        return $return;
    }

}

レコードがない場合、検証ルールは false を返すため、保存が中止されます。フォーム ヘルパーが検索するのと同じ「フィールド」名を持つ HABTM アソシエーションで無効化を呼び出すと、エラー メッセージが表示されます。

あるいは

質問で2番目のアプローチを使用できます。

echo $this->Form->input('GenForm.PdfFile', array(
    'label' => 'Select some PDF files', 
    'multiple' => 'checkbox'
));

これはCake がデータを受け取り、それを beforeValidate で正しい形式になるように操作することを期待する方法ではないことを十分に理解した上で:

<?php
class GenForm extends AppModel {

    public $validate = array(
        'PdfFile' => array( // existing rule
            ...
        )
    );

    function beforeValidate() {
        if (isset($this->data[$this->alias]['PdfFile'])) {
            // keep the existing data as that's what validation will check against
            // copy to the right location so Cake will process it
            $this->data['PdfFile']['PdfFile'] = $this->data[$this->alias]['PdfFile'];
        }
        return true;
    }

    ...
}
于 2013-08-26T15:59:43.063 に答える
0

私の記憶が正しければ、ケーキのマニュアルから、データのフォーマットが間違っている可能性があります。

$this->data次のようにしてみてください。

array(
    'GenForm' => array(
        'first_name' => 'xxx',
        'last_name' => 'xxx',
        'association_id' => '1',
        'email' => ''
    ),
    'PdfFile' => array(
        (int) 0 => '1',
        (int) 1 => '5'
    ),
)
于 2013-08-26T15:29:55.293 に答える