Magento - Create product programmatically - php

I'm creating products by code.
I'm using Fixed Product Tax with attributo (eco_tax)
It turns out that is not being inserted the rate information, which are they (country, state, value) other product information is OK and the product is created normally, but without the fee.
I am using the following code
->setFpt(array(
'website_id'=>0,
'country'=>'BR',
'state'=>'0',
'price'=>10.0000,
));
What am I doing wrong?
Solution
I found the solution
->setData("eco_tax", array(
array(
'website_id' => 0,
'country' => 'BR',
'state' => '',
'price' => 10.000,
'delete' => ''
)0
));

Related

Configurable product created programmatically doesn't show in search - Magento 1.9

I have a script that creates a configurable product and the simple products associated to it. After the creation, in the backend, all of them seems fine (stock, website, status, visibility and association between the simple products and the configurable are ok). The problem is when I try to search for the configurable product or add it to a category, it doesn't display.
All products (configurable and simple) are firstly created with this method:
private function createBaseProduct($sku)
{
$_product = Mage::getModel('catalog/product');
$_product->setSku($sku);
$_product->setAttributeSetId(4);
$_product->setTypeId('simple');
$_product->setWebsiteIDs(array(1));
$_product->setVisibility(Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH);
$_product->setStatus(1);
$_product->setTaxClassId(0);
$_product->setStockData(array(
'use_config_manage_stock' => 0,
'manage_stock' => 1,
'is_in_stock' => 1,
'qty' => 100
));
return $_product;
}
In case the product is configurable, it then goes to this method:
private function setData($configurable)
{
$configurable->setTypeId('configurable');
$configurable->setStockData(array(
'use_config_manage_stock' => 0,
'manage_stock' => 0,
'is_in_stock' => 1,
'qty' => 0,
));
--> $configurable = $this->setAssociativeAttributes($configurable);
$configurableAttributesData = $configurable->getTypeInstance()->getConfigurableAttributesAsArray();
$configurable->setCanSaveConfigurableAttributes(true);
$configurable->setConfigurableAttributesData($configurableAttributesData);
return $configurable;
}
Where the method setAssociateAttributes() set the attributes IDs of the configurable product being created:
private function setAssociativeAttributes()
{
$configurable->getTypeInstance()->setUsedProductAttributeIds($this->configurableAttrsIds);
return $configurable;
}
After that, the configurable product returned in setData() is saved using $product->save(). Then, the simple product's are created (using the createBaseProduct() method), saved, and assigned to the configurable product using this method:
public function associateChildProduct($configurableId, $childProduct)
{
$configurable = Mage::getModel('catalog/product')->load($configurableId);
$childProducts = $configurable->getTypeInstance()->getUsedProducts();
array_push($childProducts, $childProduct);
$childProductsIds = array();
foreach($childProducts as $product) {
array_push($childProductsIds, $product->getId());
}
Mage::getResourceSingleton('catalog/product_type_configurable')
->saveProducts($configurable, $childProductsIds);
}
And all seems good, products are created and correctly assigned to configurable. But in the frontend the configurable product isn't displayed (only if I access it via URL it opens correctly, with the variations and all).
Obs.: simple products are displayed in search correctly, only the configurable is missing.
I believe there's something wrong in the configurable's data, but I can't figure it out :(
----- EDIT -----
So I debugged it a little more and seems that the problem is actually in the attribute used to create the configurable product (I'm also creating this attribute programmatically). If I save the attribute created programatically again, in my admin panel, the link between simple products and their configurable disapear (they don't show linked in the admin panel anymore).The attribute is created before the configurable product using class "CustomAttribute":
public function __construct($attrCode)
{
$attrData = array(
'group' => '',
'type' => 'varchar',
'backend' => '',
'frontend' => '',
'label' => ucfirst($attrCode),
'input' => 'select',
'class' => '',
'source' => '',
'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
'visible' => true,
'required' => false,
'user_defined' => true,
'default' => '0',
'searchable' => false,
'filterable' => false,
'comparable' => false,
'visible_on_front' => false,
'is_configurable' => true,
'unique' => false,
);
$installer = new Mage_Eav_Model_Entity_Setup('core_setup');
$installer->startSetup();
$installer->addAttribute(Mage_Catalog_Model_Product::ENTITY, $attrCode, $attributeData);
$this->addAttributeToDefaultSet();
$installer->endSetup();
}
And this attribute is set to child products (during their creation) using the following method:
private function setCustomAttribute($chidlProduct, $attrCode, $optionLabel)
{
$customAttribute = new CustomAttribute($attrCode);
$customAttribute->addOptionIfNotExists($optionLabel, $attrCode);
$optionId = $customAttribute->getOptionId($optionLabel);
$product->setData($attrCode, $optionId);
}
Where the method $customAttribute->addOptionIfNotExists() creates the attribute's option if not already created:
public function addOptionIfNotExists($optionLabel, $attrCode)
{
$value['option'] = array($optionLabel);
$order['option'] = 0;
$optionData = array(
'value' => $value,
'order' => $order
);
$attribute = Mage::getSingleton('eav/config')
->getAttribute(Mage_Catalog_Model_Product::ENTITY, $attrCode);
$attribute->setData('option', $optionData);
$attribute->save();
}
And after added the method associateChildProduct() is called to associate simple products to their configurable.
Obs.: configurable product is displayed correctly via URL, even the attribute variations are shown.
Obs2.: if I save the attribute via admin panel, delete simple products and create new ones using "Quick create" (with the same values) the configurable product is displayed in search and categories.
Just to put my comments in form of an answer, and organize it...
There are many reasons for a recently created product or one created programmatically to not being displayed in some collection.
Index
The first and most common one is related to indexation.
This could be related to issues in the cronjob (not configured, or not working properly).
You can manually trigger the reindex process by doing:
Magento 1: php shell/indexer.php reindexall
Magento 2: bin/magento indexer:reindex
Product not added to the website or not visible
Check if the product is enabled and visible in catalog. If they are simple products from a configurable product, make sure they are both enabled.
Also check if there is enough inventory of the item and if they are not marked as "out of inventory" (regardless the stock qty).
In multi website stores, check the "Website" group in the product edit page, and see if it's checked to appear in that website. Also check the product scope. Sometimes you disable the product in a inner level (i.e. store view or website).
Some condition is not met
If you believe that you've checked everything, now it's time to debug the collection.
Magento 1 and Magento 2 have the getSelect() method available in collection objects.
Find the phtml or block where your products are being looped, and find the collection variable (generally used in the foreach).
Then, add something like echo (string)$collection->getSelect().
This will show the query used to search the products. See which join or where condition is not met by your missing product.
Here's an example of category collection queries in Magento 1:
SELECT `e`.*,
`cat_index`.`position` AS `cat_index_position`,
`price_index`.`price`,
`price_index`.`tax_class_id`,
`price_index`.`final_price`,
IF(price_index.tier_price IS NOT NULL, LEAST(price_index.min_price, price_index.tier_price),
price_index.min_price) AS `minimal_price`,
`price_index`.`min_price`,
`price_index`.`max_price`,
`price_index`.`tier_price`
FROM `catalog_product_entity` AS `e`
INNER JOIN `catalog_category_product_index` AS `cat_index`
ON cat_index.product_id = e.entity_id AND cat_index.store_id = 4 AND
cat_index.visibility IN (2, 4) AND cat_index.category_id = '10'
INNER JOIN `catalog_product_index_price` AS `price_index`
ON price_index.entity_id = e.entity_id AND price_index.website_id = '4' AND
price_index.customer_group_id = 0
ORDER BY `cat_index`.`position` ASC
LIMIT 12
1 'New Arrivals' category from Magento 1 sample data.
With Ricardo Martins help I was able to debug the problem and discover that the configurable product wasn't being displayed because it's entity_id wasn't being added to the table catalog_product_index_price. This problem seems to be caused because the attribute used in the configurable product's creation had the backend_type set to varchar, instead int (Reference).
So I changed my code for attribute's creation to:
public function __construct($attrCode)
{
$attrData = array(
'group' => '',
--> 'type' => 'int',
'backend' => '',
'frontend' => '',
'label' => ucfirst($attrCode),
'input' => 'select',
'class' => '',
'source' => '',
'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
'visible' => true,
'required' => false,
'user_defined' => true,
'default' => '0',
'searchable' => false,
'filterable' => false,
'comparable' => false,
'visible_on_front' => false,
'is_configurable' => true,
'unique' => false,
);
$installer = new Mage_Eav_Model_Entity_Setup('core_setup');
$installer->startSetup();
$installer->addAttribute(Mage_Catalog_Model_Product::ENTITY, $attrCode, $attributeData);
$this->addAttributeToDefaultSet();
$installer->endSetup();
}
Where in the indicated line the attribute's backend_type is set to int. After this, the configurable product is now being correctly displayed in category and search :)

