Professional Documents
Culture Documents
Created using zinepal.com. Go online to create your own zines or read what others have already published. 1
September 8th, 2009 Published by: inchoo
Let’s assume we wish the “newreference” block to be placed TRUNCATE `sales_order_entity_datetime`;
below 2 columns, but above the footer. In this case, our TRUNCATE `sales_order_entity_decimal`;
TRUNCATE `sales_order_entity_int`;
updated file could look like this: TRUNCATE `sales_order_entity_text`;
TRUNCATE `sales_order_entity_varchar`;
<!-- start middle -->
TRUNCATE `sales_order_int`;
<div class="middle-container">
TRUNCATE `sales_order_text`;
<div class="middle col-2-right-layout">< ?php getChildHtml('breadcrumbs') ?>
TRUNCATE `sales_order_varchar`;
<!-- start center -->
TRUNCATE `sales_flat_quote`;
<div id="main" class="col-main"><!-- start global messages -->
TRUNCATE `sales_flat_quote_address`;
< ?php getChildHtml('global_messages') ?>
TRUNCATE `sales_flat_quote_address_item`;
<!-- end global messages -->
TRUNCATE `sales_flat_quote_item`;
<!-- start content -->
TRUNCATE `sales_flat_quote_item_option`;
< ?php getChildHtml('content') ?>
TRUNCATE `sales_flat_order_item`;
<!-- end content --></div>
TRUNCATE `sendfriend_log`;
<!-- end center -->
TRUNCATE `tag`;
TRUNCATE `tag_relation`;
<!-- start right -->
TRUNCATE `tag_summary`;
<div class="col-right side-col">< ?php getChildHtml('right') ?></div>
TRUNCATE `wishlist`;
<!-- end right --></div>
TRUNCATE `log_quote`;
<div>< ?php getChildHtml('newreference') ?></div>
TRUNCATE `report_event`;
</div>
<!-- end middle -->
ALTER TABLE `sales_order` AUTO_INCREMENT=1;
Created using zinepal.com. Go online to create your own zines or read what others have already published. 2
September 8th, 2009 Published by: inchoo
ALTER TABLE `customer_entity_decimal` AUTO_INCREMENT=1; ?>
ALTER TABLE `customer_entity_int` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity_text` AUTO_INCREMENT=1; < ?php if (!empty($result)): ?>
ALTER TABLE `customer_entity_varchar` AUTO_INCREMENT=1; <table id="relatedProductsList">
ALTER TABLE `log_customer` AUTO_INCREMENT=1; < ?php foreach ($result as $item): ?>
ALTER TABLE `log_visitor` AUTO_INCREMENT=1; <tr class="productInfo">
ALTER TABLE `log_visitor_info` AUTO_INCREMENT=1; <td><a href="<?php echo $storeUrl ?>/< ?php echo $item->url_
<td>< ?php _e('Starting at') ?> $ < ?php echo floatval($item
-- Reset all ID counters </tr>
TRUNCATE `eav_entity_store`; < ?php endforeach; ?>
ALTER TABLE `eav_entity_store` AUTO_INCREMENT=1; </table>
< ?php endif; ?>
SET FOREIGN_KEY_CHECKS=1;
Hope some of you find this useful. Especially those who refuse
After you have it executed, the test orders will not be in the to use Web Services for connecting different systems.
database any more. Keep in mind that this will delete ALL
orders, in the database. So, you should execute this queries Download connect2MAGE WordPress plugin.
immediately after launch. There are 6 comments
Created using zinepal.com. Go online to create your own zines or read what others have already published. 3
September 8th, 2009 Published by: inchoo
<ol id="graybox-latest-news"> • use the http://somestore.domain/catalogsearch/
< ?php foreach ($channel as $item): ?> partnumber as a link
<li><a href="<?php echo $item->link; ?>">< ?php echo $item->title; ?></a></li>
< ?php endforeach; ?> • show only custom_partnumber field on the search form
</ol>
</div> First, we have to see where does the /advanced come from.
</div>
Lets open our template folder at
Step 2 app\design\frontend\default\default\template
Now, we should decide where to place it. I assume you already \catalogsearch\
know how Magento blocks and references work. Let’s assume
there you will see the /advanced folder. Make a copy of that
you would like to place it in right column by default for whole
entire folder, in the same location, and name it to something
catalog. In this case open your app/design/frontend/default/
like /custom.
[your_theme]/layout/catalog.xml file and under “default” tag
update “right” reference with something similar. Now your /custom folder should have 2 files: form.phtml and
result.phtml.
That’s it. You should be able to see the list of articles from RSS
feed with the URLs. Hope this will help someone. Next in line is the /layout folder in our template. You need
to open catalogsearch.xml file. Go to line 64. Do you see the
Some of you might say why not use the default and call it a day. <action method=”addItem”><type>js</
Well, default one does not get very user friendly when large type><name>calendar/lang/calendar-en.js</name><!–
number of custom added searchable attributes are added in <params/><if/><condition>can_load_calendar_js</
Magento admin interface. Then the frontend search form gets condition>–></action>
cluttered and users are easily to get confused.
So in our example we would like to use the advanced search <action method=”addItem”><type>js</
and all of it’s behaviour and logic but to use it on somewhat type><name>calendar/calendar-setup.js</name><!–
special link and to hide unnecessary fields. Therefore, our <params/><if/><condition>can_load_calendar_js</
custom pages he would have only one input field on form and condition>–></action>
the submit button. How do we set this up? Well, all of the logic
and functionality is already there. </reference>
What we need is to:
<reference name=”content”>
Created using zinepal.com. Go online to create your own zines or read what others have already published. 4
September 8th, 2009 Published by: inchoo
<block type=”catalogsearch/custom_form” This might not be the best method of reusing already written
name=”catalogsearch_custom_form” code, however I hope it’s any eye opener to somewhat more
template=”catalogsearch/custom/form.phtml”/> elegant aproach.
Enyoj.
</reference>
There are 14 comments
</catalogsearch_custom_index>
Do the same for <catalogsearch_advanced_result> tag. Related products
Now go to the app\code\core\Mage\CatalogSearch\Block
There are three types of product relations in Magento:
folder. And make a copy of /Advanced folder naming
Up-sells, Related Products, and Cross-sell Products. When
it /Custom. Open /Custom/Form.php and replace
viewing a product, Upsells for this product are items that your
class name Mage_CatalogSearch_Block_Advanced_Form
customers would ideally buy instead of the product they’re
with Mage_CatalogSearch_Block_Custom_Form, then
viewing. They might be better quality, produce a higher profit
open /Custom/Result.php and replace class
margin, be more popular, etc. These appear on the product
name Mage_CatalogSearch_Block_Advanced_Result with
info page. Related products appear in the product info page
Mage_CatalogSearch_Block_Custom_Result.
as well, in the right column. Related products are meant to
Inside Form.php there is getModel() function. DO NOT be purchased in addition to the item the customer is viewing.
replace the Mage::getSingleton(’catalogsearch/advanced’); Finally, Cross-sell items appear in the shopping cart. When
with Mage::getSingleton(’catalogsearch/custom’);. The point a customer navigates to the shopping cart (this can happen
is to use the default advanced search logic here. Same goes for automatically after adding a product, or not), the cross-sells
getSearchModel() function inside Result.php file. block displays a selection of items marked as cross-sells to the
Next in line, controllers. We need to make items already in the cart. They’re a bit like impulse buys – like
the copy of AdvancedController.php and name it magazines and candy at the cash registers in grocery stores.
CustomController.php, then open it and replace the
class name Mage_CatalogSearch_AdvancedController with
Upsells
Mage_CatalogSearch_CustomController. This is the example of the Up-sell. Ideally, the visitor is
supposed to analyze those products as they should be relevant
Inside this CustomController.php there is a function
to the one that is just loaded.
called resultAction(). You need to replace the ( …
Mage::getSingleton(’catalogsearch/advanced’) … ) string
‘catalogsearch/advanced’ with ‘catalogsearch/custom’. This is
the one telling the browser what page to open.
Now if you open your url link in browser with /index.php/
catalogsearch/custom instead of /index.php/catalogsearch/
advanced you will see the same form there.
And for the final task… As we said at the start, the point of all
this is to 1) get more custom link in url and 2) display only one
custom searchable attribute field in form. Therefore, for the
last step we need to go to the template\catalogsearch\custom
folder and open form.phtml file.
Inside that file, there is one foreach loop that goes like
There are 2 comments
<?php foreach ($this->getSearchableAttributes() as
$_attribute): ?> File upload in Magento
All we need to do now is to place one if() condition
Now, Magento already have frontend and admin part of file
right below it. If your custom attribute name (code) is
upload option implemented in themes. Since backend part is
“my_custom_attribute” then your if() condition might look
still missing, understand that this still doesn’t work, however,
something like
if you’re interested how it looks, read on ..
<?php foreach ($this->getSearchableAttributes() as
We are coding module of similar functionality for one of our
$_attribute): ?>
clients as we speak, but we have our fingers crossed to see this
<?php if($_code == ‘my_custom_attribute’): ?>
option in next Magento version!
…
<?php endif; ?>
<?php endforeach; ?>
And you are done. Now you have somewhat more custom url,
and only one custom field displayed on that url.
Created using zinepal.com. Go online to create your own zines or read what others have already published. 5
September 8th, 2009 Published by: inchoo
Magento using static blocks Default order takes the first value available. So, all you have to
do is to either:
This is my first post here and I’ll write about my first challenge
regarding Magento since I came to work at Inchoo. • reorder it if you want to have a selection in the Toolbar or
Please note that you are not restricted only to images, you • set only one value of choice if you will remove the
could use text, video or whatever you want here, but I’ll focus selection from the toolbar
on images with links as title says.
In order to show this block, you should be familiar with I hope this will help somebody.
Magento layouts.
There are 4 comments
Since that is out of scope for this article, I’ll show you how to
put it below the content on cms pages.
Couple of days ago we launched a new Magento project:
Created using zinepal.com. Go online to create your own zines or read what others have already published. 7
September 8th, 2009 Published by: inchoo
The love and the passion for beautiful home interiors
translates into a high-quality product with a sophisticated
style manufactured in the USA. Pebblehill Designs has
assembled some of the most popular styles of custom
upholstered furniture to offer to our customers. All styles are
available in every fabric shown or you can provide your own
fabric. You can customize the furniture collection to express
your own unique style made with the highest quality materials
and craftsmanship available.
Created using zinepal.com. Go online to create your own zines or read what others have already published. 8
September 8th, 2009 Published by: inchoo
popularity is fading. ZenCart is stable for the past two years. also tutorial about this on Magento Wiki. However i don’t like
And my previous favorite, CRE Loaded (much better solution approach of duplicating and overriding Mage files from /local,
than ZenCart in my opinion), is very low. Its popularity is also if it can be avoided, so i decided to write this small and useful
fading even after their team put great effort into a new website example of adding or overriding default Magento settings
and identity. through separated config files. And yes, Magento values can
be overridden this way. Default layouts config can be found
Now, take a look at blue line. My prediction is that sometime
in app/code/core/Mage/Cms/etc/config.xml along with used
in Q1 2009, Magento will become most popular eCommerce
xml code structure, so check it out. Thank you for listening!
platform. It will surely kick osCommerce off the throne where
that fat duck was sitting for many years. It was about time.
Drupal to Magento integration, simple
First of all, let me inform you that this article is for those of link tweak with multilingual site
you who are just starting with Magento. If you are a Magento
expert, you will probably know this. Consider it just a reminder I see my coworker and friend Željko Prša made a nice little post
for those who use Magento for first time. There are three on Adding a new language in Magento so I figure I’ll jump with
common mistakes that most people do when they try to use a little Drupal to Magento integration trick concerning link
Magento for first time, so read this article and you won’t be issues and multilingual sites. Here is a piece of code you can
one of them.:) use in your Drupal templates to do the proper switching from
Drupal site to Magento while keeping the selected language of
• More experienced PHP developers will first read site. Note, this tweak assumes you have the desired language
Magento Designers Guide before they try to style setup on both Drupal and Magento side.
Magento, but others won’t and that’s the mistake This part goes to some of your Drupal theme file
number two. Since Magento has great theme fallback
system there is really no need to touch default theme. ...
Although easiest way to make new theme for new global $language ;
Magento is top copy the whole theme to a new folder, $lname = ($language->language == null) ? 'en' : $language->l
$storeView = null;
don’t do that. Copy only the files you will need: from / if($lname == 'de') { $storeView = '?___store=german&amp;
design/frontend/default/default/ directory to /design/ ??>
frontend/default/YOUR_NEW_THEME directory. Do
the same thing with /skin/frontend/default/default/ </p><p style="text-align: left;"><a id="main_menu_shop" href
...
Congratulations, you have your own theme just like
that. All that left is to apply new theme (System- Note the $storeView variable; GET ___store holds the value
>Configuration->Design) and you are ready to do with of code name of the view you assigned in Magento, while GET
your theme files whatever you want. ___from_store variable is used as helper to Magento inner
workings. You can basically omit the other one. Your links to
• Third mistake is modifying Magento core files. What files
Shop from Drupal to Magento should now activate the proper
are core ones? All what is in app/code/core folder. If you
language, the same one you have active on Drupal side.
have a need to modify some of those ones, you just need
to duplicate that file in the same directory path to app/ There are 1 comments
code/local. For example, if you need to modify the file
app/code/core/Mage/Checkout/Block/Success.php
Adding a new language in Magento
copy it to As anything in Magento adding a new language is something
that requires a certain procedure which we will explain right
app/code/local/Mage/Checkout/Block/Success.php now and for future reference.
and leave the core file intact. This way your Magento will • 3. Now go to: Configuration -> Current Configuration
be more bullet-proof to future updates. Scope (Select your language from the dropdown) and on
the right side under “Locale options” choose the desired
language.
Custom CMS page layout in Magento |
Inchoo
That’s it, now when you go to the frontend of the site, you’ll
notice a dropdown menu allowing the language switching.
Last week I had a request to add new custom layout
for few cms pages in one Magento shop. It’s really
useful for different static pages of your shop. First create
Access denied in Magento admin
extension with only config file in it: app/code/local/Inchoo/ Some of you may encountered this problem. You install new
AdditionalCmsPageLayouts/etc/config.xml Magento extension through downloader, try to access its
Add your page/custom-static-page-1.phtml template file (or configuration settings and Magento throws “Access denied”
page at you. Although you’re administrator of the system.
copy some default one for start) and you’re done There is
Created using zinepal.com. Go online to create your own zines or read what others have already published. 9
September 8th, 2009 Published by: inchoo
When you un-archive files from simpleorderpreview there is On Magento site, there is a nice tutorial how to create a
only one thing you need to do prior to running .exe file. You grouped product. Please read it first to become familiar with
need to open ACMNewProducts.exe.config and set username, the process. If you don’t have to assign simple products with
password and url of your own Magento shop. That’s it. Now custom options to a grouped product, that tutorial will be
you can run the app. enough.
Created using zinepal.com. Go online to create your own zines or read what others have already published. 11
September 8th, 2009 Published by: inchoo
How do we create Google Sitemap in Magento? One of the things that caught my eye and made me
wonder about the consequences is the Observer and override
1. Sitemap File Configuration functionality that probably most of the serious custom made
Magento modules will utilize. Utilizing Observers enables you
First we need to create sitemap file in Magento. This is
to observe and execute some action inside the “customer work
basically pointer to tell Magento where to create sitemap file
flow” or even some admin stuff. Such functionality is heavily
and how to name it. Log in to Magento Administration and go
known is systems like WordPress and it’s called “hooks”.
to:
Besides hooking, another useful an very powerful feature
Catalog -> Google Sitemap
which is actually related more to the OOP concept itself is the
Check to see if the sitemap file is already present. Lets overriding. Personally i find the combination of observers and
assume we wish to create sitemap in the URL: http:// overrides to be the coolest and most powerful stuff in Magento
www.yourstore.com/sitemap/sitemap.xml module development.
To do it successfully,
So where is the issue? As of time of this writing, the
1. FTP to the server latest Magento version is 1.3.1. Let’s look at the previous
“major” release prior to that one, version 1.2.1.2. Here is
2. create sitemap folder a prepareForCart method signature from app/code/core/
3. chmod the folder to 777 Mage/Catalog/Model/Product/Type/Abstract.php (line 239,
Magento version 1.2.1.2):
On some servers, previous steps will not be required, but it is
Notice the difference? Although this might not look like
better to create the file first so that Magento can edit it.
“that big of a deal” suppose you had implemented override
Let’s go to Magento administration now and click on “Add functionality like
Sitemap” button. Just insert the default values.
In the above code, we override the prepareForCart method to
After this step, we just told Magento where to create sitemap to some custom stuff for us. This peace of code would work
file. It is not yet created. perfectly fine in version 1.2.1.2, but when client decides to
upgrade the shop to 1.3.1 or newer he would get the error like
2. Configure Sitemap
To me, stuff like this is a serious downside towards building
Sitemap can be configured from the interface System ->
advanced modules. Changing core files and core functionality
Configuration -> Catalog->Google Sitemap. If you are not sure
can have serious impact on custom made modules each
what does it all mean, check XML Tag definitions section from
Magento upgrade. Therefore, one should keep an eye open
“Sitemaps XML format” document.
on what modules he will throw into the shop. Personally I
3. Create Sitemap Manually consider online stores very serious and have strong feelings
about each store owner having somewhat of dedicated
Looks like Magento folks were thinking that sitemap should developer that will be in charge even for stuff like adding new
only be created by a cron job. Yes, it can be done that way modules.
also. Be sure to read Wiki article How to Set Up a Cron Job
to get familiar with it. If you are looking for manual creation, Just consider the financial loss for a store owner of any more
quit your search for “Create Sitemap” button. You will not find serious web shop if he decides to download the and install
it. But there is a workaround. You can enter manual URL to module himself just to realize that for incompatibility reasons
execute sitemap creation: this new module made his shop fully nonfunctional.
http://www.yourstore.com/index.php/admin/sitemap/
generate/sitemap_id/[ID of Sitemap from step 1] How to transfer large Magento database
Of course, replace the content with square brackets with actual from live to development server and
Sitemap ID.
other way round
There are 9 comments
I have been involved in Magento development for almost a
year now. God knows I had (and still have) my moments of
Observer pitfalls of building serious pain with it . If you are in professional, everyday, PHP
modules in Magento development that focuses mainly on Magento then your life
probably isn’t all flowers and bees. Magento is extremely rich
Unlike good old WordPress that “every kid in the block” knows eCommerce platform, but its main downside IMHO is its size
how to create a plugin for, Magento is a whole new system. It and code complexity. If you download Magento via SVN, you
requires extensive knowledge of OOP, ORM’s, MVC, and few will sound find out it has around 11 600 and more files. This
other stuff. This is why not “every kid in the block” can write a is no small figure. Transferring that much of files over the
module for Magento, and this is why I love it. However, unlike FTP can be a real night mare. Luckily we have SSH and tar
WordPress, Drupal and other community driven systems out command to handle this really neat.
there who keep in mind backward compatibility things with
But what about database. Today I worked on database with
Magento things are a bit different.
more than 20 000 products in store and with extremely
large number of categories. What seemed like easy database
Created using zinepal.com. Go online to create your own zines or read what others have already published. 12
September 8th, 2009 Published by: inchoo
transfer from live site to local developer machine to do a test Affiliates for all, are modules I consider loosely related to core.
and fix on few issues tunerd out to be an issue for itself. They are in one or another way connected to Magento but they
Without further delay, here is my favorite tool to handle all are self standing, independent, applications.
database related work from now on: Navicat. Installation of Affiliate module is a trivial task. It mostly
Among my favorite features is the Data transfer. Directly comes down to extracting downloaded archive file to a web
moving one database to another among different MySQL accessible directory (to your server, hosting) and configuring
servers works like a charm. I find yourself strangled among the config.inc file. (For security reasons, try renaming
often database recommended action I suggests you test the the config.inc to config.inc.php, plus changing the /lib/
trial version of this tool. bootstrap.php on line 23 to include config.inc.php). After
importing affiliates.sql into the database our installation is
Here are some screenshots of Navicat Data transfer in Action.
done.
To configure Magento part, one needs to copy required files
form /carts directory of Affiliate module and then (turn off
Cache) go to System > Configuration and set the required
options. After that you can go back to your Affiliate For
All application, upload some banners and set their url links
to point to your Magento shop. When you test banner the
links (click on one of them to get you to Magento store,
then Magento store url should have a little GET variable
in url like ?ref=someNum). Now when you do the entire
checkout process, order info gets recorded to Affiliate For All
application.
If you wish to play with Affiliate For All without installing it,
you can check out the demo (just use “Admin” both for user
and password).
There are 2 comments
Created using zinepal.com. Go online to create your own zines or read what others have already published. 13
September 8th, 2009 Published by: inchoo
Magento community member Ross gave a good review
comment:
Create a Color Switcher in Magento
This is a great theme to use for wire-framing or as a base Magento comes packed with a lot of options. But no matter
for developing a custom theme! It looks like a lot of work has how many options you put into some product you can never
gone in to slimming down the HTML and CSS, which makes cover all of them. One of such options (for now) is a color
it much easier to work with compared to the default theme. switcher in Magento. To be more precise, an image switcher
I particularly appreciate the well structured and commented based on color selection.
CSS. The only things I would want different at this stage is
Recently I’ve made a screencast on my site on this subject,
for the ‘callouts’ to be taken out (and removal of associated
with somewhat different title. The idea is to have a dropdown
media images), and for this theme to be included in the main
box from which you choose a color and based on the color
Magento download (I would even like it to be the ‘default’). 5
selection product image changes. All of this is to be based on
stars from me!
some simple javascript (in my case, jQuery).
Take a sneak peak of how does product info page looks line
Before we continue, you might want to see color switcher in
with no styling, but in finished layout. I’m sure that the CSS
action. We used this solution on our Kapitol Reef project.
wizards will find this invaluable.
First you need to upload some images to your product and
give them some meaningful names like Red, Blue, Green
depending on your product color. When I say give them
name, I mean on label values. Same goes for creating custom
attribute. You create a dropdown selection box and create the
same amount of dropdown options as you have images, giving
them the same name Red, Green, Blue… and so on. Here are
some images for you to see what I’m talking about:
Created using zinepal.com. Go online to create your own zines or read what others have already published. 14
September 8th, 2009 Published by: inchoo
After this is done we go to the code part. There are three things After some additional styling you can get some impressive
you need to do here. results for this. Hope you find it useful.
Upload the jQuery and save it into the /js/jquery/jquery.js. You can see complete screencast at:
One important note on jQuery; for some reason I had to use http://activecodeline.com/wp-content/uploads/videos/
jQuery 1.2.3 to get this example working. Latest version 1.2.6 MagentoProductColorChooser.swf
(as of time of this writing) did not work. You can see the exact
error it gave me on my screencast. There are 28 comments
Now you need to modify /template/page/html/head.phtml
Created using zinepal.com. Go online to create your own zines or read what others have already published. 15
September 8th, 2009 Published by: inchoo
Created using zinepal.com. Go online to create your own zines or read what others have already published. 16
September 8th, 2009 Published by: inchoo
• shop - the name of the folder you wish to place the files After you’re done with setting your new templates save the
into. You may set the folders name to your likings. configuration by clicking on the “Save config”.
That’s it. Wise thing to do now would be to check how the
Read more about SVN at Wikipedia SVN Page and Subversion
emails look when received so make a test purchase to verify
official site.
everything is the way it should be.
Alternative 2: Installing via wget There are 3 comments
I will not be very descriptive here. This alternative is very well
explained on Magento website in Wiki section:
http://www.magentocommerce.com/wiki/groups/227/ Bestseller products in Magento
installing_magento_via_shell_ssh Bestseller or best selling product is one of the features people
Both scenarios will only place files. You still need to run web tend to ask for when it comes to Magento™.
based installer afterward. But, that is another story. There are multiple ways to implement this feature.
There are 6 comments In this example, I’m not using controller or model directories
at all; I’m going to show you how to implement this feature
Since transactional emails are very important for the process Basically, what you need to do is to create the directory inside
of online shopping you need to have them set up just the you your template directory and place the bestseller.phtml file in
want them and the default templates just don’t cut it. You it. In my example, I’m using the custom-created directory /
need your own logo, email data and custom verbiage to be inchoo. All of the screenshots provided here are based on that
consistent with the image of your company. directory structure.
Here how it’s done : Adding this feature to your store is a matter of two simple
steps:
1. Creating custom transactional e-mails via Admin
a) In the admin panel of your magento installation go to: • copy bestseller-phtml file to your directory
System->Transactional Emails • display the block on home page
You’ll be presented with a list of default emails. You’ll need
To add a block to a home page, you simply log into the
to create a custom email so the only way to avoid writing our
Magento, CMS > Manage Pages > Home. Then add the
custom templates from scratch is to use the existing code of
following to the content area:
the template.
Hint: If you want to see the template before copying, first click {{block type=”core/template” template=”inchoo/
on the “Preview” button on the right. bestseller.phtml”}}
b) To create the new template click on the “Add new template” Notice the type attribute. I used core/template which means
above the “Transactional Emails” list. This is the part where you can place this code anywhere in your site and it will work.
Magento helps you with the option to load a deafult template Code does not inherit any collection objects from controllers
for you to customize. Nice feature indeed. since it has none. All that is necessary for the bestseller.phtml
to work is defined in that single file.
Once you have loaded the deafult template give it a unique
name under the “Template name” input field by adding a
prefix of your own but leaving the deafult name as well.
Example: ” mysite :: New account “.
That way you can easily spot them in the long list of default
and custom emails.
Afterwards you can easily customize the verbiage and styling
within the “Template subject” and “Template content”.
The “Template content” is the body of the message that the
user will recieve upon transaction so be sure to change the E-
mail, name of the company etc. You’ll need to upload the logo
of your company in the images folder of the skin you’re using.
Once you are done with editing, save the changes and repeat
the process for the rest of the email templates.
2. Assigning the templates to different stores and storeviews
Assigning is the easiest part. Just go to the System One more thing: If you study the code in bestseller.phtml file
> Configuration > Sales > Sales Emails and select the you will see, at the very top of the file, the part that says: $this-
corresponding template minding the configuration scope. >show_total.
Created using zinepal.com. Go online to create your own zines or read what others have already published. 17
September 8th, 2009 Published by: inchoo
If I were to write • Support for Downloadable Products. (to see this new
product type in action visit the Magento Demo Store. We
{{block type=”core/template” show_total=”12″
added an example of an MP3 product and an eBook )
template=”inchoo/bestseller.phtml”}}
• Added Layered Navigation to site search result page,
in my home page, then $this would be assigned property
show_total with a value of 12. with control on the attribute level to include or exclude
attributes used on the search results page.
• Improved site search to utilize MySQL fulltext search
• Added support for fixed-taxes on product level for such
taxes as “State Environmental Fee” in the USA and
“WEEE/DEEE” in the EU.
• Upgraded Zend Framework to the latest stable version
1.7.2
• Added a Layered Navigation Cache for improved
performance of large catalogs (currently in beta and is
NOT recommended for production use).
Created using zinepal.com. Go online to create your own zines or read what others have already published. 18
September 8th, 2009 Published by: inchoo
simply create a promotion rule and say something like “Set all
the products in Category X to be on sale.”
I provided few screenshots at the bottom of this article to
provide a closer look at what I’m talking about. I will not go
into too much details here since this is a bit more advanced
HOW TO, but here is the process in a nutshell:
First, create a copy of /catalog/product/list.phtml file
and name it onsale_list.phtml. Here is my version of
onsale_list.phtml file.
Second, “activate” this new file. There are few ways you can do
this. Let’s say you wish to assign this onsale_list.phtml on one
of our categories, named “On Sale,” for instance.
We then go to Categories > Manage Categories > On Sale…
select Custom design and under Custom layout update, place
the following:
product_list_toolbar
If you now go to your category On Sale, it should only show
products you have assigned to category “On sale” that have a
special price set to them.
If you now wish to apply Promotion rules to entire “On sale”
category, then you simply assign a rule to one item, and all
the items assigned to the same “On sale” category (covered by
promotion rules) will be automatically listed in the grid.
Basically, the magic is in one simple IF statement
< ?php if(($_product->special_price !== null) or ($_product-
>_rule_price !== null)): ?>
for each block that lists products.
Check out the screenshots, they explain a lot.
Hope you find a way to try this out. Feel free to provide some
feedback or additional suggestions.
There are 3 comments
Magento
After many weeks of work, our 1st Magento project hit
the Web: TeraFlex Suspensions. As the purpose of the site
Created using zinepal.com. Go online to create your own zines or read what others have already published. 19
September 8th, 2009 Published by: inchoo
in not primarily selling, but also branding and community
development, we decided to use Wordpress and Magento
combination to accomplish the client’s goals.
How do you like the new site? Feel free to post a comment. 2. Find what power of 10 these are in.
3. If there’s 2 or less ranges available we go one power
There are 4 comments down.
Place Contact form in CMS Page in So one approach would to be to somehow override default
price filter logic by rewriting it and embedding some new logic
Magento | Inchoo of yours. I call this one head trough wall. I’m not implying
that this is wrong approach, on the contrary this is the generic
As you know, Magento has a built-in contact form that can
solution. However it does require some more time to come up
be used for general contacts. That form isn’t part of any CMS
with.
page, you cannot edit some introduction text, you cannot
add phone numbers administration, and you cannot see the Second solution is by far more easier. It involves using simple
breadcrumbs. If you wish to edit text in that default contact HTML (could use it in your static blocks).
form, you will need to update front-end files. Luckily, there is If one wishes to use the price range filter to filter trough entire
an alternative. product collection he can simply create a subcategory under
If you are a developer, editing your contact form HTML is an the Default root category and add all of the products to it. Then
easy task. You only need to open file: we write some static html code with urls made to fire up the
app/design/frontend/default/[yourtheme]/template/ price filter.
contacts/form.phtml and you will find your way around. Let’s look at the default Magento sample data. It gies you the
However, there are cases when you would like to give your following category layout
client an option to edit some intro text, edit his phone Root Catalog (6)
numbers, edit text behind the form, etc. You are probably
guessing that it would be nice to be able to embed contact form • Furniture (6)
in some CMS page. No problem.
• Living Room (4)
Created using zinepal.com. Go online to create your own zines or read what others have already published. 20
September 8th, 2009 Published by: inchoo
• Bed Room (4) Most of this is quite selfexplanaory so, for those who need
this kind of functionality across some special pages, hope you
Notice the url link above… It wont work if you put it like http:// integrate it withouth any problems.
somesite.domain/furniture/living-room/?price=1%2C199
There are 4 comments
It wont work like that because by default you do not have price
filter functionality covering second subcategory level. What
this means is that following link wont work Magentique - Magento Showcase
Launched | Inchoo
http://somesite.domain/furniture/living-room/?
price=1%2C199
Since the first subcategory level is Furniture, and second are We launched one internal project today: magentique.com. For
Living Room and Bed Room, by default the following url will the last few months we were working almost exlusively on
work with or withoutindex.php. Magento projects. As many of you, we were also wondering
what sites are developed with it. There are very little galleries
• url: http://somesite.domain/furniture/? that give the list of Magento powered stores and that’s how
price=1%2C199 this idea was created. We present you Magentique and hope
• url: http://somesite.domain/index.php/furniture/? you like it.
price=1%2C199 Curiosity about this project is that we used Magento to develop
it. You’ll not see a shopping cart or Add to Cart buttons, but
You could therefore create simple HTML like Magento was the tool we used. Take a look at the gallery,
<select onchange=”setLocation(this.value)”> comment the sites you like. Subscribe to RSS. Share it with
<option value=”http://somesite.domain/all/? you friends. Also, we would welcome your submissions of new
price=1%2C10000″> <!– Here you place your own ranges – stores you own, you created or just the ones you like.
>
0,00 € – 10 000,00 €
</option>
<option value=”http://somesite.domain/all/?
price=2%2C10000″> <!– Here you place your own ranges –
>
10 000,00 € – 20 000,00 €
</option>
<option value=”http://somesite.domain/all/?
price=3%2C10000″> <!– Here you place your own ranges –
>
20 000,00 € – 30 000,00 €
</option>
</select>
And put it into some of the static block. Notice the links in
above HTML code. The /all part of the url is the url key of the Hi,
All category in which we added all of our products. I like your work with Magento, and i see that y’re not
Last, but not least is understanding of the “price=…” affraid of experimenting. My question is relative to http://
parametar. www.raspberrykids.com. I like the layout, especially folder tab
with ‘Description’, ‘Tags’ etc. I didnt find such a feature in
1%2C10000 – where 1 stands for first range of 10000 (last Magento. Can you explain it on Inchoo web (in some article),
number) of course, only when it isnt company secret ) Thankx. Have
or a nice day.
2%2C10000 – where 2 stands for second ranfge of 10000, Online stores on magentique.com are not only our works.
(first would be 0-10000). Magentique is the gallery that lists all Magento sites and not
only our portfolio.
So if we were to write something like
3%2C10 it would be the price range from 20-30, where 3 Regarding blog topics, we try to write about the things we work
stands for third range of tens (number 10). Firs is from 0-10, on. However, we can not cover all Magento possibilities. Hope
second 10-20, third 20-30. you agree.
Created using zinepal.com. Go online to create your own zines or read what others have already published. 21
September 8th, 2009 Published by: inchoo
Can an online store have only one product? Sure it can and <label for="lastname">< ?php echo $this->__('Last name') ?>
we give you the one that just launched. Kapitol Reef was <input id="lastname" name="lastname" class="<em/><strong>inp
founded to develop, perfect, manufacture and market a new
breed of snorkels based upon pressure-balanced breathing in <label for="useremail">< ?php echo $this->__('Email') ?> <sp
the aquatic environment. The entire focus for this company <input type="text" name="useremail" id="useremail" class="<e
is to deliver best-of-class products, starting with the snorkel. <input type="submit" name="submit" value="<?php echo $this-/
Kapitol Reef is in the market for many years and this week
they published a new site. Similar to our work on Teraflex </form>< ?php /* END OF my-custom-form */?>
project, we used Wordpress and Magento platforms for the
<script type="text/javascript">
development.
//< ![CDATA[
The request was to have an extensive online store solution var customForm = new VarienForm('<em><strong>my-custom-form<
with multiple customers groups. Those groups should have //]]>
</script>
different product prices and different payment options.
Magento seemed like a great solution for such a request, You will notice all of the input fields have one common
although the initial concern was if it might be an overkill class name, required-entry. I’m not gonna go over all of the
considering the fact we only have one product to start with? available class names here. To find available class names, try
When the development started to roll out, the concern was no going to One page checkout page, where you have checkout
more. This will work superbly. We give you the new Magento form, then simply view source and look for class names next
store that uses a combination of Wordpress and Magento. to input, radio select and other fields.
Magento portion of the site is visible from the Online Store tab. Most important thing besides assigning class names is that
little piece of JavaScript below the form. Remember to pass
form id into the new VarienForm object.
Basically thats it. Constructing the form this way, automaticaly
makes your form reuse already existing validation code, the
one that the rest of the shop is using.
There are 5 comments
One of the coolest things in Magento is a form validation, and 2. Don’t click suspicious links. These kind of attacks are
the way how it’s done. Magento uses Prototype library (which, usually done through malformed links that admin clicks
personlay, I’m not a big fan of) to manage form validation. All through mail, comment, or any other source.
you need to do when writing custom form is to assign a valid 3. Clear “saved passwords” from browsers. Since most
class names to your input fields. Here is an example of how web browsers offer to remember passwords, and then
your custom form might look in order to get use of automatic autocomplete them, these kind of attack could easily stole your
form validation. password.
<form name="<em><strong>my-custom-form</strong>" id="my-custom-form" action="" method="post">
<label for="firstname">< ?php echo $this->__('First name') ?> <span class="required">*</span></label><br />
<input id="firstname" name="firstname" class="<em/><strong>input-text required-entry</strong>" />
Created using zinepal.com. Go online to create your own zines or read what others have already published. 22
September 8th, 2009 Published by: inchoo
There are 4 comments This really depends on your server configuration, however
it’s always good to restore permissions to defaults if they are
changed to 777, just to be sure.
Magento Connect
One of the first things that really confused me when i Magento™ and Google™ Website
start using Magento is Magento connect. I just started
learning things, so i was looking for some plugin examples. I Optimizer
visited Magento connect page with extensions and looked for I attended a webinar yesterday called “Maximizing Magento
download button, instead i found “Get extension key” one. Webinar: Optimizing Conversions with Website Testing.” It
If i recall correctly their What is this? explanation wasn’t the was a nice and informative hour-long webinar with Google and
same back then .. or i was just so terrified of Magento at start Magento team speakers that provided us some really useful
that i didn’t understand anything at that point I knew i information.
need to paste that key somewhere, in something they called First of all, you should know what Google Website Optimizer
my Magento connect manager or Magento downloader, but i is. It’s a powerful tool that allows you to test various page
didn’t understand where it is. concepts directly on your visitors and see which of your ideas
Visit Magento connect page. There are really some great works best in practice.
extensions there and many of them are free. The idea behind Google Website Optimizer is “You should
Find extension that interest you, click “Get extension key”, test that.” If you have an idea you don’t know will work—or
agree with license agreement and get key. Pay attention to whether it will increase you conversions—Google has created
Stability description field (stable, alpha, beta). this tool to help you test it.
Google Website Optimizer is easily integrated in Magento.
You can test various changes on your product pages and see
which ones work best for your visitors. Only product page
integration between Magento and Google Website Optimizer
is made for now, however according to Roy Rubin, we can
expect integration with our shopping cart and checkout pages
soon.
What Google Website Optimizer does is serve different
variations of your site to the visitors so that you can test which
one converts best. You can set up easily “A-B compare” where
you serve half of your visitors one page variation and half
of your visitors another. Then all you have to do is compare
results or set up multiple page variations. The Optimizer gives
you nice, clean reports where you can see how are your page
variations performing. To learn more about conversion rates,
read how to improve your web shop conversion rates.
TIPS:
Created using zinepal.com. Go online to create your own zines or read what others have already published. 23
September 8th, 2009 Published by: inchoo
There are 1 comments wonder where did I pool the number “11″ from?
If you open your database (with any tool), and go
to sales_order table, you will notice entity_type_id
Extending Order object and hooking on column. Each and every entry in sales_order table
event in Magento has the same value for entity_type_id column. In my
Magento installation, this value is “11″. Keep in mind
One of my previous articles was a Magento Event Hooks. that this does not have to mean yours will also be the
This one will be a practical example on using the event same.
hooks. Although the more proper way would be to call them To confirm everything went ok, just Search the database
Observers, bare with me. I’m use to this “hooks”. for the “inchoo_custom_info” (or whatever you used for
Here’s the walk-trough on how to add a new property attribute name).
(attribute) to an object (Mage_Sales_Model_Order object in
our case). Ok, now that we added new attribute (property) to Order
object, we will go on to Observer part. We will create a
To add an attribute to object, we need (the dirty way) 2 little hook that will watch for successfull checkout process and
steps trigger appropriate code execution. In my example I needed
to add some extra info to order upon it’s successfull creation.
• Go to app/code/core/Mage folder. If you drill down
Meaning as soon as checkout process is successfully executed,
into most of the folders and go to /Model subfolder
order is stored in database with some extra info I saved in its
there you will see /Entity subfolder under /Model for
previously created field “inchoo_custom_info”.
most of the stuff (modules) under /Mage. For our
example we go to app/code/core/Mage/Sales/Model/ Here is my Observer file, I called it Observer.php and
Entity/Setup.php file. This Setup.php file holds Objects it’s saved under app/code/local/Inchoo/HookSystem/Model/
fields definitions in database. We need to add new fields Observer.php.
to public function getDefaultEntities(). Once again, this
< ?php
is the “quick” and “dirty” way of adding new attributes.
The “propper” way would be to create the sql file and class Inchoo_HookSystem_Model_Observer
update config file to read the new sql file and… Whatever, {
I haven’t got the whole day Here is the code in my /**
* Event Hook: checkout_type_onepage_save_order
example, that I added to the array in public function * @param $observer Varien_Event_Observer
getDefaultEntities(). */
'inchoo_custom_info' => array(
'type' => 'text', public function hookToOrderSaveEvent()
'backend' => '', {
'frontend' => '', /**
'label' => 'Extra info', * NOTE:
'input' => 'textarea', * Order has already been saved, now we simply add some stuff
'class' => '', * that will be saved to database. We add the stuff to Order
'source' => '', * called "inchoo_custom_info"
'global' => */
Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE,
'visible' => true, $order = new Mage_Sales_Model_Order();
'required' => false, $incrementId = Mage::getSingleton('checkout/session')->getLa
'user_defined' => false,
'default' => '', $order->loadByIncrementId($incrementId);
'searchable' => false,
'filterable' => false, $extraInfo = array(
'comparable' => false, 'shirt_color' => 'Freakin cool blue color',
'visible_on_front' => true, 'developer_is_freak' => true,
'visible_in_advanced_search' => false, 'coded_by' => 'Branko Ajzele, Web Application Develop
'unique' => false, );
),
$extraInfo = serialize($extraInfo);
Basically you can copy-paste some existing attribute that
$order->setData('inchoo_custom_info', $extraInfo);
suites you the most and just change the array key name.
$order->save();
• Run this code only once (you can place it inside any file,
like index.php or view.phtml or any other that you will }
}
execute) then uncomment or remove this code.
Since
$setup = new Mage_Eav_Model_Entity_Setup('core_setup'); this is a module, we also need to add some config
$AttrCode = 'inchoo_custom_info'; files. Here is the content of my app/code/local/Inchoo/
HookSystem/etc/config.xml
$settings = array('position' => 1, 'is_required' => 0);
$setup->addAttribute('11', $AttrCode, $settings); < ?xml version="1.0"?>
<config>
NOTE: In code above, note the line $setup-
>addAttribute(’11′, $AttrCode, $settings). You probabily
Created using zinepal.com. Go online to create your own zines or read what others have already published. 24
September 8th, 2009 Published by: inchoo
<global> avoid editing the default one). You can download Admintheme
<models> module here.
<hooksystem>
<class>Inchoo_HookSystem_Model</class> Important: Our colour highlighting plugin on this site seems to
</hooksystem> lower-case some tag names on xml code, so keep that in mind
</models>
</global>
if you experience some trouble with sample code.
Huh, we are done! Final result is shown on image.
<frontend>
<events> Cheers…
There are 8 comments
<checkout_onepage_controller_success_action>
<observers>
<hooksystem_order_success>
Display Promotion
There are two unused product list blocks in Magento which
can be very useful if you push a few buttons, edit few layouts ..
1. Promotion
Block located in app\code\core\Mage\Catalog\Block
\Product\List\Promotion.php
This is basically built in featured product functionality. It
reacts to “promotion” attribute which needs to be created, so
let’s click
Catalog->Attributes->Manage Attributes->Create New
Attribute
Attribute Code: promotion
Scope: Global
CoffeeFreak – Blank Magento extension Catalog Input Type for Store Owner: Yes/No
for building main admin menu with
sidebar and tabs
My previous article, CoolDash – Blank Magento extension for
building admin system configuration area, was about blank
start-up extension for building System > Configuration admin
area. I used a lot of “funny” attribute names so that “get
around” gets some speed. This extension is somewhat similar
to previous one, except its meant to be a blank start-up
extension for building items under main admin menu with
sidebar and tabs.
Keep in mind that, once again, extension name is something I
popped out of my head while I was making myself a coffee:).
Below are two screenshots for you to see final result.
In short, this extension demonstrates the use of controllers
(router definition under config file) and widgets in Magento.
Download Inchoo_CoffeeFreak extension for Magento.
Hope you find it useful.
Label: Promotion (second tab)
Offline Magento problems Other params can be left alone, but it’s up to you of course. I
also labeled it Promotion just for this article.
I was working recently on a local server without internet
Now we need to add created attribute to attribute set, so
connection (nothing can stop us !! ) and i noticed that navigate to
Magento administration is extremely slow. Some parts of Catalog->Attributes->Manage Attribute Sets
administration took up to 10 seconds to load.
On every page view in admin Magento was trying to resolve select attribute set you’re using and drag promotion to General
widgets.magentocommerce.com address and connect to it few group for example.
times which caused time delay. His notification system was
trying to grab new message.
The solution was to disable Mage_AdminNotification module
and since i was offline i didn’t really need it. You can do it in
System -> Advanced -> Disable modules output
Some other admin parts which are using online resources will
still be slower, like Dashboard for example because it is using
Created using zinepal.com. Go online to create your own zines or read what others have already published. 28
September 8th, 2009 Published by: inchoo
<block type="catalog/product_list_random"
name="product_random" template="catalog/product/
list.phtml"/>
since it also extends product_list block, however, since it is
random product listing, that toolbar has no purpose here, so
create phtml that will suit your shop needs, based on catalog/
product/list.phtml. For example, i’m using similar Random
block to display random products in sidebar.
So long, take care, i’m off …
There are 6 comments
Created using zinepal.com. Go online to create your own zines or read what others have already published. 30
September 8th, 2009 Published by: inchoo
• Unique features. – Your online store is specific, you are $shippingPrice = '0.00';
a member of some niche. Most niches will require some }
additional functions that Magento doesn’t support by $method->setPrice($shippingPrice);
default to make the best out of your online store. If you $method->setCost($shippingPrice);
choose to work with experienced development company,
they will be able to provide you with development $result->append($method);
solutions for your problems. This is something you can’t }
get with free or premium Magento themes. return $result;
}
There are 2 comments
public function getAllowedMethods()
}
In this article I will demonstrate how to write custom shipping
method in Magento commerce. Pay attention on following lines:
First we need to write our shipping method, it’s a class in folder $method->setCarrier('inchoocustom');
app/code/core/Mage/Shipping/Model/Carrier/. $method->setCarrierTitle($this->getConfigData('title'));
CMS pages
<type translate="label">
<label>Type</label>
<frontend_type>select</frontend_type>
Latest version of Magento, as of time of this writing, is 1.3.2.3.
<source_model>adminhtml/system_config_source_shipping_flatrate</source_model>
<sort_order>4</sort_order> Latest, as well as previous versions come with “half-packed”
support for TinyMCE editor. There are however few bugs and
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
few steps that need to be handled in order to enable wysiwyg
<show_in_store>0</show_in_store>
</type> editing in CMS pages. Personally I am not that big of a fan
<sallowspecific translate="label"> of wysiwyg editors, mostly because I am developer and like to
know what I write down.
<label>Ship to applicable countries</label>
<frontend_type>select</frontend_type>
<sort_order>90</sort_order> However, most of the store owners are not developers or even
not that much technically savvy people (not that this is a
<frontend_class>shipping-applicable-country</frontend_class>
bad thing) and they could use wysiwyg editors when adding,
<source_model>adminhtml/system_config_source_shipping_allspecificcountries</source_model>
modifying content.
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>0</show_in_store> Here I will walk you trough few simple steps that will make
</sallowspecific> you enable wysiwyg editing by using TinyMCE. You can see
<specificcountry translate="label">
the screenshots of final result below.
<label>Ship to Specific countries</label>
Step 1: Download and unpack TinyMCE to root /js folder.
<frontend_type>multiselect</frontend_type>
<sort_order>91</sort_order> Two things to keep in mind here. Download regular version
<source_model>adminhtml/system_config_source_country</source_model>
(not jQuery version) of TinyMCE. This is due to the fact that
<show_in_default>1</show_in_default>
Magento uses Prototype, so we need to avoid conflicts. Second,
<show_in_website>1</show_in_website>
<show_in_store>0</show_in_store> watch out for unpack location. Your tiny_mce.js file should be
</specificcountry> accessible on js/tiny_mce/tiny_mce.js path.
<showmethod translate="label">
Step 2: Open the app/code/core/Mage/Adminhtml/Block/
<label>Show method if not applicable</label>
Cms/Page/Edit/Tab/Main.php file. Locate the
<frontend_type>select</frontend_type>
<sort_order>92</sort_order>
<source_model>adminhtml/system_config_source_yesno</source_model>
$fieldset->addField('content', 'editor', array(
<show_in_default>1</show_in_default>
'name' => 'content',
<show_in_website>1</show_in_website>
'label' => Mage::helper('cms')->__('Content'),
<show_in_store>0</show_in_store> 'title' => Mage::helper('cms')->__('Content'),
</showmethod> 'style' => 'height:36em;',
<specificerrmsg translate="label"> 'wysiwyg' => false,
<label>Displayed Error Message</label>
'required' => true,
<frontend_type>textarea</frontend_type>
));
<sort_order>80</sort_order>
and change it to
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store> $fieldset->addField('content', 'editor', array(
Created using zinepal.com. Go online to create your own zines or read what others have already published. 32
September 8th, 2009 Published by: inchoo
'name' => 'content', file. If you are using store that does not have url rewrites
'label' => Mage::helper('cms')->__('Content'), this is something that needs to be done because your
'title' => Mage::helper('cms')->__('Content'),
'style' => 'height:36em;', javascript file would not be found if you go trough link
'wysiwyg' => true, like “http://store.local/index.php/js/tiny_mce/tiny_mce.js”.
'theme' => 'advanced', Then you would get TinyMCE shown on CMS page but it would
'required' => true, be disabled.
));
As you can see, there were only three minor changes needed
As you can see, here we changed on existing attribute (download, modify, modify) to get the TinyMCE editor
(’wysiwyg’) value and added new attribute ‘theme’. working.
Step 3: Open the /lib/Varien/Data/Form/Element/ Hope this helps. Cheers.
Editor.php file and locate the method getElementHtml().
Here we change There are 3 comments
Inchoo
<script type="text/javascript">
//< ![CDATA[
/* tinyMCE.init({
mode : "exact", I was playing with some of the Magento controller functions
theme : "'.$this->getTheme().'", today, when I saw my coworker Vedran Subotic struggling
elements : "' . $element . '", with turning the Path hints in On and Off every few minutes.
theme_advanced_toolbar_location : "top", Idea cross my mind, and here is the result Inchoo’s Magento
theme_advanced_toolbar_align : "left",
theme_advanced_path_location : "bottom", Developer Toolbar prototype.
extended_valid_elements : "a[name|href|target|title|onclick],img[class|src|border=0|alt|title|hspace|vspace|width|hei
< ?php
theme_advanced_resize_horizontal : "false",
theme_advanced_resizing : "false",
class Inchoo_Hints_IndexController extends Mage_Core_Control
apply_source_formatting : "true",
{
convert_urls : "false",
force_br_newlines : "true",
public function init()
doctype : \'< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.
{
});*/
//]]>
}
</script>';
public function indexAction()
to
{
$hints = $this->getRequest()->getParam('hints');
$_storeBaseUrl = str_replace('index.php', '', Mage::getBaseUrl());
try {
How to use WordPress home page in /*
//IF YOU HAVE WORDPRESS AND MAGENTO INSTALLED EACH IN ITS OW
Magento home page (CMS page) $conf = array(
'host' => 'localhost',
Simple : ) -Ok, lets get down to business. This one is really, 'username' => 'wordpress_db_username',
'password' => 'wordpress_db_password',
really simple, but powerful. In all it greatness Magento
'dbname' => 'wordpress_db_name'
lacks the good content management solution (CMS features). );
Lot of people are heading down the road of integrating
Created using zinepal.com. Go online to create your own zines or read what others have already published. 34
September 8th, 2009 Published by: inchoo
$_resource = Mage::getSingleton('core/resource'); visitors are able to subscribe to your newsletter via Magento
//Create new connection to new server and new databse Newsletter subscription form in sidebar.
$_conn = $_resource->createConnection('place_some_free_random_resource_name_here', 'pdo_mysql', $conf);
*/ Besides newsletter subscribers, all of your store’s registered
users will also appear in your Magento’s newsletter e-mail
$_homePageContent = $_conn->fetchOne($_findHomePage);
}
database. This database also contains information on different
store views, allowing you to easily send multiple variations
catch (Exception $ex) { of your newsletter to different store view subscribers. This
feature is extremely useful when dealing with multiple
//SEND EXCEPTION INFO TO ADMIN? language web shops.
/*
How to send a Magento Newsletter?
* USE $emailSmtpConf, $transport and $mail->send($transport); in case you need to specify SMTP manualy
$emailSmtpConf = array( Newsletter Template:
'auth' => 'login',
'ssl' => 'tls', The process of sending out Magento Newsletter starts
'username' => 'some_email@gmail.com', with creation of Newsletter Template. Once you create this
'password' => 'some_pass_here' template, the template will remain there even after you send
);
your newsletter to subscribers, allowing you to change it and
use $emailSmtpConf);
$transport = new Zend_Mail_Transport_Smtp('smtp.gmail.com', it multiple times. You can create multiple newsletter
*/ templates with different styling and test them to see which one
attracts the most response from subscribers.
$_sendTo_email = 'ajzele@somemail.com';
$_sendFrom_email = 'branko.ajzele@somemail.com';
Magento Newsletter
If you’re using Magento you probably noticed by now that
you have integrated newsletter system with it. By default,
Created using zinepal.com. Go online to create your own zines or read what others have already published. 35
September 8th, 2009 Published by: inchoo
You also need to set a Queue date start. Notices that the date and we don’t want SIDs to appear to those visitors. Most
and time you set are in fact server date and time, not your date important: We don’t want that search engines index the URLs
and time. If you wish to send your newsletter immediately, you with SIDs.
need to set it to your current server date and time or set it into
Many people wonder why sometimes the SID part appears in Save the file and you should be good!
their Magento URLs. This is when your URL has additional To assist your integration, MerchantPlus created the following
SID query usually at the end. Take a look at the image. The developer tools (you will not need them in our case):
curiosity is that it does not appear always. What is the most
common scenario it happens? You didn’t access the site with For more information on the connection API, see
the same domain variant you entered as your “Base URL” in Authorize.net’s AIM documentation.
your System> Configuration> Web interface.
There are 1 comments
When you decide to launch the site, you have to decide
whether you will market http://www.domain.com/ URL or Magento Flash Widgets Extension – AMF
Point
http://domain.com/. This is an important decision and you
shouldn’t change your mind quite often. Search engines
usually treat those two URLs as a different sites and therefore If you read our previous article where we made it clear we were
the Page Rank potential can be split between those two URLs. working on something interesting for Magento store owners,
So, think about whether you will use www or not and stick by you could see this coming.
this decision.
Once you decided, go to your System> Configuration> Web
interface and enter the desired form to “Base URL” field. When
you access the site you will notice that there are no “SID”s
when the URL matches the value from “Base URL” field and
they appear when it does not.
Now, we want the ability that the site redirects to proper URL
once accessed. Someone can place a wrong link to some forum
or blog. We don’t want those links to lead to improper URL
Created using zinepal.com. Go online to create your own zines or read what others have already published. 36
September 8th, 2009 Published by: inchoo
1. Logging to Google Analytics Forums say that older versions of Magento before 1.2 do not
2. Select an account for this site properly track eCommerce data. In case you have older version
of Magento and have this issue, do not install some special
3. On the list of Account profiles, do not go to the reports, plugins. Upgrade Magento instead.
click on Edit instead
There are 4 comments
4. On the first box “Main Website Profile Information”,
there is another Edit link to the right. Click on it.
5. One there, you will see the interface similar to the one Magento CMS syntax – part1
on this image. Let Google Analytics know this is an Every Magento user noticed that there is special
eCommerce website {{magentocode}} syntax available in cms pages and blocks.
We traced a bit to find out which params are available and
what exactly they do.
As strange as this may sound, processor class that gets called is
Mage_Core_Model_Email_Template_Filter located at app/
code/core/Mage/Core/Model/Email/Template/Filter.php .
There are also some interesting directives in superclass
Varien_Filter_Template, but if i’m not mistaken, none of
them can be used.
There are six replacement codes that can be used and each
triggers its equivalent Directive function:
skinDirective
Created using zinepal.com. Go online to create your own zines or read what others have already published. 37
September 8th, 2009 Published by: inchoo
mediaDirective Example: {{store url=’customer/account’ _query_a=’8′}}
storeDirective Params:
Synonym: Mage::getDesign()->getSkinUrl($params['url'], custom = if using magento route url param, every custom
$params) param added will be appended like /a/8/b/10
I probably missed something in this last one, but it’s very late
Params: and i’m tired of poking through Magento
<action method=”addItem”><type>skin_js</
type><name>facelift/flir.js</name></action>
</reference>
There is nice Quick Start Guide and Documentation available
from FLIR homepage, so i won’t go in details on some
advanced FLIR settings, but here are few examples:
//pass selectors as comma separated list
FLIR.auto(’h5,h4′);
Created using zinepal.com. Go online to create your own zines or read what others have already published. 39
September 8th, 2009 Published by: inchoo
Created using zinepal.com. Go online to create your own zines or read what others have already published. 40
September 8th, 2009 Published by: inchoo
custom script I wrote. After that i noticed the data in flat tables
got rebuild as well. This of course took several hours. Magento
EAV model seems OK on paper, but with store that hold’s large
number of products it simply does not work, at least not in way
in which their collection objects are built. Changes introduced
in form of flat tables in versions 1.3 should, to some extent,
improve work with stores that have large numbers of products.
However this improvement seems to come in form of “copy all
data from scattered tables to single flat table”.
Solutions like these are nightmare when it comes to upgrading
the store that already has large number of products in. System
is expected to handle part of the job transparently but it failed,
leaving the client with corrupted database.
So, a word of advice for upgrading an existing Magento store:
NEVER do it on live site. Let professional developer transfer
live site and database to his dev machine, or make a copy on
some sub folder on live site. Magento’s extreme out of the
box feature rich capabilities, open source philosophy and good
marketing have made it extremely popular but be careful, free
is such a a loose term.
I am really anxious to see the future path of EAV vs Flat model
in Magento.
EAV, also know as Entity Attribute Value was suppose to There are 8 comments
bee (or is) the next big thing in OOP. Anyhow, Magento and
his way of EAV have two huge downfalls called LACK OF
DOCUMENTATION and WHAT WILL THEY CHANGE IN
Updating options of configurable product
NEXT UPGRADE. The other day I was working on a Magento that is already in the cart
shop that had 22 000 products. Almost all of them were simple
products, just about 600 were grouped. The store was initially < ?php
if($this->getProduct()->isConfigurable()){
installed on Magento 1.2 version. Site was pretty much 95%
$_product = Mage::getModel('catalog/product')->load($this->g
complete from both graphic and development perspective. Mage::getBlockSingleton('catalog/product_view_type_configura
Anyhow, Magento version 1.3.1 was released and on client $_configurable = Mage::getBlockSingleton('catalog/product_vi
demand we decide to to upgrade. Important thing to keep $_cdata = json_decode($_configurable->getJsonConfig());
in mind is that in version 1.3 Magento introduce “change in $_current = array();
foreach((array)$this->getOptionList() as $_option) {
philosophy” concerning the EAV model. $_current[$_option['label']]=$_option['value'];
Altough EAV sounds great (and really is great for most of }
foreach($_cdata->attributes as $attribute) {
the time), it can really slow things down with all those
?>
JOINS executed on database. So the Magento team decided <strong>< ?php echo $attribute->label; ?></strong>
to do a little flat tabling. Basically we now have massive data <select style="width:150px;" name="cart[<?php echo $_item->g
duplication in MySQL where data is taken from various tables < ?php
and copied int one, the flat table. Flat tables were introduced foreach($attribute->options as $option) {
?>
for both Products and categories, in regards to various website
<option <?php echo ($_current[$attribute->label]==$option->l
and store views. < ?php
Basically Magento has the power to “on the fly” create tables }
?>
and do the “magical” copying of data from various tables to </select>
the flat tables. I assume they were looking for a faster way to < ?php
“assemble” Product objects in Magento which in turn should }
boost the speed of collection object i grew so found about. I can } else {
live with duplicated data in database, I mean I am not the one // THIS IS PLACE WHERE EXISTING CODE from [*] goes
}
writing them down. But let me get back to real world scenario. ?>
As I mentioned, store I have been working on had more
than 20 000 products. Due to limitations of both MySQL Now you are done with template and you can style it as you
and PHP failed to do Rebuilt that you can find in System wish as soon as you do few additional steps.
> Configuration > Cache management. This failure caused < ?php
corrupted data in database. This manifested with “empty”
attributes (attributes not showing up in Layered navigation). I class YOUR_FIRM_MODULE_NAME_Model_Card
resolved the issue by “re saving” all of the 20 000 product with {
public function update($e)
Created using zinepal.com. Go online to create your own zines or read what others have already published. 41
September 8th, 2009 Published by: inchoo
{ $emailTemplateVariables['myvar1'] = 'Branko';
$_this = $e->cart; $emailTemplateVariables['myvar2'] = 'Ajzele';
$data = $e->info; $emailTemplateVariables['myvar3'] = 'ActiveCodeline';
Magento custom emails And lets not forget the email template itself, app/locale/
en_US/template/email/
Ever wanted to “just send the email” using the built in email activecodeline_custom_email1.html.
features in Magento? Ever hit the wall trying to do something
with Magento? OK, I know the answer to the other one, just <!--@subject ActiveCodeline custom email module @-->
had to ask . Anyhow, sending the emails with Magento
<div>
turned out to be a process of “just” a few hours of tracing <h1>ActiveCodeline custom email example by Branko Ajzele</h1
Magento code. <p>Hi there {{var myvar1}} {{var myvar2}} from {{var myvar3}
</div>
I cant wait for smart comments like, “few hours, huh its
so easy…”. Yea, thats the beauty of Magento… few hours of Hope this was helpful. Cheers.
bashing your head against the wall while you are sipping the
4th cup of coffee until the solution hits you. Interesting do, just There are 8 comments
when you get the hang of it, Magento gets you this “have you
tried this” attitude . Getting started with building Admin
What am I talking about? Scenario: I want to create email
template named activecodeline_custom_email1.html, I want
module in Magento
to pass few variables to it during runtime, I want to send emails
Due to the “complexity” of Magento’s xml files, developers can
programmaticaly. I dont want to create 56 lines of xml file just
waste great amount of time on “unnecessary” things.
to call one template. When I say “complexity” I say it with purpose. XML files are
Here is how. not so complex by them selves, but due to extreme lack of
documentation and changes Magento pumps in every new
... “major” release, people are lost among things that should
/* really be sideways. Anyway, in this little article I will show you
* Loads the html file named 'custom_email_template1.html' from
how to create basic, startup structure for your module to get it
* app/locale/en_US/template/email/activecodeline_custom_email1.html
*/ shown under Magento Admin main top menu.
$emailTemplate = Mage::getModel('core/email_template')
As you can see on the picture below, I am creating a menu item
->loadDefault('custom_email_template1');
with title “ActiveCodeline_SampleModule1″.
//Create an array of variables to assign to template
$emailTemplateVariables = array();
Created using zinepal.com. Go online to create your own zines or read what others have already published. 42
September 8th, 2009 Published by: inchoo
My module is called “SampleModule1″ and it consists of just </config>
a few files. As you go over the provided config.xml file you
My “admin” controller is extremely simple, just an
will see that I used “BigLettersSmallLetters” style. I do this
indexAction() method. However it does tell a lot. Below is a
intentionally because this “naming convention” is another
code of indexAction() method.
great pitfall for developers when it comes to constructing
xml files. I know I too still struggle with “what must be the
lowercase” question. ...
public function indexAction()
Here is my example of config.xml file {
// "Fetch" display
$this->loadLayout();
< ?xml version="1.0"?>
// "Inject" into display
<config> // THe below example will not actualy show anything sinc
<modules> $this->_addContent($this->getLayout()->createBlock('core
<activecodeline_samplemodule1>
<version>0.1.0</version> // echo "Hello developer...";
</activecodeline_samplemodule1>
</modules> // "Output" display
$this->renderLayout();
<global> }
<helpers> ...
<samplemodule1>
And below are all the files required for this “Admin
<class>ActiveCodeline_SampleModule1_Helper</class> example
</samplemodule1>
</helpers>
module” to work.
</global> Note this is only example, DO NOT USE on live site.
<admin> Cheers…
<routers>
<samplemodule1> There are 2 comments
<use>admin</use>
extension
<frontname>samplemodule1</frontname>
</args>
</samplemodule1>
</routers> I have been working on a project, in my own time, that involves
</admin> Flex – Magento communication. I decided to test Adobe’s
AMF format. In this article I will show you how easy is to create
<adminhtml>
<menu> AMF server as an extension in Magento.
So, where to we start?
<menu1 translate="title" module="SampleModule1">
<title>ActiveCodeline SampleModule1</title>
<sort_order>60</sort_order> The idea is to have special Url which will act as AMF endpoint.
<children> Since Magento is built on top of Zend, this is extremely easy
<menuitem1 module="SampleModule1">
to do.
<title>Menu item 1</title>
For your module to act as a basic AMF server you need
<action>samplemodule1/example</action>
</menuitem1> only 3 files. MyCompany_MyModule.xml that goes under
</children>
</menu1>
the /app/etc/modules/ folder. Then IndexController.php that
</menu> goes under the /app/code/local/MyCompany/MyModule/
<acl> controllers/IndexController.php. And last but not least
<resources> the config.xml file that goes under the /app/code/local/
<admin> MyCompany/MyModule/etc/ folder.
<children>
I will not go into the details and show you the full
<menu1 translate="title" module="SampleModule1">
<title>ActiveCodeline SampleModule1</title> content of each of those files. Important thing is to focus
<sort_order>60</sort_order>
on IndexController.php and config.xml files. Inside your
<children>
<menuitem1> IndexController.php file you will actualy hold the code for your
<title>Menu item 1</title> AMF server (Zend_Amf).
</menuitem1>
</children> Here is an example of indexAction from my
</menu1> IndexController.php file:
</children>
</admin>
</resources> ...
</acl> public function indexAction()
</adminhtml> {
//Create AMF server instance
Created using zinepal.com. Go online to create your own zines or read what others have already published. 43
September 8th, 2009 Published by: inchoo
$server = new Zend_Amf_Server(); develop a feature for Magento than for some other system out
there.
//setProduction(false): return exception info
$server->setProduction(false);
Above piece of code sets access to AMF server on Url like protected function _construct()
{
http://server/store/index.php/myamfserver. $this->addData(array(
Thats it. 'cache_lifetime' => 3600,
'cache_tags' => array(Mage_Catalog_Model_Product::CACHE_
There are 2 comments 'cache_key' => $this->getProduct()->getId(),
));
}
Top 5 annoying things in Magento or if you need some conditional approach like i did in this
If you ask me, there are two important things that make example define equivalent functions
Magento so attractive. First, its free and open source. Until
month ago Magento was fully free, now they have Community public function getCacheKey(){}
and Enterprise editions. But make no mistake, when it comes public function getCacheLifetime(){}
to out of the box feature list, Community edition will most public function getCacheTags(){}
likely beat any open source cart out there. Rich “out of the box”
features are the second thing that make it so attractive. because constructor approach isn’t enough in most scenarios.
There is a general misassumption about cache_lifetime. If
• Large number of files in system which makes it you set it to false, Zend cache will get default value of 7200
fully impractical to do installations and backup by seconds!! If you want infinite never expired cache set it
transferring files over FTP to 9999999999, which is Zend_Cache maximum value, or
something else big enough.
There are more to add to the list, but these are the ones that
caught my attention for most of the time. We do every day I believe that best way to activate this is to rewrite specific
Magento development, and believe me its quite hard to explain block with our own with caching enabled, like shown in
your client that sometimes it takes you 2-4 times more to example. You should always try to avoid modifying core files,
even copying modified Mage classes to local, because things
get really messy on updates.
Created using zinepal.com. Go online to create your own zines or read what others have already published. 44
September 8th, 2009 Published by: inchoo
Generated cached files can be found in usual subfolders of / <remove name="name_of_the_ol_block"/>
var/cache folder. Two files are generated, first metadata file
which contains serialized cache data and second one which is That’s it. You should now be free of product comparison for
cached html output itself. ever and ever
In my example:
There are 3 comments
mage—internal-metadatas—PRODUCT_INFO_STORE
+ID_PRODUCT+ID Magento duplicated content | Inchoo
mage—PRODUCT_INFO_STORE+ID_PRODUCT+ID Magento has several issues with duplicated content. Of course,
you don’t actually have two versions of the same content
Note that “Blocks HTML output” option needs to be enabled
in your database, however, in the eyes of search engines,
in Cache Management for this to work.
two different URLs serving same content are counted as
Many things in Magento can be cached in similar way and duplicated content and will cause you lots of problems. The
there are predefined mechanism waiting for you to use them. most obvious problem is that your page rank is leaking on
It’s possible that we’ll see more of this implemented in future different versions of virtually the same landing page. You also
Magento versions. might end up with having several versions of the same content
indexed which is bad in so many ways.
Removing Product Comparison in First duplicated content problem in Magento occurs when
you are listing a product in multiple categories. Magento will
Magento create several URLs that actually contain the same content
As many things in Magento, removing product comparison is such as:
not available thru the admin interface. Thus, leaving us with The easiest way to avoid this problem is to simply turn
the only option of getting down and dirty with theme files of the category based URLs in Magento admin panel. This
editing. way you will always serve exactly the same URL no matter
This guide is pretty straightforward and is based on the which direction user took to find your product and it will be
Magento ver. 1.3.1.1 example.com/product_name.html.
Before beginning of this procedure please Go However, you might actually want to have category based
to: System-> Cache Management and disable URLs for both usability and SEO reasons. Don’t worry, there
cache. You can turn it on after you’re done. is a solution for you here, it just involves a little more work to
do. What you need to do is put a rel cannonical on the URLs
Step 1 – reports.xml with category base pointing back to the original product URL.
Open: app/design/frontend/deafult/Your Theme name/ This probably sounds like some sort of voodoo but if you reed
layout/reports.xml and delete the following lines: about rel canonical it will be piece of cake.
This issue is also easily fixed by use of rel canonical. Simply
<block type="reports/product_compared" before="right.permanent.callout" name="right.reports.product.compared" templat
put a rel cannonical on all of the products with SID in URL,
pointing back toname="right.reports.product.viewed"
<block type="reports/product_viewed" before="right.permanent.callout" the product’s original URL. template="r
Step 2 – catalog.xml
Open app/design/frontend/deafult/Your Theme name/
layout/catalog.xml and delete the following line:
<block type="core/template" before="cart_sidebar" name="catalog.compare.sidebar" template="catalog/product/compare/si
Save the files and refresh the page you we’re checking. Product
comparison should not be there but if you click on any of the
products you ‘ll see that the “Add to compare” text link is still
there.
The way to remove it:
Step 3 – addto.phtml
Open up app/design/frontend/default/Your Theme name/
template/catalog/product/view/addto.phtml and delete the
following line:
< ?php if($_compareUrl=$this->helper('catalog/product_compare')->getAddUrl($_product) ): ?>
<li><span class="pipe">|</span> <a href="<?php echo $_compareUrl ?>">< ?php echo $this->__('Add to Compare') ?></a></
< ?php endif; ?>
Oh, of course theif you don’t want to actually delete the code
can always use the following:
Created using zinepal.com. Go online to create your own zines or read what others have already published. 45