// Check whether this page has any visuals
if (count($this->page->pagevisuals->find_all()) > 0)
{
// Ok to go ahead and assign
$visual = $this->page->pagevisuals->find_all();
}
// If this is a sub page, parent page may have visuals we can use
elseif (count($this->page->parent->pagevisuals->find_all()) > 0)
{
$visual = $this->page->parent->pagevisuals->find_all();
}
// If two levels deep, grandparent page might have visuals
elseif (count($this->page->parent->parent->pagevisuals->find_all()) > 0)
{
$visual = $this->page->parent->parent->pagevisuals->find_all();
}
答案 0 :(得分:1)
你可以写一个循环:
$page = $this->page;
$visual = null;
while (!$visual && $page) {
$visual = $page->pagevisuals->find_all();
$page = $page->parent;
}
我相信这是相同的,无论你有多少级别的父母/筑巢,都会有效。
答案 1 :(得分:0)
$visual = $this->page->pagevisuals->find_all()
or $visual = $this->page->parent->pagevisuals->find_all()
or $visual = $this->page->parent->parent->pagevisuals->find_all();
如果它们都不匹配,你会怎么做?在此代码中,它将被设置为最后一个,这与您所做的不同。 (在您的代码中,如果没有匹配,则不会触及$ visual,在此代码中它将被设置为零。您可以添加or $visual = -1
或类似的东西。)
如果您想避开所有 - >父级,可以进行循环,但是您需要一些终结符。
$el = $this->page;
while(!$visual = $el->pagevisuals->find_all()) {
$el = $el->parent;
}
如果它永远不匹配,这可以永远运行,但我不太了解您的应用程序建议终止条件 - 您可以添加计数器,或其他。
答案 2 :(得分:0)
您可以将$this->page
分配给变量并使用该变量开始语句,以获得非常小的改进。
或者,您可以创建嵌套的三元语句来分配$visual
,但这肯定不是建议的做法。
答案 3 :(得分:0)
递归方法:
function getVisuals($root) {
$visuals = $root->pagevisuals->find_all();
if(count($visuals) === 0 && isset($root->parent)) {
$visuals = getVisuals($root->parent);
}
return $visuals;
}
$visuals = getVisuals($this->page);
如果您可以控制任何类$this->page
的实例,那么您可以将其作为实例方法。
答案 4 :(得分:0)
你可以制作一个递归方法来摆脱那些讨厌的条件。此外,您为每个条件分支调用find_all()方法两次,这会使处理时间加倍。
这是对递归函数的尝试(可能不起作用,递归函数总是有点棘手!)。小心无限循环。
<?php
$visual = $this->page->find_all_visuals();
class Page {
function find_all_visuals()
{
$found = $this->pagevisuals->find_all();
if (count($found) > 0) {
return $found;
} else if ($this->parent == null) {
return null;
} else {
return $this->parent->find_all_visuals();
}
}
}
?>
答案 5 :(得分:0)
您可能希望在代码中进行两项更改:
如果进行了两次调整,大部分有关视觉效果的代码将变得更容易编写和调试。
获取两个级别的所有视觉效果(我假设您不需要递归):
$visuals = array_merge(
$this->page->pagevisuals->find_all(),
$this->page->parent->pagevisuals->find_all(),
$this->page->parent->parent->pagevisuals->find_all(),
);
获取页面的视觉效果或祖父的父OR的视觉效果:
($visuals = $this->page->pagevisuals->find_all()) ||
($visuals = $this->page->parent->pagevisuals->find_all()) ||
($visuals = $this->page->parent->parent->pagevisuals->find_all());
递归函数也会更简单(这是一种添加到页面对象的方法):
public function findRecursive(){
$my_visuals = $this->pagevisuals->find_all()
return $this->parent->isNull()?
$my_visuals
: array_merge($my_visuals, $this->parent->findRecursive());
}