/** * Returns repository class for model class of current node * * @param \Includes\Decorator\DataStructure\Graph\Classes $node Current node * * @return string */ protected function getRepositoryClass(\Includes\Decorator\DataStructure\Graph\Classes $node) { $repositoryClass = null; if (!($node->isLowLevelNode() || $node->isTopLevelNode() || !$node->isDecorator())) { $children = $node->getChildren(); $repositoryClass = isset($children[0]) ? $this->getRepositoryClass($children[0]) : $this->getDefaultRepositoryClass(''); } else { $repositoryClass = \Includes\Utils\Converter::getPureClassName($node->getClass()); $repositoryClass = \Includes\Utils\Converter::prepareClassName(str_replace('\\Model\\', '\\Model\\Repo\\', $repositoryClass), false); if (!\XLite\Core\Operator::isClassExists($repositoryClass)) { $repositoryClass = $this->getDefaultRepositoryClass($repositoryClass); } } return $repositoryClass; }
/** * Get decorators and regular children; order the first group * * @param \Includes\Decorator\DataStructure\Graph\Classes $node Current node * * @return array */ protected static function divideChildrenIntoGroups(\Includes\Decorator\DataStructure\Graph\Classes $node) { // First element - list of decorators, second one - regular children. // Both of them may be empty $result = array(array(), array()); foreach ($node->getChildren() as $child) { // One in the pair: (<decorators>, ...) or (..., <regular>) $result[$child->isDecorator() ? 0 : 1][] = $child; } // Get module name by class name. // Calculate module priority in modules graph. // Use that priority to sort decorators. // So, classes of dependent modules will be placed above // their dependencies in decorator chain usort($result[0], array('static', 'compareClassWeight')); return $result; }
/** * Get decorators and regular children; order the first group * * @param \Includes\Decorator\DataStructure\Graph\Classes $node Current node * * @return array */ protected static function divideChildrenIntoGroups(\Includes\Decorator\DataStructure\Graph\Classes $node) { // First element - list of decorators, second one - regular children. // Both of them may be empty $result = array(array(), array()); foreach ($node->getChildren() as $child) { // One in the pair: (<decorators>, ...) or (..., <regular>) $result[$child->isDecorator() ? 0 : 1][] = $child; } list($nodeids, $edges) = static::getTopology($result[0]); $ids = array_flip($nodeids); $nodeids = static::sortTopological($nodeids, $edges); $tmp = $result[0]; $result[0] = array(); foreach ($nodeids as $className) { $result[0][] = $tmp[$ids[$className]]; unset($tmp[$ids[$className]]); } if ($tmp) { $result[0] = array_merge($result[0], $tmp); } return $result; }