Yii CActiveForm需要对象而不是数组

Yii CActiveForm需要对象而不是数组,yii,cactiverecord,Yii,Cactiverecord,我的目标: 我试图根据GET参数筛选模型,并基于此填充表单 我需要的是当用户在Gridview上选择更新图标时 我会的 抓取他们想要编辑的“电话号码” 用电话号码的数据填充表单 允许用户编辑电话号码的此数据并提交 然后,我根据新数据运行自己的自定义sql更新查询 我的问题 My gridview可以成功捕获选定行的电话号码。 它可以成功地将其发送到控制器更新方法(见下文) 但是,我无法基于此电话号码筛选模型,然后使用此模型填充表单 我的错误 get_class() expects paramet

我的目标: 我试图根据GET参数筛选模型,并基于此填充表单

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

  • 抓取他们想要编辑的“电话号码”
  • 用电话号码的数据填充表单
  • 允许用户编辑电话号码的此数据并提交
  • 然后,我根据新数据运行自己的自定义sql更新查询
  • 我的问题 My 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") 
    
    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));
    
    }
    
    这是我的Gridview。

    $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'
        ),
    )); 
    
    这是我的控制器

    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") 
    
    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 -->
    
    
    

    带*的字段是必需的

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

    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") 
    
    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));
    
    }
    
    我将模型作为数组返回…但我的表单希望它作为对象。 我需要在控制器更新操作中对模型进行过滤的方式进行一些更改,但是我看不到如何做到这一点。
    我的所有其他方法都使用类似的模型筛选代码。

    以下是解决此问题的方法:

  • 您的表单试图使用模型标签,但您已经给出了一个数组,
    ->findAll()
    将返回一个模型数组,这里您需要一个
    模型的单个对象

  • 您的错误是因为网格的
    filter
    中的
    $model
    需要是模型的对象,此处将尝试使用此模型进行验证,因此当您为其提供一个模型数组时,它将不起作用

  • 如果您想基于某些内容过滤结果,则需要在填充网格的
    数据提供程序的位置执行此操作,因此在本例中,位于
    $model->search()

  • 获取参数并将其附加到该
    标准中

    因此,您的网格可以如下所示:

    $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,
        ));
    }
    

    以下是最终对我有效的方法

    使用“FindByatAttributes”筛选模型并将其返回表单

    public function actionUpdate($TelephoneNumbers_TelephoneNumber)
        {
    
            $model = DateAudiidCondensedByAudibeneId::model()->findByAttributes(array("TelephoneNumbers_TelephoneNumber" => $_GET['TelephoneNumbers_TelephoneNumber']));
    
            $this->render('editupdate',array('model'=>$model));
    
        }
    

    感谢TinyByte的回复…编辑模型对我来说不起作用,而是检索模型的控制器方法。不过还是要谢谢你:-)