I use Yii MVC
.
I have to add new columns in a data table very often.
I want to use Gii
and regenerate the model
and keep the chnages that i made; changes like constants, variables, rules, relations, etc ...
So, let's take for example the url
class model:
<?php
/**
* This is the model class for table "url".
*
* The followings are the` available columns in table 'url':
* @property string $id
* @property integer $instance_id
* @property integer $website_id
* @property string $link
* @property string $title
* @property integer $created
* @property integer $updated
* @property integer $status
*/
class Url extends CActiveRecord {
const ACTIVE = 1;
/**
* Returns the static model of the specified AR class.
* @param string $className active record class name.
* @return Url the static model class
*/
public static function model($className = __CLASS__) {
return parent::model($className);
}
/**
* @return string the associated database table name
*/
public function tableName() {
return 'url';
}
/**
* @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(
array('instance_id, website_id, link, title, created, updated, status', 'required'),
array('instance_id, website_id, created, updated, status', 'numerical', 'integerOnly' => true),
array('link, title', 'length', 'max' => 255),
array('link', 'unique'),
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array('id, instance_id, website_id, link, title, created, updated, status', 'safe', 'on' => 'search'),
);
}
/**
* @return array relational rules.
*/
public function relations() {
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
);
}
/**
* @return array customized attribute labels (name=>label)
*/
public function attributeLabels() {
return array(
'id' => 'ID',
'instance_id' => 'Instance',
'website_id' => 'Website',
'link' => 'Link',
'title' => 'Title',
'created' => 'Created',
'updated' => 'Updated',
'status' => 'Status',
);
}
/**
* Retrieves a list of models based on the current search/filter conditions.
* @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
*/
public function search() {
// Warning: Please modify the following code to remove attributes that
// should not be searched.
$criteria = new CDbCriteria;
$criteria->compare('id', $this->id, true);
$criteria->compare('instance_id', $this->instance_id);
$criteria->compare('website_id', $this->website_id);
$criteria->compare('link', $this->link, true);
$criteria->compare('title', $this->title, true);
$criteria->compare('created', $this->created);
$criteria->compare('updated', $this->updated);
$criteria->compare('status', $this->status);
return new CActiveDataProvider($this, array(
'criteria' => $criteria,
));
}
}
when I will regenerate the model
, the const
and the rule
with unique
will be lost
so, I created a new model class
, UrlM
, that extends the url
model class, and this class keps all my enhancements:
<?php
class UrlM extends Url {
const ACTIVE = 1;
public function rules() {
return array(
array('link', 'unique'),
);
}
public function relations() {
return array(
);
}
}
how do i concat the rules from the url
model class with the rules
from the urlm
model class?
the same answer should aply for future enhancements, like relations
Each function of the parent class - like rules()
, relations()
etc., returns array. So you may use call to the parent::rules()
and then just join "array".
public function rules() {
$myParentRules=parent::rules();
$myConcatRules=$myParentRules + array(
array('link', 'unique'),
);
return $myConcatRules;
}