2

いくつかのページには、1 つのボックスと送信ボタンを含める必要があります。ビュー ファイルは DatePicker を使用して、ユーザーが入力ボックスに入力できるようにします。「Go」(送信)ボタンを押すと、日付に基づいて以下のコンテンツが変更されます。

このコードは複数のページで使用されるため、現在ウィジェットを使用しようとしています。私の問題は、フォームから POST リクエストを取得して使用する方法を考えていることです。モデルが必要ですか?現在のコードを以下に添付しますが、現在、$date が未定義であるというエラーが発生しています。エラーが発生することはわかっていましたが、これを行うために正確に何をする必要があるかについて少し混乱しています。

ウィジェットの現在のコード:

/保護された/views/dateWidget.php

<div class="form">

    <?php $form=$this->beginWidget('CActiveForm', array(
            'id'=>'date-form',
            'enableAjaxValidation'=>false,
            'enableClientValidation' => true,
)); ?>

    <p class="note">
        Fields with <span class="required">*</span> are required.
    </p>

    <?php echo $form->errorSummary($date); ?>

    <div class="row">
        <?php echo $form->labelEx($date,'date'); ?>
        <?php
        $this->widget('zii.widgets.jui.CJuiDatePicker', array(
                'model' => $model,
                'attribute' => 'date',
                'language' => 'ja',
                'i18nScriptFile' => 'jquery.ui.datepicker-ja.js',
                'options' => array(
                    'showOn' => 'both',             // also opens with a button
                    'dateFormat' => 'yy-mm-dd',     // format of "2012-12-25"
            ),
            'htmlOptions' => array(
                'size' => '10',         // textField size
                'maxlength' => '10',    // textField maxlength
            ),
        ));
        ?>
        <?php echo $form->error($date,'date'); ?>
    </div>

    <div class="row buttons">
        <?php echo CHtml::submitButton('Add'); ?>
    </div>

    <?php $this->endWidget(); ?>

</div>
<!-- form -->

/保護された/コンポーネント/DateWidget.php

<?php 
class DateWidget extends CWidget
{
    /**
     * @var CFormModel
     */
    public $form;

    public function run()
    {
//      if (! $this->form instanceof CFormModel) {
//          throw new RuntimeException('No valid form available.');
//      }
        $this->render('application.views.dateWidget', array('form'=>$this->form));
    }
}
?>

質問は次のとおりです。DateForm から $_POST を使用して他のビュー/モデルに影響を与えるにはどうすればよいですか。

4

1 に答える 1

1

$formビューでは変数があいまいであるため、選択した日付に基づいてどのデータを正確に変更したいかは明確ではありませんdateWidget.php。インスタンスから渡されたインスタンス$form = $this->beginWidget('CActiveForm', array(...))を置き換えるように、日付のフォームウィジェットを開始します。これは紛らわしいことです...日付フィールドを別のフォームの一部として使用しますか、それとも別のネストされたフォームとして使用しますか?CFormModelDateWidgetCActiveFormDateWidget

とにかく、フォーム送信の直前にデータを変更するには、onSubmitハンドラーをそのフォームにアタッチできます。

jQuery('#date-form').submit(function(event) {
    // Any actions before submission
}

$formネストされたフォームのより一般的なケースを考慮し、それがビューのインスタンスであると仮定すると、以下に示すCActiveFormように、ビュー スクリプトの最後に (またはDateWidget任意の方法で別の JS ファイルに) 次のスクリプトを登録できます。

collectFormData独自の JavaScript 関数(メイン フォームのフィールドの値を収集し、結果のプレーンな JavaScript オブジェクトに配置する関数) とpopulateFormData(フィールドの新しい値を設定する関数)を作成する必要があることに注意してください。これは、一部のフィールドCActiveFormがカスタムで、複数の入力要素 (チェックボックスやラジオ ボタン リストなど) で構成されているためです。これらの関数は、ウィジェットの別の JS ファイルに配置できます。

また、任意のデータを含む任意のフォームに適したものにするために、フォームのデータを変更するコード スニペットで制限し、これらのスニペットを のプロパティでDateWidget参照できる別の PHP スクリプトに移動します。$urlDateWidget

Yii::app()->clientScript->registerScript("alterPost", "
    jQuery('#" . $form->id . "').submit(function(event, submit) {

        // Checking whether form's submission has been requested
        if (submit) {

            // Allowing form submission
            return;
        }

        // Preventing form submission
        event.preventDefault();
        event.stopPropagation();

        // Getting selected date
        var dateString = jQuery(this).find('input[name$=\"[date]\"]').val();

        // Collecting data of main form...
        var jqMainForm = jQuery(this).parents('form');
        var mainFormData = collectFormData(jqMainForm.attr('id'));

        var self = jQuery(this);
        jQuery.ajax('" . $this->url . "', {
            'type': 'POST',
            'data': jQuery.extend({'dateString': dateString}, mainFormData),
            'dataType': 'json',
            'success': function(data, textStatus, jqXHR) {

                // Populating main form by new values
                if (data['result'] === true)
                    populateFormData(jqMainForm.attr('id'), data['alteredFormData']);
                self.trigger('submit', true);
            }
        });
    })
", CClientScript::POS_READY);

フォーム データを変更する PHP スクリプトは、結果を JSON として返す必要があります。

<?php
$response = array(
    'result' => false
);
if (isset($_POST))
{
    // Analyzing dateString and form data, altering form data
    // $response['alteredFormData'] = ...;
    $response['result'] = true;
}
header("Content-Type: application/json");
print json_encode($response);
于 2013-04-09T19:08:32.160 に答える