这是与我最近使用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);
我正在尝试创建一个包含网格中location
个数据的视图,还有一个用于更改parameter
- 表中某个值的功能。在实践中,除了可以更改parameter.value
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,
));
}
我看到很多关于多模型表格等的帖子,但我无法掌握这一点。我可能正试图以完全错误的方式完成这项工作。 所以,请打我正确的方向。
答案 0 :(得分:1)
好的,我认为最好的办法是在ParameterController中放置更新参数的方法。这使得它更容易实现,并且更清洁。
为此,请将表单代码更改为:
您可能需要调整表单中的操作才能使其正常工作,例如/管理/参数/更新
<?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-&gt; save()更改为$ model-&gt; update(),因为它不会调用验证规则并使其返回false。如果由于某种原因需要验证,则需要更改规则,以便仅在创建新参数时才需要名称和值,如下所示:
array('name, value', 'required', 'on' => 'create'),
然后当您创建新参数时,您需要执行$ model = new Parameter('create');