Yii CActiveForm期望对象而不是数组

时间:2014-01-06 02:02:07

标签: yii cactiverecord

我的目标: 我试图基于GET参数过滤模型,并基于此填充表单。

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

  1. 抓住他们想要编辑的'电话号码',
  2. 使用电话号码的数据填充表单
  3. 允许用户编辑电话号码的此数据并提交
  4. 然后我根据新数据运行自己的自定义sql更新查询。
  5. 我的问题 我的gridview可以成功捕获所选行的电话号码。 它可以成功地将其发送到Controller Update方法(见下文) 但是,我无法根据此电话号码过滤模型,然后使用此模型填充表单。

    我的错误

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

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

    这是我的控制器

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

    我的想法/到目前为止我尝试了什么

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

2 个答案:

答案 0 :(得分:1)

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

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

  2. 您遇到的错误是因为您网格的$model中的filter需要是模型的对象,此处将尝试使用此模型进行验证,因此当您使用时无效正在为它提供一系列模型,

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

  4. 获取参数并将其附加到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,
        ));
    }
    

答案 1 :(得分:-1)

以下是最终对我有用的内容

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

public function actionUpdate($TelephoneNumbers_TelephoneNumber)
    {

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

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

    }