0

这是一个与我最近使用 Yii 框架的练习有关的新手问题。

我在数据库中有以下结构:

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中某个值的功能。parameter在实践中,除了可以更改parameter.valuewhere之外,我还会列出网格中所有可能的位置parameter.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行,但我似乎没有做对。到目前为止,我已经调试过,似乎提交按钮会导致位置控制器的 actionAdmin 函数被执行。如果我可以指示那里保存参数记录而不是位置,那对我来说很好。这是 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

好吧,我认为最好的办法是将更新参数的方法放在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 中有一个现有的更新方法,请查看它是否按原样工作。如果没有或者您没有更新方法,请尝试以下操作:

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 回答