/** * Merging one group of classed (for one alias) * * @param array $classes * @return boolean */ public function merge($classes, $isAbstract = false) { $this->_latestMergedFiles = array(); if (!is_array($classes) || empty($classes)) { return false; } if ($isAbstract) { $filename = $classes[count($classes) - 1]['parent']; } else { $filename = $classes[count($classes) - 1]['child']; } $filepath = $this->_rewriteDir . $filename . '.php'; $fileContent = ''; $fileContent .= '<?php' . "\r\n"; $fileContent .= '/* DO NOT MODIFY THIS FILE! THIS IS TEMPORARY FILE AND WILL BE RE-GENERATED AS SOON AS CACHE CLEARED. */' . "\r\n"; $rewriteClass = new Aitoc_Aitsys_Model_Rewriter_Class(); $bOmitRewriteChain = false; $iEncodedCount = 0; //set count of encoded classes foreach ($classes as $parent => $class) { if (isset($class['encoded']) && $class['encoded']) { $iEncodedCount++; } } foreach ($classes as $parent => $class) { if ($bOmitRewriteChain) { continue; } $bEncodedCurrent = false; /** * Different strategy for normal and abstract rewrites */ if (is_array($class)) { // for abstract rewrites $contentFrom = $class['contents']; $parent = $class['parent']; $child = $class['child']; $bEncodedCurrent = isset($class['encoded']) && $class['encoded'] ? true : false; if ($bEncodedCurrent) { $iEncodedCount--; } } else { // parent is parent $contentFrom = $parent; $child = $class; } /** * The last $child is always magento base class */ $contents = $class['content']; $this->_latestMergedFiles[$contentFrom] = $rewriteClass->getClassPath($contentFrom); if ($child) { $contents = preg_replace('/' . $contentFrom . '(\\s+)(extends)?(\\s+)?([^\\s{]+)?/', "{$parent} \$2 {$child}", $contents, 1); } else { $contents = preg_replace('/' . $contentFrom . '(\\s+)(extends)?(\\s+)?([^\\s{]+)?/', "{$parent} \$2 \$4", $contents, 1); } if ($bEncodedCurrent) { if ($contentFrom != $parent) { $bOmitRewriteChain = true; continue; } else { $contents = ($iEncodedCount > 0 ? '//' : '') . 'require_once("' . $rewriteClass->getClassPath($parent) . '");'; } } $fileContent .= $contents; $fileContent .= "\r\n\r\n"; } if ($bOmitRewriteChain) { return false; } $this->tool()->filesystem()->putFile($filepath, $fileContent); return $filename; }
protected function _prepareConflictGroups() { $allExtensions = array(); $currentExtension = Mage::app()->getRequest()->getParam('extension'); $rewriterConflictModel = new Aitoc_Aitsys_Model_Rewriter_Conflict(); list($conflicts, ) = $rewriterConflictModel->getConflictList(); // will combine rewrites by alias groups $groups = array(); if (!empty($conflicts)) { $rewriterClassModel = new Aitoc_Aitsys_Model_Rewriter_Class(); $rewriterinheritanceModel = new Aitoc_Aitsys_Model_Rewriter_Inheritance(); foreach ($conflicts as $groupType => $modules) { $groupType = substr($groupType, 0, -1); foreach ($modules as $moduleName => $moduleRewrites) { foreach ($moduleRewrites['rewrite'] as $moduleClass => $rewriteClasses) { // building inheritance tree $alias = $moduleName . '/' . $moduleClass; $baseClass = $rewriterClassModel->getBaseClass($groupType, $alias); $inheritedClasses = $rewriterinheritanceModel->build($rewriteClasses, $baseClass, false); $groups[$baseClass] = array_keys($inheritedClasses); ksort($groups[$baseClass]); $groups[$baseClass] = array_values($groups[$baseClass]); } } } $order = $this->_aithelper('Rewriter')->getOrderConfig(); foreach ($groups as $baseClass => $group) { $groups[$baseClass] = array_flip($group); $isCurrentFound = !(bool) $currentExtension; $savedRewritesValid = $this->_aithelper('Rewriter')->validateSavedClassConfig(isset($order[$baseClass]) ? $order[$baseClass] : array(), array_keys($groups[$baseClass])); foreach ($groups[$baseClass] as $class => $i) { if (isset($order[$baseClass][$class]) && $savedRewritesValid) { $groups[$baseClass][$class] = $order[$baseClass][$class]; } // adding class to the list of all extensions $key = substr($class, 0, strpos($class, '_', 1 + strpos($class, '_'))); // ^^^^^^^^^^^^^^^^^^^^^ --- this is offset, so start searching second "_" $allExtensions[] = $key; if ($key == $currentExtension) { $isCurrentFound = true; } } $groups[$baseClass] = array_flip($groups[$baseClass]); ksort($groups[$baseClass]); if (!$isCurrentFound || in_array($baseClass, $this->_aithelper('Rewriter')->getExcludeClassesConfig())) { // will display conflicts only for groups where current selected extension presents // exclude conflicts for excluded base Magento classes unset($groups[$baseClass]); } } } $aModuleList = $this->tool()->platform()->getModules(); $allExtensions = array_unique($allExtensions); foreach ($allExtensions as $key) { $moduleName = $key; foreach ($aModuleList as $moduleItem) { if ($key == $moduleItem->getKey()) { $moduleName = (string) $moduleItem->getLabel(); } } $this->_extensions[$this->getExtensionUrl($key)] = $moduleName; } $this->_groups = $groups; }
/** * @param $class * @param $array * @return bool */ protected function _findInheriatanceClass($class, &$array) { $classModel = new Aitoc_Aitsys_Model_Rewriter_Class(); $content = $classModel->getContents($class); if (empty($content)) { return false; } if (in_array($class, $array)) { //delete static AITOC rewrite. Not use preg_replace because 100k limit if ((strpos($class, 'Aitoc') === 0 || strpos($class, 'AdjustWare') === 0) && strpos($content, 'AITOC static rewrite inserts start') !== false) { $maches = array(); preg_match('/\\/\\* default extends start \\*\\/(\\n)?(\\s+)?class(\\s+)?' . $class . '_Aittmp(\\s+)extends(\\s+)?([^\\s{]+)?(\\s+)?{}(\\n)?(\\s+)?\\/\\* default extends end \\*\\//', $content, $maches); //$content = preg_replace('/\/\* AITOC static rewrite inserts start \*\/(.|\n)*\/\* AITOC static rewrite inserts end \*\/(\n)?/', '', $content, 1); //$content = preg_replace('/(class)(\s+)?'.$class.'(\s+)(extends)?(\s+)?'.$class.'_Aittmp/', 'class '.$class.' extends '.$maches[6], $content, 1); $content = substr($content, strpos($content, '/* AITOC static rewrite inserts end */')); $content = str_replace('/* AITOC static rewrite inserts end */', '', $content); $content = str_replace('class ' . $class . ' extends ' . $class . '_Aittmp', 'class ' . $class . ' extends ' . $maches[6], $content); } $this->_contentArray[$class] = $content; } $this->_checkClassByContent($class, $array, $content); }
public function prepare() { $merge = new Aitoc_Aitsys_Model_Rewriter_Merge(); $rewriterConfig = new Aitoc_Aitsys_Model_Rewriter_Config(); // first clearing current class rewrites Aitoc_Aitsys_Model_Rewriter_Autoload::instance()->clearConfig(); $merge->clear(); $conflict = new Aitoc_Aitsys_Model_Rewriter_Conflict(); list($conflicts, $rewritesAbstract) = $conflict->getConflictList(); /** * FOR NORMAL REWRITES */ // will combine rewrites by alias groups if (!empty($conflicts)) { foreach ($conflicts as $groupType => $modules) { $groupType = substr($groupType, 0, -1); foreach ($modules as $moduleName => $moduleRewrites) { foreach ($moduleRewrites['rewrite'] as $moduleClass => $rewriteClasses) { /* * $rewriteClasses is an array of class names for one rewrite alias * for example: * Array * ( * [0] => AdjustWare_Deliverydate_Model_Rewrite_AdminhtmlSalesOrderCreate * [4] => Aitoc_Aitcheckoutfields_Model_Rewrite_AdminSalesOrderCreate * [10] => Aitoc_Aitorderedit_Model_Rewrite_AdminSalesOrderCreate * ) */ // building inheritance tree $alias = $moduleName . '/' . $moduleClass; $classModel = new Aitoc_Aitsys_Model_Rewriter_Class(); $inheritanceModel = new Aitoc_Aitsys_Model_Rewriter_Inheritance(); $baseClass = $classModel->getBaseClass($groupType, $alias); $inheritedClasses = $inheritanceModel->build($rewriteClasses, $baseClass); // don't create rewrites for excluded Magento base classes if (in_array($baseClass, $this->tool()->db()->getConfigValue('aitsys_rewriter_exclude_classes', array()))) { continue; } $mergedFilename = $merge->merge($inheritedClasses); if ($mergedFilename) { $rewriterConfig->add($mergedFilename, $rewriteClasses); $rewriterConfig->add(serialize($merge->getLatestMergedFiles()), 'file:' . $mergedFilename); } } } } } /** * FOR ABSTRACT REWRITES (AITOC REALIZATION) */ if (!empty($rewritesAbstract)) { foreach ($rewritesAbstract as $groupType => $modules) { $groupType = substr($groupType, 0, -1); foreach ($modules as $moduleName => $moduleRewrites) { foreach ($moduleRewrites['rewriteabstract'] as $moduleClass => $rewriteClass) { // building inheritance tree $alias = $moduleName . '/' . $moduleClass; $classModel = new Aitoc_Aitsys_Model_Rewriter_Class(); $inheritanceModel = new Aitoc_Aitsys_Model_Rewriter_Inheritance(); $baseClass = $classModel->getBaseClass($groupType, $alias); $inheritedClasses = $inheritanceModel->buildAbstract($rewriteClass, $baseClass); $mergedFilename = $merge->merge($inheritedClasses); if ($mergedFilename) { $rewriterConfig->add($mergedFilename, array($rewriteClass, $baseClass)); } } } } } $rewriterConfig->commit(); Aitoc_Aitsys_Model_Rewriter_Autoload::instance()->setupConfig(); }
/** * Found all Inherited Classes and run method for analysis * * @param $object * @param $method * @param array $params * @param bool $useOrdering * @return bool */ public function analysisInheritedClasses($object, $method, &$params = array(), $useOrdering = true) { $rewriterConflictModel = new Aitoc_Aitsys_Model_Rewriter_Conflict(); $conflicts = $rewriterConflictModel->getConflictList(); // will combine rewrites by alias groups if (!empty($conflicts)) { $rewriterClassModel = new Aitoc_Aitsys_Model_Rewriter_Class(); $rewriterInheritanceModel = new Aitoc_Aitsys_Model_Rewriter_Inheritance(); $result = false; foreach ($conflicts as $groupType => $modules) { $groupType = substr($groupType, 0, -1); foreach ($modules as $moduleName => $moduleRewrites) { foreach ($moduleRewrites['rewrite'] as $moduleClass => $rewriteClasses) { // building inheritance tree $alias = $moduleName . '/' . $moduleClass; $baseClass = $rewriterClassModel->getBaseClass($groupType, $alias); $inheritedClasses = $rewriterInheritanceModel->build($rewriteClasses, $baseClass, $useOrdering); if ($inheritedClasses == false) { continue; } $paramsMethod = array('rewriteClasses' => $rewriteClasses, 'alias' => $alias, 'baseClass' => $baseClass, 'inheritedClasses' => $inheritedClasses, 'params' => &$params); $result = $object->{$method}($paramsMethod) ? true : $result; } } } return $result; } return false; }
/** * Creates inheritance array * * @param array $rewriteClasses * @param array $baseClass */ public function build($rewriteClasses, $baseClass, $useOrdering = true) { $inheritedClasses = array(); $orderedInheritance = array(); krsort($rewriteClasses); $rewriteClasses = array_values($rewriteClasses); $i = 0; while ($i < count($rewriteClasses)) { $inheritedClasses[$rewriteClasses[$i]] = isset($rewriteClasses[++$i]) ? $rewriteClasses[$i] : $baseClass; } // reversing to make it read classed in order of existence $inheritedClasses = array_reverse($inheritedClasses, true); // sorting in desired order $order = $this->loadOrderConfig(); if (!$order) { $order = array(); } if (!isset($order[$baseClass]) || !$this->_aithelper('Rewriter')->validateSavedClassConfig($order[$baseClass], $rewriteClasses)) { $config = Aitoc_Aitsys_Model_Rewriter_MageConfig::get()->getConfig(); $tmp = array(); foreach ($rewriteClasses as $class) { list($vendor, $name) = explode('_', $class, 3); $priority = (string) $config->getNode('modules/' . $vendor . '_' . $name . '/priority'); $priority = $priority ? $priority : 1; while (isset($tmp[$priority])) { ++$priority; } $tmp[$priority] = $class; } krsort($tmp); $i = 0; $order[$baseClass] = array(); foreach ($tmp as $class) { $order[$baseClass][$class] = ++$i; } } /* Check encoded files */ $encoded = array(); if (isset($order[$baseClass])) { $classes = array_flip($order[$baseClass]); ksort($classes); $classes = array_values($classes); $classModel = new Aitoc_Aitsys_Model_Rewriter_Class(); foreach ($classes as $k => $class) { if ($classModel->isEncodedClassFile($class)) { $encoded[] = $class; unset($classes[$k]); } } $classes = array_merge($classes, $encoded); $i = 0; $order[$baseClass] = array(); foreach ($classes as $class) { $order[$baseClass][$class] = ++$i; } } if ($useOrdering && isset($order[$baseClass])) { $orderedClasses = array_flip($order[$baseClass]); ksort($orderedClasses); $orderedClasses = array_values($orderedClasses); $i = 0; $replaceClass = array(); while ($i < count($orderedClasses)) { $contentsFromClass = $orderedClasses[$i]; if (0 == $i && $orderedClasses[$i] != $rewriteClasses[$i]) { $parentClass = $rewriteClasses[$i]; $replaceClass[$rewriteClasses[$i]] = $orderedClasses[$i]; } else { $parentClass = $orderedClasses[$i]; if (isset($replaceClass[$parentClass])) { $parentClass = $replaceClass[$parentClass]; } } if (isset($orderedClasses[$i + 1])) { $childClass = $orderedClasses[$i + 1]; if (isset($replaceClass[$childClass])) { $childClass = $replaceClass[$childClass]; } } else { $childClass = $baseClass; } $orderedInheritance[] = array('contents' => $contentsFromClass, 'parent' => $parentClass, 'child' => $childClass, 'encoded' => in_array($contentsFromClass, $encoded)); $i++; } if ($orderedInheritance) { krsort($orderedInheritance); $inheritedClasses = $orderedInheritance; } } return $inheritedClasses; }
/** * Get Magento real class names * * @param string $key, e.g. catalog_resource * @param string $key1, e.g. product_option * @param string $groupType, e.g. models, blocks, helpers * @return string class name */ protected function _getBaseClass($key, $key1, $groupType) { $alias = $key . '/' . $key1; $groupType = substr($groupType, 0, -1); $classModel = new Aitoc_Aitsys_Model_Rewriter_Class(); $baseClass = $classModel->getBaseClass($groupType, $alias); return $baseClass; }