How to get additional product information in cart.php in opencart?

I am using opencart for a web project and I add a custom field to all products called unit. I created a column named unit in the oc_product table. I can access a product's unit on the product.php page by adding data['unit'] = product_info['unit'] and fetching it via a query, but I want to access it on the cart.php page. I am not sure where the cart get's its products from thought. So I don't know where exactly to add the code to get the unit. In controller/common/cart.php there is this block of code:
$data['products'][] = array(
'product_id'=> $product['product_id'],
'key' => $product['key'],
'thumb' => $image,
//THIS
'unit' => $product['unit'],
'name' => $product['name'],
'model' => $product['model'],
'option' => $option_data,
'recurring' => ($product['recurring'] ? $product['recurring']['name'] : ''),
'quantity' => $product['quantity'],
'price' => $price,
'total' => $total,
'href' => $this->url->link('product/product', 'product_id=' . $product['product_id'])
);
If you look at the code above, right blow the comment THIS, I added a line to get the unit. Adding that code doesn't give me the unit and I know it doesn't because I am not querying it but I don't know where to add the query. If I replace $product['unit'] with a simple string like "12", I can access the 12 on the cart page. So the question is which query do I edit to get the unit on the cart page?
I was able to figure it out. Go to line 242 int /system/library/cart.php and in the array add the following line
'unit' => $product_query->row['unit']

