2

アプリケーションのすべてのページに「Report Bug」モーダル フォームが必要です。そこで、ウィジェットの形で作成し、アプリケーションのメイン レイアウト テンプレートに配置しました。

<? $reportBugForm = $this->widget('application.widgets.reportBugWidget.reportBug',array(),true); ?>
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        ....
    </head>
    <body>
        <? echo $reportBugForm; ?>

現在のページに関係なく、ajaxリクエストをそれ自体にポストする必要があるため、ページの上部に配置しました(コントローラーは使用したくありません)。ウィジェットクラス自体のコードは次のとおりです。

Yii::import('application.widgets.reportBugWidget.reportBugForm');

class reportBug extends CWidget {

    public $id = 'reportBug';
    public $name = 'reportBugForm';
    public $form;

    public function init() {

        $this->form = new reportBugForm('error');

        if(Yii::app()->request->isAjaxRequest && isset($_POST[$this->name]) && !empty($_POST[$this->name])) {
            $this->form->attributes = $_POST[$this->name];
            if($this->form->validate()) {
                echo 'Form is submited!';
            } else
                echo 'You have incorrectly filled out the form!';
            Yii::app()->end();
        }
    }

    public function run() {

        $this->render('form',array(
            'model'=>$this->form,
            'id'=>$this->id,
            'name'=>$this->name
        ));
    }

}

これが私のモデルのコードです。可視性のためにすべてを単純化しました。

class reportBugForm extends CFormModel {

    public $subject = '';
    public $message = '';

    public function rules() {
        return array(
            array('message','required','on'=>'error,question,suggestion'),
            array('subject','safe','on'=>'question'),
            array('subject','required','on'=>'error,suggestion')
        );
    }

    public function attributeLabels() {
        return array(
            'subject'=>'Subject',
            'message'=>'Message'
        );
    }
}

そして、これが私のビューファイルのコードです:

<div class="modal fade hide" id="<? echo $id; ?>">
    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" id="reportBug_iconClose">&times;</button>
        <h3>Report a bug</h3>
    </div>
    <?
    $form = $this->beginWidget('CActiveForm', array(
        'id'=>$name,
        'enableAjaxValidation'=>true,
        'enableClientValidation'=>true,
        'clientOptions'=>array(
            'validateOnSubmit'=>true,
            'validateOnChange'=>false,
            'validateOnType'=>false
        ),
        'focus'=>array($model,'subject')
    ));
    ?>
    <div class="modal-body">
        <fieldset>
            <div class="control-group">
                <?
                echo $form->label($model,'subject',array('for'=>'reportBug_subject'));
                echo $form->textField($model,'subject',array('id'=>'reportBug_subject','placeholder'=>'A short summary of your problem','class'=>'input-xxlarge'));
                echo $form->error($model,'subject',array('class'=>'help-block error'));
                ?>
            </div>
            <div class="control-group">
                <?
                echo $form->label($model,'message',array('for'=>'reportBug_message'));
                echo $form->textArea($model,'message',array('id'=>'reportBug_message','class'=>'input-xxlarge','rows'=>5,'placeholder'=>'Please, provide details of found error'));
                echo $form->error($model,'message',array('class'=>'help-block error'));
                ?>
            </div>
        </fieldset>
    </div>
    <div class="modal-footer">
        <?
        echo CHtml::ajaxSubmitButton('Send',null,array(),array('class'=>'btn btn-primary'));
        echo CHtml::htmlButton('Close',array('id'=>'reportBug_btnClose','class'=>'btn','data-dismiss'=>'modal'));
        ?>
    </div>
    <? $this->endWidget(); ?>
</div>

クライアントまたは ajax の検証は実行されません。フォームはクライアント検証なしで ajax によって送信され、You have incorrectly filled out the form!文字列が返されます。教えてください、それは何でしょうか?

PS 違いがあるかもしれませんが、私は Yii の Twitter Bootstrap 拡張機能を使用しています。

PSS そして、もう 1 つ奇妙なことがあります。CHtml::submitButtonビュー ファイルで使用すると、フォームは単純に POST によって送信されます。フォームを使用CHtml::ajaxSubmitButtonすると、Ajax によって送信され、上記の結果が返されます。

4

1 に答える 1

1

この指示は、「安全な」パラメーターに対してのみ機能します。

$this->form->attributes = $_POST[$this->name];

安全なバリデーターに「メッセージ」を追加する必要があります。

array('subject,message','safe','on'=>'question'),

または、次を使用する必要があります。

$this->form->subject  = $_POST[$this->name]['subject'];
$this->form->message  = $_POST[$this->name]['message'];

このドキュメントを参照してください: http://www.yiiframework.com/wiki/161/understanding-safe-validation-rules

「メッセージ」は必須ですが「安全」ではないため、検証は機能しません。

于 2012-07-17T11:38:23.757 に答える