示例#1
0
 /**
  * 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;
 }
示例#2
0
文件: List.php 项目: rajarshc/Rooja
 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);
 }
示例#4
0
 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;
 }
示例#6
0
 /**
  * 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;
 }