Converts data of multiple checkboxes to INT representation by setting bits of integer value (like at *nix chmod command).
Usage ¶
ActiveRecordModel:
public function behaviors()
{
return array(
'StatesBinaryField'=>array(
'class'=>'path.to.StatesBinaryFieldBehavior',
'attribute'=>'states', // Model attribute name
'data'=>array( // Source data of available states
'state1'=>'First model state',
'state2'=>'Second model state',
'state3'=>'Third model state',
),
)
);
}
View file:
$model=ARModel::model()->findByPK(1); // in controller of course
echo CHtml::beginForm();
echo CHtml::activeCheckBoxList($model, 'states', $model->statesData);
echo CHtml::submitButton();
echo CHtml::endForm();
Checking state (in any model attribute format [int or arr]):
if ($model->checkState(array('state1'))) echo 'Model state 1 is set';
if ($model->checkState(array('state1','state3'))) echo 'Model state 1 and 3 is set';
Force attribute convertion:
$model->convertAttribute() // or
$model->convertAttribute('auto') // converts to opposite format
$model->convertAttribute('int') // coverts to database int representation
$model->convertAttribute('arr') // converts to output array representation
Selecting:
Model::model()->statesIncluded(array('state1','state3'))->findAll();
/*
Will select records:
('state1','state2','state3')
('state1','state3')
Not:
('state1','state2')
*/
Model::model()->statesExact(array('state1','state3'))->findAll();
/*
Will select records:
('state1','state3')
Not:
('state1','state2','state3')
('state1')
*/
Model::model()->statesAtLeast(array('state1','state3'))->findAll();
/*
Will select records:
('state1','state2','state3')
('state1')
('state3')
Not:
('state2')
*/
Using out of ARModel for forming sql WHERE statement:
$states=array('state1','state3');
$data=array(
'state1'=>'First model state',
'state2'=>'Second model state',
'state3'=>'Third model state',
);
$bitmask=StatesBinaryFieldBehavior::createBitMask($states,$data); // Returns integer: 5
$dbColumn='table.column'; // Database table column alias
$where_Included ="$dbColumn & $bitmask = $bitmask";
$where_Exact ="$dbColumn = $bitmask";
$where_AtLeast ="$dbColumn & $bitmask != 0";
Other usage moments ¶
Massive attributes assignment available.
Model saving at controller makes as ususal.
No need for attribute validation, just set it as save-attribute.
Normaly attribute contains an array of selected(setted) states, like array('state1','state3') and converts it to int representation only before saving.
Order of state keys at requested $states doesn't matter. Example: Model::model()->statesAtLeast(array('state1','state3')) equal to Model::model()->statesAtLeast(array('state3','state1'))
Only one field per model available (yet).
You a free to rename keys and labels of source $data without affecting to database records, BUT NOT THEIR ORDER.
If you have any questions, please ask in the forum instead.
Signup or Login in order to comment.