Yii

Yii is a high-performance PHP framework best for developing Web 2.0 applications.

http://www.yiiframework.com/

Slackware installation

http://www.yiiframework.com/doc/guide/1.1/en/topics.url#hiding-x-23x

<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>
LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so
Include /etc/httpd/mod_php.conf  # enable the php module

<VirtualHost *:80>
    ServerName localhostyii
    DocumentRoot "/var/www/htdocs/yii-1.1.15.022a51"
    <Directory "/var/www/htdocs/yii-1.1.15.022a51">
      Require all granted
      AllowOverride all
    </Directory>
</VirtualHost>

127.0.0.1 localhostyii 

date.timezone="Europe/Lisbon"

Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on
RewriteBase /demos/blog
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# otherwise forward it to index.php
RewriteRule . index.php

                'urlManager'=>array(
                        'showScriptName'=>false,

Validation rules ActiveRecord CModel

http://www.yiiframework.com/doc/guide/1.1/en/form.model#declaring-validation-rules

We specify the validation rules in the rules() method which should return an array of rule configurations.

Alias

Class

boolean

CBooleanValidator

captcha

CCaptchaValidator

compare

CCompareValidator

email

CEmailValidator

date

CDateValidator

default

CDefaultValueValidator

exist

CExistValidator

file

CFileValidator

filter

CFilterValidator

in

CRangeValidator

length

CStringValidator

match

CRegularExpressionValidator

numerical

CNumberValidator

required

CRequiredValidator

type

CTypeValidator

unique

CUniqueValidator

url

CUrlValidator

   1  public function rules()
   2     {
   3         return array(
   4             array('username, password', 'required'),
   5             array('rememberMe', 'boolean'),
   6             array('password', 'authenticate'),
   7         );
   8     }

Relations ActiveRecord

http://www.yiiframework.com/doc/guide/1.1/en/database.arr#declaring-relationship

Override the relations() method of CActiveRecord.

Types relationship:

   1 public function relations()
   2     {
   3         return array(
   4             'posts'=>array(self::HAS_MANY, 'Post', 'author_id'),
   5             'profile'=>array(self::HAS_ONE, 'Profile', 'owner_id'),
   6         );
   7     }

ActiveResource extension

Adapted from http://www.yiiframework.com/extension/activeresource

Steps:

'activeresource'=>array(
    'class'=>'EActiveResourceConnection',
    'site'=>'http://api.aRESTservice.com',
    'contentType'=>'application/json',
    'acceptType'=>'application/json',
    'queryCacheId'=>'SomeCacheComponent'
)

ActiveResource implementation:

   1 class Person extends EActiveResource
   2      {
   3      /* The id that uniquely identifies a person. This attribute is not defined
   4       * as a property      
   5       * because we don't want to send it back to the service like a name, surname or    
   6       * gender etc.
   7       */
   8      public $id;
   9  
  10      public static function model($className=__CLASS__)
  11      {
  12          return parent::model($className);
  13      }
  14  
  15      /* Define the resource property of this class */
  16      public function rest()
  17      {
  18          return CMap::mergeArray(
  19          parent::rest(),
  20          array(
  21         'resource'=>'people',
  22              )
  23     );
  24      }
  25  
  26      /* Let's define some properties and their datatypes*/
  27      public function properties()
  28      {
  29          return array(
  30              'name'=>array('type'=>'string'),
  31              'surname'=>array('type'=>'string'),
  32              'gender'=>array('type'=>'string'),
  33              'age'=>array('type'=>'integer'),
  34              'married'=>array('type'=>'boolean'),
  35              'salary'=>array('type'=>'double'),
  36          );
  37      }
  38  
  39      /* Define rules as usual */
  40      public function rules()
  41      {
  42          return array(
  43              array('name,surname,gender,age,married,salary','safe'),
  44              array('age','numerical','integerOnly'=>true),
  45              array('married','boolean'),
  46              array('salary','numerical')
  47          );
  48      }
  49  
  50      /* Add some custom labels for forms etc. */
  51      public function attributeLabels()
  52      {
  53          return array(
  54              'name'=>'First name',
  55              'surname'=>'Last name',
  56              'salary'=>'Your monthly salary',
  57          );
  58      }
  59  }

Sample usage:

/* GET to http://api.example.com/person/1 and populates a single Person model*/
    $person=Person::model()->findById(1);
 
    /* GET to http://api.example.com/person and populating Person models */
    $persons=Person::model()->findAll();
 
    /* create a resource*/
    $person=new Person;
    $person->name='A name';
    $person->age=21;
    $person->save(); POST request. Returns false if the model doesn't validate
 
    /* Updating a resource (sending a PUT request)
    $person=Person::model()->findById(1);
    $person->name='Another name';
    $person->save(); //PUT request. Returns false if the model doesn't validate
 
    //or short version
    Person::model()->updateById(1,array('name'=>'Another name'));
 
    /* DELETE a resource */
    $person=Person::model()->findById(1);
    $person->destroy(); //DELETE to http://api.example.com/person/1
 
    //or short version
    Person::model()->deleteById(1);
 
    //setting attributes
    $person->attributes=$_POST['Person'];
    if($person->save())
        echo 'yipiie'; //model validated and was saved/updated

Other methods for EActiveResource:

Trace

Yii:trace(string $msg, string $category='application')

Sample controller actions Blog demo

Path: http://localhostyii/demos/blog/site/

   1   public function actionRxvalue()
   2         {
   3           $m = new Tag();
   4           $m->name=$_GET['value'];
   5           $m->save();
   6           header('Content-type: application/json');
   7           echo( json_encode( array('value'=>$_GET['value']) )  );
   8         }
   9 
  10         public function actionDelvalue()
  11         {
  12           $m = Tag::model()->find('id=:id' , array(':id' => $_GET['value'] )  );
  13           $m->delete();
  14           header('Content-type: application/json');
  15           echo( json_encode( array('value'=>$_GET['value']) )  );
  16         }

Javascript AJAX calls

   1 $(document).ready(function(){
   2   $('#addTag').click(function(){ 
   3        console.log('Clicked');  
   4        $.ajax({
   5          url: '/demos/blog/site/rxvalue',
   6          data: {'value':$('#tag').val() },
   7          success: rxSuccess   
   8        });
   9     } );
  10   $('.delTag').click( delTag  );
  11 } );
  12 
  13 function delTag(){
  14   $.ajax({
  15          url: '/demos/blog/site/delvalue',
  16          data: {'value':  $(this).attr('id')   },
  17          success: delSuccess   
  18        });
  19   return false;
  20 }
  21 
  22 function rxSuccess(data){
  23   $('#listx').append('<li>' + data.value + '</li>');    
  24   console.log(data);
  25 }
  26 
  27 function delSuccess(data){
  28   console.log('Delete !' + data.value  ); 
  29   $('li#' +  data.value  ).remove();
  30 }

CGridView + CArrayDataProvider with pagination, sort and filtering

views/site/test.php:

<h1>Test 1234</h1>

<?php
 $this->widget('zii.widgets.grid.CGridView', 
     array( 'dataProvider'=>$dp, 
            'enableSorting'=>true,
            'columns'=>array('id','name' ) ,
            'filter'=>Tag::model() ,   
 )) ;
?>

models/Tag.php:

        public function search(){
           if( isset( $_GET[get_class($this)] )  ){
               Yii::app()->session['filterId']= trim($_GET[get_class($this)]['id']);
               Yii::app()->session['filterName']= trim($_GET[get_class($this)]['name']);
           }

           $posts = $this->findAll();
           // filtering
           $filtered = array();
           $filterId= Yii::app()->session['filterId'];
           $filterName= Yii::app()->session['filterName'];

           foreach($posts as $p){

             if(  strlen($filterId)   >0 ){
                 if(strpos($p->id ,  $filterId  ) !==false) $filtered[]=$p;
             }

             if(  strlen(  $filterName )  >0 ){
                 if(strpos($p->name,  $filterName  ) !==false) $filtered[]=$p;
             }

           }

           if( strlen(Yii::app()->session['filterId'])==0 && strlen(Yii::app()->session['filterName'])==0 ) {
              $filtered=$posts;
           }

           $dataProvider=new CArrayDataProvider(  $filtered, 
                       array(  'pagination'=>array( 'pageSize'=>4, ) , 
                               'id'=>'id', 
                               'sort'=>array('attributes'=>array('id','name') , 'multiSort'=>false ) 
                       ) );

           return $dataProvider; 
        }

controllers/SiteController.php:

        public function actionTest()
        {
                syslog(LOG_INFO,'actionTest called'); 
                $dp = Tag::model()->search();
                $this->render('test', array(  'dp'=>$dp   ) );
        }

$this in a view

In a view, $this refers to the controller that called render to that view.

Get absolute URL inside a view

   1 echo( $this->createAbsoluteUrl($this->getRoute() ) );

Register Javascript file

   1 Yii::app()->getClientScript()->registerScriptFile( Yii::app()->baseUrl . '/js/test.js' );

PHP/Yii (last edited 2014-07-22 21:51:15 by 89)