Как отсортировать массив списка категорий по алфавиту в Magento - PullRequest
3 голосов
/ 25 ноября 2010

В Magento я создал файл шаблона phtml с кодом ниже.Я получил это из этого урока .Я и другие задаемся вопросом, как отсортировать этот список категорий по алфавиту.Первые строки кода создают массив с идентификаторами категорий.Далее мы можем получить Имя категории, используя идентификатор в разделе foreach.Но для сортировки по Имени нам нужно получить Имена в массиве перед foreach, а затем отсортировать по имени.Как?

<?php
$cats = Mage::getModel('catalog/category')->load(319)->getChildren();
$catIds = explode(',',$cats);
?>
<ul>
<?php foreach($catIds as $catId): ?>
    <li>
        <?php
            $category = Mage::getModel('catalog/category')->load($catId);
            echo '<a href="' . $category->getUrl() . '">';
            echo $category->getName() . '</a>';
        ?>
    </li>
<?php endforeach; ?>
</ul>

Примечание: 319 - это идентификатор категории родительской категории, для которой я хочу перечислить подкатегории.Кроме того, я не помещаю это шаблон страницы категории.Я вставляю как блок на странице CMS (эта часть уже работает).

Ответы [ 5 ]

21 голосов
/ 25 ноября 2010

Вы можете позвонить

Mage::getModel('catalog/category')->getCollection()->addFieldToFilter('parent_id', '319')->addAttributeToSort('name', 'ASC');

и вы сразу же отсортируете всю связку, остальное - просто итерация над типичной коллекцией Varien. Это псевдосэмпл, и я не знаю, является ли parent_id фактическим именем поля в db, так что вы можете проверить это, прежде чем получите правильные результаты.

Великолепная статья о коллекциях в Magento написана Аланом Штормом

10 голосов
/ 25 ноября 2010

Вы могли бы сначала создать список имен категорий.

<?php
$cats = Mage::getModel('catalog/category')->load(319)->getChildren();
$catIds = explode(',',$cats);

$categories = array();
foreach($catIds as $catId) {
       $category = Mage::getModel('catalog/category')->load($catId); 
       $categories[$category->getName()] = $category->getUrl();
}

ksort($categories, SORT_STRING);
?>

<ul>
<?php foreach($categories as $name => $url): ?>
    <li>
    <a href="<?php echo $url; ?>"><?php echo $name; ?></a>
    </li>
<?php endforeach; ?>
</ul>

Я написал этот ответ, не зная слишком много о Magento и просто желая, чтобы что-то быстро работало. Ответ Антона лучше и более магический (?)

1 голос
/ 27 мая 2014

Сначала сделайте резервную копию вашего topmenu.phtml, затем замените следующий код в вашем новом файле topmenu.phtml

<?php $_helper = Mage::helper('catalog/category') ?>
<?php $_categories = $_helper->getStoreCategories() ?>
<?php

function array_sort($array, $on, $order=SORT_ASC){
    $new_array = array();
    $sortable_array = array();

    if (count($array) > 0) {
        foreach ($array as $k => $v) {
            if (is_array($v)) {
                foreach ($v as $k2 => $v2) {
                    if ($k2 == $on) {
                        $sortable_array[$k] = $v2;
                    }
                }
            } else {
                $sortable_array[$k] = $v;
            }
        }

        switch ($order) {
            case SORT_ASC:
            asort($sortable_array);
            break;
            case SORT_DESC:
            arsort($sortable_array);
            break;
        }

        foreach ($sortable_array as $k => $v) {
            $new_array[$k] = $array[$k];
        }
    }

    return $new_array;
}

?>
<?php
$layer = Mage::getSingleton('catalog/layer');
$_category = $layer->getCurrentCategory();
$currentCategoryId= $_category->getId();
?>
<div class="nav-container">
    <ul id="nav">
    <?php $_helper = Mage::helper('catalog/category') ?>
    <?php $_categories = $_helper->getStoreCategories() ?>
    <?php $currentCategory = Mage::registry('current_category') ?>
    <?php if (count($_categories) > 0){ ?>
        <?php foreach($_categories as $_category){ ?>
            <?php $_category = Mage::getModel('catalog/category')->load($_category->getId()) ?>
            <li><a href="<?php echo $_helper->getCategoryUrl($_category) ?>"><span><?php echo $_category->getName(); ?></span></a>
            <?php $catList = array();?>
            <?php $_subcategories = $_category->getChildrenCategories() ?>
            <?php foreach($_subcategories as $_subCategory){ ?>
                <?php $catList[] = array('name' => $_subCategory->getName(), 'url' => $_subCategory->getUrl(), 'id' => $_subCategory->getId());?>
            <?php } ?>
            <?php $catList = array_sort($catList, 'name', SORT_ASC);?>
            <ul>
            <?php if (count($catList) > 0){ ?>
                <?php $subcat=0?>
                <?php foreach($catList as $_subCategory){ ?>
                    <li><a href="<?php echo $_subCategory['url'] ?>"><span><?php echo $_subCategory['name'] ?></span></a>
                    <?php $subCatList = array();?>
                    <?php $_subSubCat = Mage::getModel('catalog/category')->load($_subCategory['id']);
                    $_subSubCategories = $_subSubCat->getChildrenCategories();?>
                    <?php foreach($_subSubCategories as $_subSubCategory){ ?>
                        <?php $subCatList[] = array('name' => $_subSubCategory['name'], 'url' => $_subSubCategory['url']);?>
                    <?php } ?>
                    <?php $subCatList = array_sort($subCatList, 'name', SORT_ASC);?>
                    <?php if (count($subCatList) > 0){ ?>
                        <ul>
                            <?php foreach($subCatList as $_subSubCat){ ?>
                                <li><a href="<?php echo $_subSubCat['url'] ?>"><span><?php echo $_subSubCat['name'] ?></span></a>
                            <?php } ?>
                            </li>
                        </ul>
                    <?php } ?>
                    </li>
                <?php } ?>

                <?php } ?>
            </ul>
            </li>
        <?php } ?>
    <?php } ?>
    </ul>
</div>
1 голос
/ 01 февраля 2013

В последнем Magento (CE 1.7.0.2) +

есть гораздо более простой способ сделать это
$children = Mage::getModel('catalog/category')->getCategories(319, 1, true, true);

// iterate through the results
foreach ($children as $category):
    echo '<option value="' . $category->getUrl() . '">' . $category->getName() . '</option>';
endforeach;

Функция getChildren() находится в ...

app/code/core/Mage/Catalog/Model/Category.php around line 817

Есть множество вариантов. Надеюсь, это сэкономит вам время!

1 голос
/ 13 декабря 2010

Привет! Я использую magento 1.4.1.1, и это сработало для сортировки дочерних категорий: используйте

$cats = Mage::getModel('catalog/category')->load(319)->getChildrenCategories();

чтобы получить категории детей с идентификатором 319 и измените файл в code/core/Mage/catalog/Model/Resource/Eav/Mysql4/category.php в строке 582 под функцией getChildrenCategories(), чтобы изменить

->setOrder('position','ASC'); 

до

->setOrder('name','ASC);

надеюсь, что это работает и для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...