Yii CActiveForm expects object and not array

508 views Asked by At

My Goal: I am trying to filter a model, based on a GET parameter, and populate a form based on this.

What I require is that when users select the update icon on the Gridview I will

  1. grab the 'telephone number' they want to edit,
  2. populate a form with the telephonenumber's data
  3. allow the user to edit this data for the telephonenumber and submit
  4. I then run my own custom sql update query based on the new data.

My Problem My gridview can successfully capture the telephonenumber for a selected row. It can successfully send this to the Controller Update method (see below) I cannot however filter a model based on this telephonenumber and then populate a form with this model.

My Error

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

Here's my 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'
    ),
)); 

Here's my Controller

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

}

Here's my View

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

?>

<h1>Update Assignments </h1>

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

Here's my Form

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

My Thoughts / What I've tried so far

I am returning the model as an array...but my form wants it as an object. I need to change something in the way I filter my model in the Controller Update action, however I cannot see how to do this. All my other methods use similar model filtering code.

2

There are 2 answers

1
Developerium On BEST ANSWER

here is what you can do to fix this :

  1. your form is trying to use models labeling but you have given an array, ->findAll() will return an array of models, here you need a single object of model

  2. the error your having is because $model in filter of your grid needs to be an object of model which here will try to validate using this model, so won't work when you are giving it an array of your models,

  3. if you want to filter the results based on something, you need to do this where the dataprovider of your grid is being populated, so in this case, is in $model->search()

get the parameter and append it to that criteria

so your grid could look like this:

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

and in your models search method:

  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,
    ));
}
0
Nischal Bachu On

Here's what eventually worked for me

The usage of 'findByAttributes' to filter and return a model to the Form

public function actionUpdate($TelephoneNumbers_TelephoneNumber)
    {

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

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

    }