2

カスタムレイヤードメニューを構築するために、Magento のナビゲーションに含まれるようにマークされているすべてのカテゴリを管理パネルと同じ順序で読み込もうとしています (出力を、に保存されている別のメニューと組み合わせます)。 DB を他のページに)。

これは、これまでメニューを生成する関数で使用しているものです。

private function generateCategories() {

    $_root_category_id = Mage::app()->getWebsite(true)->getDefaultStore()->getRootCategoryId();

    $_current_children = Mage::getModel('catalog/category')
        ->getCollection()
        ->addAttributeToSelect('*')
        ->addIsActiveFilter()
        ->addLevelFilter(2)
        ->addOrderField('position', 'asc');

    $i = 0;

    $html = '';

    foreach( $_current_children as $l0 ) {
        if ($l0->getID() != $_root_category_id && $l0->getName() != '' && $l0->getIncludeInMenu())  {

            $i++;

            if (Mage::helper('core/url')->getCurrentUrl() == $l0->getURL())
                $active = ' active';
            else
                $active = '';

            if ($l0->hasChildren())
                $parent = ' parent';
            else
                $parent = '';

            $html .= '<li class=" level0' . $active . $parent . '"><a href="' . $l0->getURL() . '" class="top">' . $l0->getName() . '</a>';

            if ($l0->hasChildren()) {
                $multiplier = 1;
                $iteration = 0;

                $level1 = '';
                $level1[] = '';

                foreach ( explode(',', $l0->getChildren()) as $l1 ) {

                    $l1 = Mage::getModel('catalog/category')->load($l1);

                    if ( $l1->getIncludeInMenu() ) {

                        if (Mage::helper('core/url')->getCurrentUrl() == $l1->getURL())
                            $active = ' active';
                        else
                            $active = '';

                        if ($iteration == $this->perColumn) {
                            $iteration = 0;
                            $multiplier++;
                        }

                        $iteration++;

                        $level1[] = '<span class="level1' . $active . '"><a href="' . $l1->getURL() . '" title="' . $l1->getName() . '">' . $l1->getName() . '</a></span>';
                    }
                }

                unset($level1[0]);

                $numLinks = count($level1);
                $columns = $numLinks / $this->perColumn;

                $html .= '<div class="border-cover"></div><div class="dropdown" style="width: ' . $this->colWidth * $multiplier . 'em;">';

                $used = 0;
                $iteration = 0;

                foreach( $level1 as $link ) {
                    $used++;
                    $iteration++;

                    if ($used == 1)
                        $html .= '<div class="col" style="float: left; width: ' . $this->colWidth . 'em;">';

                    $html .= $link;

                    if ($used == 4 || $iteration == $numLinks) {
                        $html .= '</div>';
                        $used = 0;
                    }
                }

                $html .= '</div>';
            }

            $html .= '</li>';
        }
    }

    return $html;

}

->addOrderField('position', 'asc')管理パネルと同じ順序でカテゴリをフィルタリングする必要があるという印象を受けましたが、これは第 1 レベル ( $l0) のカテゴリでのみ機能し、サブカテゴリでは機能しません。

これが機能するようにこれを変更する方法を誰かが提案できますか?

4

2 に答える 2

3

getChildren の代わりに関数 getChildrenCategories() を使用してみてください。これはカテゴリの ID ではなくオブジェクトを返すため、情報をロードする必要はありません。

詳細については、Magento サブカテゴリの並べ替え順序を変更するを参照してください。

于 2013-02-20T14:16:42.757 に答える