2010-11-25 2 views
3

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

<?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 (эта часть уже работает).

ответ

10

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

<?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 и просто желая чего-то быстро работающего. Anton's answer is better and more Magentic(?)

+0

Я просто проверял, что ... порядок сортировки был тот же. Если я использую krsort, тогда порядок будет правильным, но я не уверен, что это имеет смысл. Он должен сортироваться в алфавитном порядке по имени, но ksort сортирует id desc. мысли? – 2010-11-25 05:20:40

+0

asort работает вместо rsort! Как ты написал это так быстро, кстати?Это было буквально через несколько минут после того, как я опубликовал его! – 2010-11-25 05:29:16

+1

@Joe Fletcher Я быстро :) – alex 2010-11-25 05:30:44

19

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

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

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

Great read about collections in Magento is written by Alan Storm

1

Привет Я использую 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); 

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

1

Там гораздо более простой способ сделать это в последнем 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

Сначала сделайте резервную копию 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> 
Смежные вопросы