提交按钮后 Yii 不保存可编辑网格
Yii doesn't save editable grid after submit button
不幸的是,此解决方案不会保存 网格上的已编辑数据,我可以帮忙吗?
- 视图名称:admin
- 模型名称:时间表
- 控制器名称:TimesheetController
提前致谢。
VIEW
<form name="editableGridForm" method="post" action="editableGrid"> <?php
$this->widget('zii.widgets.grid.CGridView',
array(
'id'=>'timesheet-grid',
'dataProvider'=>$model->search(),
'columns'=>array(
array('name'=>'ID','htmlOptions'=>array('width'=>'25px')),
array('name'=>"DESCRIZIONE",
'type'=>'raw',
'htmlOptions'=>array('width'=>'150px'),
'value'=>'$data->getInputField(\'DESCRIZIONE\',$row)'
),
)
)
);
echo CHtml::submitButton('salva',array('class' => 'btn btn-success'));
?>
</form>
型号
public function getInputField($fieldName, $row, $options = array()) {
return CActiveForm::textField($this, $fieldName,
array_merge(array("name" => "Timesheet[" . $row . "][" . $fieldName . "]"), $options)
);
}
控制器
public function actionEditableGrid() {
$model=new Timesheet('search');
$notenData = $model->search();
if (isset($_POST['Timesheet']) ) {
foreach( $notenData->data as $i=>$item ) {
if(isset($_POST['Timesheet'][$i])) {
$item->attributes=$_POST['Timesheet'][$i];
if ( $item->validate() ) {
$item->save();
}
}
}
$this->redirect(array('admin'));
}
}
当您对 $this->attributes
进行批量赋值时,Yii 只会更改 "safe" 属性。当属性具有验证规则或仅被标记为安全时(如果没有合适的验证规则),属性是安全的,如下:
public function rules()
{
return array(
array('DESCRIZIONE', 'required'),
array('DESCRIZIONE', 'safe'),
);
}
这些规则中的任何一个都足够了。
关于批量分配和 "safe" 验证器的更多信息:http://www.yiiframework.com/wiki/161/understanding-safe-validation-rules/
我还注意到您应该将模型中的 CActiveForm::textField
替换为 CHtml::activeTextField
以防止 php 严格模式下的错误。 textField
是 CActiveForm
.
的非静态方法
编辑:为了调试为什么保存不起作用,请在您的控制器中替换它
if ( $item->validate() ) {
$item->save();
}
来自
if ( !$item->save() ) {
var_dump('Could not save, errors: ' . var_export($item->errors, TRUE) . ', attributes: ' . var_export($item->attributes, TRUE));
return;
}
save()
将自动调用 validate()
和 return false
如果验证失败。
不幸的是,此解决方案不会保存 网格上的已编辑数据,我可以帮忙吗?
- 视图名称:admin
- 模型名称:时间表
- 控制器名称:TimesheetController
提前致谢。
VIEW
<form name="editableGridForm" method="post" action="editableGrid"> <?php
$this->widget('zii.widgets.grid.CGridView',
array(
'id'=>'timesheet-grid',
'dataProvider'=>$model->search(),
'columns'=>array(
array('name'=>'ID','htmlOptions'=>array('width'=>'25px')),
array('name'=>"DESCRIZIONE",
'type'=>'raw',
'htmlOptions'=>array('width'=>'150px'),
'value'=>'$data->getInputField(\'DESCRIZIONE\',$row)'
),
)
)
);
echo CHtml::submitButton('salva',array('class' => 'btn btn-success'));
?>
</form>
型号
public function getInputField($fieldName, $row, $options = array()) {
return CActiveForm::textField($this, $fieldName,
array_merge(array("name" => "Timesheet[" . $row . "][" . $fieldName . "]"), $options)
);
}
控制器
public function actionEditableGrid() {
$model=new Timesheet('search');
$notenData = $model->search();
if (isset($_POST['Timesheet']) ) {
foreach( $notenData->data as $i=>$item ) {
if(isset($_POST['Timesheet'][$i])) {
$item->attributes=$_POST['Timesheet'][$i];
if ( $item->validate() ) {
$item->save();
}
}
}
$this->redirect(array('admin'));
}
}
当您对 $this->attributes
进行批量赋值时,Yii 只会更改 "safe" 属性。当属性具有验证规则或仅被标记为安全时(如果没有合适的验证规则),属性是安全的,如下:
public function rules()
{
return array(
array('DESCRIZIONE', 'required'),
array('DESCRIZIONE', 'safe'),
);
}
这些规则中的任何一个都足够了。
关于批量分配和 "safe" 验证器的更多信息:http://www.yiiframework.com/wiki/161/understanding-safe-validation-rules/
我还注意到您应该将模型中的 CActiveForm::textField
替换为 CHtml::activeTextField
以防止 php 严格模式下的错误。 textField
是 CActiveForm
.
编辑:为了调试为什么保存不起作用,请在您的控制器中替换它
if ( $item->validate() ) {
$item->save();
}
来自
if ( !$item->save() ) {
var_dump('Could not save, errors: ' . var_export($item->errors, TRUE) . ', attributes: ' . var_export($item->attributes, TRUE));
return;
}
save()
将自动调用 validate()
和 return false
如果验证失败。