tags:

views:

16020

answers:

8

I want to create a page in Magento that shows a visual representation of the categories.. example

CATEGORY
 product 1
 product 2

ANOTHER CATEGORY
 product 3

My problem is, their database is organised very differently to what I've seen in the past. They have tables dedicated to data types like varchar, int, etc. I assume this is for performance or similiar.

I haven't found a way to use MySQL to query the database and get a list of categories. I'd then like to match these categories to products, to get a listing of products for each category. Unfortunately Magento seems to make this very difficult.

Also I have not found a method that will work from within a page block.. I have created showcase.phtml and put it in the XML layout and it displays and runs it's PHP code. I was hoping for something easy like looping through $this->getAllCategories(); and then a nested loop inside with something like $category->getChildProducts();

Can anyone help me? Thank you!

+3  A: 

Maybe this will help, at least as far as categories go.

Manos Dilaverakis
+1  A: 

Hey something like this might help you from (http://www.juretic.com/news/index.php/2009/02/23/developing-magento-outside-of-magento/), I've adapted it slightly to answer your question more specifically.

 $h3h3=Mage::getModel('catalog/category')->load(5);  // YOU NEED TO CHANGE 5 TO THE ID OF YOUR CATEGORY


$h3h3=$h3h3->getProductCollection();


foreach($h3h3->getAllIds() as $lol)
{
 $_product=Mage::getModel('catalog/product')->load($lol);

 print $_product->getName()."<br/>";

}
+2  A: 

From code found in an SEO related class (Mage_Catalog_Block_Seo_Sitemap_Category)

    $helper     = Mage::helper('catalog/category');
    $collection = $helper->getStoreCategories('name', true, false);
    $array      = $helper->getStoreCategories('name', false, false);

Try to forget that it's a database that's powering your store, and instead concentrate on using the objects that the Magento system provides.

For example, I had no no idea how to get a list of categories. However, I grepped through the Mage codebase with

    grep -i -r -E 'class.+?category'

Which returned a list of around 30 classes. Scrolling through those, it was relatively easy to guess which objects might have methods or need to make method calls that would grab the categories.

Alan Storm
I'm not sure how you can actually use the resulting collection or array to get the names or url's of categories. That data I need is stored in the "_data:protected" keys of the result. Could you elaborate?
Martijn Heemels
@Martijn http://stackoverflow.com/questions/1005394/magento-show-custom-attributes-in-grouped-product-table/1005474#1005474
Alan Storm
A: 

Thanks a lot. Really helps. To get the game, make a loop and then getName()

foreach ($collection as $cat):

    echo $cat->getName();

endforeach;
A: 

I adapted this from Paul Whipp's website:

SELECT e.entity_id AS 'entity_id', vn.value AS 'name'   
FROM catalog_category_entity e  
LEFT JOIN catalog_category_entity_varchar vn  
ON e.entity_id = vn.entity_id AND vn.attribute_id = 33 
ORDER BY entity_id;

This will provide you with the catalog category IDs.

A: 

I used this in /app/design/frontend/default/default/template/catalog/product/feature.xml

<?php
/**
 * Home page Featured Product list template
 *
 * @see Mage_Catalog_Block_Product_List
 */
?>
<?php 
if (!is_null($this->_productCollection)) {
    $_origCollection = $this->_productCollection;
    $this->setCollection(null);
}
$this->setCategoryId(16);
$_productCollection=$this->getLoadedProductCollection() ?>
<?php if($_productCollection->count()): ?>
<div class="featured-products">
    <h2><?php echo $this->__('Featured Products') ?></h2>
    <?php foreach ($_productCollection as $_product): ?>
        <div>
            <a href="<?php echo $_product->getProductUrl() ?>" title="<?php echo $this->htmlEscape($_product->getName()) ?>">
                <img src="<?php echo $this->helper('catalog/image')->init($_product, 'small_image')->resize(150, 50); ?>" alt="<?php echo $this->htmlEscape($this->getImageLabel($_product, 'small_image')) ?>" />
                <h3 class="product-name"><?php echo $this->htmlEscape($_product->getName())?></h3>
                <?php echo nl2br($this->htmlEscape($_product->getShortDescription())) ?>
            </a>
        </div>
    <?php endforeach; ?>
</div>
<?php endif; ?>
Nikola
+1  A: 

I made this little video on how I create custom category listing blocks with Magento. I am sure there are better ways of achieving this or even something I could have done better, but it's just my method. I only created this it in hopes that it helps explain somethings to some people out there.

Magento Custom Category Listing Tutorial

Thanks!

Devin R. Olsen
A: 

category Listing block:

<?php
$categories = Mage::getModel('catalog/category')->load(2)->getChildren();
$catIds = explode(',',$cats);
?>
<ul>
<?php foreach($catIds as $catId): ?>
    <li>
        <?php
            $category = Mage::getModel('catalog/category')->load($catId);
            echo $category->getName();

            $subCats = Mage::getModel('catalog/category')->load($category->getId())->getChildren();
            $subCatIds = explode(',',$subCats);
        ?>
            <?php if(count($subCatIds) > 1):?>
                <ul>
                <?php foreach($subCatIds as $subCat) :?>
                    <li>
                    <?php
                        $subCategory = Mage::getModel('catalog/category')->load($subCat);
                        echo $subCategory->getName();
                    ?>
                    </li>
                <?php endforeach;?>
                </ul>
            <?php endif; ?>
    </li>
<?php endforeach; ?>
</ul>
Pooja maheshwari