MoinMoin Logo
  • Comments
  • Immutable Page
  • Menu
    • Navigation
    • RecentChanges
    • FindPage
    • Local Site Map
    • Help
    • HelpContents
    • HelpOnMoinWikiSyntax
    • Display
    • Attachments
    • Info
    • Raw Text
    • Print View
    • Edit
    • Load
    • Save
  • Login

Navigation

  • Start
  • Sitemap
Revision 12 as of 2014-07-16 23:16:33
  • PHP
  • Yii

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

  • cd ~/Downloads
  • wget https://github.com/yiisoft/yii/releases/download/1.1.15/yii-1.1.15.022a51.tar.gz

  • cp yii-1.1.15.022a51.tar.gz /vars/www/htdocs
  • cd /vars/www/htdocs
  • tar xvzf yii-1.1.15.022a51.tar.gz
  • cd yii-1.1.15.022a51
  • chown apache * -R
  • chmod 755 /etc/rc.d/rc.httpd
  • vim /etc/httpd/httpd.conf

<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
  • vim /etc/httpd/vhosts.conf

<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>
  • vim /etc/hosts

127.0.0.1 localhostyii 

  • vim /etc/httpd/php.ini

date.timezone="Europe/Lisbon"
  • vim /var/www/htdocs/yii-1.1.15.022a51/demos/blog/.htaccess

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
  • vim blog/protected/config/main.php

                'urlManager'=>array(
                        'showScriptName'=>false,
  • /etc/rc.d/rc.httpd start
  • Open URL http://localhostyii/demos/blog/index.php

  • http://localhostyii/demos/blog/post/index

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:

  • self::BELONGS_TO
  • self::HAS_MANY
  • self::HAS_ONE
  • self::MANY_MANY

   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:

  • Get source code from https://github.com/Haensel/ActiveResource/

  • Add the extension to Yii by placing it in your application's extension folder (for example '/protected/extensions')
  • Edit your applications main.php config file and add 'application.extensions.EActiveResource.*' to your import definitions
  • Add the configuration for your resources to the main config

'activeresource'=>array(
    'class'=>'EActiveResourceConnection',
    'site'=>'http://api.aRESTservice.com',
    'contentType'=>'application/json',
    'acceptType'=>'application/json',
    'queryCacheId'=>'SomeCacheComponent'
)
  • Create a class extending EActiveResource like this (don't forget the model() method!):

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:

  • public function init()
  • public function setAttribute($name,$value)
  • public function getAttributesToSend($attributes=null)
  • protected function beforeSave()
  • public function sendRequest($uri,$method,$params,$data)

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 }
  • MoinMoin Powered
  • Python Powered
  • GPL licensed
  • Valid HTML 4.01