Hello Joblo,
I am getting an error "Array to String Conversion" on my multimodel form. This is the only form in my app that gives this error. I have another form that uses the same rules() and saves the information with no problem. Can you help me find the problem?
Here’s my controller:
<?php
class memberController extends Controller
{
/**
* @var string the default layout for the views. Defaults to '//layouts/column2', meaning
* using two-column layout. See 'protected/views/layouts/column2.php'.
*/
public $layout='//layouts/column2';
/**
* @return array action filters
*/
public function filters()
{
return array(
'accessControl', // perform access control for CRUD operations
);
}
/**
* Specifies the access control rules.
* This method is used by the 'accessControl' filter.
* @return array access control rules
*/
public function accessRules()
{
return array(
array('allow', // allow all users to perform 'index' and 'view' actions
'actions'=>array('index','view'),
'users'=>array('*'),
),
array('allow', // allow authenticated user to perform 'create' and 'update' actions
'actions'=>array('create','update','create2'),
'users'=>array('@'),
),
array('allow', // allow admin user to perform 'admin' and 'delete' actions
'actions'=>array('admin','delete'),
'users'=>array('admin'),
),
array('deny', // deny all users
'users'=>array('*'),
),
);
}
/**
* Displays a particular model.
* @param integer $id the ID of the model to be displayed
*/
public function actionView($id)
{
$this->render('view',array(
'model'=>$this->loadModel($id),
));
}
/**
* Creates a new model.
* If creation is successful, the browser will be redirected to the 'view' page.
*/
public function actionCreate()
{
$model=new member;
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['member']))
{
$model->attributes=$_POST['member'];
if($model->save())
$this->redirect(array('view','id'=>$model->id));
}
$this->render('create',array(
'model'=>$model,
));
}
public function actionCreate2()
{
Yii::import('ext.multimodelform.MultiModelForm');
$model = new member;
$member = new member;
$validatedMembers = array(); //ensure an empty array
if(isset($_POST['member']))
{
$model->attributes=$_POST['member'];
if( //validate detail before saving the master
MultiModelForm::validate($member,$validatedMembers,$deleteItems) &&
$model->save()
)
{
//the value for the foreign key 'groupid'
$masterValues = array ('groupid'=>$model->id);
if (MultiModelForm::save($member,$validatedMembers,$deleteMembers,$masterValues))
$this->redirect(array('view','id'=>$model->id));
}
}
$this->render('create2',array(
'model'=>$model,
//submit the member and validatedItems to the widget in the edit form
'member'=>$member,
'validatedMembers' => $validatedMembers,
));
}
/**
* Updates a particular model.
* If update is successful, the browser will be redirected to the 'view' page.
* @param integer $id the ID of the model to be updated
*/
public function actionUpdate($id)
{
$model=$this->loadModel($id);
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['member']))
{
$model->attributes=$_POST['member'];
if($model->save())
$this->redirect(array('view','id'=>$model->id));
}
$this->render('update',array(
'model'=>$model,
));
}
/**
* Deletes a particular model.
* If deletion is successful, the browser will be redirected to the 'admin' page.
* @param integer $id the ID of the model to be deleted
*/
public function actionDelete($id)
{
if(Yii::app()->request->isPostRequest)
{
// we only allow deletion via POST request
$this->loadModel($id)->delete();
// if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
if(!isset($_GET['ajax']))
$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
}
else
throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');
}
/**
* Lists all models.
*/
public function actionIndex()
{
$criteria = new CDbCriteria();
if(isset($_GET['qs']))
{
$qs = $_GET['qs'];
$criteria->compare('name', $qs, true, 'OR');
}
$dataProvider=new CActiveDataProvider("member", array('criteria'=>$criteria));
$this->render('index',array(
'dataProvider'=>$dataProvider,
'pagination'=>false,
$dataProvider->pagination->pageSize=50000000,
'name'=>'ajax',
));
}
/**
* Manages all models.
*/
public function actionAdmin()
{
$model=new member('search');
$model->unsetAttributes(); // clear any default values
if(isset($_GET['member']))
$model->attributes=$_GET['member'];
$this->render('admin',array(
'model'=>$model,
));
}
/**
* Returns the data model based on the primary key given in the GET variable.
* If the data model is not found, an HTTP exception will be raised.
* @param integer the ID of the model to be loaded
*/
public function loadModel($id)
{
$model=member::model()->findByPk($id);
if($model===null)
throw new CHttpException(404,'The requested page does not exist.');
return $model;
}
/**
* Performs the AJAX validation.
* @param CModel the model to be validated
*/
protected function performAjaxValidation($model)
{
if(isset($_POST['ajax']) && $_POST['ajax']==='service-member-form')
{
echo CActiveForm::validate($model);
Yii::app()->end();
}
}
}
And here is the form:
<div class="form wide">
<?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'bulk-form',
'enableAjaxValidation'=>true,
)); ?>
<p class="note">Fields with <span class="required">*</span> are required.</p>
<?php
// see http://www.yiiframework.com/doc/guide/1.1/en/form.table
// Note: Can be a route to a config file too,
// or create a method 'getMultiModelForm()' in the member model
$memberFormConfig = array(
'elements'=>array(
'name'=>array(
'type'=>'text',
'maxlength'=>40,
),
'rankLevel'=>array(
'type'=>'text',
'maxlength'=>40,
),
'Tag'=>array(
'type'=>'text',
'maxlength'=>40,
),
'dept'=>array(
'type'=>'text',
'maxlength'=>40,
),
'dateTag'=>array(
'type'=>'text',
'maxlength'=>40,
),
'date'=>array(
'type'=>'text',
'maxlength'=>40,
),
));
$this->widget('ext.multimodelform.MultiModelForm',array(
'id' => 'id_member', //the unique widget id
'formConfig' => $memberFormConfig, //the form configuration array
'model' => $servicemember, //instance of the form model
//if submitted not empty from the controller,
//the form will be rendered with validation errors
'validatedItems' => $validatedMembers,
//array of member instances loaded from db
'data' => $servicemember->findAll('branchId=:branchId', array(':branchId'=>$model->id)),
));
?>
<div class="row">
<?php echo $form->labelEx($model,''); ?>
<?php echo $form->hiddenField($model,'ip3',array('value'=>Yii::app()->request->userHostAddress,)); ?>
<?php echo $form->labelEx($model,''); ?>
<?php echo $form->hiddenField($model,'branchId',array('value'=>1,)); ?>
</div>
<div class="row buttons">
<?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>
</div>
<?php $this->endWidget(); ?>
</div><!-- form -->
Here’s the stack trace:
Array to string conversion
(D:\WAMP\www\yii-1.1.8.r3324\framework\db\CDbCommand.php:256)
Stack trace:
#0
D:\WAMP\www\yii-1.1.8.r3324\framework\db\schema\CDbCommandBuilder.php(98):
CDbCommandBuilder->bindValues()
#1 D:\WAMP\www\yii-1.1.8.r3324\framework\db\ar\CActiveRecord.php(1607):
CDbCommandBuilder->createFindCommand()
#2
D:\WAMP\www\yii-1.1.8.r3324\framework\validators\CUniqueValidator.php(97):
member->exists()
#3 D:\WAMP\www\yii-1.1.8.r3324\framework\validators\CValidator.php(192):
CUniqueValidator->validateAttribute()
#4 D:\WAMP\www\yii-1.1.8.r3324\framework\base\CModel.php(152):
CUniqueValidator->validate()
#5 D:\WAMP\www\yii-1.1.8.r3324\framework\db\ar\CActiveRecord.php(780):
member->validate()
#6
D:\WAMP\www\yii-1.1.8.r3324\APP\protected\controllers\memberController.php(97):
member->save()
#7 D:\WAMP\www\yii-1.1.8.r3324\framework\web\actions\CInlineAction.php(50):
memberController->actionCreate2()
#8 D:\WAMP\www\yii-1.1.8.r3324\framework\web\CController.php(300):
CInlineAction->runWithParams()
#9 D:\WAMP\www\yii-1.1.8.r3324\framework\web\filters\CFilterChain.php(134):
memberController->runAction()
#10 D:\WAMP\www\yii-1.1.8.r3324\framework\web\filters\CFilter.php(41):
CFilterChain->run()
#11 D:\WAMP\www\yii-1.1.8.r3324\framework\web\CController.php(1144):
CAccessControlFilter->filter()
#12
D:\WAMP\www\yii-1.1.8.r3324\framework\web\filters\CInlineFilter.php(59):
memberController->filterAccessControl()
#13
D:\WAMP\www\yii-1.1.8.r3324\framework\web\filters\CFilterChain.php(131):
CInlineFilter->filter()
#14 D:\WAMP\www\yii-1.1.8.r3324\framework\web\CController.php(283):
CFilterChain->run()
#15 D:\WAMP\www\yii-1.1.8.r3324\framework\web\CController.php(257):
memberController->runActionWithFilters()
#16 D:\WAMP\www\yii-1.1.8.r3324\framework\web\CWebApplication.php(277):
memberController->run()
#17 D:\WAMP\www\yii-1.1.8.r3324\framework\web\CWebApplication.php(136):
CWebApplication->runController()
#18 D:\WAMP\www\yii-1.1.8.r3324\framework\base\CApplication.php(158):
CWebApplication->processRequest()
#19 D:\WAMP\www\yii-1.1.8.r3324\APP\index.php(25): CWebApplication->run()
REQUEST_URI=/yii-1.1.8.r3324/APP/index.php/member/create2
I really hope I can get this fixed as I need tabular input.
As you can probably see in the controller, I copied your sample code from the readme and simply added my model names, etc.