0

これは、Yii Framework を使った私の最近の演習に関連する初心者向けの質問です。

データベースに次の構造があります。

CREATE TABLE location(
      id INTEGER PRIMARY KEY NOT NULL,
      location TEXT);
CREATE TABLE parameter(
      id INTEGER PRIMARY KEY NOT NULL,
      name TEXT,
      value TEXT);
CREATE TABLE temperature(
      id INTEGER PRIMARY KEY NOT NULL,
      locationId INTEGER,
      value REAL NOT NULL,
      createDate DATETIME NOT NULL,
      FOREIGN KEY(locationId) REFERENCES location(id));
CREATE INDEX idx1_temperature ON temperature (createDate);

グリッド内の両方のデータを含むビューを作成しようとしていますが、 -tablelocationの特定の値を変更する機能も備えています。実際には、 whereparameterを変更する可能性に加えて、グリッド内のすべての可能な場所のリストがあります。parameter.valueparameter.name="CURRENT_LOCATION"

私がこれまでに得たものは次のとおりです。

location/admin.phpビューの生成:

...
<h2>Change current location</h2>
<?php echo $this->renderPartial('_para', array('model'=>Parameter::model()->find('name="current_location"'))); ?>

<h2>Modify locations</h2>
<?php $this->widget('zii.widgets.grid.CGridView', array(
        'id'=>'location-grid',
        'dataProvider'=>$model->search(),
        'columns'=>array(
            'location',
            array(
                    'class'=>'CButtonColumn',
            ),
    ),
));
...

location/_para.phpフォームを埋め込む場合:

<?php
/* @var $this ParameterController */
/* @var $model Parameter */
/* @var $form CActiveForm */
?>

<div class="form">

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

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

    <div class="row">
            <?php echo $form->labelEx($model,'value'); ?>
            <?php //echo $form->textField($model,'value'); ?>
            <?php echo $form->dropDownList($model,'value',CHtml::listData(Location::model()->findAll(), 'id', 'location')); ?>
            <?php echo $form->error($model,'value'); ?>
    </div>

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

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

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

したがって、必要なのは、特定の行を保存(=更新)することparameterですが、正しくないようです。これまでにデバッグしたところ、Submit ボタンによって Location-controller の actionAdmin-function が実行されるようです。Location の代わりに Parameter-record を保存するように指示できれば、それで問題ありません。LocationController.php の actionAdmin 関数は次のとおりです。

    public function actionAdmin()
    {

            $model=new Location('search');
            $model->unsetAttributes();  // clear any default values
            if(isset($_GET['Location']))
            {
                    $model->attributes=$_GET['Location'];
            }

            if(isset($_POST['Parameter']))
            {
                    $model->attributes=$_POST['Parameter'];
                    if($model->save())
                    {
                            $this->redirect(array('view','id'=>$model->id));
                    }
            }

            $this->render('admin',array(
                    'model'=>$model,
            ));
    }

マルチモデルフォームなどをカバーする投稿をよく見かけますが、これを理解することはできません. 私がこれを完全に間違った方法で達成しようとしている可能性が非常に高いです。だから、正しい方向に私を殴ってください。

4

1 に答える 1

1

そうですね、Parameterを更新するメソッドはParameterControllerに入れるのが一番いいと思います。これにより、実装が簡単になり、少しきれいになります。

そのためには、フォーム コードを次のように変更します。

/admin/parameter/update などのように、動作させるためにフォームのアクションを調整する必要がある場合があります。

<?php
/* @var $this ParameterController */
/* @var $model Parameter */
/* @var $form CActiveForm */
?>

<div class="form">

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'parameter-form',
    'enableAjaxValidation'=>false,
    // Check that the action method below is correct
    'action' => array('/parameter/update', 'id' => $model->id), 
)); ?>

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

    <div class="row">
            <?php echo $form->labelEx($model,'value'); ?>
            <?php //echo $form->textField($model,'value'); ?>
            <?php echo $form->dropDownList($model,'value',CHtml::listData(Location::model()->findAll(), 'id', 'location')); ?>
            <?php echo $form->error($model,'value'); ?>
    </div>

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

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

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

ParameterController に既存の update メソッドがある場合は、それがそのまま機能するかどうかを確認してください。そうでない場合、または update メソッドがない場合は、次のようにしてみてください。

public function actionUpdate($id)
{
    $model = Parameter::model()->findByPk($id);
    if(isset($_POST['Parameter']))
    {
        $model->attributes=$_POST['Parameter'];
        if($model->update())
        {
            // Below redirects to the previous URL
            $this->redirect(Yii::app()->request->urlReferrer);
        }
    }
}

$model->save() を $model->update() に変更しました。これは、検証ルールを呼び出して false を返さないためです。何らかの理由で検証したい場合は、次のように、新しいパラメーターを作成するときにのみ名前と値が必要になるようにルールを変更する必要があります。

array('name, value', 'required', 'on' => 'create'),

そして、新しいパラメーターを作成するときは、 $model = new Parameter('create'); を実行する必要があります。

于 2013-01-05T18:15:43.417 に答える