Пример #1
0
 /**
  * 建立分类所属关系的树形结构
  * $aModelList 中的子元素必须拥有 lft 字段值
  * 
  * 改造参数$aModelList中的元素,将元素间的关系保存在元素的属性中,$aModelList的迭代顺序依然不变
  * 如果 $bReturnTopModels=true 则返回一个包含所有 第一层分类的数组
  */
 public static function buildTree(ModelList $aModelList, $bReturnTopModels = false)
 {
     $aParentStack = new Stack();
     if ($bReturnTopModels) {
         $arrTopCategories = array();
     }
     // 按照 lft 排序
     $aModelList->sortChildren(function (Model $aModelA, Model $aModelB) {
         if ($aModelA->lft > $aModelB->lft) {
             return 1;
         } else {
             if ($aModelA->lft == $aModelB->lft) {
                 return 0;
             } else {
                 return -1;
             }
         }
     });
     foreach ($aModelList as $nIdx => $aModel) {
         for (; ($nParentIdx = $aParentStack->get()) !== false; $aParentStack->out()) {
             if ($aModelList->data('lft', $nParentIdx) < $aModel->lft and $aModelList->data('rgt', $nParentIdx) > $aModel->rgt) {
                 break;
             }
         }
         if ($nParentIdx !== false) {
             self::addChildCategory($aModelList, $nParentIdx, $nIdx);
         } else {
             self::setDepth($aModel, 0);
             if ($bReturnTopModels) {
                 $arrTopCategories[] = $nIdx;
             }
         }
         $aParentStack->put($nIdx);
     }
     return $bReturnTopModels ? new ModelListIterator($aModelList, $arrTopCategories) : null;
 }
Пример #2
0
 private function generateAndWeaveAroundAdviceDefines(GenerateStat $aStat, Stack $aAdvices)
 {
     $aBodyEnd = $aStat->aAdvicesDispatchFunc->endToken();
     // 织入advice调用代码
     if ($aFirstAdvice = $aAdvices->get()) {
         $aStat->aTokenPool->insertBefore($aBodyEnd, new Token(T_STRING, "\r\n\t\t// around advices ----\r\n"));
         $sAdviceFuncName = $this->generateAdviceWeavedFunctionName($aStat, $aFirstAdvice);
         // 在 AdviceDispatchFunction 中设置一个 around 类型 advice 的调用代码
         $sCallType = $this->generateAdviceCalltype($aStat, $aFirstAdvice);
         $this->weaveAroundAdviceCall($aStat, "{$sCallType}{$sAdviceFuncName}({$aStat->sAdviceCallArgvsLit})");
         // 陆续植入各个 around 类型 advice
         while ($aAdvice = $aAdvices->out()) {
             // 生成advice定义代码
             $aAdviceDefine = $this->generateAdviceDefine($aAdvice, $aStat, $aAdvices->get() ?: null);
             // 织入advice定义代码
             $aStat->aTokenPool->insertAfter($aBodyEnd, $aAdviceDefine);
         }
     } else {
         $this->weaveAroundAdviceCall($aStat, $aStat->sOriginJointCode . "({$aStat->sOriginCallArgvsLit})", true);
     }
 }