Difference between #7 and #20 of
Common Yii questions

Changes

Title unchanged

Common Yii questions

Category unchanged

FAQs

Yii version unchanged

Tags unchanged

yii, common, questions, beginners

Content changed

Introduction ------------ Here I suggest to list the most common questions you meat in the forum or freenode irc.
 
Feel free to edit this wiki article, and add another question **with answer**
 
 
Put attention of the question answer form
 
 
~~~
 
[html]
 
<hr/>
 
 
### Questions text
 
 
#### Answer:
 
The answer text
 
~~~
 
 
 
[Discuss it here](http://www.yiiframework.com/forum/index.php?/topic/24729-creating-common-questions-wiki/ "http://www.yiiframework.com/forum/index.php?/topic/24729-creating-common-questions-wiki/")
 
 
To give some one link to this wiki in freenode yii chat write:
 
 
 
 
```php 
!faq common questions
 
```
 
 
The Questions
 
-------------
 
 
### Why is $model->save() not saving the record/object/model?
 
 
#### Answer:
 
Because save method performs validation
 
[CActiveRecord::save](http://www.yiiframework.com/doc/api/1.1/CActiveRecord#save-detail "CActiveRecord::save")
 
 
As you can see in the source code:
 
 
```php 
public function save($runValidation=true,$attributes=null)
 
{
 
    if(!$runValidation || $this->validate($attributes))
 
        return $this->getIsNewRecord() ? $this->insert($attributes) : $this->update($attributes);
 
    else
 
        return false;
 
}
 
```
 
if you don't want it to validate just do **$method->save(true);**
 
 
<hr/>
 
 
### How to connect to database in controller?
 
 
#### Answer:
 
The best approach is to set db coneection in your main.php config.
 
 
The second one would be just using the CDbConnection::__construct
 
 
Examples for both aproaches can be found here
 
[Guide::Establishing Database Connection](http://www.yiiframework.com/doc/guide/1.1/en/database.dao#establishing-database-connection "http://www.yiiframework.com/doc/guide/1.1/en/database.dao#establishing-database-connection")
 
 
 
<hr/>
 
 
### How to change site/page?id=123 to site/page/id
 
 
#### Answer:
 
For this you should use urlManager
 
 
it is actually very-well documented...
 
[URL Manager](http://www.yiiframework.com/doc/guide/1.1/en/topics.url "http://www.yiiframework.com/doc/guide/1.1/en/topics.url")
 
 
The direct answer to the question is - using that rule:
 
 
 
```php 
array(
 
    'site/action/<id:\d+>' => 'site/action
 
)
 
```
 
 
In your you can set **$id** like this: **actionPage($id)**
 
 
or get it via **Yii::app()->request->getQuery('id');**
 
 
 
<hr/>
 
 
### I got an error: Call to a member function getAttributes() on a non-object ...
 
what to do?
 
 
#### Answer:
 
First of all you should always read the error...
 
The problem is actually indeed that you trying to use a function on some variable that is not an object, and because it is not an object - it doesn't has the method you want to use!
 
 
so use **var_dump** or **echo CVarDumper::dump($param, 10, true);
 
** or **print_r** , 
 
TO understand why it is not an object!
 
 
for example if you tried to get a user via active record it can be null if it is not exists, you need to check it...
 
 
<hr/>
 
 
### Why Form /  ActiveForm not doing ajax validation ?
 
 
#### Answer:
 
In most of the cases this code snippet will help for **generated form via gii**:
 
 
 
```php 
<?php $form=$this->beginWidget('CActiveForm', array(
 
        'id'=>'top-websites-cr-form',
 
        'enableAjaxValidation'=>true,
 
        'clientOptions' => array(
 
      'validateOnSubmit'=>true,
 
      'validateOnChange'=>true,
 
      'validateOnType'=>false,
 
         ),
 
)); ?>
 
```
 
 
If you create your own form, and trying to do this... better create CRUD with gii, and see how it is done there!
 
 
you need to echo the validation results if this is an ajax request!
 
via
 
 
```php 
echo CActiveForm::validate($model);
 
 
```
 
 
<hr/>
 
 
### How to use find / findByAttributes etc.
 
 
#### Answer:
 
This is an example from UserIdentity:
 
 
 
```php 
$user = User::model()->findByAttributes(array('username'=>$this->username));
 
```
 
 
other way is specify [CDbCriteria](http://www.yiiframework.com/doc/api/1.1/CDbCriteria "http://www.yiiframework.com/doc/api/1.1/CDbCriteria")
 
 
<hr/>
 
 
### How to increment or decrement counter via query builder
 
 
#### Answer:
 
The simplest answer would be - don't use query builder for that...
 
But just for the protocol
 
 
 
```php 
Yii::app()->db->commandBuilder->createUpdateCommand( 
 
                '{{table}}', 
 
                array( 
 
                    'counter' => new CDbExpression( 'counter + :counter' , array(':counter'=>1))
 
                    ), 
 
                new CDbCriteria(array(
 
                    "condition" => "id = :id" , 
 
                    "params" => array(
 
                        "id"=>1
 
                    )
 
                ))
 
            )->execute();
 
```
et in the forum or freenode irc.
 
Feel free to edit this wiki article, and add another question **with answer**
 
 
Put attention of the question answer form
 
 
~~~
 
[html]
 
<hr/>
 
 
### Questions text
 
 
#### Answer:
 
The answer text
 
~~~
 
 
 
[Discuss it here](http://www.yiiframework.com/forum/index.php?/topic/24729-creating-common-questions-wiki/ "http://www.yiiframework.com/forum/index.php?/topic/24729-creating-common-questions-wiki/")
 
 
To give some one link to this wiki in freenode yii chat write:
 
 
 
 
```php 
!faq common questions
 
```
 
 
The Questions
 
-------------
 
 
### Why is $model->save() not saving the record/object/model?
 
 
#### Answer:
 
Because save method performs validation
 
[CActiveRecord::save](http://www.yiiframework.com/doc/api/1.1/CActiveRecord#save-detail "CActiveRecord::save")
 
 
As you can see in the source code:
 
 
```php 
public function save($runValidation=true,$attributes=null)
 
{
 
    if(!$runValidation || $this->validate($attributes))
 
        return $this->getIsNewRecord() ? $this->insert($attributes) : $this->update($attributes);
 
    else
 
        return false;
 
}
 
```
 
if you don't want it to validate just do **$method->save(false);**
 
 
Other possible reason is that "beforeSave" method (if overridden) doesn't return "true".
 
<hr/>
 
 
### How to connect to database in controller?
 
 
#### Answer:
 
The best approach is to set db connection in your main.php config.
 
 
The second one would be just using the CDbConnection::__construct
 
 
Examples for both aproaches can be found here
 
[Guide::Establishing Database Connection](http://www.yiiframework.com/doc/guide/1.1/en/database.dao#establishing-database-connection "http://www.yiiframework.com/doc/guide/1.1/en/database.dao#establishing-database-connection")
 
 
 
<hr/>
 
 
### How to change site/page?id=123 to site/page/id
 
 
#### Answer:
 
For this you should use urlManager
 
 
it is actually very-well documented...
 
[URL Manager](http://www.yiiframework.com/doc/guide/1.1/en/topics.url "http://www.yiiframework.com/doc/guide/1.1/en/topics.url")
 
 
The direct answer to the question is - using that rule:
 
 
 
```php 
array(
 
    'site/action/<id:\d+>' => 'site/action'
 
)
 
```
 
 
In your you can set **$id** like this: **actionPage($id)**
 
 
or get it via **Yii::app()->request->getQuery('id');**
 
 
 
<hr/>
 
 
### I got an error: Call to a member function getAttributes() on a non-object ...
 
what to do?
 
 
#### Answer:
 
First of all you should always read the error...
 
The problem is actually indeed that you trying to use a function on some variable that is not an object, and because it is not an object - it doesn't have the method you want to use!
 
 
Use **var_dump** or **echo CVarDumper::dump($param, 10, true);
 
** or **print_r** , 
 
to understand why it is not an object!
 
 
For example if you tried to get a user via active record it can be null if it does not exist, you need to check it...
 
 
<hr/>
 
 
### Why Form / ActiveForm is not doing ajax validation ?
 
 
#### Answer:
 
In most of the cases this code snippet will help for **generated form via gii**:
 
 
 
```php 
<?php $form=$this->beginWidget('CActiveForm', array(
 
    'id'=>'form-id',
 
    'enableAjaxValidation'=>true,
 
    'clientOptions' => array(
 
        'validateOnSubmit'=>true,
 
        'validateOnChange'=>true,
 
        'validateOnType'=>false,
 
    ),
 
)); ?>
 
```
 
 
If you create your own form, and trying to do this... better create CRUD with gii, and see how it is done there!
 
 
You need to echo the validation results if this is an ajax request!
 
By using:
 
 
```php 
echo CActiveForm::validate($model);
 
```
 
 
<hr/>
 
 
### How to use find() / findByAttributes() etc.
 
 
#### Answer:
 
This is an example from UserIdentity:
 
 
 
```php 
$user = User::model()->findByAttributes(array('username'=>$this->username));
 
```
 
 
Other way is to specify [CDbCriteria](http://www.yiiframework.com/doc/api/1.1/CDbCriteria "http://www.yiiframework.com/doc/api/1.1/CDbCriteria").
 
 
<hr/>
 
 
### How to increment or decrement counter via query builder
 
 
#### Answer:
 
The simplest answer would be - don't use query builder for that...
 
But just for the protocol
 
 
 
```php 
Yii::app()->db->commandBuilder->createUpdateCommand( 
 
   '{{table}}', 
 
   array( 
 
      'counter' => new CDbExpression( 'counter + :counter' , array(':counter'=>1))
 
   ), 
 
   new CDbCriteria(
 
      array(
 
         "condition" => "id = :id" , 
 
         "params" => array(
 
            "id"=>1
 
         )
 
      )
 
   )
 
)->execute();
 
```
 
 
<hr/>
 
 
### How to use model()->find() / model()->findAll()
 
 
#### Answer:
 
There are three ways:<br>
 
First CdbCriteria:
 
 
```php 
$criteria = new CDbCriteria();
 
$criteria->compare('first_name', 'Paul');
 
$criteria->compare('last_name', 'Smith');
 
$users = User::model()->findAll($criteria);
 
```
 
 
Second:
 
 
 
```php 
User::model()->findAll('first_name=? AND last_name=?', array('Paul', 'Smith'));
 
```
 
 
Third:
 
 
 
```php 
User::model()->findAllByAttributes(array('first_name'=>'Paul', 'last_name'=>'Smith'));
 
```
 
 
The result will be collection of models, to get an array you can use DAO or QueryBuilder
 
 
<hr/>
 
 
### Property ClassName.xxx is not defined , what is the problem?
 
 
#### Answer:
 
First of all, actually the error message say all what you need to know!
 
 
This is very common error in component configuration, and widget configuration.
 
This is not a framework issue!
 
 
To solve it, you should make sure that the **ClassName** has a field with the name you are trying to use.
 
This can be a capital letter issue, or just the property aka field not exists in the class...
 
 
Read the class reference to see if there is a property that you want to use, or if this is an extension or widget - open the class file, and see if there is the property and you spelled it well
 
 
for example if this is the class:
 
 
 
```php 
class Foo{
 
    public $bar = 123;
 
}
 
```
 
 
And you trying to access **Foo.bor** , it not exists there!
 
 
See also: [1](http://www.yiiframework.com/forum/index.php?/topic/16190-property-is-not-defined/ "")
 
[2](http://www.yiiframework.com/forum/index.php?/topic/8054-property-usersalt-is-not-defined/ "")
 
[3](http://www.yiiframework.com/forum/index.php?/topic/5209-gathering-tabular-input-property-item-is-not-defined/ "")
 
[4](http://www.yiiframework.com/forum/index.php?/topic/3452-property-productcontroller-locale-is-not-defined/ "")
 
[5](http://www.yiiframework.com/forum/index.php?/topic/2378-property-cmysqltableschema-primarykey-is-not-defined/ "")
 
 
<hr/>
 
 
### Trying get uploaded file via CUploadedFilee::getInstanceByName() and getting null every time
 
 
#### Answer:
 
I will just show you working example:
 
 
 
 
```php 
//this is how to get the file
 
$file = CUploadedFile::getInstanceByName('data');
 
//upload form
 
CHtml::beginForm('', 'post',array('enctype'=>'multipart/form-data'));
 
//the file field
 
CHtml::fileField('data', '');
 
```
 
 
<hr/>
 
 
### what's the difference between exit and Yii::app()->end()
 
 
#### Answer:
 
Both terminates the application. But end method calls onEndRequest event before doing the exit...
 
In this case as in a lot of others the source code explains itself very-well
 
 
 
 
```php 
public function end($status=0, $exit=true)
 
{
 
    if($this->hasEventHandler('onEndRequest'))
 
        $this->onEndRequest(new CEvent($this));
 
    if($exit)
 
        exit($status);
 
}
 
```
 
14 0
23 followers
Viewed: 62 457 times
Version: 1.1
Category: FAQs
Written by: dckurushin dckurushin
Last updated by: migajek migajek
Created on: Oct 17, 2011
Last updated: 13 years ago
Update Article

Revisions

View all history