Cannot set group price on new magento products from the xml-rpc api

I'm trying to use the xmlrpc api in magento 1.9 to add a list of products to the shop. I've got creating the products working with a lot of tinkering but I cannot add rows to the "Group price" field of the product.
This is the current version of my productCreate function:
public function productCreate(MagentoProduct $product)
{
$parameters = [
'simple',
'4', // attribute set
$product->sku,
[
'website_ids' => [2, 3, 4, 7],
'category_ids' => [7],
'name' => $product->name,
'description' => $product->description,
'short_description' => $product->short_description,
'weight' => $product->weight,
'url_key' => $product->url_key,
'url_path' => $product->url_path,
'price' => $product->price,
'tax_class_id' => $product->tax_class_id,
'meta_title' => $product->meta_title,
'meta_keyword' => $product->meta_keyword,
'meta_description' => $product->meta_description,
'status' => 1,
'group_price' => [
'website_id' => 1,
'cust_group' => 2,
'price' => '100.0',
],
]
];
return $this->client->call('product.create', $parameters);
}
I've tried using tier price with qty of 0 or 1 but those are saved to the wrong table. If I retrieve some existing products through the xmlrpc api then I do get the group prices in the tier price list without any quantity but creating them that way doesn't work.
In the function above I'm setting the values in the (undocumented) group_price field. The error I'm getting now is:
'fXmlRpc\Exception\ResponseException' with message 'Dubbele website
groep prijs klantengroep.'
which translates to:
Duplicate website group price customer group.
Does anybody know the correct way of setting the group price?
It looks like magento does not support group price updates within their api.
You have to create your own api for this.
Read this:
https://magento.stackexchange.com/questions/56481/use-api-v2-to-work-with-customer-group-prices
and this
How to update group price via SOAP api

Create a Coupon In BigCommerce Using API

I am trying to create a coupon in big commerce using their API. I am using the following code after connecting with the store.
$coupon = array('name' => 'somecoupon', 'type' => 'percentage_discount', 'amount' => '50.0', 'code' => '50off', 'enabled' => true);
echo Bigcommerce::createCoupon($coupon);
I simply copied the code from their
Support Page
All the other codes on that page work but create coupon doesnt work. If I use get coupons codes, they work perfectly but creating coupon is not working what so ever. Any ideas on this?
Any help would be highly appreciated.
Thanks
The developer page neglects to mention that 'applies_to' is also a required field, hence why your code is failing.
Try
$coupon = array('name' => 'somecoupon', 'type' => 'percentage_discount', 'amount' => '50.0', 'code' => '50off', 'enabled' => true, 'applies_to'=> array('entity' => 'categories', 'ids' => array('value' => 0)));
echo Bigcommerce::createCoupon($coupon);

Magento how to save additional shipping info to Quote during checkout

I'm quite new in magento, I work version 1.6.2.0.
I'm trying to add my own Custom Shipping Method module and I have few problems.
My magento has already custom checkout module - Threestep checkout, what I'm trying to do is save additional shipping info which I choose in 3rd step (Payment and Shipping) (something like Store Pickup place) to Quote, and then in Review retrive Quote data and save it to Order.
I'm using Events to do this:
checkout_controller_onepage_save_shipping_method to save data to Quote
checkout_type_onepage_save_order to save data to Order
The problem is that Quote and Order doesn't have any free place where i can save my data, so I created installer for my module:
$installer = $this;
$installer->startSetup();
$packboxName = array(
'type' => 'varchar',
'backend' => '',
'frontend' => '',
'label' => 'packboxname',
'input' => '',
'class' => '',
'source' => '',
'global' => 1,
'visible' => true,
'required' => false,
'user_defined' => false,
'default' => '',
'searchable' => false,
'filterable' => false,
'comparable' => false,
'visible_on_front' => false,
'visible_in_advanced_search' => false,
'unique' => false
);
$installer->addAttribute('order', "packboxname", $packboxName);
$installer->getConnection()->addColumn($installer->getTable('sales/order'), 'packboxname', 'varchar(255) DEFAULT NULL');
$installer->addAttribute('quote', "packboxname", $packboxName);
$installer->getConnection()->addColumn($installer->getTable('sales/quote'), 'packboxname', 'varchar(255) DEFAULT NULL');
$installer->endSetup();
And i got a error saying that
$installer->addAttribute('quote'
has wrong Entity Id.
So I checked DB, table: eav_entity_type and there wasn't any 'quote' type (hopefully there was a 'order') I didn't really know what I should do so, I tried to google something, I found tutorial and modified my installer.
$installer->addEntityType('quote', array(
'entity_model' => 'sales/quote',
'table' =>'sales/quote',
));
Now it's working I have additional place where I can save my info, but my friend told me that I shouldn't use addEntityType, Is there any other way to achive what I need?
I think perhaps what you're looking for can be found in this answer: https://stackoverflow.com/a/4389786/823549
An important point made in that answer is the event fired, sales_convert_quote_to_order - this will get fired when the quote is being converted to an order, and will happen regardless of what your other checkout module does. This answer is also useful as you can see the details of your custom column in the orders grid page.

Categories