public function reloadClasses($force = false) { // only (re)load the autoloading cache once per request if (self::$freshCache) { return; } $configuration = sfProjectConfiguration::getActive(); if (!$configuration || !$configuration instanceof sfApplicationConfiguration) { return; } self::$freshCache = true; if (file_exists($configuration->getConfigCache()->getCacheName('config/autoload.yml'))) { self::$freshCache = false; if ($force) { unlink($configuration->getConfigCache()->getCacheName('config/autoload.yml')); } } $file = $configuration->getConfigCache()->checkConfig('config/autoload.yml'); $this->classes = (include $file); //If the user has specified provided one or more class paths foreach ($this->overriden as $class => $path) { $this->classes[$class] = $path; } //Remove non Peer classes from the array. foreach ($this->classes as $className => $path) { if (substr($className, -4, 4) != 'Peer' || substr($className, -4, 4) == 'Peer' && substr($className, 0, 4) == 'Base') { unset($this->classes[$className]); } } }
public function getForeignValue($value, $method = '__toString') { if (ncChangeLogConfigHandler::getForeignValues() && $this->isForeignKey()) { $peerClassName = constant($this->adapter->getClassName() . '::PEER'); $tableMap = call_user_func(array($peerClassName, 'getTableMap')); $column = $tableMap->getColumn($this->getFieldName()); $relatedTableName = $column->getRelatedTableName(); $relatedPeerClassName = ncClassFinder::getInstance()->findPeerClassName($relatedTableName); if (!is_null($relatedPeerClassName) && class_exists($relatedPeerClassName)) { $object = call_user_func(array($relatedPeerClassName, 'retrieveByPk'), $value); if (!is_null($object) && method_exists($object, $method)) { return $object->{$method}(); } } } return $value; }
/** * This methods inspects the columns of the object's table and if one of them if a foreign key, * it returns the change log of the referenced object IF it points to the specified object (parameter). * * @param mixed $object * @param date $from_date * @param transformToAdapters * * @return Array of ncChangeLogEntry */ public function getNNRelatedChangeLog($object, $from_date = null, $transformToAdapters = true) { $relatedChangeLog = array(); $relatedObjects = array(); if (!is_null($object)) { // Obtain object's information $object_class = get_class($object); $peer = constant($object_class . '::PEER'); // Get all tableMaps and make the queries to retrieve all object instances that reference the object!!! ncClassFinder::getInstance()->reloadClasses(); foreach (ncClassFinder::getInstance()->getPeerClasses() as $class => $path) { if ($class != get_class($object) && class_exists($class) && method_exists($class, 'getTableMap')) { $criteria = new Criteria(); $tableMap = call_user_func(array($class, 'getTableMap')); foreach ($tableMap->getColumns() as $c) { if ($c->isForeignKey()) { $method = 'get' . $c->getPhpName(); $relatedTableName = $c->getRelatedTableName(); $relatedColName = $c->getRelatedColumnName(); $relatedPeerClass = ncClassFinder::getInstance()->findPeerClassName($relatedTableName); $relatedClass = ncClassFinder::getInstance()->findClassName($relatedTableName, $relatedPeerClass); // Traverse all collumns. If any has as its `relatedClass` the class of $object, make a // Criteria object to fetch every related object. if ($relatedClass == get_class($object)) { $criterion = $criteria->getNewCriterion(constant($class . '::' . $c->getName()), $object->getPrimaryKey()); $criteria->addOr($criterion); } } } if ($criteria->size() > 0) { $relatedObjects[$class] = call_user_func(array($class, 'doSelect'), $criteria); } } } // Get every object's change log foreach ($relatedObjects as $tableName => $objects) { foreach ($objects as $o) { $criteria = new Criteria(); if (!is_null($from_date)) { $criteria->add(ncChangeLogEntryPeer::CREATED_AT, $from_date, Criteria::GREATER_THAN); } if (sfMixer::getCallable('Base' . get_class($o) . ':getChangeLog') && count($changes = $o->getChangeLog($criteria)) > 0) { if (method_exists($o, '__toString')) { $relatedChangeLog[$tableName][strval($o)] = $changes; } else { $relatedChangeLog[$tableName][$o->getPrimaryKey()] = $changes; } } } } } return $relatedChangeLog; }