/** * 建立分类所属关系的树形结构 * $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; }
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); } }