YiiAbstractArrayModel

0

Work with PHP files in Active Record way

@see github.com/codemix/YiiAbstractArrayModel

samsonradu

YiiAbstractArrayModel

Work with PHP files in an Yii Active Record way.

Whenever there is a bunch of PHP array files that need to be maintained through a web interface, one could do CRUD operations by extending the AbstractArrayModel class.

##Usage

Supposing we need to manage the following config files:

/path/to/config/

config1.php
config2.php
config3.php
old-config1.php
...

config1.php

 return array(
     'name' => 'site',
     'theme' => 'bootstrap',
     'components' => array(
         'bill' => array(
             'siteId' => 11,
             'packages' => array(
                 8001,   
                 10442
             ),  
         ),
     ),
     'params' => array(
         'mainCssUrl' => '/css/app/site.css',
         'prefix' => 'M',
     )   
 );  

We define our model by extending the AbstractArrayModel class and overriding the following methods:

class Config extends AbstractArrayModel
{

    /**
     * Base path definition
     * @return string base path
     */
    public function getBasePath(){
        return '/path/to/config/';
    }

    /**
     * File pattern matching
     * @return string pattern
     */
    public function getPattern(){
        return '*.php';
    }

    /**
     * @return array validation rules for model attributes.
     */
    public function rules()
    {
        // NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        return array(
            // The following rule is used by search().
            // Please remove those attributes that should not be searched.
            array('name, theme, components, params', 'safe'),
        );
    }   

    /**
     * Returns the list of all attribute names of the model.
     * @return array list of attribute names.
     */
    public function attributeNames()
    {
        return array('name', 'theme', 'components', 'params');
    }
}

Following methods are now available:

$model = Config::model()->findByPk('config1');
$model->theme = 'foundation'; 
$model->components['bill']['siteId'] = 99; 
$model->save(); //save the file

$model->delete(); //remove the file

$models = Config::model()->findAll(); // returns all files as models

//We can also pattern match the name. Internally uses the PHP [glob] (http://php.net/manual/en/function.glob.php) method 
$model = Config::model()->findA('old-*');
$models = Config::model()->findAll('config*');