Skip to content

Instantly share code, notes, and snippets.

@nojimage
Created December 22, 2010 09:14
Show Gist options
  • Save nojimage/751299 to your computer and use it in GitHub Desktop.
Save nojimage/751299 to your computer and use it in GitHub Desktop.
CakePHP VirttualFieldCollection Behavior
<?php
/**
* virtual field collection Behavior for CakePHP 1.3
*
* Copyright 2010, nojimage (http://php-tips.com/)
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @author nojimage
* @package elastic_kit
* @subpackage elastic_kit.models.behaviors
* @copyright 2010 nojimage (http://php-tips.com/)
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*
* =====
* Original Code is:
*
* hiromi2424
* http://d.hatena.ne.jp/hiromi2424/20100609/1276076490
*
* Thank you!
*/
class VirtualFieldCollectionBehavior extends ModelBehavior {
var $__cache = array();
/**
*
* @param AppModel $model
* @param array $query
*/
function beforeFind(&$model, $query = array()) {
if (isset($query['virtualFields'])) {
$query['virtualFields'] = Set::normalize($query['virtualFields']);
foreach ($query['virtualFields'] as $key => $sql) {
if (empty($sql)) {
if (isset($model->virtualFieldCollection[$key])) {
$query['virtualFields'][$key] = $model->virtualFieldCollection[$key];
} else {
unset($query['virtualFields'][$key]);
}
}
}
}
if (!empty($query['virtualFields'])) {
$this->__cache[$this->__cacheName($model)] = $model->virtualFields;
$model->virtualFields = am($model->virtualFields, $query['virtualFields']);
}
if ($model->name !== $model->alias || (get_class($model) !== 'AppModel' && get_class($model) !== $model->alias)) {
// if model->name not equal model->alias
$aliasedModel = & ClassRegistry::init($model->alias);
$this->__cache[$this->__cacheName($aliasedModel)] = $aliasedModel->virtualFields;
$aliasedModel->virtualFields = am($aliasedModel->virtualFields, $model->virtualFields);
}
return $query;
}
/**
*
* @param AppModel $model
* @param mixed $results
* @param boolean $primary
*/
function afterFind(&$model, $results, $primary) {
$cacheName = $this->__cacheName($model);
if (isset($this->__cache[$cacheName])) {
$model->virtualFields = $this->__cache[$cacheName];
unset($this->__cache[$cacheName]);
}
if ($model->name !== $model->alias || get_class($model) !== $model->alias) {
$aliasedModel = & ClassRegistry::init($model->alias);
$aliasedCacheName = $this->__cacheName($aliasedModel);
if (isset($this->__cache[$aliasedCacheName])) {
$aliasedModel->virtualFields = $this->__cache[$aliasedCacheName];
unset($this->__cache[$aliasedCacheName]);
}
}
return true;
}
/**
*
* @param AppModel $model
* @return string
* @access private
*/
function __cacheName(&$model) {
return get_class($model) . ':' . $model->name;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment