How can get position of product in magento - php

I am getting all products with their categories, below the code I am using but I want to get position of products .
I am not getting how to change my code so that it will make optimize.
$products = Mage::getModel('catalog/product')->getCollection()->addAttributeToSort('position');
$prodIds=$products->getAllIds();
if(count($prodIds)>0)
{
$product = Mage::getModel('catalog/product');
$i=0;
foreach($prodIds as $productId)
{
$ids= array();
$productCollection = Mage::getModel('catalog/product')->load($productId);
$final['prodCat_list'][$i]['sku']= $productCollection ->getSku();
$final['prodCat_list'][$i]['product_id']= $productId;
$final['prodCat_list'][$i]['name']= $productCollection ->getName();
$final['prodCat_list'][$i]['image']=$productCollection ->getThumbnailUrl();
$final['prodCat_list'][$i]['description']=$productCollection ->getDescription();
$final['prodCat_list'][$i]['short_description']=$productCollection ->getShortDescription();
$final['prodCat_list'][$i]['weight']=$productCollection ->getWeight();
$final['prodCat_list'][$i]['created_at']=$productCollection ->getCreatedAt();
$final['prodCat_list'][$i]['updated_at']=$productCollection ->getUpdatedAt();
$final['prodCat_list'][$i]['price']=$productCollection ->getPrice();
$final['prodCat_list'][$i]['special_price']=$productCollection ->getSpecialPrice();
$final['prodCat_list'][$i]['tax_class_id']=$productCollection ->getTaxClassId();
$final['prodCat_list'][$i]['cat_id']= implode(',',$productCollection ->getCategoryIds());
$ids[$i]=$result[$i]['category_ids'];
foreach($productCollection ->getCategoryIds() as $categoryId)
{
$category = Mage::getModel('catalog/category')->load($categoryId);
$final['prodCat_list'][$i]['cat_name'][$categoryId]= $category->getName();
}
$i++;
}
I want also to add position of products in $final['prodCat_list'] variable.

You should consider cleaning up that code. Anyway, below is the solution to your problem.
foreach($productCollection ->getCategoryIds() as $categoryId)
{
$category = Mage::getModel('catalog/category')->load($categoryId);
$final['prodCat_list'][$i]['cat_name'][$categoryId]= $category->getName();
// new code starts here
$positions = $category->getProductsPosition();
if ($positions) {
$final['prodCat_list'][$i]['cat_name'][$categoryId]['position'] = $positions[$productId];
}
}

Related

Magento tags collection for multiple products

My PHP knowledge is somewhat limited and I'm working with Magento 1.9.3.
I need to display a tags collection from multiple products and I don't understand why this code doesn't work:
//List of my products
$displayProduct = $this->getCollection();
ob_start();
foreach ($displayProduct as $_product) {
echo ($_product->getId().',');
}
$output = substr(ob_get_clean(), 0, -1);
echo $output;
// Tags list
$model = Mage::getModel('tag/tag');
$TaGCollection = $model->getResourceCollection()
->addPopularity()
->addProductFilter(array($output))
->setFlag('relation', true)
->addStoreFilter(Mage::app()
->getStore()->getId())
->limit(30)
->setActiveFilter()
->load();
The first collection displays this list of products ids correctly:
548,549,650,675,676,686,761,534,535,533,766,767,768,772,778,783,786,790,794,814,818
If I paste this list as array values in the second collection it works. But when I insert the variable $output in the second collection it doesn't work.
What did I miss?
//List of my products
$displayProduct = $this->getCollection();
$output = array(); /declaration as an arraY
foreach ($displayProduct as $_product) {
array_push($output,$_product); //PUSH Product Ids in $output
}
// Tags list
$model = Mage::getModel('tag/tag');
$TaGCollection = $model->getResourceCollection()
->addPopularity()
->addProductFilter($output)
->setFlag('relation', true)
->addStoreFilter(Mage::app()
->getStore()->getId())
->limit(30)
->setActiveFilter()
->load();
//Get the collection of products
$displayProduct = $this->getCollection();
$output = array(); //declaration as an array
foreach ($displayProduct as $_product) {
array_push($output,$_product->getId()); //PUSH Product Ids in $output
}
// Get Tags By Product ids, that is based on $output variable
$model = Mage::getModel('tag/tag');
$TagCollection = $model->getResourceCollection()
->addPopularity()
->addProductFilter($output)
->setFlag('relation', true)
->addStoreFilter(Mage::app()
->getStore()->getId())
->limit(30)
->setActiveFilter()
->load();
Then loop through the $TagCollection to get tags one by one.
Well, this solution really works:
//List of my products
$displayProduct = $this->getCollection();
ob_start();
foreach ($displayProduct as $_product) {
echo ($_product->getId().', ');
}
$output = substr(ob_get_clean(), 0, -2);
$productIds = explode(', ', trim($output));
// Tags list
$model = Mage::getModel('tag/tag');
$TaGCollection = $model->getResourceCollection()
->addPopularity()
->addFieldToFilter('product_id', array('in' => $productIds))
->setFlag('relation', true)
->addStoreFilter(Mage::app()
->getStore()->getId())
->limit(30)
->setActiveFilter()
->load();
Thanks for your answers!! :)

Database query for fetching products in customer cart programmatically

How to build a query for fetching all the product details from magento customer cart,
actually we have tried
$quote = Mage::getModel('checkout/cart')->getQuote();
$quote->setSharedStoreIds($storeIds)->loadByCustomer($customer);
foreach ($quote->getAllItems() as $item) {
$product = $item->getProduct();
$productsResult[] = array(// Basic product data
'product_id' => $product->getId()
}
but the issue is we are not getting proper data as we are expecting, if we able to found this database query so it would be better
Try this
$quote = Mage::getSingleton('checkout/cart')->getQuote();
$items = $quote->getAllVisibleItems();
foreach ($items as $item) {
$productId = $item->getProductId();
}
The code below is perfectly working for me
<?php
$quote = Mage::getSingleton('checkout/cart')->getQuote();
$items = $quote->getAllVisibleItems();
foreach ($items as $item) {
$productId = $item->getProductId();
$options = $item->getProduct()->getTypeInstance(true)->getOrderOptions($item->getProduct());
print_r($options);
}
?>

Augment category detail with product information

I currently have a piece of code that puts together data about all of the categories in Magento. I would like to add product details, including but not limited to:
price
sku
image url
I'm having trouble adding those attributes to the response
<?php
require_once('../app/Mage.php'); //Path to Magento
umask(0);
Mage::app();
function getCategoryTree($recursionLevel, $storeId = 1)
{
$parent = Mage::app()->getStore()->getRootCategoryId();
$tree = Mage::getResourceModel('catalog/category_tree');
$nodes = $tree->loadNode($parent)
->loadChildren($recursionLevel)
->getChildren();
$tree->addCollectionData(null, false, $parent);
$categoryTreeData = array();
foreach ($nodes as $node) {
$categoryTreeData[$node->getData('entity_id')] = getNodeChildrenData($node);
}
return $categoryTreeData;
}
function getNodeChildrenData(Varien_Data_Tree_Node $node)
{
$data = array(
'title' => $node->getName(),
'url' => $node->getData('url_key'),
'price' => $node->getPrice(),
);
foreach ($node->getChildren() as $childNode) {
if (!array_key_exists('children', $data)) {
$data['children'] = array();
}
$data['children'][$childNode->getData('entity_id')] = getNodeChildrenData($childNode);
}
return $data;
}
print_r(json_encode(getCategoryTree(100)));
?>
You can easily bring in information about products, but you'll need to load product collections along the way. So far you're dealing with only category models (as mentioned in the comments) which don't contain any product data.
To load the set of products associated with a category, use:
<?php
...
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect({attribute})
->addCategoryFilter($category)
->load();
$category should be a category object and $products is a collection of products that you can loop through. For each product attribute that you are interested in, add an addAttributeToSelect() entry with the name of the attribute in the pares. You can then get product details by writing things like:
<?php
...
foreach($products as $product) {
$price = $product->getPrice();
}

Magento get all products in a certain category ordered by the 'Position' field

I am simply trying to get all products that belong to a certain category ID in the Position order they are set in the back end.
I seemed to have tried every example available to no avail.
The basic code I'm working with is as follows (external php file that loads magento manually):
// Load Magento
require_once $_SERVER['DOCUMENT_ROOT'] . "/app/Mage.php";
umask(0);
Mage::app();
// set Store ID
$store_id = Mage::app()->getStore()->getStoreId();
// set Cat ID
$cat_id = 345;
$cat = Mage::getModel('catalog/product')->setId(345);
$products = Mage::getModel('catalog/product')
->getCollection()
->addCategoryFilter($cat)
->addAttributeToSelect("*")
->setOrder('name','asc')
->load();
foreach($products as $p) {
var_dump($p->getName());
}
How might I achieve this?
This was what finally worked:
$cat_id = 345;
$category = Mage::getModel('catalog/category')->load($cat_id);
$collection = $category->getProductCollection()->addAttributeToSort('position');
Mage::getModel('catalog/layer')->prepareProductCollection($collection);
foreach ($collection as $product) {
var_dump( $product->getName() );
}
$product_position_array = Mage::getModel('catalog/category')->load($CategoryID)->getProductsPosition();
This should return an array of $product_id = $position.

Magento products by categories

Does anyone know how I can get a list of products belonging to a specific category from within a view file in Magento?
You can use magento object to filter.
Example:
$categoryId = 123; // a category id that you can get from admin
$category = Mage::getModel('catalog/category')->load($categoryId);
$products = Mage::getModel('catalog/product')
->getCollection()
->addCategoryFilter($category)
->load();
print_r($products);
It all depends on which view you're in. ;-)
First off, I hope you stayed within your template set (default in my example).
Use this as an example:
<?php
$_cat = $this->getCurrentCategory();
$_parent = $_cat->getParentCategory();
$_categories = $_parent->getChildren();
/* #var $category Mage_Catalog_Model_Category */
$collection = Mage::getModel('catalog/category')->getCollection();
/* #var $collection Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Collection */
$collection->addAttributeToSelect('url_key')
->addAttributeToSelect('name')
->addAttributeToSelect('is_anchor')
->addAttributeToFilter('is_active', 1)
->addIdFilter($_categories)
->setOrder('position', 'ASC')
->joinUrlRewrite()
->load();
$productCollection = Mage::getResourceModel('catalog/product_collection');
$layer = Mage::getSingleton('catalog/layer');
$layer->prepareProductCollection($productCollection);
$productCollection->addCountToCategories($collection);
// $productCollection should be ready here ;-)
?>
I'm using the above code to display sister categories in my template - it's not ideal but it works.
It's sort of a hack because I did not yet have time to learn all the layout XML madness. Otherwise if you use the XMLs you need to keep in mind - it all depends on where you are at. Where means the template file and essentially also the layout (in terms of app/design/frontend/default/default/layout/*).
I know it's not much, but I hope it helps to get you started.
Here is the code to get products from any particular category. You can use this in view file as well.
// if you want to display products from current category
$category = Mage::registry('current_category');
// if you want to display products from any specific category
$categoryId = 10;
$category = Mage::getModel('catalog/category')->load($categoryId);
$productCollection = Mage::getResourceModel('catalog/product_collection')
->addCategoryFilter($category);
// printing products name
foreach ($productCollection as $product) {
echo $product->getName();
echo "<br />";
}
<?php
$c_id = 2;
$category = new Mage_Catalog_Model_Category();
$category->load($c_id);
$collection = $category->getProductCollection();
$collection->addAttributeToSelect('*');
foreach ($collection as $_product) { ?>
<?php echo $_product->getName(); ?>
<?php } ?>
I pretty much needed the same. Here is how I have done it:
$prod_whole = array();
if(!empty($_menu)) //$_menu = array of Categories with some basic info
foreach($_menu as $v)
{
if($v['name']=='HOME')
continue;
$cat_id = $v['id'];
#/ Setup Products
$category = Mage::getModel('catalog/category')->load($cat_id);
$collection = Mage::getModel('catalog/product')->getCollection()
->addAttributeToSelect('*') // select all attributes
->addCategoryFilter($category)
->setPageSize(8) // limit number of results returned
->setCurPage(0)
->load()
;
$prod_collection = array();
foreach ($collection as $product)
{
$prod_collection_1 = array();
#/ Basic Info
$prod_collection_1['id'] = $product->getId();
$prod_collection_1['name'] = $product->getName();
$prod_collection_1['price'] = (float) $product->getPrice();
//$prod_collection_1['desc'] = $product->getDescription();
//$prod_collection_1['short'] = $product->getShortDescription();
$prod_collection_1['type'] = $product->getTypeId();
$prod_collection_1['status'] = $product->getStatus();
$prod_collection_1['special_price'] = $product->getSpecialPrice();
$prod_collection_1['direct_url'] = $product->getProductUrl();
#/ getCategoryIds(); returns an array of category IDs associated with the product
foreach ($product->getCategoryIds() as $category_id)
{
$category = Mage::getModel('catalog/category')->load($category_id);
$prod_collection_1['parent_category'] = $category->getParentCategory()->getName();
$prod_collection_1['category'] = $category->getName();
//$prod_collection_1['category_idx'] = preg_replace('/[\s\'\"]/i', '_', strtolower(trim($prod_collection_1['category'])));
$prod_collection_1['category_id'] = $category->getId();
}
#/gets the image url of the product
$prod_collection_1['img'] = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA).'catalog/product'.$product->getImage();
$prod_collection[] = $prod_collection_1;
}//end foreach.....
$prod_whole[$cat_id] = $prod_collection;
}//end foreach categories.......
//var_dump('<pre>', $prod_whole);
Hope this helps.
<?php
$category_id = 10; // if you know static category then enter number
$catagory_model = Mage::getModel('catalog/category')->load($category_id); //where $category_id is the id of the category
$collection = Mage::getResourceModel('catalog/product_collection');
$collection->addCategoryFilter($catagory_model); //category filter
$collection->addAttributeToFilter('status',1); //only enabled product
$collection->addAttributeToSelect(array('name','url','small_image')); //add product attribute to be fetched
//$collection->getSelect()->order('rand()'); //uncomment to get products in random order
$collection->addStoreFilter();
if(!empty($collection))
{
foreach ($collection as $_product):
echo $_product->getName(); //get product name
endforeach;
}else
{
echo 'No products exists';
}
?>
You should always avoid putting code like this into a view, it's very bad practice.
You can also run into issues as views can be cached, leading to unexpected behaviour.
you should override the block you are using, placing code there. you can then call any new methods inside your view files.
for example, you could copy Mage_Catalog_Block_Product_List
from: app/code/core/Catalog/Block/Product/List.php
to: app/code/local/Catalog/Block/Product/List.php
you could then add a new method, possibly using some of the code mentioned in the above posts.
your new method would then be available inside your view file (list.phtml or any view using this block)
Here is a code to export all product with it's category into csv
<?php
set_time_limit(0);
ini_set("memory_limit",-1);
ini_set('max_execution_time','1800000000');
require_once '../app/Mage.php';
Mage::app();
$category = Mage::getModel('catalog/category');
$tree = $category->getTreeModel();
$tree->load();
$ids = $tree->getCollection()->getAllIds();
$fp = fopen('category-product-export.csv', 'w');
$field = array('Product SKU','Category Name');
fputcsv($fp, $field);
$_productCollection = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addFieldToFilter('visibility', Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH)
->load();
foreach ($_productCollection as $_product){
$cats = $_product->getCategoryIds();
$cnt = 0;
$catName = '';
foreach($cats as $id) {
$category->load($id);
$root = 'Root Catalog';
$isRoot = strtolower($root);
$categoryName = strtolower($category->getName());
if($categoryName == $isRoot){
continue;
}
$categories[$id]['name'] = $category->getName();
$categories[$id]['path'] = $category->getPath();
$path = explode('/', $categories[$id]['path']);
$len = count($path);
$string = '';
if($id > 2){
foreach ($path as $k=>$pathId)
{
$separator = '';
if($pathId > 2){
$category->load($pathId);
if($k != $len-1){ $separator = ' || ';}
$string.= $category->getName() . $separator;
}
}
if($cnt > 0) {
$catName.= ','.$string;
} else {
$catName = $string;
}
$cnt++;
}
}
//echo $catName;
$field = array($_product->getSku(),$catName);
fputcsv($fp, $field);
}
?>
Download

Categories