1

PHPを使用してツリーナビゲーション構造を表現するための最良の方法は何ですか?パンくずのトレイルを使用して、ツリー内の現在のページの場所を追跡できるようにする必要があります。ツリーの一部は、make->modelsなどのデータベースから生成されます。各モデルには、次のような同じ同等のツリーブランチがあります。

作成>モデル>(エリア1、エリア2、エリア3)。

ツリーの一部は時間の経過とともに変化する可能性があります。静的なクラス階層構造を使用するのが最善ですか、それともクラスを再利用する動的なソリューションを使用するのが最善ですか?

これが簡単に説明されていることを願っています。

4

3 に答える 3

0

OOの観点から、次のようなインターフェイスを定義することをお勧めします。

interface BreadcrumbInterface
{
    public function getLabel();

    public function getParent(); // returns an instance of BreadcrumbInterface, or null
}

次に、このインターフェイスを実装し、オプションで「親」を含めることができるPageクラスを作成します。これには、このインターフェイスも実装する必要があります。これにより、必要な階層が構築されます。

(プロセスでオブジェクト指向設計パターンをブラッシュアップしながら)完全なブレッドクラムを取得するための優れた方法は、ビジターパターンを使用することです。この場合、訪問者を処理するロジックを「抽象化」するために、インターフェイスだけでなく共通の抽象クラスも定義する必要があります。

abstract class BaseNode implements BreadcrumbInterface
{
    protected $parent = null;

    public function accept(BreadcrumbVisitor $visitor)
    {
        $visitor->visit($this);
    }

    public function setParent(BreadcrumbInterface $parent)
    {
        $this->parent = $parent;
    }

    public function getParent()
    {
        return $this->parent;
    }
}

class BreadcrumbVisitor
{
    protected $breadcrumbs = array();

    public function visit(BreadcrumbInterface $node)
    {
        $parent = $node->getParent();
        if ($parent instanceof BaseNode) {
            $parent->accept($this);
        }

        $this->breadcrumbs[] = $node->getLabel();
    }

    public function getBreadcrumbs()
    {
        return $this->breadcrumbs;
    }
}

これはそのままでは実行されませんが、うまくいけば、あなたはアイデアを得ることができます。おそらく、ノードがラベルだけでなくページへのURLも決定するようにしたい場合もありますが、それは簡単に追加できます。この問題を解決するための一般的なOO構造を示したかっただけです。

編集:

大まかな使用例の追加:

$rootPage = new Page(/*...*/);

$parentPage = new Page(/*...*/);
$parentPage->setParent($rootPage); // In reality you most likely wouldn't be building this structure so explicitly. Each object only needs to know about it's direct parent

$currentPage = new Page(/*...*/);
$currentPage->setParent($parentPage);

$visitor = new BreadcrumbVisitor();
$currentPage->accept($visitor);
$breadcrumbs = $visitor->getBreadcrumbs(); // returns an array, where the first element is the root

// then you can implode with ' > ' if you want
$breadcumbString = implode(' > ', $breadcrumbs);
于 2012-09-12T20:01:23.543 に答える
0

私は一緒に行きます:

  • 各要素の$nodesリスト [空の場合はもちろん葉ノードです];
  • 親要素の$parentフィールド [null の場合はルート ノード]。

このようにして、すべてのノードのブレッドクラム トレイルを再構築し、getTrail()メソッドを提供できます。

public function getTrail()
{

    $parent = $this -> parent();

    $trail = array();

    while($parent !== NULL)
    {

        // push parent element to trail
        $trail[] = $parent;

        // go backwards one node
        $parent = $parent -> parent();

    }

    // you want trail in reverse order [from root to latest]
    return array_reverse($trail);

}

ノードのタイプが異なる場合は、少なくとも/メソッドを備えたTrailTrackableインターフェースを提供してクリーンにします。getTrail()getParent()

于 2012-09-12T19:40:07.913 に答える
0
class TreeNode {
    /**
 * the parent node
 *
 * @var TreeNode
 */
    private $parentNode=null;
     /**
 * the children of this node
 *
 * @var TreeNode[]
 */
    private $children=array();
     /**
 * The user element this tree node holds.
 *
 * @var Object
 */
    private $element;
}
于 2012-09-12T19:43:04.650 に答える