0

我的目标: 我正在尝试根据 GET 参数过滤模型,并基于此填充表单。

我需要的是,当用户选择 Gridview 上的更新图标时,我会

  1. 获取他们想要编辑的“电话号码”,
  2. 使用电话号码的数据填充表单
  3. 允许用户编辑电话号码的数据并提交
  4. 然后我根据新数据运行我自己的自定义 sql 更新查询。

我的问题 我的 gridview 可以成功捕获所选行的电话号码。它可以成功地将它发送到控制器更新方法(见下文)但是我不能根据这个电话号码过滤一个模型,然后用这个模型填充一个表单。

我的错误

get_class() expects parameter 1 to be object, array given

/framework/web/helpers/CHtml.php(2220)
/framework/web/helpers/CHtml.php(2220): get_class(array()) 
/framework/web/helpers/CHtml.php(1236): CHtml::resolveName(array(), "TelephoneNumbers_TelephoneNumber") 
/framework/web/widgets/CActiveForm.php(562): CHtml::activeLabelEx(array(), "TelephoneNumbers_TelephoneNumber", array()) 
/views/dateAudiid/editupdateform.php(18): CActiveForm->labelEx(array(), "TelephoneNumbers_TelephoneNumber") 
/framework/web/CBaseController.php(126): require("/var/www/OMReport/protected/views/dateAudiid/editupdateform.php") 

这是我的网格视图。

$this->widget('bootstrap.widgets.TbGridView', array(
    'id'=>'dateaudiidcondensed-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        array(
            'class'=>'bootstrap.widgets.TbButtonColumn',
            'template'=>'{update}',
            'buttons'=>array
            (
                'update' => array
                (
                'url'=>'Yii::app()->createUrl("dateAudiid/Update/",array("TelephoneNumbers_TelephoneNumber"=>$data->TelephoneNumbers_TelephoneNumber))',
                ),

            ),
        ),
        'TelephoneNumbers_TelephoneNumber',
        'FormId_Formid',
        'Date',
        'AudibeneID_Audibene_ID'
    ),
)); 

这是我的控制器

public function actionUpdate($TelephoneNumbers_TelephoneNumber)
{

    $criteria=new CDbCriteria;
    $criteria->compare('TelephoneNumbers_TelephoneNumber',$_GET['TelephoneNumbers_TelephoneNumber'],true);
    $criteria->limit = 1;
    $criteria->offset = 1;
    $model = DateAudiidCondensedByAudibeneId::model()->findAll($criteria);
    $this->render('editupdate',array('model'=>$model));

}

这是我的看法

<?php
/* @var $this DateAudiidController */
/* @var $model DateAudiidCondensedByAudibeneId */

?>

<h1>Update Assignments </h1>

<?php echo $this->renderPartial('editupdateform', array('model'=>$model)); ?>

这是我的表格

<div class="form">

<?php 
    $form=$this->beginWidget('CActiveForm', array(
    'id'=>'date-audiid-condensed-by-audibene-id-customupdate-form',
    'enableAjaxValidation'=>false,
)); ?>

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

    <?php 

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

    <div class="row">
        <?php echo $form->labelEx($model,'TelephoneNumbers_TelephoneNumber'); ?>
        <?php echo $form->textField($model,'TelephoneNumbers_TelephoneNumber'); ?>
    </div>

    <div class="row">
        <?php echo $form->labelEx($model,'FormId_Formid'); ?>
        <?php echo $form->textField($model,'FormId_Formid'); ?>
        <?php echo $form->error($model,'FormId_Formid'); ?>
    </div>

    <div class="row">
        <?php echo $form->labelEx($model,'Date'); ?>
        <?php echo $form->textField($model,'Date'); ?>
        <?php echo $form->error($model,'Date'); ?>
    </div>

    <div class="row">
        <?php echo $form->labelEx($model,'AudibeneID_Audibene_ID'); ?>
        <?php echo $form->textField($model,'AudibeneID_Audibene_ID'); ?>
        <?php echo $form->error($model,'AudibeneID_Audibene_ID'); ?>
    </div>


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

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

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

我的想法/到目前为止我尝试过的

我将模型作为数组返回......但我的表单希望它作为一个对象。我需要更改在控制器更新操作中过滤模型的方式,但是我看不到如何执行此操作。我所有的其他方法都使用类似的模型过滤代码。

4

2 回答 2

1

您可以采取以下措施来解决此问题:

  1. 您的表单正在尝试使用模型标签,但您已经给出了一个数组,->findAll()将返回一个模型数组,这里您需要一个single object of model

  2. 您遇到的错误是因为$modelfilter您的网格中需要是模型的对象,这里将尝试使用此模型进行验证,因此当您为其提供模型数组时将不起作用,

  3. 如果要根据某些内容过滤结果,则需要在dataprovider填充网格的地方执行此操作,因此在这种情况下,位于$model->search()

获取参数并将其附加到该参数criteria

所以你的网格看起来像这样:

$this->widget('bootstrap.widgets.TbGridView', array(
    'id'=>'dateaudiidcondensed-grid',
    'dataProvider' => $model->search(), //create a new model with search scenario
    'filter' => $model, // here use that model to validate fields
    'columns'=>array(
        .
        .
        .
    ),
));

并在您的模型搜索方法中:

  public function search() {
    $criteria = new CDbCriteria;
    // grab the sent data and use it here
    $tel = Yii::app()->request->getParam('TelephoneNumbers_TelephoneNumber' , null);
    if(!empty($tel))
        $criteria->compare('TelephoneNumbers_TelephoneNumber' , $tel , true);
    .
    .
    .
    return new CActiveDataProvider($this, array(
        'criteria' => $criteria,
    ));
}
于 2014-01-06T04:50:02.933 回答
-1

这就是最终对我有用的方法

使用“findByAttributes”过滤模型并将模型返回到表单

public function actionUpdate($TelephoneNumbers_TelephoneNumber)
    {

        $model = DateAudiidCondensedByAudibeneId::model()->findByAttributes(array("TelephoneNumbers_TelephoneNumber" => $_GET['TelephoneNumbers_TelephoneNumber']));

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

    }
于 2014-01-06T10:18:21.810 回答