Magento Layout
Magento Layout
Magento Layout
Alan Storm
April 2011
Contents
1
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
CONTENTS
6 CMS Pages 82
6.1 Creating a Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
6.1.1 Page Information : Page Title . . . . . . . . . . . . . . . . 85
6.1.2 Page Information : URL Key . . . . . . . . . . . . . . . . 85
6.1.3 Page Information : Store View . . . . . . . . . . . . . . . 85
6.1.4 Page Information : Status . . . . . . . . . . . . . . . . . . 85
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
CONTENTS
7 Widgets 98
7.1 Widgets Overview . . . . . . . . . . . . . . . . . . . . . . . . . . 98
7.2 Adding a Widget to a CMS Page . . . . . . . . . . . . . . . . . . 100
7.3 CMS Template Directives . . . . . . . . . . . . . . . . . . . . . . 102
7.4 Adding Data Property UI . . . . . . . . . . . . . . . . . . . . . . 103
7.5 Widget Templates . . . . . . . . . . . . . . . . . . . . . . . . . . 105
7.6 Instance Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
7.7 Creating an Instance Widget . . . . . . . . . . . . . . . . . . . . 108
7.8 Inserting a Widget . . . . . . . . . . . . . . . . . . . . . . . . . . 110
7.9 Behind the Scenes . . . . . . . . . . . . . . . . . . . . . . . . . . 111
7.10 Restricting Blocks. . . . . . . . . . . . . . . . . . . . . . . . . . . 112
7.11 Per Theme Widget Config . . . . . . . . . . . . . . . . . . . . . . 114
7.12 Wrap Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
CONTENTS
If you’re reading this intro, chances are you know something about Magento.
Maybe you’ve chosen it for your new online store, maybe it’s been chosen for
you, or maybe you’re just the curious type. Whatever the reason you’ve kicked
the tires, liked what you’ve seen, and ran to this book for help once you opened
the hood.
Magento isn’t just a shopping cart. It’s an entire system for programming
web applications and performing system integrations. The PHP you see here is
not your your father’s PHP. It’s probably not even your PHP. Magento takes
enterprise java patterns and applies them to the PHP language. More than any
system available today, it’s pushing the limits of what’s possible with object
oriented PHP code.
When it comes to layout engines, Most PHP MVC systems use a simple outer-
shell/inner-include approach. Magento does not. At the top of the Magento
view layer there’s a layout object, which controls a tree of nested block objects.
Magento uses a domain specific programming language, implemented in XML,
to create, configure, and render this nested tree of block objects into HTML.
This layer is separate from the rest of the application, allowing non-PHP devel-
opers an unprecedented level of power to change their layouts without having
to touch a single line of PHP code.
If the above paragraph was greek to you don’t worry, you’re not alone. With
all that power available there’s a learning curve to Magento that can be hard
to climb by yourself. This book is your guide up that learning curve. We’ll tell
you what you need to know to quickly become a Magento Layout master.
5
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
0.2 No Frills
Why No Frills? Because we tell you what you need to know, and nothing more.
Mandated book lengths make sense in a physical retail environment, but with
the internet being the preferred way of distributing technical prose, there’s no
need to pad things out.
With that in mind, lets get started!
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
The archive structure mirrors where the files should be placed in your system.
This is the standard layout of a Magento extension. Place the files in the same
location on your own installation, clear your cache, and the extension will be
loaded into the system on the next page request. For more background, read
the Magento Controller Dispatch and Hello World article online
http://alanstorm.com/magentocontroller hello world
If you’re not up for a manual instal, each archive is also a fully valid Magento
Connect package. Magento Connect is Magento Inc’s online marketplace of free
extensions. It’s also a package management system. For background on Magento
Connect and instructions for installing its packages, please see Appendix J.
to this
ini_set ( ’ dis play_err ors ’ , 1);
Seemingly invisible errors are one of the most frusting things for a developer
new to any system. By configuring Magento to fail fast we’ll be setting ourselves
up to better learn what needs to be done for any given task.
Magento’s a fast changing platform, and while the concepts in this books will
apply to all versions the specifics may change as Magento Inc changes its focus.
It should go without saying you should run the exercises presented here on
a development or testing server, and not your production environment. The
following legal notice is the fancy way of saying that
THIS BOOK AND SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
CONTRIBUTORS " AS IS " AND ANY EXPRESS OR IMPLIED WARRANTIES ,
INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES OF
M ER CH AN T AB IL IT Y AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
BE LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL ,
EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT LIMITED
TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR
TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF
THE USE OF THIS BOOK AND SOFTWARE , EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE .
We’ll be monitoring the site for any problems with code examples, and by asking
your questions in a public forum you’ll be helping the global Magento developer
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
community. Developers are often amazed when they find people across the world
are having the same problems they are, and often already have a solution ready
to share.
Additionally, each chapter will contain a link to a site online for discussions
specific to each chapter. You’re not just getting a book, you’re joining a com-
munity.
0.7 Let’s Go
That’s it for pleasantries, let’s get started. In the first chapter we’re going to
start by creating Magento layouts using PHP code.
Visit http://www.pulsestorm.net/nofrills-layout-introduction to join the discus-
sion online.
Chapter 1
Building Layouts
Programmatically
Before we can understand the layout system in its entirety, we need to under-
stand its individual parts. With that in mind, we’ll start with some simple
examples. A Layout can be defined with the following phrase
A Layout is a collection of blocks in a tree structure
So, let’s start by defining what a block is.
A Magento block is an object with a toHtml method defined. When this toHtml
method in called, it returns the string which should be output to the screen.
Typically ”the screen” means your web browser. In additional to having a
toHtml method, Magento blocks inherit from the Mage Core Block Abstract class.
This class contains a number of other useful block helper methods. We’ll get to
these eventually, but for now just think of a block as an object which has a
toHtml method, and when this toHtml is called output is sent to the screen.
Let’s give this a try. If you installed the Nofrills Booklayout module that came
with this book, you can open the following url on your system
http://magento.example.com/nofrills booklayout/index/index
which corresponds to the controller file at
app / code / local / Nofrills / Booklayout / controllers / I nd ex Co n tr ol le r . php
10
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
If you load the above URL with an unmodified extension, you should see a
mostly blank browser screen that looks something like Figure 1.1
Figure 1.1
Our first line instantiates a block object from the class Mage Core Block Text. Our
second line sets the text we want to output, and the third line calls the toHtml
method, which returns our string and echos the output.
If you reload your browser page, you should see the following output.
Hello World
So far so good. We now have an object oriented echo statement. In our example
above we instantiated a Mage Core Block Text object. When you call this type of
block’s toHtml method, it simply outputs whatever text has been set with the
setText method.
Magento has literally hundreds of different types of block classes for every pos-
sible need. The Magento core team subscribes to a style of development that’s
similar to Java and C# programming that says
When in doubt, make a new class
Each block type may have a slightly different implementation of how its toHtml
method is implemented. Fortunately, you don’t need to know what every single
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
block class does. In fact, you can accomplish most of what you’ll ever need with
with the Mage Core Block Template class.
With the above in your controller, reload the page and ... nothing happened.
That’s because we didn’t create a helloworld.phtml file. Let’s take care of that!
This allows you to rely on a the base Magento design package, and only add
files that you wish to change to your own packages and themes. See Appendix
E for more information if you’re interested in how this fallback system works.
Here’s a little trick to find out where Magento is loading any block’s template
from.
public function indexAction ()
{
$block = new M a g e _ C o r e _ B l o c k _ T e m p l a t e ();
$block - > setTemplate ( ’ helloworld . phtml ’ );
var_dump ( $block - > ge tTe mp la t eF il e ());
// echo $block - > toHtml ();
}
By calling the block’s getTemplateFile method, we’re doing the same thing Ma-
gento will when rendering the block. Running the above will result in
string ’ frontend / base / default / template / helloworld . phtml ’ ( length =47)
If you reload the page, you should see a hello world lorem ipsum, loaded from
the template, (see Figure 1.2 )
Figure 1.2
The <p> tag is the parent node, and the <span> is the child node. All blocks
share a similar relationship. Oversimplifying things a bit, this sort of paren-
t/child relationship is known as a ”Tree” in computer science circles.
Let’s consider our previous template block. Alter the phtml file so it contains
the following
<? php # File : app / design / f r o n t e n d / default / default / t e m p l a t e / h e l l o w o r l d . phtml
?>
<h1 > Hello World </ h1 >
<p >
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
There’s a few new concepts to cover here. First, you’ll notice we’ve dropped
into PHP code
<? php $this - > getChildHtml ( ’ the_first ’ ); ? >
You may be wondering what $this is a reference to. If you’ll remember back
to our definition of a template block, we said that each template block object
has a phtml template file. So, when you refer to $this within a phtml template,
you’re referring to the tempalte’s block object. If that’s a little fuzzy future
examples below should clear things up.
Next, we have the getChildHtml method. This method will fetch a child block,
and call its toHtml method. This allows you to structure blocks and templates
in a logical way. So, with the above code in our template, let’s reload the page,
(see Figure 1.3 )
Figure 1.3
Our second hard-coded paragraph rendered, but nothing happened with our
call to getChildHtml. That’s because we failed to add a child. Let’s change our
controller action so it matches the following.
public function indexAction ()
{
$ p a r a g r a p h _ b l oc k = new M a g e _ C o r e _ B l o c k _ T e x t ();
$paragraph_block - > setText ( ’ One paragraph to rule them all . ’ );
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
Here we’ve created a simple text block. We’ve set its text so that when the
block is rendered, it will output the sentence One paragraph to rule them all..
Then, as we did before,
$main_block = new M a g e _ C o r e _ B l o c k _ T e m p l a t e ();
$main_block - > setTemplate ( ’ helloworld . phtml ’ );
we define a template block, and point it toward our hello world template. Finally
(and here’s the key)
$main_block - > setChild ( ’ the_first ’ , $ p a r a g r a p h _ b l o c k );
Here we call a method we haven’t see before, called setChild. Here we’re telling
Magento that the $paragraph block is a child of the $main block. We’ve also given
that block a name (or alias) of the first. This name is how we’ll refer to the
block later, and what we’ll pass into our call to getChildHtml
<? php echo $this - > getChildHtml ( ’ the_first ’ ); ? >
Expressed as a generic XML tree, the relationship between blocks might look
like
< main_block >
< p ar ag ra p h_ bl oc k name = " the_first " > </ paragraph_block >
</ main_block >
A block may have an unlimited number of children, and because we’re dealing
with PHP 5 objects, changes made to the block after it has been appended will
carry through to the final rendered object. Try the following code
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
One final trick with rendering child blocks. If you don’t provide getChildHtml
with the name of a block, all child blocks will be rendered. That means the
following template will give us the same result as the one above
<? php # File : app / design / f r o n t e n d / default / default / t e m p l a t e / h e l l o w o r l d . phtml
?>
<h1 > Hello World </ h1 >
<p >
<? php echo $this - > getChildHtml (); ? >
</p >
<p >
The second paragraph is hard - coded .
</p >
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
And then add the following code to the specific controller action, and load its
corresponding URL in your browser
# http :// magento . example . com / n o f r i l l s _ b o o k l a y o u t / index / h e l l o b l o c k
public function h e l l o b l o c k A c t io n ()
{
$block_1 = new M a g e _ C o r e _ B l o c k _ T e x t ();
$block_1 - > setText ( ’ The first sentence . ’ );
When you load the page in your browser, you should see your helloworld.phtml
template rendered the same as before.
What we’ve done is create a new block named Nofrills Booklayout Block Helloworld.
This class extends Mage Core Block Template, which means it automatically gains
the same functionality as a standard template block.
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
There’s a few other special methods you can define in a block class. The first
that we’re interested in is beforeToHtml. When we call toHtml on our block, this
method is called immediately before the block content is rendered. There’s
also a corresponding afterToHtml($html) method which is called after a block
is rendered, and is passed the completed HTML string. We’re going to use
the beforeToHtml method to automatically add our two child blocks, making
everything self contained.
class N o f r i l l s _ B o o k l a y o u t _ B l o c k _ H e l l o w o r l d extends M a g e _ C o r e _ B l o c k _ T e m p l a t e
{
public function _construct ()
{
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
This will let us remove the extraneous code from our controller
public function h e l l o b l o c k A c t io n ()
{
$main_block = new N o f r i l l s _ B o o k l a y o u t _ B l o c k _ H e l l o w o r l d ();
echo $main_block - > toHtml ();
}
Again, a page refresh should result in the exact same page. We’ve gone from
having to manually create our hello world block with 10 or so lines of code
to completely encapsulating its functionality and output in 2 lines. This is a
pattern you’ll see over and over again in Magento.
If you reload your page with this in place, you’ll get the following error
Invalid method N o f r i l l s _ B o o k l a y o u t _ B l o c k _ H e l l o w o r l d :: fetchTitle ( Array
(
)
)
As previously mentioned, if you use the $this keyword in your template, you’re
referring to a template’s parent block object. Let’s add a method that returns
the page title
class N o f r i l l s _ B o o k l a y o u t _ B l o c k _ H e l l o w o r l d extends M a g e _ C o r e _ B l o c k _ T e m p l a t e
{
public function _construct ()
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
{
$this - > setTemplate ( ’ helloworld . phtml ’ );
return parent :: _construct ();
}
Reload the page with the above Nofrills Booklayout Block Helloworld in place, and
you’ll see your page with its new title.
This is the preferred way to create templates with dynamic data in Magento.
Your phtml file should contain
1. HTML/CSS/Javascript code
2. Calls to echo
3. Looping and control structures
4. Calls to block methods
Any PHP more complicated than the above should be put in block methods.
This includes calls to Magento models to read back data which was saved in the
controller layer.
Load your page and you’ll see the second hello world template rendered in your
browser, without any output for getChildHtml (as we didn’t add any child nodes).
There’s a lot new going on here, so let’s cover things line by line.
$layout = Mage :: getSingleton ( ’ core / layout ’ );
This instantiates your layout object as a singleton model (see below). The string
core/layout is known as a class alias. It’s beyond the scope of this book to go
fully into what class aliases are used for (see Appendix B: Class Alias for a better
description), but from a high level; when creating a Magento model, a class alias
is used as a shortcut notation for a full class name. It can be translated into a
class name by the following set of transformations
Core Layout // adding a space at the slash , and c a p i t a l i z i n g
Core Model Layout // Add the word Model in between
Mage Core Model Layout // Add the word Mage before
Mage_Core_Model_Layout // u n d e r s c o r e the spaces
This is a bit of an over simplification, but for now when you see something like
$o = Mage :: getModel ( ’ foo / bar ’ );
$o = Mage :: getSingleton ( ’ foo / bar ’ );
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
just substitue
$o = new M a g e _ F o o _ M o d e l _ B a r ();
in your mind.
A singleton is a fancy object oriented programming term for an object that may
only be instantiated once. The first time you instantiate it, a new object will be
created. However, if you attempt to instantiate the object again, rather than
create a new object, the originally created object will be returned.
A singleton is used when you only want to create a single instance of any type
of object. Magento assume you’ll only want to render one HTML page per
request (probably a safe assumption), and by using a singleton they ensure
you’re always getting the same layout object.
If all that went over your head don’t worry. All you need to know is whenever
you want to get a reference to your layout object, use
$layout = Mage :: getSingleton ( ’ core / layout ’ );
This line creates a Mage Core Template Block object named root (we’ll get to the why
of ”root ” in a bit) by calling the createBlock method on our newly instantiated
layout object.
Again, in place of a class name, we have the core/template class alias. Because
we’re using the class alias to instantiate a block, this translates to
Mage_Core_Block_Template
Again, check Appendix B if you’re interested in how class aliases are resolved.
Whenever we use a class alias for the remainder of this book, we’ll let you know
the real PHP class.
Everything else from here on out should look familiar. The following
$block - > setTemplate ( ’ helloworld -2. phtml ’ );
echo $block - > toHtml ();
sets our block template, and renders the block using its toHtml method. Let’s
use a class alias to instantiate our custom block from the previous examples
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
Refresh the page, and you should see the same output as your did before.
What we’ve done here is replace our call to the block’s toHtml with the following
$layout - > a ddOutpu tBlock ( ’ root ’ );
$layout - > se t Di re ct O ut pu t ( true );
$layout - > getOutput ();
The call to addOutputBlock tells our layout block that this is the block that should
start the page rendering process. Following that is a call to getOutput, which is
the call that actually starts the page rendering process. Every time you use
createBlock to create an object, the Layout object will know about that block.
That’s why we gave it a name earlier.
The call to setDirectOutput is us telling the Layout object that it should just
automatically echo out the results of the page. If we wanted to capture the
results as a string instead, we’d just use
$layout - > a ddOutpu tBlock ( ’ root ’ );
$layout - > se t Di re ct O ut pu t ( false );
$output = $layout - > getOutput ();
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
You’ll notice that we’ve trimmed a few lines from the code, but that we’re using
a funky syntax in that last line.
echo $layout - > a ddOutpu tBlock ( ’ root ’) - > s et Di re c tO ut p ut ( false ) - > getOutput ();
This is method chaining. It’s not a Magento feature per se, but it’s a feature of
PHP that’s become much more popular as applications start leveraging PHP 5
OOP capabilities.
If a call to a method returns an object, PHP lets you chain a another method
call on the end for brevity. This can be repeated as long as each method call
returns an object. The above is equivalent to the following
$block = $layout - > addOutpu tBlock ( ’ root ’ );
$block - > se tD ir e ct Ou tp u t ( false );
echo $block - > getOutput ();
Again, this isn’t anything that’s specific to Magento. It’s just a pattern that’s
becoming more popular with PHP developers as PHP 5 style objects are used
more and more. Magento enables this syntax by having most of its set, create,
and add methods return an appropriate object. You’re not required to use it,
but get used to seeing it if you spend any time with core or community modules
The block is identical to the Core template block, with one exception.
public function fetchView ( $fileName )
{
// ignores file name , just uses a simple include with t e m p l a t e name
$this - > setScriptPath (
Mage :: getModuleDir ( ’ ’ , ’ N o f r i l l s _ B o o k l a y o u t ’) .
DS .
’ design ’
);
return parent :: fetchView ( $this - > getTemplate ());
}
We’ve overridden the fetchView function in our template with the code above.
What this does is move the base folder for templates from
app / design
This has allowed us to package our template files in the same folder as our PHP
files, and save you from a lot of copy/paste
Let’s open up the URL that corresponds to the Layoutdemo controller
# URL : http :// magento . example . com / n o f r i l l s _ b o o k l a y o u t / l a y o u t d e m o
# File : app / code / local / N o f r i l l s / B o o k l a y o u t / c o n t r o l l e r s / L a y o u t d e m o C o n t r o l l e r . php
You should see a browser screen that looks like Figure 1.4
Figure 1.4
If you view the source of this page, you’ll see we have a full (if very basic) HTML
page structure. Let’s take a look at the code we used to create the layout and
blocks necessary to pull this off.
# File : app / cod / local / N o fr i l l s / B o o k l a y o u t / c o n t r o l l e r s / L a y o u t d e m o C o n t r o l l e r . php
class N o f r i l l s _ B o o k l a y o u t _ L a y o u t d e m o C o n t r o l l e r
extends M a g e _ C o r e _ C o n t r o l l e r _ F r o n t _ A c t i o n
{
public function _initLayout ()
{
$layout = Mage :: getSingleton ( ’ core / layout ’ );
$layout - > addOutpu tBlock ( ’ root ’ );
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
return $layout ;
}
exit ;
}
}
The insert method is the preferred method for adding child blocks to an existing
block. There’s a bit of redundancy in the setChild method, as it requires you to
pass in a name for your block.
$block - > setChild ( ’ block_name ’ , $block );
However, the insert method will automatically use the name you set when you
created it (the following code created a block named ”sidebar”)
$layout - > createBlock ( ’ n o f r i l l s _ b o o k l a y o u t / template ’ , ’ sidebar ’ );
There are a few other problems with using setChild in a public context; as of
CE 1.4.2 it still doesn’t add blocks to the internal sortedBlocks array, which will
cause problems down the road, (see Chapter 5 for more information).
Stick with insert method and you’ll be a happy camper.
The first two lines should look familiar. We’re creating a simple core/text
(Mage Core Block Text) block that looks like it was written by an infinite num-
ber of monkeys - 1. The next set of lines is far more interesting. The getBlock
method allows you re-obtain a reference to any block that’s been added to the
layout (including those added using createBlock).
What this code does is get a reference to the content block that was added in
initLayout, and then add our new content block to it. The getBlock method is
what allows us to centralize the creation of a general layout, and then customize
it further for any specific action’s needs.
Let’s look back up at the created of our block named content.
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
You’ll notice we used the class alias core/text list here, which corresponds to
the class Mage Core Block Test List. Text list blocks have a slightly deceptive
name, as you don’t set their text. Instead, what a core/text list block does is
automatically render all child blocks that have been added to it.
This feature of the core/text list block is what allows us to add a block named
content and just start inserting blocks into it. Any block we add will be auto-
matically rendered.
The core problem the Magento Layout XML system sets out to solves is
How do we allow designers and theme developers to configure a
layout, but still offer them full control over the HTML output if
they need/want it
So why XML? XML gets used for a lot of things. If you’ve been doing web
development for a while you probably think of XML as a generic document
format. While that’s one of the things XML can be used for, software engineers
and computer scientists have other uses for it.
The Magento XML Layout format is less a document format, and more a mini-
programming language. The Magento core team created a special format of
XML files that fully describes the process of creating blocks programmatically
that was described in the previous chapter. There is no public schema or DTD
for this dialect of XML, but don’t worry, by the time we’re through with this
chapter you’ll have the format down cold.
The Magento Layout XML System is made up of multiple independent pieces.
It may seem like some of what we’re doing is more of a hassle than just using
PHP to create our blocks. However, once you’ve seen all the pieces, and how
those pieces fit together, the advantages of the system should be apparent.
All of which is a fancy way of saying, ”Hang in There”. This is new, this
is different than what you’re used to, but it’s no harder than any other web
development you’ve learned before.
Finally, while not 100% necessary, the content of this chapter assumes you’ve
been through Chapter 1. Even if you’re a master at creating blocks program-
matically, you may want to skim through the previous chapter before venturing
on.
31
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
The first type of XML tree Magento uses is called the Page Layout. We say tree
instead of file, as the Page Layout XML is normally generated on the fly. We’re
going to create a few Page Layouts manually to get an idea of how they work.
In the previous chapter, we created a Hello World block with a class alias of
nofrills booklayout/helloworld (corresponding to the class Nofrills Booklayout Block Helloworld).
Let’s start by creating a Page Layout that uses this block.
First, here’s the XML we’ll use
< layout >
< block type = " n o f r i l l s _ b o o k l a y o u t / helloworld " name = " root " output = " toHtml " / >
</ layout >
We have an XML node with a root node named layout. Within the root node
is a single block node with three attributes; type, name, and output.
The type attribute is where we specify the class alias of the block we’d like to
instantiate. The name attribute allows us to set a name for the block which can
be used later to get a reference. The output="toHtml" attribute/value pair tells
the layout system that this is the block which should start output.
The Page Layout XML above is roughly equivalent to the following PHP code
$layout = new Mage :: getSingleton ( ’ core / layout ’ );
$layout - > createBlock ( ’ n o f r i l l s _ b o o k l a y o u t / helloworld ’ , ’ root ’ );
$layout - > a ddOutpu tBlock ( ’ root ’ , ’ toHtml ’)
In practice you’ll never set this optional paramater, but we’re including it here
to make it more clear what the output attribute in the XML node above is doing
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
You may have never seen a SimpleXML node created with that second para-
mater
Mage_Core_Model_Layout_Element
One of SimpleXML’s lesser known features is the ability to tell PHP to use a
user defined class to represent the nodes. By default, a SimpleXML node is a
object of type SimpleXMLElement, which is a PHP built-in. By using the syntax
above, the Magento core code is telling PHP
Make our simple XML nodes objects of type Mage Core Model Layout Element
instead of type SimpleXMLElement
If you look at the inheritance chain, you can see that the Mage Core Model Layout Element
class has SimpleXMLElement as an ancestor.
class M a g e _ C o r e _ M o d e l _ L a y o u t _ E l e m e n t extends V a r i e n _ S i m p l e x m l _ E l e m e n t {...}
class V a r i e n _ S i m p l e x m l _ E l e m e n t extends S i m p l e XM L E l e m e n t {...}
So, the Magento provided class name extends SimpleXMLElement. That means all
normal SimpleXML functionality is preserved.
If you tried to use setXml with a normal SimpleXMLElement, you’d end up with an
error that looks something like this
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
That’s because Magento uses PHP’s type hinting features to ensure that a nor-
mal SimpleXMLElement based object can’t be used.
// notice the V a r i e n _ S i m p l e x m l _ E l e m e n t type hinting
public function setXml ( V a r i e n _ S i m p l e x m l _ E l e m e n t $node )
{
...
Using the SimpleXML custom class feature, we can define a method on our class
to do this for us
public function getBlockName ()
{
$tagName = ( string ) $this - > getName ();
if ( ’ block ’ !== $tagName && ’ reference ’ !== $tagName || empty ( $this [ ’ name ’ ])) {
return false ;
}
return ( string ) $this [ ’ name ’ ];
}
and then use it wherever we want, resulting in cleaner end-user code which is
easier to read and understand
$name = $node - > getBlockName ();
If you’re not convinced, a little paraphrased Tennyson might help you along the
way
Ours is not to question why/Ours is but to do or die
Page Layout XML is one of its jobs. After getting a reference to the Layout
object, we set our newly created simple XML object
$layout - > setXml ( $xml );
Next, we tell the Layout object to us the Page Layout XML to generate the
needed block objects
$layout - > g enerate Blocks ();
This doesn’t create any output. When you call the generateBlocks method, it
goes through your Page Layout XML and creates all the PHP block objects that
are needed to generate your layout. The Page Layout XML configures which
blocks are used as well as the parent/child relationships between those blocks.
It’s not until we call
echo $layout - > se t Di re c tO ut pu t ( true ) - > getOutput ();
Before we get into the Layout XML itself, there’s two new things going on here,
both related to how we’re loading our XML. First,
$path = Mage :: getModuleDir ( ’ ’ , ’ N o f r i l l s _ B o o k l a y o u t ’) . DS .
’ page - layouts ’ . DS . ’ complex . xml ’;
$xml = s i m p l e x m l _ l o a d _ f i l e ( $path ,
Mage :: getConfig () - > g e t M o d e l C l a s s N a m e ( ’ core / l ayout_el ement ’ ));
you’ll notice we’re loading our Page Layout XML from a file rather than passing
in a string. This isn’t necessary, but will make it easier for us to examine/add-to
the XML.
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
The second thing you’ll notice is we’ve replaced the hard coded XML element
class
Mage_Core_Model_Layout_Element
with a call to
Mage :: getConfig () - > g e t M o d e l C l a s s N a m e ( ’ core / l ayout_el ement ’)
While current versions of Magento use a Mage Core Model Layout Element, it’s pos-
sible that a future version may change this. Because of that, Magento engineers
store and read this class name from a config file. When possible, it’s best to
follow the same conventions you see in Magento core code to ensure maximum
compatibility with future versions. Again, this is something you won’t need
to concern yourself with while using the Layout system, rather it’s something
you’d want to understanding if you’re working on extending it.
Alright! Let’s take a look at the layout we just rendered and the XML that
created it, (see Figure 2.1 )
Figure 2.1
If you look at the complex.xml file (bundled with the Chapter 2 module code),
app / code / local / Nofrills / Booklayout / page - layouts / complex . xml
< block type = " n o f r i l l s _ b o o k l a y o u t / template " name = " sidebar " >
< action method = " setTemplate " >
< template > simple - page / sidebar . phtml </ template >
</ action >
</ block >
< block type = " core / text_list " name = " content " / >
Lots of new and interesting things to discuss here. The first thing you’ll notice
is that we’ve added some sub-nodes to our parent block, as well as introduced
a new attribute named template.
< block type = " n o f r i l l s _ b o o k l a y o u t / template " name = " root "
template = " simple - page /2 col . phtml " output = " toHtml " >
...
</ block >
When you nest blocks in a Page Layout XML tree, it’s the equivalent of using the
insert method when you’re creating them programmatically. The node structure
of the XML mirrors the parent/child relationships you were previously setting
up programmatically.
Depending on how well you’re following along (and if you’ve taken a few days off
to digest everything and/or drink heavily), you may be wondering why it’s only
the top level node that has a output attribute. How does Magento know how to
render the sub-blocks? The answer, of course, is in your simple-page/2col.phtml
template.
File : app / code / local / Nofrills / Booklayout / design / simple - page /2 col . phtml
<! DOCTYPE html >
< html >
< head >
< meta charset = " utf -8 " / >
< title > </ title >
<? php echo $this - > getChildhtml ( ’ ad d it io na l _h ea d ’ ); ? >
</ head >
< body >
<? php echo $this - > getChildhtml ( ’ sidebar ’ ); ? >
< section >
<? php echo $this - > getChildhtml ( ’ content ’ ); ? >
</ section >
</ body >
</ html >
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
The phtml template files don’t care how their parent blocks have been instanti-
ated, they’ll function the same regardless of whether they’ve been created with
PHP code or XML code. The simple-page/2col.phtml template is still looking for
a child block named (in this example) additional head. That’s why it’s important
that all your sub block <block/> elements have names
name = " ad d it io na l _h ea d "
name = " sidebar "
name = " content "
Here you’ll see we’re still using a template block, but we’ve left off the template
attribute. Instead, we’ve added a sub-node named <action/>.
An <action/> nodes will allow you to call methods on the block which contains
it. The above node is equivalent to the following PHP code
$layout = Mage :: getSingleton ( ’ core / layout ’ );
$block = $layout - > createBlock ( ’ n o f r i l l s _ b o o k l a y o u t / template ’ , ’ sidebar ’ );
$block - > setTemplate ( ’ simple - page / sidebar . phtml ’ );
You can call any public method on a block this way, although some methods
won’t have any meaning when called from XML. Here we’ve used it as an alter-
nate method of setting a template, but the Magento core themes are filled with
other practical examples. Consider the page/html head blocks (Mage Core Block Html Head).
They contain a number of methods for adding CSS and Javascript files to your
page
< action method = " addCss " >< stylesheet > css / styles . css </ stylesheet > </ action >
< action method = " addJs " >< script > lib / ccard . js </ script > </ action >
We’ll cover the <action/> node in greater depth later on in Chapter 5. You also
may be interested in Appendix D, which contains a full list, in XML format, of
what actions may be called from what blocks.
because we can’t get a reference to a block before it’s been created. Reload the
page and you’ll see our new content, (see Figure 2.2 )
Figure 2.2
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
Of course, now we’re back to adding things to the layout via PHP. Wouldn’t it
be nice if there was a way to get references to blocks via the Page Layout XML?
As you might have guessed by our overtly rhetorical tone, The Page Layout
XML offers just such capabilities. At the top level of complex.xml add the node
named <reference/> below and give your page a refresh.
< layout >
< block type = " n o f r i l l s _ b o o k l a y o u t / template " name = " root "
template = " simple - page /2 col . phtml " output = " toHtml " >
< block type = " n o f r i l l s _ b o o k l a y o u t / template " name = " sidebar " >
< action method = " setTemplate " >
< template > simple - page / sidebar . phtml </ template >
</ action >
</ block >
< block type = " core / text_list " name = " content " / >
Now’s a good time to remind you that it’s the core/text list node that makes
this insert/auto-render process work. If we were to get a reference to the top
level root node and insert a block, that block wouldn’t be rendered unless the
root block’s template explicitly rendered it. A core/text list block, on the other
hand, will automatically render any block inserted into it. This difference in
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
rendering between core/text list and core/template blocks is the biggest reason
for head scratching layout problems I’ve seen in the field.
Load the page, and you’ll once again see your hello world block.
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
These replace the manual loading of our page layout that we did above. First, a
Layout object contains a reference to a Mage Core Model Layout Update object. This
object is responsible for managing and holding the individual XML chunks that
we’re calling updates.
You may be wondering why both the Layout and this new Update Manager
objects are models, even though they don’t read/write to/from a database. If
you’ve used PHP based MVC systems in the past, you’ve probably become
accustomed to the idea that a Model is an object that represents a table of data
in a SQL database, or perhaps even multiple tables. While that’s become one
common understanding of the term, the original meaning of Model in MVC was
the computer science term Domain Model.
The Domain Model is an abstract concept. It’s where you describe the concepts
and vocabulary of the problems you’re trying to solve in code. It’s sometimes
referred to as business logic, or the objects that you use when writing business
logic code.
The ”Un-Domain Model” portions of a project are things like the code that runs
your controller dispatching, or the code that renders a template. This is code
you might use on any projects for any number of companies, each with their
own Domain Model.
Another way of thinking about this might be a school. Teachers, students,
classes, which classes are in each room; these things are all the Domain Model
of a School. The non Domain Model would then be the school building itself,
its plumbing and boiler, etc.
We mention this here because much of the Magento model layer can be thought
of in the more recent, ”Models are data in a database way”. The layout and
update hierarchy, however, cannot. A layout and an update object are both
models in the Domain Model sense of the word. They are modeling the ”business
rules” of creating HTML pages. This can be particularly confusing with the
update object, as a single update object will be used to manage multiple Layout
Update XML fragments. That’s why we’re calling this objet an Update Manager
$ up da te _ ma na ge r = $layout - > getUpdate ();
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
Here we’re adding a single XML update that is our hello world block. Once we’ve
done that, we then tell our Layout object to generate its own Page Layout XML
tree. You may be a little confused, as it appears we’ve never told our layout
object about the the updates. Remember, this is object oriented programming.
Our update object is already a part of the Layout object. When we said
$ up da te _ ma na ge r = $layout - > getUpdate ();
we got a reference to the update object, but it’s still a part of the layout
object. So when we add a chunk of XML via the Update object, the Layout
automatically knows about it.
Our call to the generateXml method is roughly equivalent to our previous call
that looked like
$layout - > setXml ( $xml );
/* *
* Use to set the base page s t r u c t u r e
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
*/
protected function _initLayout ()
{
$path_page = Mage :: getModuleDir ( ’ ’ , ’ N o f r i l l s _ B o o k l a y o u t ’) . DS .
’ page - layouts ’ . DS . ’ page . xml ’;
$xml = f i l e _ g e t _ c o n t e n t s ( $path_page );
$layout = Mage :: getSingleton ( ’ core / layout ’)
-> getUpdate ()
-> addUpdate ( $xml );
}
/* *
* Use to send output
*/
protected function _sendOutput ()
{
$layout = Mage :: getSingleton ( ’ core / layout ’ );
If you load the above URL, you’ll get our basic, but complete, page layout from
previous examples.
First off, let’s cover a slight change it our approach. There’s two protected
methods on this controller
1. initLayout
2. sendOutput
The initLayout method we’ve used before. This is where we’ll setup a base
Layout object, to which our primary controller action can add blocks. We’re
also loading up a new file, page.xml (included with he Chapter 2 module).
The sendOutput method centralizes the code we’ve been using to render a layout
object once we’re done manipulating it. By centralizing these functions, all we
need to do in our controller action is something like
public function indexAction ()
{
$this - > _initLayout ();
// ... add a d d i t i o n a l updates here ...
$this - > _sendOutput ();
}
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
Before we get deep into that, let’s take a look at the code that’s loading our
layout in initLayout
protected function _initLayout ()
{
$path_page = Mage :: getModuleDir ( ’ ’ , ’ N o f r i l l s _ B o o k l a y o u t ’) . DS .
’ page - layouts ’ . DS . ’ page . xml ’;
$xml = f i l e _ g e t _ c o n t e n t s ( $path_page );
Here you can already see some of the efficiencies that updates have brought
us. We no longer need to worry about creating/adding the right type of simple
XML object. We can store our base XML fragment in a file,
<! - - # File : app / code / local / N o f r i l l s / B o o k l a y o u t / page - layouts / page . xml -->
< block type = " n o f r i l l s _ b o o k l a y o u t / template " name = " root "
template = " simple - page /2 col . phtml " output = " toHtml " >
< block type = " n o f r i l l s _ b o o k l a y o u t / template " name = " ad d it io na l _h ea d "
template = " simple - page / head . phtml " / >
< block type = " n o f r i l l s _ b o o k l a y o u t / template " name = " sidebar " >
< action method = " setTemplate " >
< template > simple - page / sidebar . phtml </ template >
</ action >
</ block >
< block type = " core / text_list " name = " content " / >
</ block >
and then just pass in to the update object as a string. You’ll notice there’s no
surrounding <layout> node for Layout Update XML fragments. Instead, we
pass in the block nodes we want at the top level of our eventual Page Layout
file.
So, with the basic page structure for our layout set, we’re ready to add in
our custom blocks. It’s only now that reference blocks show their true power.
Consider the indexAction, and then load up the controller URL
# URL : http :// magento . example . com / n o f r i l l s _ b o o k l a y o u t / r e f e r e n c e
public function indexAction ()
{
$this - > _initLayout ();
Mage :: getSingleton ( ’ core / layout ’)
-> getUpdate ()
-> addUpdate ( ’ < reference name =" content " >
< block type =" core / text " name =" our_message " >
< action method =" setText " > < text > Here we go ! </ text > </ action >
</ block >
</ reference > ’ );
$this - > _sendOutput ();
}
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
You should see the content area with the text ”Here we go!”.
What <reference/> nodes allow us to do is alter elements that have already
been added to a layout elsewhere. This allows us to write our structural Page
Layout XML once, and then have different controller actions insert the different
blocks they need.
Next, try adding the following methods to the controller
protected function _l oa dU p da te F il e ( $file )
{
$path_update = Mage :: getModuleDir ( ’ ’ , ’ N o f r i l l s _ B o o k l a y o u t ’) . DS .
’ content - updates ’ . DS . $file ;
The loadUpdateFile method will load an XML Update from our module’s ”content-
updates” folder. This allows us a simple three line controller action to load up
content for any particular controller action/URL. Consider these other actions,
ceaser and dog
# URL : http :// magento . example . com / n o f r i l l s _ b o o k l a y o u t / r e f e r e n c e / dog
public function dogAction ()
{
$this - > _initLayout ();
$this - > _ lo ad U pd at eF i le ( ’ dog . xml ’ );
$this - > _sendOutput ();
}
We could even take this a step further. Consider the following method in place
of loadUpdateFile.
protected function _ l o a d U p d a t e F i l e F r o m R e q u e s t ()
{
$path_update = Mage :: getModuleDir ( ’ ’ , ’ N o f r i l l s _ B o o k l a y o u t ’) . DS .
’ content - updates ’ . DS . $this - > g e t F u l l A c t i o n N a m e () . ’. xml ’;
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
Load the foxAction URL, and you’ll see a warning something like this.
Warning : f i l e _ g e t _ c o n t e n t s (/ mage / path / app / code / local / Nofrills / Booklayout / content -
updates / n o f r i l l s _ b o o k l a y o u t _ r e f e r e n c e _ f o x . xml )
[ function . file - get - contents ]: failed to open stream : No such file
or directory
Reload the page, and you’ll see our new content block.
1. Combines all the chunks of Update XML into a single tree by concatenat-
ing them under a top level <layout> node
2. Does some additional processing of the nodes
3. Sets this new tree as the Layout’s XML. In other words, set it as the Page
Layout
So, in our examples above, that means we end up with a Page Layout that looks
something like this
< layout >
<! - - update loaded from page . xml -->
< block type = " n o f r i l l s _ b o o k l a y o u t / template " name = " root "
template = " simple - page /2 col . phtml " output = " toHtml " >
< block type = " n o f r i l l s _ b o o k l a y o u t / template " name = " a dd it io n al _h ea d "
template = " simple - page / head . phtml " / >
< block type = " n o f r i l l s _ b o o k l a y o u t / template " name = " sidebar " >
< action method = " setTemplate " >
< template > simple - page / sidebar . phtml </ template >
</ action >
</ block >
< block type = " core / text_list " name = " content " / >
</ block >
and you should see a page without the block named sidebar, which was ren-
dering our navigation.
Figure 2.3
Remove instructions are processed in the Mage Core Model Layout::generateXml method.
This method
1. Combines all updates with a call to $xml = $this->getUpdate()->asSimplexml();
2. Looks through the combined updates for any nodes named remove.
3. If it finds a remove node, is then takes that node’s name and looks for any
block or references nodes with the same name.
4. If it finds any blocks or references, these nodes are marked with an ignore
attribute.
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
Figure 2.4
5. The remove blocks are ignored during the Layout rendering process. Their
job is to mark which nodes should be ignored. After that, they’re irrelevant
Once the remove instructions have been processed, the resulting tree is set as
the Page Layout.
This means in our most recent example we ended up with a Page Layout XML
tree that looked exactly the same as before, with one exception
< block type = " n o f r i l l s _ b o o k l a y o u t / template " name = " sidebar " ignore = " 1 " >
So far we’ve been using individual init methods in our controllers. While
this has offered us more modularity that previous methods, this will still get
unwieldy as the number of controllers and actions grows. Plus, there’s still
the sub-problem of how to create a method of doing this that allows back-end
PHP developers and front-end PHP developers the ability to go about their jobs
without crossing paths.
The answer to this question, and the final large topic we need to cover, is the
Package Layout.
Visit http://www.pulsestorm.net/nofrills-layout-chapter-two to join the discus-
sion online.
Chapter 3
We’re finally getting closer to fully understanding the Magento layout rendering
process. At the end of the last chapter, we stated that the final puzzle pieces
were
1. How should we store all the layout update for our system
2. How should we load these layout files into the system
The approach Magento has taken is to introduce another XML tree, this one
called the Package Layout. The Package Layout is an XML tree which contains
any number of Layout XML Update Fragments. The Package Layout contains
all the updates fragments that the entire application might want to use.
The top level node in the package layout is named <layouts/>.
< layouts >
<! - - ... --->
</ layouts >
Make note of the plural, layouts. This is different from the top level singular
<layout/> node of the Page Layout XML tree you were building in previous
chapters. That’s because, as mentioned, this is a different XML tree.
The second level nodes of the Package Layout are not blocks, or references, or
any tag we’ve seen so far. The second level nodes are something new, called
Handles. Each handle node contains a single XML Update Fragment.
< layouts >
< handle_name >
<! - - ... XML Update Fragment --->
</ handle_name >
52
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
< default > <! - - default is an actual handle name from the system - - >
<! - - ... -->
</ default >
Handle names may be repeated, but before we discuss what they mean, lets
discuss how they’re loaded into the system.
Magento will look for layout files in this folder first. If it doesn’t find a specific
layout file here, it will check the base fold at
[ BASE DESIGN FOLDER ]/[ AREA FOLDER ]/ base / default / layout
On each request, Magento will scan the config for any XML files located in the
<updates> node. These filenamess will be the files Magento will attempt to load
up as the Package Layout. The code that does this can be found in
app / code / core / Mage / Core / Model / Layout / Update . php
M a g e _ C o r e _ M o d e l _ L a y o u t _ U p d a t e :: g e t F i l e L a y o u t U p d a t e s X m l
Load the URL for the above action, and you’ll see the list of files that Magento
will load, and then combine, into the package layout.
Two additional things to note about the loading of the package layout. First,
you’ll see in the above code, (which was copied from Mage Core Model Layout Update::getFileLayoutUpdatesXml),
that Magento checks for a config flag at advanced/modules disable output before
loading any particular file. This corresponds to the System Config section at
System -> Configuration -> Advanced -> Disable Module ’s Output
If you’ve disabled a module’s output through this config section, Magento will
ignore loading that module’s updates into the Package Layout.
The second thing you’ll want to notice is this line
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
After loading XML files found in the configuration, Magento will add a local.xml
file to the end of the list. This file is where store owners can add their own
Layout Update XML fragments to the Package Layout. We’ll learn more about
this later, but by loading local.xml last, Magento ensures any Layout Update
XML Fragments here have the final say of what goes into the Layout.
Once Magento has determined which files should be loaded into the Package
Layout, the contents of each file will be combined into a single, massive XML
tree.
and enter nofrills layoutbook. Click Save, and you’ll be set for the example in
the next section, (see Figure 3.1 )
You can find your new ”zeroed out” layout files at
app / design / frontend / default / n o f r i l l s _ l a y o u t b o o k / layout /
If you load any page in your store, you’ll encounter an empty, blank, and error-
less browser screen.
Figure 3.1
it generates handle names for the request. There are some handle names which
are produced on every request. They include the handle default, as well as a
handle based on the controller’s ”Full Action Name” that was discussed in the
previous chapter.
The Full Action Name, as a reminder, is a combination of the current module
name, controller name, and action name.
• Module Name: nofrills booklayout
• Controller Name: reference
• Action Name: fox
In the Package Layout example above, the
< catalog_product_send >... </ catalog_product_send >
node is an example of a full action name handle for the send Action in the
Product controller of the Catalog module.
In general, it’s the responsibility of the controller object to set handles for any
particular request. Also, you generally don’t need to worry about setting your
own handles. Magento’s base controller methods do this for you. If you want to
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
see the handles set from a particular action controller, use the following code
snippet
# URL : http :// magento . example . com / n o f r i l l s _ b o o k l a y o u t / r e f e r e n c e / handle
public function handleAction ()
{
$this - > loadLayout ();
$handles = Mage :: getSingleton ( ’ core / layout ’) - > getUpdate () - > getHandles ();
var_dump ( $handles );
exit ;
}
$handles = Mage :: getSingleton ( ’ core / layout ’) - > getUpdate () - > getHandles ();
echo " < strong > Handles Generated For This Request : " ,
implode ( " ," , $handles ) , " </ strong > " ;
return $ o r i g i n a l _ r e s u l t s ;
}
You’ll notice we’ve extended the loadLayout method to print out the handles
generated by Magento. This is for our own debugging purposes. Load up the
index URL, and you should see a blank white page with only the handles listed,
(see Figure 3.2 )
Because of this, in the layout files that ship with Magento the handles for a
page’s structure are kept under the <default/> handle. This is also where the
”root” tag with the output="toHtml" attribute is stored. If you look at a stock
page.xml, you can see this.
<! - - # File : app / design / f r o n t e n d / base / default / layout / page . xml -->
< default translate = " label " module = " page " >
< label > All Pages </ label >
< block type = " page / html " name = " root " output = " toHtml "
template = " page /3 columns . phtml " >
< block type = " page / html_head " name = " head " as = " head " >
< action method = " addJs " >
< script > prototype / prototype . js </ script >
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
Figure 3.2
Layout Update XML Fragments located in the default handle will always be
loaded.
If you look at our custom page.xml, you’ll see we’ve removed all the handle tags
<! - - # File : app / design / f r o n t e n d / default / n o f r i l l s _ l a y o u t b o o k / layout / page . xml -->
<? xml version = " 1.0 " ? >
< layout version = " 0.1.0 " >
</ layout >
That’s why our page is rendering blank. Let’s restore those tags and see what
effect it has. We’ll copy the base page.xml over our blank one.
cp app / design / frontend / base / default / layout / page . xml \
app / design / frontend / default / n o f r i l l s _ l a y o u t b o o k / layout / page . xml
Clear your Magento cache and reload your page. You should now see a base
Magento layout, (see Figure 3.3 )
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
Figure 3.3
You’ll want to either turn caching off or clear it between each page reload form
here on out, see Appendix F for more information if you’re interested in why.
Take a look at the top of page.xml and find the node named root
# File : app / design / f r o n t e n d / default / n o f r i l l s _ l a y o u t b o o k / layout / page . xml
< block type = " page / html " name = " root " output = " toHtml "
template = " page /3 columns . phtml " >
Refresh your page (again, after clearing your cache). The page now renders
as blank. You’d probably never do this for a product site, we’ve done here to
demonstrate that the Magento Layout itself is built on the same concepts our
simple templates from previous chapters.
Let’s restore that output attribute before continuing
< block type = " page / html " name = " root " output = " toHtml "
template = " page /3 columns . phtml " >
So, that’s the default handle. Any Layout Update XML fragments inside a
default handle will always be a part of the Page Layout, and that’s where most
of the structural blocks live. That brings us to the other handle you can always
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
rely on being present, the Full Action Name handle. In our examples above this
is
nofrills_booklayout_package_index
As previously mentioned, this handle is generated from the module name (nofrills booklayout),
the controller name (package) and the action name (index). The handle will
uniquely identify any request into the system. Therefore, Layout Update XML
fragments located in this handle are most often used to add content to the page.
Let’s add a Layout Update XML fragment using our handle. Open up the
local.xml file, and paste in the following code.
<! - - # File : app / design / f r o n t e n d / default / n o f r i l l s _ l a y o u t b o o k / layout / local . xml -->
<? xml version = " 1.0 " ? >
< layout version = " 0.1.0 " >
< nofrills_booklayout_package_index >
< reference name = " content " >
< block type = " core / text " name = " our_message " >
< action method = " setText " >< text > Hello Mars </ text > </ action >
</ block >
</ reference >
</ n o f r i l l s _ b o o k l a y o u t _ p a c k a g e _ i n d e x >
</ layout >
Inside our nofrills booklayout package index node we’ve added a Layout Update
XML fragment to update the content block with a little bit of text. Reload,
clear cache, and you can see our simple Hello Mars text block has been added
to the page. However, if we move to this URL/Action
# http :// magento . example . com / n o f r i l l s _ b o o k l a y o u t / package / second
public function secondAction ()
{
$this - > loadLayout ();
$this - > renderLayout ();
}
We can see that our text block is, as expected, NOT added. We’d need to
add another handle to the Package Layout with its own Layout Update XML
fragment for that to happen. Let’s do that now.
<! - - # File : app / design / f r o n t e n d / default / n o f r i l l s _ l a y o u t b o o k / layout / local . xml -->
< layout version = " 0.1.0 " >
<! - - ... -->
< nofrills_booklayout_package_second >
< reference name = " content " >
< block type = " core / text " name = " our_message " >
< action method = " setText " >< text > Hello Jupiter </ text > </ action >
</ block >
</ reference >
</ n o f r i l l s _ b o o k l a y o u t _ p a c k a g e _ s e c o n d >
<! - - ... -->
</ layout >
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
Notice the new handle’s name (nofrills booklayout package second) matches the
secondAction method . Refresh the page (after clearing your cache) and you’ll
see the Hello Jupiter text.
We can also use the Full Action Handle to change which template an existing
block uses. For example, to make this a one column layout, we’ll get a reference
to the root block and call its setTemplate method.
< nofrills_booklayout_package_second >
< reference name = " content " >
< block type = " core / text " name = " our_message " >
< action method = " setText " >< text > Hello Jupiter </ text > </ action >
</ block >
</ reference >
When editing a single Layout XML file, you can either put all your additional
tags changes into a single handle, or spread them out. The following would be
functionally the same as the above.
< nofrills_booklayout_package_second >
< reference name = " content " >
< block type = " core / text " name = " our_message " >
< action method = " setText " >< text > Hello Jupiter </ text > </ action >
</ block >
</ reference >
</ n o f r i l l s _ b o o k l a y o u t _ p a c k a g e _ s e c o n d >
The order the update handles are placed in is significant. Consider multiple lay-
out files that try to change a block’s template. The last file processed (local.xml)
will be the one that wins, just like the last method called on a PHP block wins
$block - > setTemplate ( ’3 columns . phtml ’ );
$block - > setTemplate ( ’6 columns . phtml ’ );
$block - > setTemplate ( ’1 column . phtml ’ );
There’s no firm rule in place here, but try not to have your layout action in one
group of handles be too dependent on what’s happened in another handle.
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
< block type = " core / text " name = " planet_5 " >
< action method = " setText " >< text > Hello Jupiter . </ text > </ action >
</ block >
</ reference >
</ n o f r i l l s _ b o o k l a y o u t _ p a c k a g e _ s e c o n d >
If we loaded our index page here, the Page Layout would contain the following
(sans comments)
<! - - from our handle -->
< reference name = " content " >
< block type = " core / text " name = " planet_4 " >
< action method = " setText " >< text > Hello Mars . </ text > </ action >
</ block >
</ reference >
That’s because while processing the nofrills booklayout package index handle, Ma-
gento encountered the <update/> tag.
< update handle = " n o f r i l l s _ b o o k l a y o u t _ p a c k a g e _ s e c o n d " / >
By including this tag, we’ve told Magento that we also want to grab Layout Up-
date XML fragments that are included in the nofrills booklayout package second
handle.
You can think of this as a sort of ”include” for Layout Update fragments. Ma-
gento itself uses this technique extensively. For example, Magento defines the
blocks for the customer account login handle, and then uses those again later on
when it wants to include the same login on the multi-shipping checkout page.
< checkout _multis hipping_ login >
< update handle = " c u s t o m e r _ a c c o u n t _ l o g i n " / >
</ c heckout_ multishi pping_l ogin >
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
The Package Layout is an XML tree that contains all possible Layout XML
Update Fragments for a design package. Frangments are organized by handle.
Top Level Node in the Package Layout
• <layout>
Allowed Second Level Nodes
• Any arbitrary named node called a handle
Allowed Third Level Nodes
• <block> or <reference>, as the start of a Layout Update XML fragment
• <update>, used to include another handle’s Layout XML Update Frag-
ments
The Page Layout is the final collection of Layout Update XML Fragments used
to create block objects for a request.
Top Level Node in the Page Layout
• <layout>
Allowed Second Level Nodes
• <block>
• <reference>
• <remove/>
Allowed Third Level nodes
• <block>’s and <reference>’s may contain - other blocks, or actions
• <remove/>
Note
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
We’ve just spent the last three chapters reviewing some complicated concepts
and the interaction of complicated concepts. We’re going to pause for a
moment to review what we’ve learned, as well as provide an overall picture of
how Magento builds a Page Layout. Original drafts had this brief, mini-chapter
at the start of the book, but it made people’s head explode. Hopefully it’s safe
enough to cover now
67
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
Figure 4.1
Update XML fragments from ”handle x” should be loaded. When the Controller
Action developer tells Magento to load the layout, the Layout Update Manager
checks this list, and asks the Package Layout for a copy of the Layout Update
XML fragments contained within those particular handles.
Also, each fetched Layout Update XML fragment is processed at this time for
an <update handle="..."/> node. This node can be used to tell the manager to
fetch additional nodes based on the specified handle.
Finally, a copy of all Layout Update XML fragments in hand, the Layout Update
Manager combines them into a single XML tree. This is the Page Layout.
Figure 4.2
they wish, the controller action developer then tells Magento it’s time to render
the layout object
HTML from the cascading render. The string is then passed into a Magento
response object, which is responsible for outputting the HTML page.
That, in a nutshell, is the Layout system.
Visit http://www.pulsestorm.net/nofrills-layout-chapter-four to join the discus-
sion online.
Chapter 5
There are, however, a few extra features you can tap into while calling methods
via blocks. Let’s take a look.
71
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
We’ve added two paramaters to the <action/> node here. The first is
translate = " param1 "
This tells Magento we want to run the <param1/> paramater through the trans-
lation engine. In this case, that’s the string ”a value”. This is the reason each
paramater is an extra node in the tree, it allows us to identify strings that need
translation. If you want to translate more than one paramater, the attribute
will accept multiple names
translate = " param1 param2 "
Next, we have
module = " core "
This tells Magento which module’s data helper should be used to translate our
strings. Each module has (or should have) a helper class named Data.
Mage_Core_Helper_Data
Mage_Catalog_Helper_Data
This helper can be instantiated via a call to the static helper method on the
Mage object
Mage :: helper ( ’ core ’ ); // s h o r t c u t for the one below
Mage :: helper ( ’ core / data ’ );
The reason you need to specify a module for the translation helper is, each
module can contain its own translations. This allows different modules to
translate their own symbols slightly differently based on context.
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
This attribute can be used to tell Magento to conditionally call the specified
method. The above XML is equivalent to PHP code something like
$block = new M a g e _ P a g e _ B l o c k _ H t m l _ H e a d ();
if ( Mage :: g e t S t o r e C o n f i g F l a g ( ’ dev / js / deprecation ’ ))
{
$block - > addJs ( ’ prototype / deprecation . js ’ );
}
That is, when you use the ifconfig attribute, you’re telling Magento
Only make the following method call if the following System Con-
figuration Variable returns true
System Configuration variables can be set in the Admin Console under
System -> Configuration
See Appendix I for more information of using the System Config system.
The ifconfig attribute is a powerful feature you can use to allow end users to
selectively turn certain layout features on or off. You can also use it to display
different layout states based on the existing System Configuration values.
< action method = " addLink " translate = " label title " module = " customer " >
< label > My Account </ label >
< url helper = " customer / getAccountUrl " / >
< title > My Account </ title >
< prepare / >
< urlParams / >
< position >10 </ position >
</ action >
But there’s one final paramater we’re using with a syntax we haven’t seen before
...
< url helper = " customer / getAccountUrl " / >
...
...
...
...
This url paramater tag is fetching data dynamically using Magento’s helper
classes. When Magento encounters an action paramater with a helper attribute,
it
1. Splits the helper by the last ”/”
2. The first part of the split is used to instantiate the helper
3. The second part of the split is used as a method name
4. A helper is instantiated and the method from step #3 is called.
5. The value returned by the method is used in the action method call
So, that means the above XML translates into PHP code something like;
$block ; // the block object
$h = Mage : helper ( ’ customer ’ ); // i n s t a n t i a t e the c u s t o m e r data helper
$url = $h - > getAccountUrl ();
$block - > addLink ( ’ My Account ’ , $url , ’ My Account ’ , null , null ,10);
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
Magento examines the helper attribute and splits off getAccountUrl to use as a
method, leaving customer to be used to instantiate the helper class. The helper
is instantiated and getAccountUrl is called. The value returned from this method
is then used as the paramater to pass to addLink.
The above example uses the shorthand ”data” helper format, but fear not. You
can use any helper class alias to return a value. Consider the following example
< action method = " addLink " translate = " label title " module = " catalog "
ifconfig = " catalog / seo / site_map " >
< label > Site Map </ label >
< url helper = " catalog / map / getC ategoryU rl " / >
< title > Site Map </ title >
</ action >
Here we’re instantiating a catalog/map helper and calling its getCategoryUrl method.
The value which getCategoryUrl returns will be used in the call to the addLink
method.
This powerful feature is the missing link for layout programming. The ability
to call into blocks with dynamic data paramaters unlocks a world of potential
for developers and designers alike.
Consider the following <nofrills booklayout order index> update handle for our
controller action. You should know how to add this to your system by now, but
if you don’t putting it in your local.xml will do. Review the previous chapters
if you’re unsure where local.xml is.
< n o f ri l l s_ b o ok l a y ou t _ or d e r _i n d ex >
< reference name = " content " >
< block type = " core / text " name = " one " >
< action method = " setText " >
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
< text > <![ CDATA [ <p > One </ p >]] > </ text >
</ action >
</ block >
< block type = " core / text " name = " two " >
< action method = " setText " >
< text > <![ CDATA [ <p > Two </ p >]] > </ text >
</ action >
</ block >
< block type = " core / text " name = " three " >
< action method = " setText " >
< text > <![ CDATA [ <p > Three </ p >]] > </ text >
</ action >
</ block >
< block type = " core / text " name = " four " >
< action method = " setText " >
< text > <![ CDATA [ <p > Four </ p >]] > </ text >
</ action >
</ block >
< block type = " core / text " name = " five " >
< action method = " setText " >
< text > <![ CDATA [ <p > Five </ p >]] > </ text >
</ action >
</ block >
< block type = " core / text " name = " six " >
< action method = " setText " >
< text > <![ CDATA [ <p > Six </ p >]] > </ text >
</ action >
</ block >
< block type = " core / text " name = " seven " >
< action method = " setText " >
< text > <![ CDATA [ <p > Seven </ p >]] > </ text >
</ action >
</ block >
< block type = " core / text " name = " line " >
< action method = " setText " >
< text > <![ CDATA [ < hr / >]] > </ text >
</ action >
</ block >
</ reference >
</ n o fr i l ls _ b o ok l a yo u t _ or d e r_ i n d ex >
Loading up our page with this bit of Layout Update XML in place will give us
a simple ordered list of paragraphs, followed by a line, (see Figure 5.1 )
(We’re using <![CDATA[<hr/>]]> nodes for our setText paramater. This allows
us to insert HTML.)
Once you’ve got the above working, change your Layout Update XML such that
an extra attribute named before is added to the block named line
< block type = " core / text " name = " line " before = " two " >
< action method = " setText " >< text > <![ CDATA [ < hr / >]] > </ text > </ action >
</ block >
Refresh your page. The <hr/> element should now be rendered in between the
”One” and ”Two” paragraph, (see Figure 5.2 )
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
Figure 5.1
In plain english, the block line was inserted before the block two. There’s also a
corresponding after paramater.
< block type = " core / text " name = " line " after = " six " >
< action method = " setText " >< text > <![ CDATA [ < hr / >]] > </ text > </ action >
</ block >
Reload your page with the above in place, and your line block should render
between six and seven. If you want a block to be inserted last, just use
< block type = " core / text " name = " line " after = " -" >
The before and after attributes are most useful when you’re inserting blocks into
an existing set. For example, with the above in place, we might have another
Layout Update XML node somewhere that looked like
< reference name = " content " >
< block type = " core / text " name = " fakeline " after = " four " >
< action method = " setText " >
< text > <![ CDATA [ < div style = " border - color : black ;
border - style : solid ; border - top :1 px ; width :300 px ; " > </ div >]] >
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
Figure 5.2
Assuming blocks one - seven had already been inserted, this bit of Layout Up-
date XML would ensure your new block was inserted after the block named four.
This feature makes working with a package or theme’s default layout blocks far
easier.
While this will sometimes work, if the block you’re removing had children, or
has data paramaters set by other parts of the layout, you’ll need to reset them
after reinserting the block. This makes the unset/re-insert method perilous at
best, and should only be considered when all other options have been exhausted
This code is foreaching over a list of sorted children. If you climb the chain
back up to the Mage Core Block Abstract class, you can see that Magento keeps
track of both children blocks, as well as a a sorted array of children
/* *
* C o n t a i n s r e f e r e n c e s to child block objects
*
* @var array
*/
protected $_children = array ();
/* *
* Sorted c h i l d r e n list
*
* @var array
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
*/
protected $ _ s o r t e dC h i l d r e n = array ();
So, while a core/template has this list of sorted children, the before and after
attributes have no influence on a template block, as the order there is determined
by where $this->getChildHtml(...) is called in the phtml template.
While it’s beyond the scope of this book, an enterprising extension developer
could probably create a class rewrite that would add a method to core/text list
blocks allowing for an explicit reorder of the $ sortedChildren array. I wouldn’t
be surprised to see the feature crop up in a future version of Magento.
A block’s name attribute defines its unique name in the layout object. If present,
the as attribute will define the block’s alias in the layout. If an alias is defined,
you still interact with a block programmatically via its name. The only time
you use an alias is when rendering the block in a template. For example, the
above block’s parent renders it with the following
<? php $this - > getChildHtml ( ’ info ’ ); ? >
you can see if an alias is used that’s the value that will be used to set the child
block (and therefore the ”template name”). Otherwise, Magento defaults to
using the the block’s name in the layout.
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
Block aliases are a feature you may never personally use, but recent versions
of Magento have made heavy use of them to overcome some earlier design
decisions. You’ll want to make sure you’re aware of the difference between an
alias and name, even if you never use an alias in your own updates.
You use this method from a phtml template, and it might look something like
<? php echo $this - > g e t C h il d C h i l d H t m l ( ’ my_child ’ , ’ foo ’ ); ? >
The getChildHtml method will render out the specified child. The getChildChildHtml
method obtains a reference to the first child block (my child above), and then
calls getChildHtml on it.
This method is most useful when you’re editing a phtml template and don’t want
to restructure your blocks. I personally haven’t found much use for it, but you
will see it used in the wild and in the core, so it’s worth knowing about. The most
typical use is to render a core/template block as though it was a core/text list
block.
Visit http://www.pulsestorm.net/nofrills-layout-chapter-five to join the discus-
sion online.
Chapter 6
CMS Pages
This chapter covers the CMS Page feature. For day-to-day Magento work most
of the knowledge here is unnecessary. However, if you ever need to debug a
Magento CMS page render, or are curious how CMS pages interact with the
layout, this is the chapter for you. We’ll also being laying the groundwork for
our final chapter on Widgets.
Back in 1996, if you wanted to put a piece of content online, you just uploaded
an HTML file. If you were really savvy, you’d upload an HTML include file
that contained your content, and the HTML page itself would use server side
includes.
It’s weird, that in 2011, if you asked a developer how to add some content to
a site or a web application, their process would be almost exactly the same.
Instead of adding an HTML file, they’d add a controller and a template, and
then put the HTML content in the template.
However, for non-developers, managing content on a website has gone com-
pletely GUI. Systems like Drupal, Concrete5, and Joomla rule the roost. Users
expect to manage their sites via a user interface, and not via code or adding
files. Magento’s often overlooked CMS features allows users the control they
want. Don’t worry though, there’s plenty in the CMS for a developer to sink
their teeth into, particularly a developer who knows the layout system inside
out.
82
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
in the Admin Console, you’ll see a list of CMS pages that have already been
added to the system, (see Figure 5.1 )
Figure 6.1
If you click on ”Add New Page” you’ll be presented with a standard Magento
editing UI, allowing you to enter information and create your page, (see Figure
5.2 )
Figure 6.2
Let’s create a simple page by entering the following values. Don’t worry about
the specifics right now, we’ll get to them down below
[ Page Information : Page Title ] Our Hello World Page
[ Page Information : URL Key ] hello - world
[ Page Information : Store View ] All Store Views
[ Page Information : Status ] Enabled
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
Once you’re done, click on save and Next, load up the following URL in your
browser
http : // magento . example . com / hello - world
You should see your new CMS page, (see Figure 5.3 )
Figure 6.3
When you saved your page in the admin, Magento stored all that data as a
cms/page model.
$page = Mage :: getModel ( ’ cms / page ’ );
When Magento identifies a URL as a CMS page, it loads this model up, reads
its information, and then displays it to the page.
Let’s take a look at all of the CMS Page fields and briefly describe what they
do.
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
This is the title of your CMS page. It will display in the Admin Console grid,
your page’s <title/> tag, and the default breadcrumb display.
This is the non-server portion of your page URL. This can be any string that’s
valid in a URL. In our example above, we used
hello - world
If we had used
hello - world . html
This setting determines which stores your page may appear in. This allows you
to hide content from stores where it may not be appropriate, or provide different
version of a page for different stores.
Stores here is referring to Magento’s internal abstract ”Store” concept.
The status field allows you to disable or enable a page. A disabled page will
return a response with a 404 HTTP Status code. This is great for embargoed
content, or for saving seasonal content to use over again.
The content heading determines you page’s top level <h1/> tag. (See rendering
section below for more information).
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
This is the rich text editor where you enter your page’s content. In addition
to the various formatting buttons common to most rich text editors, clicking
the Show/Hide Editor button will toggle the raw source view. When viewing
a page in raw source view, you can view and edit the actual HTML that will
render your page.
Also in raw source view, you’ll see a few additional buttons. Insert Widget,
Insert Image, and Insert Variable. Clicking one these buttons eventually results
in text something like
{{ config path = " trans_email / ident_general / email " }}
being added to your raw source. This is a directive tag, and we’ll cover it in
greater detail in just a bit.
The text in this field controls the <meta name="keywords"/> tag on your page. The
contents of this field will be added directly to the content attribute of the tag.
< meta name = " keywords " content = " This is a test of the keywords . " / >
Much like Keywords, the Description field controls the contents of your
page’s <meta name="description"/> tag.
< meta name = " description " content = " Describing the meta . " / >
This select box allows you to set which page structure template your CMS page
will use. This select is populated by a call to
// M a g e _ P a g e _ M o d e l _ S o u r c e _ L a y o u t
Mage :: getSingleton ( ’ page / source_layout ’) - > toOptionArray ()
which, in a default installation, ultimately reads from the global config nodes
at the following location
< config >
< global >
<cms >
< page >
...
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
If you can hold on, you’ll eventually understand to the meaning of all the tags
above. For now, if you take a peek at the HTML source for that select
< select id = " p a g e _ r o o t _ t e m p l a t e " name = " root_template "
class = " required - entry select " >
< option value = " empty " > Empty </ option >
< option value = " one_column " selected = " selected " >1 column </ option >
< option value = " t w o _ c o lu m n s _ l e f t " >2 columns with left bar </ option >
< option value = " t w o _ c o l u m n s _ r i g h t " >2 columns with right bar </ option >
< option value = " three_columns " >3 sum columns </ option >
</ select >
you can see that Magento’s taking the tag names from the above nodes for
option values. This is what Magento will save with its page model, and will
then use later to retrieve the label, template, and layout handle values.
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
The Magento CMS system still uses the layout/block mechanism for page ren-
dering. This field will allow you to add additional Layout Update XML frag-
ments to your Page Layout for a CMS Page request. For example, you could
add an additional text content block if you liked with
< reference name = " content " >
< block type = " core / text " name = " redundant " >
< action method = " setText " >< text > Hello Again </ text > </ action >
</ block >
</ reference >
Fields in this section allow users to override the above values, and our default
theme, for specific date ranges.
If you’re interested in checking out the code that looks for a CMS page, checkout
the match method in
# File : app / code / core / Mage / Cms / C o n t r o l l e r / Router . php
public function match ( Z e n d _ C o n t r o l l e r _ R e q u e s t _ H t t p $request )
{
...
}
Magento URLs that lack ANY path portion (that is, they contain only a server
name) will be dispatch to the following controller action.
M a g e _ C m s _ I n d e x C o n t r o l l e r :: indexAction
This check happens after the check for a standard controller is instantiated,
but before the CMS Page check is done.
You can override which controller the index page dispatches to via the System
Config variable
System -> Configuration -> Web -> Default Pages -> Default Web Url
In a base install, this value is cms. What that means is, when you go to the root
level page, Magento will treat it as though you’ve gone to
http : // magento . example . com / cms
If you wanted to have a particular category page display as the home page, you
could set this value to something like catalog/category/view/id/8.
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
That’s only four lines in the method body, but if you’re not familiar with Ma-
gento coding conventions, it’s four dense looking lines. We’re going to tease
apart what’s going on in this method. If you’re already familiar with Magento
conventions you may want to skip ahead (although reviewing information never
hurt anyone)
The call to $this->getRequest() returns the Magento request object. Rather
than have you interact directly with $ GET, $ POST and $ COOKIES, Magento pro-
vides a request object that allows you access to the same information. This
object is a Mage Core Controller Request Http, which extends from a Zend class
(Zend Controller Request Http)
Next, we’re chaining in a call to getParam in order to retrieve the value of page id.
This is the id of our cms/page model. The second paramater to getParam is a
default value to return if page id isn’t found. In this case, we’re calling getParam
again, this time looking for value of the id paramater. If there’s no id paramater,
$pageId is set to false.
we instantiate a cms/page helper class, and call its render method. We pass in a
reference to the controller, and the page id we just fetched from the request.
If this method returns false, we forward on to noRoute, which for our purposes
we’ll call the 404 Page.
...
...
if ( $renderLayout ) {
$action - > renderLayout ();
}
}
}
We’ve truncated much of the actual code (...) to focus on the specific lines above.
You’ll see that the renderPage method wraps a call to the internal, protected
renderPage method. Notice that the controller we’ve passed in is (locally) known
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
as $action. Without going into to much detail, the code above replaces your calls
to $this->loadLayout().
In fact, if you looked at the implementation of the loadLayout method in the base
action controller, you’d see code similar to what’s above. The only difference
here is, after loading the layout update handles from the package layout files,
we then add any additional layout handles from our CMS Page. (You’ll recall
that Admin Console allowed us to add layout update handles for specific CMS
pages)
We won’t go into every little detail of the page rendering process, but we will
highlight a few other chunks of code that should shed some light on what we
were doing in the Admin Console GUI.
Here, the handle cms page is being issued. This means when we’re pulling Layout
Update XML from the package layout, the following will be included.
<! - - File : app / design / frontend / base / default / layout / cms . xml -->
< layout >
<! - - ... -->
< cms_page translate = " label " >
< label > CMS Pages ( All ) </ label >
< reference name = " content " >
< block type = " core / template " name = " p a g e _ c o n t e n t _ h e a d i n g "
template = " cms / c on te n t_ he ad i ng . phtml " / >
< block type = " page / html_wrapper " name = " cms . wrapper " translate = " label " >
< label > CMS Content Wrapper </ label >
< action method = " s e tE le m en tC la s s " >< value > std </ value > </ action >
< block type = " cms / page " name = " cms_page " / >
</ block >
</ reference >
</ cms_page >
<! - - ... --->
</ layout >
This is the key Layout Update XML for CMS pages. It adds the blocks for the
content heading, and the page content itself, to the page layout. Later on in the
render method we set the page content header by grabbing the saved content
header values from our page model
$ c o n t e n t H e a d i n g B l o c k = $action - > getLayout () - > getBlock ( ’ p a g e _ c o n t e n t _ h e a d i n g ’ );
if ( $ c o n t e n t H e a d i n g B l o c k ) {
$contentHeadingBlock - > s e t C o n t e n t H e a d i n g ( $page - > g e t C o n t e n t H e a d i n g ());
}
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
This value is then referenced in the content heading block’s template cms/content heading.phtml.
The Layout object’s applyTemplate method takes the saved value (say, two columns left),
jumps back into the config to find the name of the template it should set, and
then sets it.
public function applyTemplate ( $pageLayout = null )
{
if ( $pageLayout === null ) {
$pageLayout = $this - > g e t C u r r e n t P a g e L a y o u t ();
} else {
$pageLayout = $this - > _getConfig () - > getPageLayout ( $pageLayout );
}
if (! $pageLayout ) {
return $this ;
}
return $this ;
}
You’ll remember that the two columns left config node looked something like this
< t w o _ c o l u m n s _ l e f t module = " page " translate = " label " >
< label >2 columns with left bar </ label >
< template > page /2 columns - left . phtml </ template >
< layout_handle > page_two_columns_left </ layout_handle >
</ two_columns_left >
You can see we’re using the <template/> node above, but we don’t seem to be
using the <layout handle/> anywhere. Plus, there’s the getIsHandle method call
above. What’s that all about?
Other parts of the system will add a layout handle named after the values in
the <layout handle> tag. If you look at one of these handles
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
you can see it’s applying a template via the setTemplate method, and also setting
a IsHandle flag on the object. This flag is used internally by the block to prevent
multiple handles from setting the root template. This isn’t done by the CMS
Page render, but it’s good to know about.
$page - > setStoreId ( Mage :: app () - > getStore () - > getId ());
if (! $page - > load ( $pageId )) {
return false ;
}
}
we created a singleton instance. This means that we’ll only ever have one
reference to this object during the PHP request lifecycle, which is why our call
to
$page = Mage :: getSingleton ( ’ cms / page ’ );
returns the same page we were dealing with in the helper class
contains all the code that will process these template directives. Like a lot of
Magento, this is a configuration based class instantiation. If you look at the
implementation of getPageTemplateProcessor
# File : app / code / core / Mage / Cms / Helper / Data . php
class M a g e _ C m s _ H e l p e r _ D a t a extends M a g e _ C o r e _ H e l p e r _ A b s t r a c t
{
You can see we look for our directive filtering class at the global configu-
ration node global/cms/page/template filter. As of Magento 1.4.2, this node
contains the class alias widget/template filter, which translates into the class
Mage Widget Model Template Filter. However, this may have changed by the time
you’re reading this, as whenever Magento adds new template directives a new
filtering class is created that extends the old one, add adds the new filtering
methods.
This class defines an object which contains parsing code which will
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
4. Use call user func to call this method on itself, passing in the an array
containing a tokenized version of the directive string.
It’s beyond the scope of this book to cover the implementation details of each
specific directive. We mention mainly to let you know that, if you’re trying to
debug a particular template directive, say
{{ media url = " / workforfree . jpg " }}
you can find its implementation method by taking the directive name (media),
and adding the word Directive. A quick search through the code base should
turn up the implementation
# File : app / code / core / Mage / Core / Model / Email / T e m p l a t e / Filter . php
public function med iaDirect ive ( $construction )
{
$params = $this - > _ g e t I n c l u d e P a r a m e t e r s ( $construction [2]);
return Mage :: getBaseUrl ( ’ media ’) . $params [ ’ url ’ ];
}
In this specific case we can see that the {{media ...} directive simply grabs the
base media URL using Mage::getBaseUrl(’media’), and appends the url paramater
to it.
Visit http://www.pulsestorm.net/nofrills-layout-chapter-six to join the discus-
sion online.
Chapter 7
Widgets
Consder the following situation. You’re a developer. You have a deep knowledge
of the Magento system. The corporate VP in charge of giving you things to do
runs into your work area and says
I want to add a YouTube video to the sidebar?!
You start explaining layouts, and blocks, and pages, and how they render, and
which XML file he’ll need to edit, or maybe you could add it as a page update
o...
Your boss then gives you that steely, bossy look and says again
I want to add a YouTube video to the sidebar
Most people don’t work on their own cars. Most people don’t harvest or hunt
their own food. And most people don’t want to code their own websites. That’s
the problem widgets set out to solve. In this chapter we’ll give you a full overfull
of the Magento widget system. From using the widgets that ship with Magento,
to creating your own widgets, to understanding how widgets are inserted into
the flow of the Layout.
98
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
CHAPTER 7. WIDGETS
5. Widgets contain rules that say which blocks in the layout system are
allowed to contain them
Let’s start by building ourselves a minimum viable widget, and inserting it into
a CMS page. We’ll be building our widget in the Nofrills Booklayout module.
You, of course, are free to add widgets to any module you create.
To start with, we need to create a configuration file that will let Magento know
about our widget. Being a newer subsystem of Magento, widgets have their
own custom XML config file which will be merged with the Magento config as
needed. widget config file are named widget.xml, and should be placed in your
module’s etc folder
<! - - # File : app / code / local / N o f r i l l s / B o o k l a y o u t / etc / widget . xml -->
< widgets >
</ widgets >
There are times where Magento will load the widget config from cache, and
there’s other times where the config will always be loaded from disk. Because
of that, it’s best to always clear the cache when making changes to this file.
We now have an empty widget config. Next, let’s add a node to hold our widget
definition
<! - - # File : app / code / local / N o f r i l l s / B o o k l a y o u t / etc / widget . xml -->
< widgets >
< n o f r i l l s _ l a y o u t b o o k _ y o u t u b e type = " n o f r i l l s _ b o o k l a y o u t / youtube " >
< name > YouTube Example Widget </ name >
< description type = " desc " >
This wiget displays a YouTube video .
</ description >
</ nofrills_layoutbook_youtube >
</ widgets >
Each second level node in this file tells Magento about a single widget that’s
available to the system. You should take steps to ensure this node’s name is
unique to avoid possible collisions with other widgets that are loaded in the
system from other modules. In this case, the name nofrills layoutbook youtube
should suffice.
It’s the type="nofrills booklayout/youtube" attribute we’re interested in. This de-
fines a block class alias for our widget. We’re telling Magento that the block
class
Nofrills_Booklayout_Block_Youtube
should be used for rendering this widget. The <name/> and <description/> tags
are used for text display in the Magento Admin Console.
Let’s create that class. Add the following file
# File : app / code / local / N of r i l l s / B o o k l a y o u t / Block / Youtube . php
<? php
class N o f r i l l s _ B o o k l a y o u t _ B l o c k _ Y o u t u b e extends M a g e _ C o r e _ B l o c k _ A b s t r a c t
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
CHAPTER 7. WIDGETS
implements M a g e _ W i d g e t _ B l o c k _ I n t e r f a c e
{
protected function _toHtml ()
{
return ’ < object width ="640" height ="505" >
< param name =" movie "
value =" http :// www . youtube . com / v / dQw4w9WgXcQ ? fs =1& amp ; hl = en_US " >
</ param >
< param name =" al low Fu l lS cr ee n " value =" true " > </ param >
< param name =" a l l o w s c r i p t a c c e s s " value =" always " > </ param >
< embed src =" http :// www . youtube . com / v / dQw4w9WgXcQ ? fs =1& amp ; hl = en_US "
type =" application /x - shockwave - flash "
a l l o w s c r i p t a c c e s s =" always " a ll o wf ul ls c re en =" true "
width ="640" height ="505" > </ embed > </ object > ’;
}
}
This class is mostly a standard block class. It extends from the Mage Core Block Abstract
class, and we’ve overridden the base toHtml method to have this block return
the embed code for a specific YouTube video. The one difference you’ll notice
is the class definition also has this
implements M a g e _ W i d g e t _ B l o c k _ I n t e r f a c e
This line is important. It tells PHP that our class is implementing the widget
interface. If you don’t understand the concept of PHP OOP interfaces, don’t
worry. Just include this line with your widget class. Without it, Magento won’t
be able to fully identify your block as a widget class.
That’s it! We now have a super simple widget. Let’s take it for a spin!
CHAPTER 7. WIDGETS
Figure 7.1
Figure 7.2
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
CHAPTER 7. WIDGETS
If you click on the Widget Type drop-down, you’ll see a list of standard
Magento widgets, with your YouTube Example Widget widget listed last.
Select your widget from the menu and click in Insert Widget. You should
notice the following text has been added to your HTML source
{{ widget type = " n o f r i l l s _ b o o k l a y o u t / youtube " }}
in a your web browser. You should see your embedded YouTube video.
Every directive in a CMS page works this way. Just look for the method name
that matches the directive name, followed by the word directive.
w id ge tD i re ct iv e
templateDirective
foobazbarDirective
The {{widget}} directive has a useful feature. You can use it to set properties on
your widget block object (see Appendix G: Magento Magic setters and getters).
We can use this to make our widget a bit more useful.
Change your block code so it matches the following, and refresh the CMS page.
<? php
class N o f r i l l s _ B o o k l a y o u t _ B l o c k _ Y o u t u b e extends M a g e _ C o r e _ B l o c k _ A b s t r a c t
implements M a g e _ W i d g e t _ B l o c k _ I n t e r f a c e
{
protected function _toHtml ()
{
$this - > setVideoId ( ’ dQw4w9WgXcQ ’ );
return ’
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
CHAPTER 7. WIDGETS
Your CMS page will remain unchanged. We’ve altered the code above to set a
video id data property on the block object, and then used that property in ren-
dering the YouTube embed code. (Remember, data properties are stored with
underscore notation, but the magic methods to fetch them are CamelCased)
Next, remove the following line from your block and reload the CMS page.
$this - > setVideoId ( ’ dQw4w9WgXcQ ’ );
Without setting this property, the video will fail to render. So far that’s all
pretty obvious. Next, edit the widget directive so it looks like the following
{{ widget type = " n o f r i l l s _ b o o k l a y o u t / youtube " video_id = " dQw4w9WgXcQ " }}
Save the CMS page, and reload the frontend page in your browser. Your video
is back!
The widgetDirective method will parse the directive text for attributes, and if
it finds any they’ll be assigned as data attributes to the widget object. With
this feature, your widgets go from static content renderers to dynamic content
renderers.
CHAPTER 7. WIDGETS
Clear your cache, and then click on the Insert Widget button again. Select
your widget from the drop-down, and you will now see a UI for entering a video
ID, (see Figure 7.3 )
Figure 7.3
Enter an ID (we recommend qYkbTyHXwbs to keep with the theme) and click
on Insert Widget. The following directive code should be inserted into the
content area.
{{ widget type = " n o f r i l l s _ b o o k l a y o u t / youtube " video_id = " qYkbTyHXwbs " }}
Easy as that, you now have a widget for inserting any YouTube video into any
page. Let’s take a look at the XML we added to our widget config
< parameters >
< video_id >
< required >1 </ required >
< visible >1 </ visible >
< value > Enter ID Here </ value >
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
CHAPTER 7. WIDGETS
This node will formally add data paramaters to our widget, and allow us to
specify a field type for data entry. The <video id> tag here does have semantic
value, it’s the name of the attribute that will be added to the directive tag
{{ widget type = " n o f r i l l s _ b o o k l a y o u t / youtube " video_id = " [ VALUE ] " }}
The <required> tag allows a level of data validation, setting this to ”1” will force
the Admin Console user to enter a value before inserting the widget.
The <visible/> node allows you to hide the input field for this data paramater,
and have the inserted widget directive tag automatically include an attribute
every time its used, with a value provided by the <value/> tag. When <visible/>
is set to 1 the <value/> tag will be used as a default ID.
The value in <label> will be used to provide your rendered HTML form with a
label, and <type/> controls what sort of form element is rendered. See Appendix
G for a full list and explanation of form rendering configurations.
Important: Be careful changing data paramaters of a deployed widget. Once
a {{widget...}} directive tag has been added to a CMS page, it become ”de-
tached” from its definition. That is, if we changed the <video id/> above to be
<youtube id/>, our CMS page would still have the
{{ widget type = " n o f r i l l s _ b o o k l a y o u t / youtube " video_id = " [ VALUE ] " }}
widget tag. While this isn’t necessarily a problem, it may cause confusion while
further developing the widget or debugging rendering issues.
CHAPTER 7. WIDGETS
Just like an ordinary block, a widget can be rendered using a phtml template.
Additionally, using the UI rendering features, we can make templates a cus-
tomizable feature of our widget.
Let’s make our YouTube widget a template block. First, we’ll alter our class
so it inherits from the core template block and we’ll removing the hard coded
toHtml method.
# File : app / code / local / N of r i l l s / B o o k l a y o u t / Block / Youtube . php
<? php
class N o f r i l l s _ B o o k l a y o u t _ B l o c k _ Y o u t u b e extends M a g e _ C o r e _ B l o c k _ T e m p l a t e
implements M a g e _ W i d g e t _ B l o c k _ I n t e r f a c e
{
Finally, we’ll add the youtube.phtml to our theme’s template folder. We’re adding
it to the default/default theme here, but if your site’s using a different theme,
make sure you put it in the appropriate location
<! - - # File : app / design / f r o n t e n d / default / default / t e m p l a t e / youtube . phtml -->
<h2 > Rick </ h2 >
< object width = " 640 " height = " 505 " >
< param name = " movie " value = " http :// www . youtube . com / v / ’ <? php
echo $this - > getVideoId ();? >? fs =1& amp ; hl = en_US " > </ param >
< param name = " al l ow Fu ll S cr ee n " value = " true " > </ param >
< param name = " a l l o w s c r i p t a c c e s s " value = " always " > </ param >
< embed src = " http :// www . youtube . com / v / <? php
echo $this - > getVideoId ();? >? fs =1& amp ; hl = en_US "
type = " application /x - shockwave - flash " a l l o w s c r i p t a c c e s s = " always "
a ll ow f ul ls cr e en = " true " width = " 640 " height = " 505 " > </ embed >
</ object >
With all of the above in place (and a cache clear), re-insert your widget. You
should get a widget tag with a template attribute
{{ widget type = " n o f r i l l s _ b o o k l a y o u t / youtube " video_id = " qYkbTyHXwbs "
template = " youtube . phtml " }}
Reload your frontend page and your configured YouTube video should render
the same as before.
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
CHAPTER 7. WIDGETS
Because template blocks store their template as a regular block data para-
mater, all we’re really doing here is adding a new widget data paramater named
<template/>. We hard coded a value (by using an invisible data field), but there’s
no reason we couldn’t make it a truly configurable value. Give the following a
try in your widget config
< template >
< required >1 </ required >
< visible >1 </ visible >
< value > youtube . phtml </ value >
< label > Frontend Template </ label >
< type > select </ type >
Clear your cache and reinsert your widget. You should now see a new drop-
down menu allowing you to pick which template your widget should use, (see
Figure 7.4 )
Figure 7.4
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
CHAPTER 7. WIDGETS
While it may appear that the template tag is being treated as just another
widget property, when we move outside of CMS based widgets and into In-
stance Widgets, we’ll see that the Instance Widget engine treats this paramater
specially.
With Instance Widgets, we can create and save a widget with a specific set of
data, and then insert that widget into multiple locations on the site. Then, if
we later change the definition of that specific widget, it will be automatically
updated throughout the site.
in the Admin Console to see a list of all the widgets in your system. We’re going
to add a new one, so click on the Add New Widget Instance button
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
CHAPTER 7. WIDGETS
Instance Widget creation is a two step process. First, we need to select the
widget type we’re going to create, as well as which theme the widget will be
added to. Select our YouTube example widget from the drop down menu, and
pick the currently configured theme. We’ll be assuming default/default for the
following examples, (see Figure 7.5 )
Figure 7.5
Figure 7.6
In Frontend Properties you have two option groups. The first allows you to
select a Widget Instance Title, Assign a Store View, and set a Sort Order for
the widget. The Widget Instance Title is used in the Admin Console when
displaying information about the widget (i.e. the listing page), Store View
allows you to specify which Magento Stores a widget appears in.
Let’s save our widget with a title, and select All Store Views. Click on the
Save button, and you’ll be returned to the widget listing page. You should
see your widget listed along with any others that have been added to your
Magento system. Click on the widget row to edit it. You’ll notice you’ve been
brought directly to the second stage, and that the Widget Type and Design
Package/Theme options are un-editable. Once you select these during widget
creation they cannot be changed, (see Figure 7.7 )
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
CHAPTER 7. WIDGETS
Figure 7.7
Figure 7.8
This drop down menu contains several options, each one describing a particular
set of, or a specific, Magento page. What we’re configuring here is the page or
pages we want to add our Widget Instance to. Select All Pages from this menu,
(see Figure 7.9 )
Two more menus have appeared. The first is Block Reference, the second is
Template.
The first menu is defining which block you want to add your Widget Instance
to. Select Main Content Area. The values in the second menu should look fa-
miliar to you. They’re the templates we defined earlier. Select ”Embed Video”,
and then Save you Widget Instance.
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
CHAPTER 7. WIDGETS
Figure 7.9
At this point you may receive a message at the top of your Magento admin that
looks something like Figure 7.10.
Figure 7.10
This is Magento telling you that it has detected a change to the system that
requires you to clear your cache. Do this, and then load any page in your site.
You should now see your YouTube video added to the main content area.
This table contains a list of Layout Update XML fragments, organized by han-
dle. When building the Page Layout for any request, Magento will check this
table after checking the loaded package layout. If it finds any matching han-
dles, they’ll be added to the Page Layout. When you select a value from the
Display On menu, you’re actually telling Magento which handles should be
applied. When you save your Widget Instance, this table is updated. Because
these updates add blocks to other block’s that inherit from core/text list, the
widget blocks are automatically rendered.
If you take a look at the Mage Core Model Layout Update::merge method, you can see
the additional call to fetchDbLayoutUpdates
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
CHAPTER 7. WIDGETS
Without an the abstract Layout system, adding a feature like widgets would
have required (at minimum) editing every single controller action, and inserting
blocks into an unknown layout structure. This is the kind of power that sort of
abstraction enables.
Similarly, the list of blocks which you insert a widget into is not hardcoded into
a configuration system. It’s generated automatically. Magento takes the handle
indicated by the Display On drop down, and applies it to the Package Layout
to create a temporary Page Layout. Then, rather than render a page, it looks at
the top level body blocks for that layout to get a list of eligible blocks to display
in the drop-down menu. This means if you add additional structural blocks to a
page via means of custom XML layout files or local.xml, those blocks will show
up in this menu. Again, this sort of thing becomes much easier to implement
when using an abstract layout system.
CHAPTER 7. WIDGETS
Clear your cache and reload the Widget Instance editing page. Your (formerly)
long block menu now only allows you the choice of
Left Column
Main Content Area
In the absence of a <supported blocks/> tag, Magento will display all eligible
blocks for any particular page. However, with this node in place, it will scan
each top level node for a sub-node named <block name> and restrict your choices
to those it finds. In our case above, the blocks are content and left. These
names are the block’s name as defined in the Layout Update XML fragment
< block type = " core / text_list " name = " content " as = " content " translate = " label " >
You’re also required to specify which, if any, templates are valid for a particular
block. This context sensitive template is a powerful feature. Consider and add
the following change to your widget.xml file
< uniquely_named_node >
< block_name > content </ block_name >
< template >
< unique_name_one > as_video </ unique_name_one >
< unique_name_two > as_link </ unique_name_two >
</ template >
</ uniquely_named_node >
Clear your cache and reload the widget editor. You’ll notice that switching
between the content and left block will result in your template choice being
restricted. By using this technique, we’ve prevented a user from accidentally
inserting a full video into the left hand column by restricting the templates they
can use. In essence, each widget definition is an abstract content type, and you
can control how it displays in each section of the site. This is only a few steps
away from some of the advanced content management features of systems like
Drupal.
The values being supplied for the templates (as link and as video) are the names
of the nodes in the <templates/> block up in the <paramaters/> section. This is
what we’ve meant when we said Magento treats this node differently.
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
CHAPTER 7. WIDGETS
This file has the same format as the widget.xml in your module. Values in these
files can be used to override the values for Instance Widgets. They do not
apply to widgets inserted into CMS Pages or Static Blocks. In practice, this
is done primarily for the supported blocks feature. Keeping with the generate
principle of separating concerns, a general code module doesn’t, technically,
know which blocks or templates are going to be available for it. By keeping
this information in each theme (Magento’s default widgets ship with all the
<supported blocks/> information in the theme configs), Magento ensures that
any themes which add custom core/test list blocks also have the ability to
allow or deny widgets access to these blocks.
7.12 Wrap Up
And that, in a nutshell, is widgets. We chose to end this books with widgets,
because they appear to be the path forward for Magento content and layout
management. The abstract layout system described in this book is stepping
stone towards larger, more robust content and layout management for Magento.
Less than four years old, Magento is dominating the ecommerce landscape like
no other system. We hope the knowedge and techniques provided here will
help you tame your Magento systems, and allow you to spend less time being
confused by code, and more time serving your customers and building your
businesses.
Visit http://www.pulsestorm.net/nofrills-layout-chapter-seven to join the dis-
cussion online.
Appendix A
115
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
| | | | |-- Mage_Directory_Block_Adminhtml_Frontend_Region_Updater
| | | | |-- Mage_GoogleCheckout_Block_Adminhtml_Shipping_Applicable_Countries
| | | | |-- Mage_GoogleCheckout_Block_Adminhtml_Shipping_Merchant
| | | | |-- Mage_Paypal_Block_Adminhtml_System_Config_ApiWizard
| | | | ‘-- M a g e _ T a x _ B l o c k _ A d m i n h t m l _ F r o n t e n d _ R e g i o n _ U p d a t e r
| | | |-- Mage_Adminhtml_Block_System_Config_Form_Field
| | | |-- Mage_Adminhtml_Block_System_Config_Form_Field_Heading
| | | |-- Mage_Adminhtml_Block_System_Config_Form_Fieldset
| | | | |-- Mage_Adminhtml_Block_System_Config_Form_Fieldset_Modules_DisableOutput
| | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ S y s t e m _ C o n f i g _ F o r m _ F i e l d s e t _ O r d e r _ S t a t u s e s
| | | |-- Mage_Adminhtml_Block_System_Config_Form_Fieldset
| | | |-- Mage_Adminhtml_Block_System_Convert_Profile_Run
| | | |-- Mage_Adminhtml_Block_Widget_Form_Element_Dependence
| | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Filter_Abstract
| | | | |-- Mage_Adminhtml_Block_Newsletter_Problem_Grid_Filter_Checkbox
| | | | |-- Mage_Adminhtml_Block_Newsletter_Subscriber_Grid_Filter_Checkbox
| | | | |-- Mage_Adminhtml_Block_System_Convert_Profile_Edit_Filter_Action
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Filter_Date
| | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ W i d g e t _ G r i d _ C o l u m n _ F i l t e r _ D a t e t i m e
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Filter_Date
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Filter_Price
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Filter_Range
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Filter_Select
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Super_Config_Grid_Filter_
| | | | | |-- Mage_Adminhtml_Block_Customer_Edit_Tab_Newsletter_Grid_Filter_Status
| | | | | |-- Mage_Adminhtml_Block_Customer_Grid_Filter_Country
| | | | | |-- Mage_Adminhtml_Block_Newsletter_Subscriber_Grid_Filter_Website
| | | | | |-- Mage_Adminhtml_Block_Review_Grid_Filter_Type
| | | | | |-- Mage_Adminhtml_Block_System_Email_Template_Grid_Filter_Type
| | | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Filter_Checkbox
| | | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ W i d g e t _ G r i d _ C o l u m n _ F i l t e r _ M a s s a c t i o n
| | | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Filter_Checkbox
| | | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Filter_Country
| | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ W i d g e t _ G r i d _ C o l u m n _ F i l t e r _ R a d i o
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Filter_Select
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Filter_Store
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Filter_Text
| | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ W i d g e t _ G r i d _ C o l u m n _ F i l t e r _ T h e m e
| | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Filter_Abstract
| | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract
| | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Super_Config_Grid_Renderer_In
| | | | |-- Mage_Adminhtml_Block_Cms_Page_Grid_Renderer_Action
| | | | |-- Mage_Adminhtml_Block_Customer_Edit_Tab_Newsletter_Grid_Renderer_Action
| | | | |-- Mage_Adminhtml_Block_Customer_Edit_Tab_Newsletter_Grid_Renderer_Status
| | | | |-- Mage_Adminhtml_Block_Customer_Edit_Tab_Wishlist_Grid_Renderer_Description
| | | | |-- Mage_Adminhtml_Block_Customer_Online_Grid_Renderer_Ip
| | | | |-- Mage_Adminhtml_Block_Customer_Online_Grid_Renderer_Type
| | | | |-- Mage_Adminhtml_Block_Customer_Online_Grid_Renderer_Url
| | | | |-- Mage_Adminhtml_Block_Dashboard_Searches_Renderer_Searchquery
| | | | |-- Mage_Adminhtml_Block_Newsletter_Problem_Grid_Renderer_Checkbox
| | | | |-- Mage_Adminhtml_Block_Newsletter_Subscriber_Grid_Renderer_Checkbox
| | | | |-- Mage_Adminhtml_Block_Newsletter_Template_Grid_Renderer_Sender
| | | | |-- Mage_Adminhtml_Block_Notification_Grid_Renderer_Actions
| | | | |-- Mage_Adminhtml_Block_Notification_Grid_Renderer_Notice
| | | | |-- Mage_Adminhtml_Block_Notification_Grid_Renderer_Severity
| | | | |-- Mage_Adminhtml_Block_Report_Grid_Column_Renderer_Customer
| | | | |-- Mage_Adminhtml_Block_Report_Grid_Column_Renderer_Product
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
| | | | |-- Mage_Adminhtml_Block_Report_Product_Downloads_Renderer_Purchases
| | | | |-- Mage_Adminhtml_Block_Review_Grid_Renderer_Type
| | | | |-- Mage_Adminhtml_Block_Sales_Reorder_Renderer_Action
| | | | |-- Mage_Adminhtml_Block_Sitemap_Grid_Renderer_Link
| | | | |-- Mage_Adminhtml_Block_Sitemap_Grid_Renderer_Time
| | | | |-- Mage_Adminhtml_Block_System_Convert_Profile_Edit_Renderer_Action
| | | | |-- Mage_Adminhtml_Block_System_Email_Template_Grid_Renderer_Sender
| | | | |-- Mage_Adminhtml_Block_System_Email_Template_Grid_Renderer_Type
| | | | |-- Mage_Adminhtml_Block_System_Store_Grid_Render_Group
| | | | |-- Mage_Adminhtml_Block_System_Store_Grid_Render_Store
| | | | |-- Mage_Adminhtml_Block_System_Store_Grid_Render_Website
| | | | |-- Mage_Adminhtml_Block_Tax_Rate_Grid_Renderer_Data
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Checkbox
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Super_Config_Grid_Rendere
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Search_Grid_Renderer_Giftmessag
| | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ W i d g e t _ G r i d _ C o l u m n _ R e n d e r e r _ M a s s a c t i o n
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Checkbox
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Concat
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Country
| | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ T a x _ R a t e _ G r i d _ R e n d e r e r _ C o u n t r y
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Country
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Currency
| | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ R e p o r t _ G r i d _ C o l u m n _ R e n d e r e r _ C u r r e n c y
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Currency
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Date
| | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ R e p o r t _ S a l e s _ G r i d _ C o l u m n _ R e n d e r e r _ D a t e
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Date
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Datetime
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Input
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Ip
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Longtext
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Number
| | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ R e p o r t _ G r i d _ C o l u m n _ R e n d e r e r _ B l a n k n u m b e r
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Number
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Price
| | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ S a l e s _ O r d e r _ C r e a t e _ S e a r c h _ G r i d _ R e n d e r e r _ P r i c e
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Price
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Radio
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Select
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Store
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Text
| | | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Action
| | | | | | |-- Mage_Adminhtml_Block_Extensions_Local_Grid_Renderer_Action
| | | | | | |-- Mage_Adminhtml_Block_Extensions_Remote_Grid_Renderer_Action
| | | | | | |-- Mage_Adminhtml_Block_Newsletter_Queue_Grid_Renderer_Action
| | | | | | |-- Mage_Adminhtml_Block_Newsletter_Template_Grid_Renderer_Action
| | | | | | |-- Mage_Adminhtml_Block_Sitemap_Grid_Renderer_Action
| | | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ S y s t e m _ E m a i l _ T e m p l a t e _ G r i d _ R e n d e r e r _ A c t i o n
| | | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Action
| | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ W i d g e t _ G r i d _ C o l u m n _ R e n d e r e r _ O p t i o n s
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Text
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Theme
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Wrapline
| | | | |-- Mage_GoogleBase_Block_Adminhtml_Items_Renderer_Id
| | | | ‘-- M a g e _ G o o g l e B a s e _ B l o c k _ A d m i n h t m l _ T y p e s _ R e n d e r e r _ C o u n t r y
| | | |-- Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract
| | | |-- Mage_Paypal_Block_Adminhtml_System_Config_Fieldset_Global
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
| | | |-- Mage_Paypal_Block_Adminhtml_System_Config_Fieldset_Hint
| | | |-- Mage_Sales_Block_Adminhtml_Billing_Agreement_View_Tab_Info
| | | ‘-- M a g e _ S a l e s _ B l o c k _ A d m i n h t m l _ R e c u r r i n g _ P r o f i l e _ E d i t _ F o r m
| | |-- Mage_Adminhtml_Block_Abstract
| | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Ajax_Serializer
| | |-- Mage_Adminhtml_Block_Sales_Order_Create_Load
| | |-- Mage_Adminhtml_Block_Tax_Rate_Title
| | |-- Mage_Adminhtml_Block_Template
| | | |-- Mage_Adminhtml_Block_Api_Buttons
| | | |-- Mage_Adminhtml_Block_Api_Roles
| | | |-- Mage_Adminhtml_Block_Api_Users
| | | |-- Mage_Adminhtml_Block_Backup
| | | |-- Mage_Adminhtml_Block_Cache_Additional
| | | |-- Mage_Adminhtml_Block_Cache_Notifications
| | | |-- Mage_Adminhtml_Block_Catalog
| | | |-- Mage_Adminhtml_Block_Catalog_Category_Abstract
| | | | |-- Mage_Adminhtml_Block_Catalog_Category_Edit_Form
| | | | |-- Mage_Adminhtml_Block_Catalog_Category_Tree
| | | | | |-- Mage_Adminhtml_Block_Catalog_Category_Checkboxes_Tree
| | | | | |-- Mage_Adminhtml_Block_Catalog_Category_Widget_Chooser
| | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ C a t a l o g _ P r o d u c t _ E d i t _ T a b _ C a t e g o r i e s
| | | | |-- Mage_Adminhtml_Block_Catalog_Category_Tree
| | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ U r l r e w r i t e _ C a t e g o r y _ T r e e
| | | |-- Mage_Adminhtml_Block_Catalog_Category_Abstract
| | | |-- Mage_Adminhtml_Block_Catalog_Product_Attribute_Set_Main
| | | |-- Mage_Adminhtml_Block_Catalog_Product_Attribute_Set_Main_Tree_Attribute
| | | |-- Mage_Adminhtml_Block_Catalog_Product_Attribute_Set_Main_Tree_Group
| | | |-- Mage_Adminhtml_Block_Catalog_Product_Attribute_Set_Toolbar_Add
| | | |-- Mage_Adminhtml_Block_Catalog_Product_Attribute_Set_Toolbar_Main
| | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Js
| | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Alerts
| | | |-- Mage_Adminhtml_Block_Catalog_Product_Widget_Chooser_Container
| | | |-- Mage_Adminhtml_Block_Cms_Wysiwyg_Images_Content_Files
| | | |-- Mage_Adminhtml_Block_Cms_Wysiwyg_Images_Content_Newfolder
| | | |-- Mage_Adminhtml_Block_Cms_Wysiwyg_Images_Tree
| | | |-- Mage_Adminhtml_Block_Customer_Edit_Tab_Carts
| | | |-- Mage_Adminhtml_Block_Customer_Edit_Tab_View
| | | |-- Mage_Adminhtml_Block_Customer_Edit_Tab_View_Sales
| | | |-- Mage_Adminhtml_Block_Customer_Online
| | | |-- Mage_Adminhtml_Block_Dashboard
| | | |-- Mage_Adminhtml_Block_Denied
| | | |-- Mage_Adminhtml_Block_Newsletter_Problem
| | | |-- Mage_Adminhtml_Block_Newsletter_Queue
| | | |-- Mage_Adminhtml_Block_Newsletter_Queue_Edit
| | | |-- Mage_Adminhtml_Block_Newsletter_Subscriber
| | | |-- Mage_Adminhtml_Block_Newsletter_Template
| | | |-- Mage_Adminhtml_Block_Notification_Baseurl
| | | |-- Mage_Adminhtml_Block_Notification_Security
| | | |-- Mage_Adminhtml_Block_Notification_Survey
| | | |-- Mage_Adminhtml_Block_Notification_Toolbar
| | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ N o t i f i c a t i o n _ W i n d o w
| | | |-- Mage_Adminhtml_Block_Notification_Toolbar
| | | |-- Mage_Adminhtml_Block_Page
| | | |-- Mage_Adminhtml_Block_Page_Footer
| | | |-- Mage_Adminhtml_Block_Page_Header
| | | |-- Mage_Adminhtml_Block_Page_Menu
| | | |-- Mage_Adminhtml_Block_Page_Notices
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
| | | |-- Mage_Adminhtml_Block_Permissions_Buttons
| | | |-- Mage_Adminhtml_Block_Permissions_Roles
| | | |-- Mage_Adminhtml_Block_Permissions_Usernroles
| | | |-- Mage_Adminhtml_Block_Permissions_Users
| | | |-- Mage_Adminhtml_Block_Poll_Edit_Tab_Answers_List
| | | |-- Mage_Adminhtml_Block_Report_Wishlist
| | | |-- Mage_Adminhtml_Block_Review_Rating_Detailed
| | | |-- Mage_Adminhtml_Block_Review_Rating_Summary
| | | |-- Mage_Adminhtml_Block_Sales
| | | |-- Mage_Adminhtml_Block_Sales_Items_Abstract
| | | | |-- Mage_Adminhtml_Block_Sales_Items_Renderer_Configurable
| | | | |-- Mage_Adminhtml_Block_Sales_Items_Renderer_Default
| | | | | ‘-- M a g e _ B u n d l e _ B l o c k _ A d m i n h t m l _ S a l e s _ O r d e r _ I t e m s _ R e n d e r e r
| | | | |-- Mage_Adminhtml_Block_Sales_Items_Renderer_Default
| | | | |-- Mage_Adminhtml_Block_Sales_Order_Creditmemo_Create_Items
| | | | |-- Mage_Adminhtml_Block_Sales_Order_Creditmemo_View_Items
| | | | |-- Mage_Adminhtml_Block_Sales_Order_Invoice_Create_Items
| | | | |-- Mage_Adminhtml_Block_Sales_Order_Invoice_View_Items
| | | | |-- Mage_Adminhtml_Block_Sales_Order_Shipment_Create_Items
| | | | |-- Mage_Adminhtml_Block_Sales_Order_Shipment_View_Items
| | | | |-- Mage_Adminhtml_Block_Sales_Order_View_Items
| | | | |-- Mage_Adminhtml_Block_Sales_Order_View_Items_Renderer_Default
| | | | | ‘-- M a g e _ B u n d l e _ B l o c k _ A d m i n h t m l _ S a l e s _ O r d e r _ V i e w _ I t e m s _ R e n d e r e r
| | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ S a l e s _ O r d e r _ V i e w _ I t e m s _ R e n d e r e r _ D e f a u l t
| | | |-- Mage_Adminhtml_Block_Sales_Items_Abstract
| | | |-- Mage_Adminhtml_Block_Sales_Items_Column_Default
| | | | |-- Mage_Adminhtml_Block_Sales_Items_Column_Name
| | | | | |-- Mage_Adminhtml_Block_Sales_Items_Column_Name_Grouped
| | | | | ‘-- M a g e _ D o w n l o a d a b l e _ B l o c k _ A d m i n h t m l _ S a l e s _ I t e m s _ C o l u m n _ D o w n l o a d a b l e _ N a m e
| | | | |-- Mage_Adminhtml_Block_Sales_Items_Column_Name
| | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ S a l e s _ I t e m s _ C o l u m n _ Q t y
| | | |-- Mage_Adminhtml_Block_Sales_Items_Column_Default
| | | |-- Mage_Adminhtml_Block_Sales_Order_Comments_View
| | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Totals_Table
| | | |-- Mage_Adminhtml_Block_Sales_Order_Creditmemo_Create_Adjustments
| | | |-- Mage_Adminhtml_Block_Sales_Order_Invoice_Create_Tracking
| | | |-- Mage_Adminhtml_Block_Sales_Order_Payment
| | | |-- Mage_Adminhtml_Block_Sales_Order_Shipment_Create_Tracking
| | | |-- Mage_Adminhtml_Block_Sales_Order_Shipment_Tracking_Info
| | | |-- Mage_Adminhtml_Block_Sales_Order_Shipment_View_Tracking
| | | |-- Mage_Adminhtml_Block_Sales_Order_View_Form
| | | |-- Mage_Adminhtml_Block_Sales_Order_View_History
| | | |-- Mage_Adminhtml_Block_Sales_Order_View_Tab_History
| | | |-- Mage_Adminhtml_Block_Store_Switcher
| | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Websites
| | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Store_Select
| | | | |-- Mage_Adminhtml_Block_Tag_Store_Switcher
| | | | ‘-- M a g e _ G o o g l e B a s e _ B l o c k _ A d m i n h t m l _ S t o r e _ S w i t c h e r
| | | |-- Mage_Adminhtml_Block_Store_Switcher
| | | |-- Mage_Adminhtml_Block_System_Config_Switcher
| | | |-- Mage_Adminhtml_Block_System_Convert_Profile_Edit_Tab_Run
| | | |-- Mage_Adminhtml_Block_System_Currency
| | | |-- Mage_Adminhtml_Block_System_Currency_Rate_Matrix
| | | |-- Mage_Adminhtml_Block_System_Currency_Rate_Services
| | | |-- Mage_Adminhtml_Block_System_Design
| | | |-- Mage_Adminhtml_Block_System_Email_Template
| | | |-- Mage_Adminhtml_Block_System_Store_Delete_Group
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
| | | |-- Mage_Adminhtml_Block_System_Store_Delete_Website
| | | |-- Mage_Adminhtml_Block_Tag
| | | |-- Mage_Adminhtml_Block_Tag_Pending
| | | |-- Mage_Adminhtml_Block_Tax_Rate_Toolbar_Add
| | | |-- Mage_Adminhtml_Block_Tax_Rate_Toolbar_Save
| | | |-- Mage_Adminhtml_Block_Widget
| | | | |-- Mage_Adminhtml_Block_Catalog_Product_Attribute_New_Product_Created
| | | | |-- Mage_Adminhtml_Block_Catalog_Product_Created
| | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit
| | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Action_Attribute
| | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Action_Attribute_Tab_Inventory
| | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Action_Attribute_Tab_Websites
| | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Inventory
| | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Options
| | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Options_Option
| | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Options_Type_Abstract
| | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Price_Tier
| | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Super_Config
| | | | |-- Mage_Adminhtml_Block_Catalog_Product_Helper_Form_Gallery_Content
| | | | |-- Mage_Adminhtml_Block_Dashboard_Abstract
| | | | | |-- Mage_Adminhtml_Block_Dashboard_Bar
| | | | | | |-- Mage_Adminhtml_Block_Dashboard_Sales
| | | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ D a s h b o a r d _ T o t a l s
| | | | | |-- Mage_Adminhtml_Block_Dashboard_Bar
| | | | | |-- Mage_Adminhtml_Block_Dashboard_Graph
| | | | | | |-- Mage_Adminhtml_Block_Dashboard_Tab_Amounts
| | | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ D a s h b o a r d _ T a b _ O r d e r s
| | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ D a s h b o a r d _ G r a p h
| | | | |-- Mage_Adminhtml_Block_Dashboard_Abstract
| | | | |-- Mage_Adminhtml_Block_Extensions_Config_Edit
| | | | |-- Mage_Adminhtml_Block_Media_Editor
| | | | |-- Mage_Adminhtml_Block_Media_Uploader
| | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ C m s _ W y s i w y g _ I m a g e s _ C o n t e n t _ U p l o a d e r
| | | | |-- Mage_Adminhtml_Block_Media_Uploader
| | | | |-- Mage_Adminhtml_Block_Newsletter_Queue_Preview
| | | | |-- Mage_Adminhtml_Block_Newsletter_Template_Edit
| | | | |-- Mage_Adminhtml_Block_Newsletter_Template_Preview
| | | | |-- Mage_Adminhtml_Block_Sales_Order_Abstract
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Creditmemo_Create_Form
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Creditmemo_View_Form
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Invoice_Create_Form
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Invoice_View_Form
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Shipment_Create_Form
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Shipment_View_Form
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Totalbar
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_View_Info
| | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ S a l e s _ O r d e r _ V i e w _ T a b _ I n f o
| | | | |-- Mage_Adminhtml_Block_Sales_Order_Abstract
| | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Abstract
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Billing_Method
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Comment
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Coupons
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Coupons_Form
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Customer
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Data
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Form
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Form_Abstract
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
| | | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Form_Account
| | | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Form_Address
| | | | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Billing_Address
| | | | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ S a l e s _ O r d e r _ C r e a t e _ S h i p p i n g _ A d d r e s s
| | | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ S a l e s _ O r d e r _ C r e a t e _ F o r m _ A d d r e s s
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Form_Abstract
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Giftmessage
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Header
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Items
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Items_Grid
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Newsletter
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Search
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Shipping_Method
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Shipping_Method_Form
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Sidebar
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Sidebar_Abstract
| | | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Sidebar_Cart
| | | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Sidebar_Compared
| | | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Sidebar_Pcompared
| | | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Sidebar_Pviewed
| | | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Sidebar_Reorder
| | | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Sidebar_Viewed
| | | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ S a l e s _ O r d e r _ C r e a t e _ S i d e b a r _ W i s h l i s t
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Sidebar_Abstract
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Store
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Totals
| | | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Totals_Default
| | | | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Totals_Discount
| | | | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Totals_Grandtotal
| | | | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Totals_Shipping
| | | | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Totals_Subtotal
| | | | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ S a l e s _ O r d e r _ C r e a t e _ T o t a l s _ T a x
| | | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ S a l e s _ O r d e r _ C r e a t e _ T o t a l s _ D e f a u l t
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Totals
| | | | | |-- Mage_Centinel_Block_Adminhtml_Validation
| | | | | ‘-- M a g e _ C e n t i n e l _ B l o c k _ A d m i n h t m l _ V a l i d a t i o n _ F o r m
| | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Abstract
| | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Newsletter_Form
| | | | |-- Mage_Adminhtml_Block_Sales_Order_View_Giftmessage
| | | | |-- Mage_Adminhtml_Block_System_Cache_Edit
| | | | |-- Mage_Adminhtml_Block_System_Config_Edit
| | | | |-- Mage_Adminhtml_Block_System_Config_Tabs
| | | | |-- Mage_Adminhtml_Block_System_Design_Edit
| | | | |-- Mage_Adminhtml_Block_System_Email_Template_Edit
| | | | |-- Mage_Adminhtml_Block_System_Email_Template_Preview
| | | | |-- Mage_Adminhtml_Block_Tax_Rate_ImportExport
| | | | |-- Mage_Adminhtml_Block_Widget_Accordion
| | | | | |-- Mage_Adminhtml_Block_Customer_Edit_Tab_View_Accordion
| | | | | |-- Mage_Adminhtml_Block_Tag_Edit_Accordion
| | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ T a g _ E d i t _ A s s i g n e d
| | | | |-- Mage_Adminhtml_Block_Widget_Accordion
| | | | |-- Mage_Adminhtml_Block_Widget_Accordion_Item
| | | | |-- Mage_Adminhtml_Block_Widget_Button
| | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ C a t a l o g _ P r o d u c t _ E d i t _ T a b _ A t t r i b u t e s _ C r e a t e
| | | | |-- Mage_Adminhtml_Block_Widget_Button
| | | | |-- Mage_Adminhtml_Block_Widget_Form
| | | | | |-- Find_Feed_Block_Adminhtml_Edit_Codes_Edit_Form
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
| | | | | |-- Mage_Adminhtml_Block_Api_Tab_Roleinfo
| | | | | |-- Mage_Adminhtml_Block_Api_Tab_Rolesedit
| | | | | |-- Mage_Adminhtml_Block_Api_User_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Api_User_Edit_Tab_Main
| | | | | |-- Mage_Adminhtml_Block_Catalog_Form
| | | | | | |-- Mage_Adminhtml_Block_Catalog_Category_Tab_Attributes
| | | | | | |-- Mage_Adminhtml_Block_Catalog_Category_Tab_Design
| | | | | | |-- Mage_Adminhtml_Block_Catalog_Category_Tab_General
| | | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Attribute_New_Product_Attribut
| | | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Action_Attribute_Tab_Attr
| | | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Attributes
| | | | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Super_Config_Simp
| | | | | | | ‘-- M a g e _ B u n d l e _ B l o c k _ A d m i n h t m l _ C a t a l o g _ P r o d u c t _ E d i t _ T a b _ A t t r i b u t e s
| | | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Attributes
| | | | | | |-- Mage_GoogleOptimizer_Block_Adminhtml_Catalog_Category_Edit_Tab_Goog
| | | | | | ‘-- M a g e _ G o o g l e O p t i m i z e r _ B l o c k _ A d m i n h t m l _ C a t a l o g _ P r o d u c t _ E d i t _ T a b _ G o o g l
| | | | | |-- Mage_Adminhtml_Block_Catalog_Form
| | | | | |-- Mage_Adminhtml_Block_Catalog_Helper_Form_Wysiwyg_Content
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Attribute_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Attribute_Edit_Tab_Front
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Attribute_Edit_Tab_System
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Attribute_Set_Main_Formattribute
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Attribute_Set_Main_Formgroup
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Attribute_Set_Main_Formset
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Attribute_Set_Toolbar_Main_Filter
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Price
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Settings
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Super_Settings
| | | | | |-- Mage_Adminhtml_Block_Catalog_Search_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Checkout_Agreement_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Cms_Block_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Cms_Page_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Cms_Page_Edit_Tab_Content
| | | | | |-- Mage_Adminhtml_Block_Cms_Page_Edit_Tab_Design
| | | | | |-- Mage_Adminhtml_Block_Cms_Page_Edit_Tab_Main
| | | | | |-- Mage_Adminhtml_Block_Cms_Page_Edit_Tab_Meta
| | | | | |-- Mage_Adminhtml_Block_Customer_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Customer_Edit_Tab_Account
| | | | | |-- Mage_Adminhtml_Block_Customer_Edit_Tab_Addresses
| | | | | |-- Mage_Adminhtml_Block_Customer_Edit_Tab_Newsletter
| | | | | |-- Mage_Adminhtml_Block_Customer_Group_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Customer_Online_Filter
| | | | | |-- Mage_Adminhtml_Block_Extensions_Config_Form
| | | | | |-- Mage_Adminhtml_Block_Extensions_Console_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Extensions_Custom_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Extensions_Custom_Edit_Tab_Abstract
| | | | | | |-- Mage_Adminhtml_Block_Extensions_Custom_Edit_Tab_Contents
| | | | | | |-- Mage_Adminhtml_Block_Extensions_Custom_Edit_Tab_Depends
| | | | | | |-- Mage_Adminhtml_Block_Extensions_Custom_Edit_Tab_Maintainers
| | | | | | |-- Mage_Adminhtml_Block_Extensions_Custom_Edit_Tab_Package
| | | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ E x t e n s i o n s _ C u s t o m _ E d i t _ T a b _ R e l e a s e
| | | | | |-- Mage_Adminhtml_Block_Extensions_Custom_Edit_Tab_Abstract
| | | | | |-- Mage_Adminhtml_Block_Extensions_File_Form
| | | | | |-- Mage_Adminhtml_Block_Extensions_Local_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Extensions_Local_Edit_Tab_Abstract
| | | | | | |-- Mage_Adminhtml_Block_Extensions_Local_Edit_Tab_Actions
| | | | | | |-- Mage_Adminhtml_Block_Extensions_Local_Edit_Tab_Changelog
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
| | | | | | |-- Mage_Adminhtml_Block_Extensions_Local_Edit_Tab_Contents
| | | | | | |-- Mage_Adminhtml_Block_Extensions_Local_Edit_Tab_Depends
| | | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ E x t e n s i o n s _ L o c a l _ E d i t _ T a b _ P a c k a g e
| | | | | |-- Mage_Adminhtml_Block_Extensions_Local_Edit_Tab_Abstract
| | | | | |-- Mage_Adminhtml_Block_Extensions_Local_Upgrade
| | | | | |-- Mage_Adminhtml_Block_Extensions_Mass_Install
| | | | | |-- Mage_Adminhtml_Block_Extensions_Mass_Uninstall
| | | | | |-- Mage_Adminhtml_Block_Extensions_Mass_Upgrade
| | | | | |-- Mage_Adminhtml_Block_Extensions_Remote_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Extensions_Remote_Edit_Tab_Abstract
| | | | | | |-- Mage_Adminhtml_Block_Extensions_Remote_Edit_Tab_Actions
| | | | | | |-- Mage_Adminhtml_Block_Extensions_Remote_Edit_Tab_Changelog
| | | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ E x t e n s i o n s _ R e m o t e _ E d i t _ T a b _ P a c k a g e
| | | | | |-- Mage_Adminhtml_Block_Extensions_Remote_Edit_Tab_Abstract
| | | | | |-- Mage_Adminhtml_Block_Newsletter_Queue_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Newsletter_Template_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Newsletter_Template_Preview_Form
| | | | | |-- Mage_Adminhtml_Block_Permissions_Tab_Roleinfo
| | | | | |-- Mage_Adminhtml_Block_Permissions_Tab_Rolesedit
| | | | | |-- Mage_Adminhtml_Block_Permissions_Tab_Useredit
| | | | | |-- Mage_Adminhtml_Block_Permissions_User_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Permissions_User_Edit_Tab_Main
| | | | | |-- Mage_Adminhtml_Block_Poll_Answer_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Poll_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Poll_Edit_Tab_Answers_Form
| | | | | |-- Mage_Adminhtml_Block_Poll_Edit_Tab_Form
| | | | | |-- Mage_Adminhtml_Block_Promo_Catalog_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Promo_Catalog_Edit_Tab_Actions
| | | | | |-- Mage_Adminhtml_Block_Promo_Catalog_Edit_Tab_Conditions
| | | | | |-- Mage_Adminhtml_Block_Promo_Catalog_Edit_Tab_Main
| | | | | |-- Mage_Adminhtml_Block_Promo_Quote_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Promo_Quote_Edit_Tab_Actions
| | | | | |-- Mage_Adminhtml_Block_Promo_Quote_Edit_Tab_Conditions
| | | | | |-- Mage_Adminhtml_Block_Promo_Quote_Edit_Tab_Labels
| | | | | |-- Mage_Adminhtml_Block_Promo_Quote_Edit_Tab_Main
| | | | | |-- Mage_Adminhtml_Block_Rating_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Rating_Edit_Tab_Form
| | | | | |-- Mage_Adminhtml_Block_Rating_Edit_Tab_Options
| | | | | |-- Mage_Adminhtml_Block_Report_Filter_Form
| | | | | | |-- Mage_Sales_Block_Adminhtml_Report_Filter_Form
| | | | | | | ‘-- M a g e _ S a l e s _ B l o c k _ A d m i n h t m l _ R e p o r t _ F i l t e r _ F o r m _ O r d e r
| | | | | | ‘-- M a g e _ S a l e s _ B l o c k _ A d m i n h t m l _ R e p o r t _ F i l t e r _ F o r m
| | | | | |-- Mage_Adminhtml_Block_Report_Filter_Form
| | | | | |-- Mage_Adminhtml_Block_Review_Add_Form
| | | | | |-- Mage_Adminhtml_Block_Review_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Giftmessage_Form
| | | | | |-- Mage_Adminhtml_Block_Sitemap_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_System_Account_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_System_Cache_Form
| | | | | |-- Mage_Adminhtml_Block_System_Config_Form
| | | | | |-- Mage_Adminhtml_Block_System_Convert_Gui_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_System_Convert_Gui_Edit_Tab_Upload
| | | | | |-- Mage_Adminhtml_Block_System_Convert_Gui_Edit_Tab_View
| | | | | |-- Mage_Adminhtml_Block_System_Convert_Profile_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_System_Convert_Profile_Edit_Tab_Edit
| | | | | |-- Mage_Adminhtml_Block_System_Currency_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_System_Currency_Edit_Tab_Main
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
| | | | | |-- Mage_Adminhtml_Block_System_Currency_Edit_Tab_Rates
| | | | | |-- Mage_Adminhtml_Block_System_Design_Edit_Tab_General
| | | | | |-- Mage_Adminhtml_Block_System_Email_Template_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_System_Store_Delete_Form
| | | | | |-- Mage_Adminhtml_Block_System_Store_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_System_Variable_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Tag_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Tag_Tag_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Tax_Class_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Tax_Rate_Form
| | | | | |-- Mage_Adminhtml_Block_Tax_Rule_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Urlrewrite_Edit_Form
| | | | | |-- Mage_Adminhtml_Block_Widget_Grid_Massaction_Item_Additional_Default
| | | | | |-- Mage_Eav_Block_Adminhtml_Attribute_Edit_Main_Abstract
| | | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ C a t a l o g _ P r o d u c t _ A t t r i b u t e _ E d i t _ T a b _ M a i n
| | | | | |-- Mage_Eav_Block_Adminhtml_Attribute_Edit_Main_Abstract
| | | | | |-- Mage_GoogleBase_Block_Adminhtml_Types_Edit_Form
| | | | | |-- Mage_GoogleOptimizer_Block_Adminhtml_Cms_Page_Edit_Tab_Googleoptimizer
| | | | | |-- Mage_Index_Block_Adminhtml_Process_Edit_Form
| | | | | |-- Mage_Index_Block_Adminhtml_Process_Edit_Tab_Main
| | | | | |-- Mage_Paypal_Block_Adminhtml_Settlement_Details_Form
| | | | | |-- Mage_Widget_Block_Adminhtml_Widget_Form
| | | | | |-- Mage_Widget_Block_Adminhtml_Widget_Instance_Edit_Form
| | | | | |-- Mage_Widget_Block_Adminhtml_Widget_Instance_Edit_Tab_Main
| | | | | |-- Mage_Widget_Block_Adminhtml_Widget_Instance_Edit_Tab_Settings
| | | | | |-- Mage_Widget_Block_Adminhtml_Widget_Options
| | | | | | ‘-- M a g e _ W i d g e t _ B l o c k _ A d m i n h t m l _ W i d g e t _ I n s t a n c e _ E d i t _ T a b _ P r o p e r t i e s
| | | | | ‘-- M a g e _ W i d g e t _ B l o c k _ A d m i n h t m l _ W i d g e t _ O p t i o n s
| | | | |-- Mage_Adminhtml_Block_Widget_Form
| | | | |-- Mage_Adminhtml_Block_Widget_Grid
| | | | | |-- Find_Feed_Block_Adminhtml_List_Codes_Grid
| | | | | |-- Find_Feed_Block_Adminhtml_List_Items_Grid
| | | | | |-- Mage_Adminhtml_Block_Api_Grid_Role
| | | | | |-- Mage_Adminhtml_Block_Api_Role_Grid_User
| | | | | |-- Mage_Adminhtml_Block_Api_User_Edit_Tab_Roles
| | | | | |-- Mage_Adminhtml_Block_Api_User_Grid
| | | | | |-- Mage_Adminhtml_Block_Backup_Grid
| | | | | |-- Mage_Adminhtml_Block_Cache_Grid
| | | | | |-- Mage_Adminhtml_Block_Catalog_Category_Tab_Product
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Attribute_Set_Grid
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Alerts_Price
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Alerts_Stock
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Crosssell
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Related
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Super_Config_Grid
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Super_Group
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Tag
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Tag_Customer
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Upsell
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Grid
| | | | | | |-- Mage_Adminhtml_Block_Review_Product_Grid
| | | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ U r l r e w r i t e _ P r o d u c t _ G r i d
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Grid
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Widget_Chooser
| | | | | |-- Mage_Adminhtml_Block_Catalog_Search_Grid
| | | | | |-- Mage_Adminhtml_Block_Checkout_Agreement_Grid
| | | | | |-- Mage_Adminhtml_Block_Cms_Block_Grid
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
| | | | | |-- Mage_Adminhtml_Block_Cms_Block_Widget_Chooser
| | | | | |-- Mage_Adminhtml_Block_Cms_Page_Grid
| | | | | |-- Mage_Adminhtml_Block_Cms_Page_Widget_Chooser
| | | | | |-- Mage_Adminhtml_Block_Customer_Edit_Tab_Cart
| | | | | |-- Mage_Adminhtml_Block_Customer_Edit_Tab_Newsletter_Grid
| | | | | |-- Mage_Adminhtml_Block_Customer_Edit_Tab_Orders
| | | | | |-- Mage_Adminhtml_Block_Customer_Edit_Tab_Tag
| | | | | |-- Mage_Adminhtml_Block_Customer_Edit_Tab_Tags
| | | | | |-- Mage_Adminhtml_Block_Customer_Edit_Tab_View_Cart
| | | | | |-- Mage_Adminhtml_Block_Customer_Edit_Tab_View_Orders
| | | | | |-- Mage_Adminhtml_Block_Customer_Edit_Tab_View_Wishlist
| | | | | |-- Mage_Adminhtml_Block_Customer_Edit_Tab_Wishlist
| | | | | |-- Mage_Adminhtml_Block_Customer_Grid
| | | | | |-- Mage_Adminhtml_Block_Customer_Group_Grid
| | | | | |-- Mage_Adminhtml_Block_Customer_Online_Grid
| | | | | |-- Mage_Adminhtml_Block_Dashboard_Grid
| | | | | | |-- Mage_Adminhtml_Block_Dashboard_Orders_Grid
| | | | | | |-- Mage_Adminhtml_Block_Dashboard_Searches_Last
| | | | | | |-- Mage_Adminhtml_Block_Dashboard_Searches_Top
| | | | | | |-- Mage_Adminhtml_Block_Dashboard_Tab_Customers_Most
| | | | | | |-- Mage_Adminhtml_Block_Dashboard_Tab_Customers_Newest
| | | | | | |-- Mage_Adminhtml_Block_Dashboard_Tab_Products_Ordered
| | | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ D a s h b o a r d _ T a b _ P r o d u c t s _ V i e w e d
| | | | | |-- Mage_Adminhtml_Block_Dashboard_Grid
| | | | | |-- Mage_Adminhtml_Block_Extensions_Custom_Edit_Tab_Grid
| | | | | |-- Mage_Adminhtml_Block_Extensions_Local_Grid
| | | | | |-- Mage_Adminhtml_Block_Extensions_Remote_Grid
| | | | | |-- Mage_Adminhtml_Block_Newsletter_Problem_Grid
| | | | | |-- Mage_Adminhtml_Block_Newsletter_Queue_Grid
| | | | | |-- Mage_Adminhtml_Block_Newsletter_Subscriber_Grid
| | | | | |-- Mage_Adminhtml_Block_Newsletter_Template_Grid
| | | | | |-- Mage_Adminhtml_Block_Notification_Grid
| | | | | |-- Mage_Adminhtml_Block_Permissions_Grid_Role
| | | | | |-- Mage_Adminhtml_Block_Permissions_Grid_User
| | | | | |-- Mage_Adminhtml_Block_Permissions_Role_Grid_User
| | | | | |-- Mage_Adminhtml_Block_Permissions_User_Edit_Tab_Roles
| | | | | |-- Mage_Adminhtml_Block_Permissions_User_Grid
| | | | | |-- Mage_Adminhtml_Block_Poll_Edit_Tab_Answers_Grid
| | | | | |-- Mage_Adminhtml_Block_Poll_Grid
| | | | | |-- Mage_Adminhtml_Block_Promo_Catalog_Grid
| | | | | |-- Mage_Adminhtml_Block_Promo_Quote_Grid
| | | | | |-- Mage_Adminhtml_Block_Promo_Widget_Chooser
| | | | | |-- Mage_Adminhtml_Block_Promo_Widget_Chooser_Sku
| | | | | |-- Mage_Adminhtml_Block_Rating_Grid
| | | | | |-- Mage_Adminhtml_Block_Report_Grid
| | | | | | |-- Mage_Adminhtml_Block_Report_Customer_Accounts_Grid
| | | | | | |-- Mage_Adminhtml_Block_Report_Customer_Orders_Grid
| | | | | | |-- Mage_Adminhtml_Block_Report_Customer_Totals_Grid
| | | | | | |-- Mage_Adminhtml_Block_Report_Product_Ordered_Grid
| | | | | | |-- Mage_Adminhtml_Block_Report_Product_Sold_Grid
| | | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ R e p o r t _ P r o d u c t _ V i e w e d _ G r i d
| | | | | |-- Mage_Adminhtml_Block_Report_Grid
| | | | | |-- Mage_Adminhtml_Block_Report_Grid_Abstract
| | | | | | |-- Mage_Adminhtml_Block_Report_Sales_Bestsellers_Grid
| | | | | | |-- Mage_Adminhtml_Block_Report_Sales_Coupons_Grid
| | | | | | |-- Mage_Adminhtml_Block_Report_Sales_Invoiced_Grid
| | | | | | |-- Mage_Adminhtml_Block_Report_Sales_Refunded_Grid
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
| | | | | | |-- Mage_Adminhtml_Block_Report_Sales_Sales_Grid
| | | | | | |-- Mage_Adminhtml_Block_Report_Sales_Shipping_Grid
| | | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ R e p o r t _ S a l e s _ T a x _ G r i d
| | | | | |-- Mage_Adminhtml_Block_Report_Grid_Abstract
| | | | | |-- Mage_Adminhtml_Block_Report_Product_Downloads_Grid
| | | | | |-- Mage_Adminhtml_Block_Report_Product_Grid
| | | | | |-- Mage_Adminhtml_Block_Report_Product_Lowstock_Grid
| | | | | |-- Mage_Adminhtml_Block_Report_Refresh_Statistics_Grid
| | | | | |-- Mage_Adminhtml_Block_Report_Review_Customer_Grid
| | | | | |-- Mage_Adminhtml_Block_Report_Review_Detail_Grid
| | | | | |-- Mage_Adminhtml_Block_Report_Review_Product_Grid
| | | | | |-- Mage_Adminhtml_Block_Report_Search_Grid
| | | | | |-- Mage_Adminhtml_Block_Report_Shopcart_Abandoned_Grid
| | | | | |-- Mage_Adminhtml_Block_Report_Shopcart_Customer_Grid
| | | | | |-- Mage_Adminhtml_Block_Report_Shopcart_Product_Grid
| | | | | |-- Mage_Adminhtml_Block_Report_Tag_Customer_Detail_Grid
| | | | | |-- Mage_Adminhtml_Block_Report_Tag_Customer_Grid
| | | | | |-- Mage_Adminhtml_Block_Report_Tag_Popular_Detail_Grid
| | | | | |-- Mage_Adminhtml_Block_Report_Tag_Popular_Grid
| | | | | |-- Mage_Adminhtml_Block_Report_Tag_Product_Detail_Grid
| | | | | |-- Mage_Adminhtml_Block_Report_Tag_Product_Grid
| | | | | |-- Mage_Adminhtml_Block_Report_Wishlist_Grid
| | | | | |-- Mage_Adminhtml_Block_Review_Grid
| | | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Reviews
| | | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ C u s t o m e r _ E d i t _ T a b _ R e v i e w s
| | | | | |-- Mage_Adminhtml_Block_Review_Grid
| | | | | |-- Mage_Adminhtml_Block_Sales_Creditmemo_Grid
| | | | | |-- Mage_Adminhtml_Block_Sales_Invoice_Grid
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Customer_Grid
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Search_Grid
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Grid
| | | | | | ‘-- M a g e _ S a l e s _ B l o c k _ A d m i n h t m l _ B i l l i n g _ A g r e e m e n t _ V i e w _ T a b _ O r d e r s
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Grid
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_View_Tab_Creditmemos
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_View_Tab_Invoices
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_View_Tab_Shipments
| | | | | |-- Mage_Adminhtml_Block_Sales_Shipment_Grid
| | | | | |-- Mage_Adminhtml_Block_Sales_Transactions_Detail_Grid
| | | | | |-- Mage_Adminhtml_Block_Sales_Transactions_Grid
| | | | | | |-- Mage_Adminhtml_Block_Sales_Order_View_Tab_Transactions
| | | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ S a l e s _ T r a n s a c t i o n s _ C h i l d _ G r i d
| | | | | |-- Mage_Adminhtml_Block_Sales_Transactions_Grid
| | | | | |-- Mage_Adminhtml_Block_Shipping_Carrier_Tablerate_Grid
| | | | | |-- Mage_Adminhtml_Block_Sitemap_Grid
| | | | | |-- Mage_Adminhtml_Block_System_Convert_Gui_Grid
| | | | | |-- Mage_Adminhtml_Block_System_Convert_Profile_Edit_Tab_History
| | | | | |-- Mage_Adminhtml_Block_System_Convert_Profile_Grid
| | | | | |-- Mage_Adminhtml_Block_System_Design_Grid
| | | | | |-- Mage_Adminhtml_Block_System_Email_Template_Grid
| | | | | |-- Mage_Adminhtml_Block_System_Store_Grid
| | | | | |-- Mage_Adminhtml_Block_System_Variable_Grid
| | | | | |-- Mage_Adminhtml_Block_Tag_Assigned_Grid
| | | | | |-- Mage_Adminhtml_Block_Tag_Customer_Grid
| | | | | |-- Mage_Adminhtml_Block_Tag_Grid_All
| | | | | |-- Mage_Adminhtml_Block_Tag_Grid_Customers
| | | | | |-- Mage_Adminhtml_Block_Tag_Grid_Pending
| | | | | |-- Mage_Adminhtml_Block_Tag_Grid_Products
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
| | | | | |-- Mage_Adminhtml_Block_Tag_Product_Grid
| | | | | |-- Mage_Adminhtml_Block_Tag_Tag_Grid
| | | | | |-- Mage_Adminhtml_Block_Tax_Class_Grid
| | | | | |-- Mage_Adminhtml_Block_Tax_Rate_Grid
| | | | | |-- Mage_Adminhtml_Block_Tax_Rule_Grid
| | | | | |-- Mage_Adminhtml_Block_Urlrewrite_Grid
| | | | | |-- Mage_Bundle_Block_Adminhtml_Catalog_Product_Edit_Tab_Bundle_Option_Sear
| | | | | |-- Mage_Eav_Block_Adminhtml_Attribute_Grid_Abstract
| | | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ C a t a l o g _ P r o d u c t _ A t t r i b u t e _ G r i d
| | | | | |-- Mage_Eav_Block_Adminhtml_Attribute_Grid_Abstract
| | | | | |-- Mage_GoogleBase_Block_Adminhtml_Items_Item
| | | | | |-- Mage_GoogleBase_Block_Adminhtml_Items_Product
| | | | | |-- Mage_GoogleBase_Block_Adminhtml_Types_Grid
| | | | | |-- Mage_Index_Block_Adminhtml_Process_Grid
| | | | | |-- Mage_Paypal_Block_Adminhtml_Settlement_Report_Grid
| | | | | |-- Mage_Sales_Block_Adminhtml_Billing_Agreement_Grid
| | | | | | ‘-- M a g e _ S a l e s _ B l o c k _ A d m i n h t m l _ C u s t o m e r _ E d i t _ T a b _ A g r e e m e n t
| | | | | |-- Mage_Sales_Block_Adminhtml_Billing_Agreement_Grid
| | | | | |-- Mage_Sales_Block_Adminhtml_Recurring_Profile_Grid
| | | | | | ‘-- M a g e _ S a l e s _ B l o c k _ A d m i n h t m l _ C u s t o m e r _ E d i t _ T a b _ R e c u r r i n g _ P r o f i l e
| | | | | |-- Mage_Sales_Block_Adminhtml_Recurring_Profile_Grid
| | | | | ‘-- M a g e _ W i d g e t _ B l o c k _ A d m i n h t m l _ W i d g e t _ I n s t a n c e _ G r i d
| | | | |-- Mage_Adminhtml_Block_Widget_Grid
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Column
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Massaction_Abstract
| | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ W i d g e t _ G r i d _ M a s s a c t i o n
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Massaction_Abstract
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Massaction_Item
| | | | |-- Mage_Adminhtml_Block_Widget_Tabs
| | | | | |-- Mage_Adminhtml_Block_Api_Editroles
| | | | | |-- Mage_Adminhtml_Block_Api_Edituser
| | | | | |-- Mage_Adminhtml_Block_Api_Tab_Rolesusers
| | | | | |-- Mage_Adminhtml_Block_Api_Tab_Userroles
| | | | | |-- Mage_Adminhtml_Block_Api_User_Edit_Tabs
| | | | | |-- Mage_Adminhtml_Block_Catalog_Category_Tabs
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Attribute_Edit_Tabs
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Action_Attribute_Tabs
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tabs
| | | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tabs_Configurable
| | | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tabs_Grouped
| | | | | | ‘-- M a g e _ B u n d l e _ B l o c k _ A d m i n h t m l _ C a t a l o g _ P r o d u c t _ E d i t _ T a b s
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tabs
| | | | | |-- Mage_Adminhtml_Block_Cms_Page_Edit_Tabs
| | | | | |-- Mage_Adminhtml_Block_Customer_Edit_Tabs
| | | | | |-- Mage_Adminhtml_Block_Dashboard_Diagrams
| | | | | |-- Mage_Adminhtml_Block_Dashboard_Grids
| | | | | |-- Mage_Adminhtml_Block_Extensions_Custom_Edit_Tabs
| | | | | |-- Mage_Adminhtml_Block_Extensions_Local_Edit_Tabs
| | | | | |-- Mage_Adminhtml_Block_Extensions_Remote_Edit_Tabs
| | | | | |-- Mage_Adminhtml_Block_Permissions_Editroles
| | | | | |-- Mage_Adminhtml_Block_Permissions_Edituser
| | | | | |-- Mage_Adminhtml_Block_Permissions_Tab_Rolesusers
| | | | | |-- Mage_Adminhtml_Block_Permissions_Tab_Userroles
| | | | | |-- Mage_Adminhtml_Block_Permissions_User_Edit_Tabs
| | | | | |-- Mage_Adminhtml_Block_Poll_Edit_Tabs
| | | | | |-- Mage_Adminhtml_Block_Promo_Catalog_Edit_Tabs
| | | | | |-- Mage_Adminhtml_Block_Promo_Quote_Edit_Tabs
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
| | | | | |-- Mage_Adminhtml_Block_Rating_Edit_Tabs
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_View_Tabs
| | | | | |-- Mage_Adminhtml_Block_System_Config_Dwstree
| | | | | |-- Mage_Adminhtml_Block_System_Convert_Gui_Edit_Tabs
| | | | | |-- Mage_Adminhtml_Block_System_Convert_Profile_Edit_Tabs
| | | | | |-- Mage_Adminhtml_Block_System_Currency_Edit_Tabs
| | | | | |-- Mage_Adminhtml_Block_System_Design_Edit_Tabs
| | | | | |-- Mage_Index_Block_Adminhtml_Process_Edit_Tabs
| | | | | |-- Mage_Sales_Block_Adminhtml_Billing_Agreement_View_Tabs
| | | | | ‘-- M a g e _ W i d g e t _ B l o c k _ A d m i n h t m l _ W i d g e t _ I n s t a n c e _ E d i t _ T a b s
| | | | |-- Mage_Adminhtml_Block_Widget_Tabs
| | | | |-- Mage_Bundle_Block_Adminhtml_Catalog_Product_Edit_Tab_Bundle
| | | | |-- Mage_Bundle_Block_Adminhtml_Catalog_Product_Edit_Tab_Bundle_Option
| | | | |-- Mage_Bundle_Block_Adminhtml_Catalog_Product_Edit_Tab_Bundle_Option_Search
| | | | |-- Mage_Bundle_Block_Adminhtml_Catalog_Product_Edit_Tab_Bundle_Option_Selectio
| | | | |-- Mage_Downloadable_Block_Adminhtml_Catalog_Product_Edit_Tab_Downloadable
| | | | |-- Mage_Downloadable_Block_Adminhtml_Catalog_Product_Edit_Tab_Downloadable_Sam
| | | | |-- Mage_Eav_Block_Adminhtml_Attribute_Edit_Options_Abstract
| | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ C a t a l o g _ P r o d u c t _ A t t r i b u t e _ E d i t _ T a b _ O p t i o n s
| | | | |-- Mage_Eav_Block_Adminhtml_Attribute_Edit_Options_Abstract
| | | | |-- Mage_Weee_Block_Renderer_Weee_Tax
| | | | |-- Mage_Widget_Block_Adminhtml_Widget_Instance_Edit_Chooser_Block
| | | | |-- Mage_Widget_Block_Adminhtml_Widget_Instance_Edit_Chooser_Layout
| | | | ‘-- M a g e _ W i d g e t _ B l o c k _ A d m i n h t m l _ W i d g e t _ I n s t a n c e _ E d i t _ C h o o s e r _ T e m p l a t e
| | | |-- Mage_Adminhtml_Block_Widget
| | | |-- Mage_Adminhtml_Block_Widget_Breadcrumbs
| | | |-- Mage_Adminhtml_Block_Widget_Container
| | | | |-- Mage_Adminhtml_Block_Catalog_Product
| | | | |-- Mage_Adminhtml_Block_Cms_Wysiwyg_Images_Content
| | | | |-- Mage_Adminhtml_Block_Sales_Transactions_Detail
| | | | |-- Mage_Adminhtml_Block_System_Convert_Gui_Edit_Tab_Wizard
| | | | |-- Mage_Adminhtml_Block_Urlrewrite_Edit
| | | | |-- Mage_Adminhtml_Block_Widget_Form_Container
| | | | | |-- Find_Feed_Block_Adminhtml_Edit_Codes
| | | | | |-- Mage_Adminhtml_Block_Api_User_Edit
| | | | | |-- Mage_Adminhtml_Block_Catalog_Category_Edit
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Attribute_Edit
| | | | | |-- Mage_Adminhtml_Block_Catalog_Search_Edit
| | | | | |-- Mage_Adminhtml_Block_Checkout_Agreement_Edit
| | | | | |-- Mage_Adminhtml_Block_Cms_Block_Edit
| | | | | |-- Mage_Adminhtml_Block_Cms_Page_Edit
| | | | | |-- Mage_Adminhtml_Block_Customer_Edit
| | | | | |-- Mage_Adminhtml_Block_Customer_Group_Edit
| | | | | |-- Mage_Adminhtml_Block_Extensions_Console_Edit
| | | | | |-- Mage_Adminhtml_Block_Extensions_Custom_Edit
| | | | | |-- Mage_Adminhtml_Block_Extensions_Local_Edit
| | | | | |-- Mage_Adminhtml_Block_Extensions_Remote_Edit
| | | | | |-- Mage_Adminhtml_Block_Permissions_User_Edit
| | | | | |-- Mage_Adminhtml_Block_Poll_Answer_Edit
| | | | | |-- Mage_Adminhtml_Block_Poll_Edit
| | | | | |-- Mage_Adminhtml_Block_Promo_Catalog_Edit
| | | | | |-- Mage_Adminhtml_Block_Promo_Quote_Edit
| | | | | |-- Mage_Adminhtml_Block_Rating_Edit
| | | | | |-- Mage_Adminhtml_Block_Review_Add
| | | | | |-- Mage_Adminhtml_Block_Review_Edit
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Create
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Creditmemo_Create
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Creditmemo_View
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Invoice_Create
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Invoice_View
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Shipment_Create
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_Shipment_View
| | | | | |-- Mage_Adminhtml_Block_Sales_Order_View
| | | | | |-- Mage_Adminhtml_Block_Sitemap_Edit
| | | | | |-- Mage_Adminhtml_Block_System_Account_Edit
| | | | | |-- Mage_Adminhtml_Block_System_Convert_Gui_Edit
| | | | | |-- Mage_Adminhtml_Block_System_Convert_Profile_Edit
| | | | | |-- Mage_Adminhtml_Block_System_Store_Delete
| | | | | |-- Mage_Adminhtml_Block_System_Store_Edit
| | | | | |-- Mage_Adminhtml_Block_System_Variable_Edit
| | | | | |-- Mage_Adminhtml_Block_Tag_Edit
| | | | | |-- Mage_Adminhtml_Block_Tag_Tag_Edit
| | | | | |-- Mage_Adminhtml_Block_Tax_Class_Edit
| | | | | |-- Mage_Adminhtml_Block_Tax_Rule_Edit
| | | | | |-- Mage_GoogleBase_Block_Adminhtml_Types_Edit
| | | | | |-- Mage_Index_Block_Adminhtml_Process_Edit
| | | | | |-- Mage_Paypal_Block_Adminhtml_Settlement_Details
| | | | | |-- Mage_Sales_Block_Adminhtml_Billing_Agreement_View
| | | | | |-- Mage_Widget_Block_Adminhtml_Widget
| | | | | ‘-- M a g e _ W i d g e t _ B l o c k _ A d m i n h t m l _ W i d g e t _ I n s t a n c e _ E d i t
| | | | |-- Mage_Adminhtml_Block_Widget_Form_Container
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Container
| | | | | |-- Find_Feed_Block_Adminhtml_List_Codes
| | | | | |-- Find_Feed_Block_Adminhtml_List_Items
| | | | | |-- Mage_Adminhtml_Block_Api_Role
| | | | | |-- Mage_Adminhtml_Block_Api_User
| | | | | |-- Mage_Adminhtml_Block_Cache
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Attribute
| | | | | |-- Mage_Adminhtml_Block_Catalog_Search
| | | | | |-- Mage_Adminhtml_Block_Checkout_Agreement
| | | | | |-- Mage_Adminhtml_Block_Cms_Block
| | | | | |-- Mage_Adminhtml_Block_Cms_Page
| | | | | |-- Mage_Adminhtml_Block_Customer
| | | | | |-- Mage_Adminhtml_Block_Customer_Group
| | | | | |-- Mage_Adminhtml_Block_Extensions_Local
| | | | | |-- Mage_Adminhtml_Block_Extensions_Remote
| | | | | |-- Mage_Adminhtml_Block_Notification_Inbox
| | | | | |-- Mage_Adminhtml_Block_Permissions_Role
| | | | | |-- Mage_Adminhtml_Block_Permissions_User
| | | | | |-- Mage_Adminhtml_Block_Poll_Poll
| | | | | |-- Mage_Adminhtml_Block_Promo_Catalog
| | | | | |-- Mage_Adminhtml_Block_Promo_Quote
| | | | | |-- Mage_Adminhtml_Block_Rating_Rating
| | | | | |-- Mage_Adminhtml_Block_Report_Customer_Accounts
| | | | | |-- Mage_Adminhtml_Block_Report_Customer_Orders
| | | | | |-- Mage_Adminhtml_Block_Report_Customer_Totals
| | | | | |-- Mage_Adminhtml_Block_Report_Product
| | | | | |-- Mage_Adminhtml_Block_Report_Product_Downloads
| | | | | |-- Mage_Adminhtml_Block_Report_Product_Lowstock
| | | | | |-- Mage_Adminhtml_Block_Report_Product_Ordered
| | | | | |-- Mage_Adminhtml_Block_Report_Product_Sold
| | | | | |-- Mage_Adminhtml_Block_Report_Product_Viewed
| | | | | |-- Mage_Adminhtml_Block_Report_Refresh_Statistics
| | | | | |-- Mage_Adminhtml_Block_Report_Review_Customer
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
| | | | | |-- Mage_Adminhtml_Block_Report_Review_Detail
| | | | | |-- Mage_Adminhtml_Block_Report_Review_Product
| | | | | |-- Mage_Adminhtml_Block_Report_Sales_Bestsellers
| | | | | |-- Mage_Adminhtml_Block_Report_Sales_Coupons
| | | | | |-- Mage_Adminhtml_Block_Report_Sales_Invoiced
| | | | | |-- Mage_Adminhtml_Block_Report_Sales_Refunded
| | | | | |-- Mage_Adminhtml_Block_Report_Sales_Sales
| | | | | |-- Mage_Adminhtml_Block_Report_Sales_Shipping
| | | | | |-- Mage_Adminhtml_Block_Report_Sales_Tax
| | | | | |-- Mage_Adminhtml_Block_Report_Search
| | | | | |-- Mage_Adminhtml_Block_Report_Shopcart_Abandoned
| | | | | |-- Mage_Adminhtml_Block_Report_Shopcart_Customer
| | | | | |-- Mage_Adminhtml_Block_Report_Shopcart_Product
| | | | | |-- Mage_Adminhtml_Block_Report_Tag_Customer
| | | | | |-- Mage_Adminhtml_Block_Report_Tag_Customer_Detail
| | | | | |-- Mage_Adminhtml_Block_Report_Tag_Popular
| | | | | |-- Mage_Adminhtml_Block_Report_Tag_Popular_Detail
| | | | | |-- Mage_Adminhtml_Block_Report_Tag_Product
| | | | | |-- Mage_Adminhtml_Block_Report_Tag_Product_Detail
| | | | | |-- Mage_Adminhtml_Block_Review_Main
| | | | | |-- Mage_Adminhtml_Block_Sales_Creditmemo
| | | | | |-- Mage_Adminhtml_Block_Sales_Invoice
| | | | | |-- Mage_Adminhtml_Block_Sales_Order
| | | | | |-- Mage_Adminhtml_Block_Sales_Shipment
| | | | | |-- Mage_Adminhtml_Block_Sales_Transactions
| | | | | |-- Mage_Adminhtml_Block_Sitemap
| | | | | |-- Mage_Adminhtml_Block_System_Convert_Gui
| | | | | |-- Mage_Adminhtml_Block_System_Convert_Profile
| | | | | |-- Mage_Adminhtml_Block_System_Store_Store
| | | | | |-- Mage_Adminhtml_Block_System_Variable
| | | | | |-- Mage_Adminhtml_Block_Tag_Customer
| | | | | |-- Mage_Adminhtml_Block_Tag_Product
| | | | | |-- Mage_Adminhtml_Block_Tag_Tag
| | | | | |-- Mage_Adminhtml_Block_Tax_Class
| | | | | |-- Mage_Adminhtml_Block_Tax_Rule
| | | | | |-- Mage_Adminhtml_Block_Urlrewrite
| | | | | |-- Mage_GoogleBase_Block_Adminhtml_Items
| | | | | |-- Mage_GoogleBase_Block_Adminhtml_Types
| | | | | |-- Mage_Index_Block_Adminhtml_Process
| | | | | |-- Mage_Paypal_Block_Adminhtml_Settlement_Report
| | | | | |-- Mage_Sales_Block_Adminhtml_Billing_Agreement
| | | | | |-- Mage_Sales_Block_Adminhtml_Recurring_Profile
| | | | | ‘-- M a g e _ W i d g e t _ B l o c k _ A d m i n h t m l _ W i d g e t _ I n s t a n c e
| | | | |-- Mage_Adminhtml_Block_Widget_Grid_Container
| | | | |-- Mage_Adminhtml_Block_Widget_View_Container
| | | | ‘-- M a g e _ S a l e s _ B l o c k _ A d m i n h t m l _ R e c u r r i n g _ P r o f i l e _ V i e w
| | | |-- Mage_Adminhtml_Block_Widget_Container
| | | |-- Mage_Adminhtml_Block_Widget_Form_Element
| | | |-- Mage_Adminhtml_Block_Widget_Form_Element_Gallery
| | | |-- Mage_Adminhtml_Block_Widget_Form_Renderer_Element
| | | |-- Mage_Adminhtml_Block_Widget_Form_Renderer_Fieldset
| | | |-- Mage_Adminhtml_Block_Widget_Form_Renderer_Fieldset_Element
| | | | |-- Mage_Adminhtml_Block_Catalog_Form_Renderer_Fieldset_Element
| | | | | |-- Mage_Adminhtml_Block_Catalog_Form_Renderer_Attribute_Urlkey
| | | | | |-- Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Price_Recurring
| | | | | |-- Mage_Bundle_Block_Adminhtml_Catalog_Product_Edit_Tab_Attributes_Extend
| | | | | ‘-- M a g e _ B u n d l e _ B l o c k _ A d m i n h t m l _ C a t a l o g _ P r o d u c t _ E d i t _ T a b _ A t t r i b u t e s _ S p e c i a l
APPENDIX A. MAGENTO BLOCK HIERARCHY
| | | | |-- Mage_Adminhtml_Block_Catalog_Form_Renderer_Fieldset_Element
| | | | |-- Mage_Adminhtml_Block_Catalog_Form_Renderer_Googleoptimizer_Import
| | | | |-- Mage_Adminhtml_Block_System_Variable_Form_Renderer_Fieldset_Element
| | | | |-- Mage_GoogleBase_Block_Adminhtml_Types_Edit_Attributes
| | | | ‘-- M a g e _ G o o g l e O p t i m i z e r _ B l o c k _ A d m i n h t m l _ C m s _ P a g e _ E d i t _ R e n d e r e r _ C o n v e r s i o n
| | | |-- Mage_Adminhtml_Block_Widget_Form_Renderer_Fieldset_Element
| | | |-- Mage_Compiler_Block_Process
| | | |-- Mage_Downloadable_Block_Adminhtml_Catalog_Product_Edit_Tab_Downloadable_Links
| | | |-- Mage_Eav_Block_Adminhtml_Attribute_Edit_Js
| | | |-- Mage_GoogleBase_Block_Adminhtml_Captcha
| | | |-- Mage_GoogleOptimizer_Block_Adminhtml_Cms_Page_Edit_Enable
| | | |-- Mage_GoogleOptimizer_Block_Js
| | | |-- Mage_Index_Block_Adminhtml_Notifications
| | | |-- Mage_Sales_Block_Adminhtml_Billing_Agreement_View_Form
| | | |-- Mage_Widget_Block_Adminhtml_Widget_Chooser
| | | ‘-- M a g e _ W i d g e t _ B l o c k _ A d m i n h t m l _ W i d g e t _ I n s t a n c e _ E d i t _ T a b _ M a i n _ L a y o u t
| | |-- Mage_Adminhtml_Block_Template
| | |-- Mage_Adminhtml_Block_Urlrewrite_Selector
| | |-- Mage_Adminhtml_Block_Widget_Grid_Serializer
| | |-- Mage_CatalogInventory_Block_Qtyincrements
| | |-- Mage_CatalogInventory_Block_Stockqty_Abstract
| | | |-- Mage_CatalogInventory_Block_Stockqty_Default
| | | | |-- Mage_CatalogInventory_Block_Stockqty_Composite
| | | | | |-- Mage_CatalogInventory_Block_Stockqty_Type_Configurable
| | | | | ‘-- M a g e _ C a t a l o g I n v e n t o r y _ B l o c k _ S t o c k q t y _ T y p e _ G r o u p e d
| | | | ‘-- M a g e _ C a t a l o g I n v e n t o r y _ B l o c k _ S t o c k q t y _ C o m p o s i t e
| | | ‘-- M a g e _ C a t a l o g I n v e n t o r y _ B l o c k _ S t o c k q t y _ D e f a u l t
| | |-- Mage_CatalogInventory_Block_Stockqty_Abstract
| | |-- Mage_CatalogSearch_Block_Advanced_Form
| | |-- Mage_CatalogSearch_Block_Advanced_Result
| | |-- Mage_CatalogSearch_Block_Result
| | |-- Mage_CatalogSearch_Block_Term
| | |-- Mage_Catalog_Block_Breadcrumbs
| | |-- Mage_Catalog_Block_Category_View
| | |-- Mage_Catalog_Block_Layer_Filter_Abstract
| | | |-- Mage_Catalog_Block_Layer_Filter_Attribute
| | | | ‘-- M a g e _ C a t a l o g S e a r c h _ B l o c k _ L a y e r _ F i l t e r _ A t t r i b u t e
| | | |-- Mage_Catalog_Block_Layer_Filter_Attribute
| | | |-- Mage_Catalog_Block_Layer_Filter_Category
| | | |-- Mage_Catalog_Block_Layer_Filter_Decimal
| | | ‘-- M a g e _ C a t a l o g _ B l o c k _ L a y e r _ F i l t e r _ P r i c e
| | |-- Mage_Catalog_Block_Layer_Filter_Abstract
| | |-- Mage_Catalog_Block_Layer_State
| | |-- Mage_Catalog_Block_Layer_View
| | | ‘-- M a g e _ C a t a l o g S e a r c h _ B l o c k _ L a y e r
| | |-- Mage_Catalog_Block_Layer_View
| | |-- Mage_Catalog_Block_Navigation
| | |-- Mage_Catalog_Block_Product
| | |-- Mage_Catalog_Block_Product_Abstract
| | | |-- Mage_Bundle_Block_Catalog_Product_List_Partof
| | | |-- Mage_Catalog_Block_Product_Compare_Abstract
| | | | |-- Mage_Catalog_Block_Product_Compare_List
| | | | ‘-- M a g e _ C a t a l o g _ B l o c k _ P r o d u c t _ C o m p a r e _ S i d e b a r
| | | |-- Mage_Catalog_Block_Product_Compare_Abstract
| | | |-- Mage_Catalog_Block_Product_List
| | | | |-- Mage_Catalog_Block_Product_List_Promotion
| | | | ‘-- M a g e _ C a t a l o g _ B l o c k _ P r o d u c t _ L i s t _ R a n d o m
| | | |-- Mage_Catalog_Block_Product_List
| | | |-- Mage_Catalog_Block_Product_List_Crosssell
| | | |-- Mage_Catalog_Block_Product_List_Related
| | | |-- Mage_Catalog_Block_Product_List_Upsell
| | | |-- Mage_Catalog_Block_Product_New
| | | | ‘-- M a g e _ C a t a l o g _ B l o c k _ P r o d u c t _ W i d g e t _ N e w
| | | |-- Mage_Catalog_Block_Product_New
| | | |-- Mage_Catalog_Block_Product_Send
| | | |-- Mage_Catalog_Block_Product_View
| | | | |-- Mage_Bundle_Block_Catalog_Product_View
| | | | |-- Mage_Review_Block_Product_View
| | | | | ‘-- M a g e _ R e v i e w _ B l o c k _ P r o d u c t _ V i e w _ L i s t
| | | | ‘-- M a g e _ R e v i e w _ B l o c k _ P r o d u c t _ V i e w
| | | |-- Mage_Catalog_Block_Product_View
| | | |-- Mage_Catalog_Block_Product_View_Abstract
| | | | |-- Mage_Bundle_Block_Catalog_Product_View_Type_Bundle
| | | | |-- Mage_Catalog_Block_Product_View_Media
| | | | |-- Mage_Catalog_Block_Product_View_Type_Configurable
| | | | |-- Mage_Catalog_Block_Product_View_Type_Grouped
| | | | |-- Mage_Catalog_Block_Product_View_Type_Simple
| | | | |-- Mage_Catalog_Block_Product_View_Type_Virtual
| | | | | ‘-- M a g e _ D o w n l o a d a b l e _ B l o c k _ C a t a l o g _ P r o d u c t _ V i e w _ T y p e
| | | | ‘-- M a g e _ C a t a l o g _ B l o c k _ P r o d u c t _ V i e w _ T y p e _ V i r t u a l
| | | |-- Mage_Catalog_Block_Product_View_Abstract
| | | |-- Mage_Checkout_Block_Cart_Crosssell
| | | |-- Mage_Downloadable_Block_Catalog_Product_Links
| | | |-- Mage_Downloadable_Block_Catalog_Product_Samples
| | | |-- Mage_Reports_Block_Product_Abstract
| | | | |-- Mage_Reports_Block_Product_Compared
| | | | | ‘-- M a g e _ R e p o r t s _ B l o c k _ P r o d u c t _ W i d g e t _ C o m p a r e d
| | | | |-- Mage_Reports_Block_Product_Compared
| | | | |-- Mage_Reports_Block_Product_Viewed
| | | | | ‘-- M a g e _ R e p o r t s _ B l o c k _ P r o d u c t _ W i d g e t _ V i e w e d
| | | | ‘-- M a g e _ R e p o r t s _ B l o c k _ P r o d u c t _ V i e w e d
| | | |-- Mage_Reports_Block_Product_Abstract
| | | |-- Mage_Review_Block_Customer_View
| | | |-- Mage_Review_Block_View
| | | |-- Mage_Tag_Block_Customer_View
| | | |-- Mage_Tag_Block_Product_Result
| | | |-- Mage_Wishlist_Block_Abstract
| | | | |-- Mage_Rss_Block_Wishlist
| | | | |-- Mage_Wishlist_Block_Customer_Sidebar
| | | | |-- Mage_Wishlist_Block_Customer_Wishlist
| | | | |-- Mage_Wishlist_Block_Share_Email_Items
| | | | ‘-- M a g e _ W i s h l i s t _ B l o c k _ S h a r e _ W i s h l i s t
| | | ‘-- M a g e _ W i s h l i s t _ B l o c k _ A b s t r a c t
| | |-- Mage_Catalog_Block_Product_Abstract
| | |-- Mage_Catalog_Block_Product_Gallery
| | |-- Mage_Catalog_Block_Product_List_Toolbar
| | |-- Mage_Catalog_Block_Product_Price
| | | |-- Mage_Bundle_Block_Catalog_Product_Price
| | | | |-- Mage_Bundle_Block_Catalog_Product_View_Type_Bundle_Option
| | | | | |-- Mage_Bundle_Block_Catalog_Product_View_Type_Bundle_Option_Checkbox
| | | | | |-- Mage_Bundle_Block_Catalog_Product_View_Type_Bundle_Option_Multi
| | | | | |-- Mage_Bundle_Block_Catalog_Product_View_Type_Bundle_Option_Radio
| | | | | ‘-- M a g e _ B u n d l e _ B l o c k _ C a t a l o g _ P r o d u c t _ V i e w _ T y p e _ B u n d l e _ O p t i o n _ S e l e c t
| | | | ‘-- M a g e _ B u n d l e _ B l o c k _ C a t a l o g _ P r o d u c t _ V i e w _ T y p e _ B u n d l e _ O p t i o n
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
| | | ‘-- M a g e _ B u n d l e _ B l o c k _ C a t a l o g _ P r o d u c t _ P r i c e
| | |-- Mage_Catalog_Block_Product_Price
| | |-- Mage_Catalog_Block_Product_View_Additional
| | |-- Mage_Catalog_Block_Product_View_Attributes
| | |-- Mage_Catalog_Block_Product_View_Description
| | |-- Mage_Catalog_Block_Product_View_Options
| | |-- Mage_Catalog_Block_Product_View_Options_Abstract
| | | |-- Mage_Catalog_Block_Product_View_Options_Type_Date
| | | |-- Mage_Catalog_Block_Product_View_Options_Type_Default
| | | |-- Mage_Catalog_Block_Product_View_Options_Type_File
| | | |-- Mage_Catalog_Block_Product_View_Options_Type_Select
| | | ‘-- M a g e _ C a t a l o g _ B l o c k _ P r o d u c t _ V i e w _ O p t i o n s _ T y p e _ T e x t
| | |-- Mage_Catalog_Block_Product_View_Options_Abstract
| | |-- Mage_Catalog_Block_Product_View_Price
| | |-- Mage_Catalog_Block_Product_View_Tabs
| | |-- Mage_Catalog_Block_Seo_Sitemap_Abstract
| | | |-- Mage_Catalog_Block_Seo_Sitemap_Category
| | | | ‘-- M a g e _ C a t a l o g _ B l o c k _ S e o _ S i t e m a p _ T r e e _ C a t e g o r y
| | | |-- Mage_Catalog_Block_Seo_Sitemap_Category
| | | ‘-- M a g e _ C a t a l o g _ B l o c k _ S e o _ S i t e m a p _ P r o d u c t
| | |-- Mage_Catalog_Block_Seo_Sitemap_Abstract
| | |-- Mage_Centinel_Block_Authentication
| | |-- Mage_Centinel_Block_Authentication_Complete
| | |-- Mage_Centinel_Block_Authentication_Start
| | |-- Mage_Centinel_Block_Logo
| | |-- Mage_Checkout_Block_Agreements
| | |-- Mage_Checkout_Block_Cart_Abstract
| | | |-- Mage_Checkout_Block_Cart
| | | |-- Mage_Checkout_Block_Cart_Coupon
| | | |-- Mage_Checkout_Block_Cart_Shipping
| | | |-- Mage_Checkout_Block_Cart_Sidebar
| | | |-- Mage_Checkout_Block_Cart_Totals
| | | | |-- Mage_Checkout_Block_Total_Default
| | | | | |-- Mage_Checkout_Block_Total_Nominal
| | | | | |-- Mage_Checkout_Block_Total_Tax
| | | | | |-- Mage_Tax_Block_Checkout_Discount
| | | | | |-- Mage_Tax_Block_Checkout_Grandtotal
| | | | | |-- Mage_Tax_Block_Checkout_Shipping
| | | | | |-- Mage_Tax_Block_Checkout_Subtotal
| | | | | ‘-- M a g e _ T a x _ B l o c k _ C h e c k o u t _ T a x
| | | | |-- Mage_Checkout_Block_Total_Default
| | | | ‘-- M a g e _ P a y p a l _ B l o c k _ E x p r e s s _ R e v i e w _ D e t a i l s
| | | ‘-- M a g e _ C h e c k o u t _ B l o c k _ C a r t _ T o t a l s
| | |-- Mage_Checkout_Block_Cart_Abstract
| | |-- Mage_Checkout_Block_Cart_Item_Renderer
| | | |-- Mage_Bundle_Block_Checkout_Cart_Item_Renderer
| | | |-- Mage_Checkout_Block_Cart_Item_Renderer_Configurable
| | | |-- Mage_Checkout_Block_Cart_Item_Renderer_Grouped
| | | ‘-- M a g e _ D o w n l o a d a b l e _ B l o c k _ C h e c k o u t _ C a r t _ I t e m _ R e n d e r e r
| | |-- Mage_Checkout_Block_Cart_Item_Renderer
| | |-- Mage_Checkout_Block_Links
| | |-- Mage_Checkout_Block_Multishipping_Abstract
| | | |-- Mage_Checkout_Block_Multishipping_Address_Select
| | | ‘-- M a g e _ C h e c k o u t _ B l o c k _ M u l t i s h i p p i n g _ S u c c e s s
| | |-- Mage_Checkout_Block_Multishipping_Abstract
| | |-- Mage_Checkout_Block_Multishipping_Link
| | |-- Mage_Checkout_Block_Multishipping_State
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
| | |-- Mage_Checkout_Block_Onepage_Abstract
| | | |-- Mage_Checkout_Block_Onepage
| | | |-- Mage_Checkout_Block_Onepage_Billing
| | | |-- Mage_Checkout_Block_Onepage_Login
| | | |-- Mage_Checkout_Block_Onepage_Payment
| | | |-- Mage_Checkout_Block_Onepage_Progress
| | | |-- Mage_Checkout_Block_Onepage_Review
| | | |-- Mage_Checkout_Block_Onepage_Shipping
| | | |-- Mage_Checkout_Block_Onepage_Shipping_Method
| | | |-- Mage_Checkout_Block_Onepage_Shipping_Method_Additional
| | | ‘-- M a g e _ C h e c k o u t _ B l o c k _ O n e p a g e _ S h i p p i n g _ M e t h o d _ A v a i l a b l e
| | |-- Mage_Checkout_Block_Onepage_Abstract
| | |-- Mage_Checkout_Block_Onepage_Failure
| | |-- Mage_Checkout_Block_Onepage_Link
| | |-- Mage_Checkout_Block_Onepage_Success
| | | ‘-- M a g e _ D o w n l o a d a b l e _ B l o c k _ C h e c k o u t _ S u c c e s s
| | |-- Mage_Checkout_Block_Onepage_Success
| | |-- Mage_Checkout_Block_Success
| | |-- Mage_Cms_Block_Widget_Block
| | |-- Mage_Core_Block_Html_Calendar
| | |-- Mage_Core_Block_Html_Date
| | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ H t m l _ D a t e
| | |-- Mage_Core_Block_Html_Date
| | |-- Mage_Core_Block_Html_Link
| | | |-- Mage_Catalog_Block_Widget_Link
| | | | |-- Mage_Catalog_Block_Category_Widget_Link
| | | | ‘-- M a g e _ C a t a l o g _ B l o c k _ P r o d u c t _ W i d g e t _ L i n k
| | | |-- Mage_Catalog_Block_Widget_Link
| | | ‘-- M a g e _ C m s _ B l o c k _ W i d g e t _ P a g e _ L i n k
| | |-- Mage_Core_Block_Html_Link
| | |-- Mage_Core_Block_Messages
| | | |-- Mage_Adminhtml_Block_Messages
| | | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Messages
| | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ S a l e s _ O r d e r _ V i e w _ M e s s a g e s
| | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ M e s s a g e s
| | |-- Mage_Core_Block_Messages
| | |-- Mage_Core_Block_Store_Switcher
| | |-- Mage_Core_Block_Template_Facade
| | |-- Mage_Core_Block_Template_Smarty
| | |-- Mage_Core_Block_Template_Zend
| | |-- Mage_Customer_Block_Account
| | |-- Mage_Customer_Block_Account_Dashboard
| | | |-- Mage_Customer_Block_Form_Edit
| | | |-- Mage_Customer_Block_Newsletter
| | | |-- Mage_Review_Block_Customer_List
| | | ‘-- M a g e _ T a g _ B l o c k _ C u s t o m e r _ T a g s
| | |-- Mage_Customer_Block_Account_Dashboard
| | |-- Mage_Customer_Block_Account_Dashboard_Address
| | |-- Mage_Customer_Block_Account_Dashboard_Block
| | |-- Mage_Customer_Block_Account_Dashboard_Hello
| | |-- Mage_Customer_Block_Account_Dashboard_Info
| | |-- Mage_Customer_Block_Account_Dashboard_Newsletter
| | |-- Mage_Customer_Block_Account_Dashboard_Sidebar
| | |-- Mage_Customer_Block_Account_Forgotpassword
| | |-- Mage_Customer_Block_Account_Navigation
| | |-- Mage_Customer_Block_Address_Book
| | |-- Mage_Customer_Block_Form_Login
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
| | |-- Mage_Customer_Block_Widget_Abstract
| | | |-- Mage_Customer_Block_Widget_Dob
| | | |-- Mage_Customer_Block_Widget_Gender
| | | |-- Mage_Customer_Block_Widget_Name
| | | ‘-- M a g e _ C u s t o m e r _ B l o c k _ W i d g e t _ T a x v a t
| | |-- Mage_Customer_Block_Widget_Abstract
| | |-- Mage_Directory_Block_Currency
| | |-- Mage_Directory_Block_Data
| | | |-- Mage_Customer_Block_Address_Edit
| | | ‘-- M a g e _ C u s t o m e r _ B l o c k _ F o r m _ R e g i s t e r
| | |-- Mage_Directory_Block_Data
| | |-- Mage_Downloadable_Block_Customer_Products_List
| | |-- Mage_GiftMessage_Block_Message_Form
| | |-- Mage_GiftMessage_Block_Message_Helper
| | |-- Mage_GiftMessage_Block_Message_Inline
| | |-- Mage_GoogleCheckout_Block_Link
| | |-- Mage_GoogleOptimizer_Block_Code
| | | |-- Mage_GoogleOptimizer_Block_Code_Category
| | | |-- Mage_GoogleOptimizer_Block_Code_Conversion
| | | |-- Mage_GoogleOptimizer_Block_Code_Page
| | | ‘-- M a g e _ G o o g l e O p t i m i z e r _ B l o c k _ C o d e _ P r o d u c t
| | |-- Mage_GoogleOptimizer_Block_Code
| | |-- Mage_Install_Block_Abstract
| | | |-- Mage_Install_Block_Admin
| | | |-- Mage_Install_Block_Begin
| | | |-- Mage_Install_Block_Config
| | | |-- Mage_Install_Block_Download
| | | |-- Mage_Install_Block_End
| | | ‘-- M a g e _ I n s t a l l _ B l o c k _ L o c a l e
| | |-- Mage_Install_Block_Abstract
| | |-- Mage_Install_Block_State
| | |-- Mage_Newsletter_Block_Subscribe
| | |-- Mage_Page_Block_Html
| | |-- Mage_Page_Block_Html_Breadcrumbs
| | |-- Mage_Page_Block_Html_Footer
| | |-- Mage_Page_Block_Html_Head
| | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ P a g e _ H e a d
| | |-- Mage_Page_Block_Html_Head
| | |-- Mage_Page_Block_Html_Header
| | |-- Mage_Page_Block_Html_Notices
| | |-- Mage_Page_Block_Html_Pager
| | | |-- Mage_Catalog_Block_Product_List_Toolbar_Pager
| | | ‘-- M a g e _ C a t a l o g _ B l o c k _ S e o _ S i t e m a p _ T r e e _ P a g e r
| | |-- Mage_Page_Block_Html_Pager
| | |-- Mage_Page_Block_Html_Toplinks
| | |-- Mage_Page_Block_Html_Welcome
| | |-- Mage_Page_Block_Js_Cookie
| | |-- Mage_Page_Block_Js_Translate
| | |-- Mage_Page_Block_Redirect
| | | ‘-- M a g e _ G o o g l e C h e c k o u t _ B l o c k _ R e d i r e c t
| | |-- Mage_Page_Block_Redirect
| | |-- Mage_Page_Block_Switch
| | |-- Mage_Page_Block_Template_Container
| | |-- Mage_Page_Block_Template_Links
| | |-- Mage_Page_Block_Template_Links_Block
| | | ‘-- M a g e _ W i s h l i s t _ B l o c k _ L i n k s
| | |-- Mage_Page_Block_Template_Links_Block
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
| | |-- Mage_Payment_Block_Catalog_Product_View_Profile
| | |-- Mage_Payment_Block_Form
| | | |-- Mage_GoogleCheckout_Block_Form
| | | |-- Mage_Payment_Block_Form_Cc
| | | | ‘-- M a g e _ P a y m e n t _ B l o c k _ F o r m _ C c s a v e
| | | |-- Mage_Payment_Block_Form_Cc
| | | |-- Mage_Payment_Block_Form_Checkmo
| | | |-- Mage_Payment_Block_Form_Purchaseorder
| | | |-- Mage_Paypal_Block_Standard_Form
| | | | |-- Mage_Paypal_Block_Express_Form
| | | | | ‘-- M a g e _ P a y p a l U k _ B l o c k _ E x p r e s s _ F o r m
| | | | ‘-- M a g e _ P a y p a l _ B l o c k _ E x p r e s s _ F o r m
| | | |-- Mage_Paypal_Block_Standard_Form
| | | ‘-- M a g e _ S a l e s _ B l o c k _ P a y m e n t _ F o r m _ B i l l i n g _ A g r e e m e n t
| | |-- Mage_Payment_Block_Form
| | |-- Mage_Payment_Block_Form_Container
| | | |-- Mage_Adminhtml_Block_Sales_Order_Create_Billing_Method_Form
| | | |-- Mage_Checkout_Block_Multishipping_Billing
| | | ‘-- M a g e _ C h e c k o u t _ B l o c k _ O n e p a g e _ P a y m e n t _ M e t h o d s
| | |-- Mage_Payment_Block_Form_Container
| | |-- Mage_Payment_Block_Info
| | | |-- Mage_Payment_Block_Info_Cc
| | | | |-- Mage_Payment_Block_Info_Ccsave
| | | | ‘-- M a g e _ P a y p a l _ B l o c k _ P a y m e n t _ I n f o
| | | |-- Mage_Payment_Block_Info_Cc
| | | |-- Mage_Payment_Block_Info_Checkmo
| | | |-- Mage_Payment_Block_Info_Purchaseorder
| | | ‘-- M a g e _ S a l e s _ B l o c k _ P a y m e n t _ I n f o _ B i l l i n g _ A g r e e m e n t
| | |-- Mage_Payment_Block_Info
| | |-- Mage_Payment_Block_Info_Container
| | | |-- Mage_Checkout_Block_Multishipping_Payment_Info
| | | ‘-- M a g e _ C h e c k o u t _ B l o c k _ O n e p a g e _ P a y m e n t _ I n f o
| | |-- Mage_Payment_Block_Info_Container
| | |-- Mage_Paypal_Block_Express_Review
| | |-- Mage_Paypal_Block_Express_Shortcut
| | | ‘-- M a g e _ P a y p a l U k _ B l o c k _ E x p r e s s _ S h o r t c u t
| | |-- Mage_Paypal_Block_Express_Shortcut
| | |-- Mage_Paypal_Block_Logo
| | |-- Mage_Poll_Block_ActivePoll
| | |-- Mage_Poll_Block_Poll
| | |-- Mage_ProductAlert_Block_Email_Abstract
| | | |-- Mage_ProductAlert_Block_Email_Price
| | | ‘-- M a g e _ P r o d u c t A l e r t _ B l o c k _ E m a i l _ S t o c k
| | |-- Mage_ProductAlert_Block_Email_Abstract
| | |-- Mage_ProductAlert_Block_Price
| | |-- Mage_ProductAlert_Block_Product_View
| | |-- Mage_ProductAlert_Block_Stock
| | |-- Mage_Rating_Block_Entity_Detailed
| | |-- Mage_Review_Block_Customer_Recent
| | |-- Mage_Review_Block_Form
| | |-- Mage_Review_Block_Helper
| | |-- Mage_Rss_Block_Abstract
| | | |-- Mage_Rss_Block_Catalog_Abstract
| | | | |-- Mage_Rss_Block_Catalog_Category
| | | | |-- Mage_Rss_Block_Catalog_New
| | | | ‘-- M a g e _ R s s _ B l o c k _ C a t a l o g _ T a g
| | | |-- Mage_Rss_Block_Catalog_Abstract
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
| | | |-- Mage_Rss_Block_Catalog_NotifyStock
| | | |-- Mage_Rss_Block_Catalog_Review
| | | |-- Mage_Rss_Block_Catalog_Salesrule
| | | ‘-- M a g e _ R s s _ B l o c k _ C a t a l o g _ S p e c i a l
| | |-- Mage_Rss_Block_Abstract
| | |-- Mage_Rss_Block_List
| | |-- Mage_Rss_Block_Order_Details
| | |-- Mage_Rss_Block_Order_New
| | |-- Mage_Rss_Block_Order_Status
| | |-- Mage_Sales_Block_Billing_Agreement_View
| | |-- Mage_Sales_Block_Billing_Agreements
| | |-- Mage_Sales_Block_Items_Abstract
| | | |-- Mage_Checkout_Block_Multishipping_Addresses
| | | |-- Mage_Checkout_Block_Multishipping_Billing_Items
| | | |-- Mage_Checkout_Block_Multishipping_Overview
| | | |-- Mage_Checkout_Block_Multishipping_Shipping
| | | |-- Mage_Checkout_Block_Onepage_Review_Info
| | | |-- Mage_Sales_Block_Order_Creditmemo_Items
| | | | ‘-- M a g e _ S a l e s _ B l o c k _ O r d e r _ C r e d i t m e m o
| | | |-- Mage_Sales_Block_Order_Creditmemo_Items
| | | |-- Mage_Sales_Block_Order_Email_Creditmemo_Items
| | | |-- Mage_Sales_Block_Order_Email_Invoice_Items
| | | |-- Mage_Sales_Block_Order_Email_Items
| | | |-- Mage_Sales_Block_Order_Email_Shipment_Items
| | | |-- Mage_Sales_Block_Order_Invoice_Items
| | | | ‘-- M a g e _ S a l e s _ B l o c k _ O r d e r _ I n v o i c e
| | | |-- Mage_Sales_Block_Order_Invoice_Items
| | | |-- Mage_Sales_Block_Order_Items
| | | |-- Mage_Sales_Block_Order_Print
| | | |-- Mage_Sales_Block_Order_Print_Creditmemo
| | | |-- Mage_Sales_Block_Order_Print_Invoice
| | | |-- Mage_Sales_Block_Order_Print_Shipment
| | | ‘-- M a g e _ S a l e s _ B l o c k _ O r d e r _ S h i p m e n t _ I t e m s
| | |-- Mage_Sales_Block_Items_Abstract
| | |-- Mage_Sales_Block_Order_Comments
| | |-- Mage_Sales_Block_Order_Details
| | |-- Mage_Sales_Block_Order_Email_Items_Default
| | | ‘-- M a g e _ D o w n l o a d a b l e _ B l o c k _ S a l e s _ O r d e r _ E m a i l _ I t e m s _ D o w n l o a d a b l e
| | |-- Mage_Sales_Block_Order_Email_Items_Default
| | |-- Mage_Sales_Block_Order_Email_Items_Order_Default
| | | |-- Mage_Downloadable_Block_Sales_Order_Email_Items_Order_Downloadable
| | | ‘-- M a g e _ S a l e s _ B l o c k _ O r d e r _ E m a i l _ I t e m s _ O r d e r _ G r o u p e d
| | |-- Mage_Sales_Block_Order_Email_Items_Order_Default
| | |-- Mage_Sales_Block_Order_History
| | |-- Mage_Sales_Block_Order_Info
| | |-- Mage_Sales_Block_Order_Item_Renderer_Default
| | | |-- Mage_Bundle_Block_Sales_Order_Items_Renderer
| | | |-- Mage_Downloadable_Block_Sales_Order_Item_Renderer_Downloadable
| | | ‘-- M a g e _ S a l e s _ B l o c k _ O r d e r _ I t e m _ R e n d e r e r _ G r o u p e d
| | |-- Mage_Sales_Block_Order_Item_Renderer_Default
| | |-- Mage_Sales_Block_Order_Recent
| | |-- Mage_Sales_Block_Order_Shipment
| | |-- Mage_Sales_Block_Order_Tax
| | |-- Mage_Sales_Block_Order_Totals
| | | |-- Mage_Adminhtml_Block_Sales_Totals
| | | | |-- Mage_Adminhtml_Block_Sales_Order_Creditmemo_Totals
| | | | |-- Mage_Adminhtml_Block_Sales_Order_Invoice_Totals
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
| | | | |-- Mage_Adminhtml_Block_Sales_Order_Totals
| | | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ S a l e s _ O r d e r _ T o t a l s _ I t e m
| | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ S a l e s _ O r d e r _ T o t a l s
| | | |-- Mage_Adminhtml_Block_Sales_Totals
| | | |-- Mage_Sales_Block_Order_Creditmemo_Totals
| | | ‘-- M a g e _ S a l e s _ B l o c k _ O r d e r _ I n v o i c e _ T o t a l s
| | |-- Mage_Sales_Block_Order_Totals
| | |-- Mage_Sales_Block_Order_View
| | |-- Mage_Sales_Block_Recurring_Profile_View
| | |-- Mage_Sales_Block_Recurring_Profiles
| | |-- Mage_Sales_Block_Reorder_Sidebar
| | |-- Mage_Sendfriend_Block_Send
| | |-- Mage_Shipping_Block_Tracking_Ajax
| | |-- Mage_Shipping_Block_Tracking_Popup
| | |-- Mage_Tag_Block_All
| | |-- Mage_Tag_Block_Customer_Edit
| | |-- Mage_Tag_Block_Customer_Recent
| | |-- Mage_Tag_Block_Popular
| | |-- Mage_Tag_Block_Product_List
| | |-- Mage_Tax_Block_Sales_Order_Tax
| | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ S a l e s _ O r d e r _ T o t a l s _ T a x
| | |-- Mage_Tax_Block_Sales_Order_Tax
| | |-- Mage_Wishlist_Block_Customer_Sharing
| | ‘-- M a g e _ W i s h l i s t _ B l o c k _ S h a r e _ E m a i l _ R s s
| |-- Mage_Core_Block_Template
| |-- Mage_Core_Block_Text
| | |-- Mage_Core_Block_Text_List
| | | |-- Mage_Adminhtml_Block_Text_List
| | | | |-- Mage_Adminhtml_Block_Poll_Edit_Tab_Answers
| | | | |-- Mage_Adminhtml_Block_Sales_Order_Creditmemo_View_Comments
| | | | |-- Mage_Adminhtml_Block_Sales_Order_Invoice_View_Comments
| | | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ S a l e s _ O r d e r _ S h i p m e n t _ V i e w _ C o m m e n t s
| | | ‘-- M a g e _ A d m i n h t m l _ B l o c k _ T e x t _ L i s t
| | |-- Mage_Core_Block_Text_List
| | |-- Mage_Core_Block_Text_List_Item
| | |-- Mage_Core_Block_Text_List_Link
| | |-- Mage_Core_Block_Text_Tag
| | | |-- Mage_Core_Block_Text_Tag_Css
| | | | ‘-- M a g e _ C o r e _ B l o c k _ T e x t _ T a g _ C s s _ A d m i n
| | | |-- Mage_Core_Block_Text_Tag_Css
| | | |-- Mage_Core_Block_Text_Tag_Debug
| | | ‘-- M a g e _ C o r e _ B l o c k _ T e x t _ T a g _ J s
| | |-- Mage_Core_Block_Text_Tag
| | |-- Mage_Core_Block_Text_Tag_Meta
| | ‘-- M a g e _ G o o g l e A n a l y t i c s _ B l o c k _ G a
| |-- Mage_Core_Block_Text
| |-- Mage_Customer_Block_Address_Renderer_Default
| |-- Mage_Page_Block_Html_Wrapper
| |-- Mage_Paypal_Block_Standard_Redirect
| |-- Mage_Rule_Block_Editable
| |-- Mage_Rule_Block_Newchild
| ‘-- M a g e _ R u l e _ B l o c k _ R u l e
‘-- Mage_Core_Block_Abstract
Class Aliases
Magento uses a factory pattern for instantiating certain objects. Don’t let the
design patterny name scare you though, it’s not that complicated.
In raw PHP, if you wanted to instantiate an object from a class, you’d say
something like
$customer = new Product ();
There’s nothing in Magento stopping you from doing this. However, most of
the Magento core code and its various sub-systems do things a little differently.
In Magento, when you want to instantiate an object from a class, you use code
like this
$customer = Mage :: getModel ( ’ catalog / product ’ );
This is calling a static method on the Mage class named getModel. This method
will examine Magento’s configuration, and ask
What model class does the string catalog/product associate with.
Magento will answer back "Mage Catalog Block Product", and then a "Mage Catalog Block Product"
will be instantiated. This catalog/product string is known as the class alias.
Magento uses this instantiation method for
1. Block classes: $layout->createBlock(’foo/bar’)
2. Helper classes: Mage::helper(’foo/bar’)
3. Model classes: Mage::getModel(’foo/bar’),Mage::getModel(’foo/bar’)
The createBlock, helper, and getModel methods are all factories. They make
objects or a particular type.
139
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
The class URI lookup tab will let you lookup which class aliases correspond to
which PHP classes for a core system.
The way Magento actually looks up class definitions is via its configuration
system. All the config.xml files in a Magento install are merged into one, large,
global config. This giant tree contains a top level <global/> node that looks
something like this
< config >
< global >
< models >... </ models >
< helpers >... </ helpers >
< blocks >... </ blocks >
</ global >
</ config >
The first thing Magento does when you use a class alias to instantiate a class is
determine the context (model, helper, block), and then look in an appropriate
node (<models>, <helpers>, and <blocks>).
Next, each of the <models>, <helpers>, and <blocks> contains a number of
”group” nodes
< models >
< catalog >... </ catalog >
< core >... </ core >
< page >... </ page >
</ models >
The portion to the left of the / is the group name. Magento will use this to
determine which of the group nodes it should look in next.
Finally, each group node contains, at minimum, a class node <class>
< models >
< catalog >
< class > Mage_Catalog_Model </ class >
</ catalog >
</ model >
This node contains the base PHP class name for the model (or helper, or
block) group. This base name in place, the non-group portion of the class alias
is appended to the base class name, with the first letter of each underscored
word uppercased
catalog / product
Mage_Catalog_Model_Product
That’s how Magento resolves which PHP class to use for a class alias.
The word module has come to be one of the most abused in software devel-
opment. If a designer’s adding a table to a side bar, they call it a module. If
a developer is adding a class to a system, they call it a module. If the project
manager wants to sound tech savvy, they call everything a module.
The word module has a very specific meaning in Magento. If referes to a
particular organization of code, such that it may be loaded into an existing
Magento system in a defined way, with the loading requiring no knowledge of
what other Magento modules are doing. In layman’s terms, everyone keeps their
code separate, and Magento is smart enough to know where to look for it.
If you look in
app / code / core / Mage
142
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
This package name can contain multiple code modules. Consider Magento Inc.
They use the package name Mage (short for Magento). While not necessary, the
general consensus is that the package name should contain only alphanumeric
characters, and be single word cased. This helps avoid autoload problems when
developing on case insensitive file systems (Windows, OS X sort of) that deploy
to case sensitive systems (Linux). The Packagename will be used as part of PHP
class names, so it also must meet those naming conventions as well.
Next, pick a name for your module. Strive for something simple that describes
what the module is for. Important: There’s many tutorials that recommend
you use names that are the same as Magento’s module names if you’re rewriting
or changing the functionality of a core Magento class. While there’s nothing
stopping you from doing this, it’s not required and can actually cause mass
confusion to developers when they’re new to the system.
When you’ve picked a name, create a folder inside your package name folder
mkdir app / code / local / Packagename / Modulename
Finally, every module in Magento needs one more file, a configuration file. This
file will contain information about the module’s features, and will be merged into
Magento’s main config, along with all the other modules. Create the following
folder
mkdir app / code / local / Packagename / Modulename / etc
The <Packagename Modulename/> node should be named using the package name
and module name you chose. This unique string will be used to identify your
modules. It will also, (and should also) be used as the base name for any classes
in your module
class P a c k a g e n a m e _ M o d u l e n a m e _ I n d e x C o n t r o l l e r {}
class P a c k a g e n a m e _ M o d u l e n a m e _ B l o c k _ M y b l o c k {}
you’ll see a number of XML files. Think of the etc folder in Magento the same
way you would on a *nix system. It contains configuration files for your store’s
core systems. These XML files tell Magento that you’d like to ”turn on” a par-
ticular module. Create an XML file using the unique Packagename Modulename
string with the following contents.
<! - - # File : app / etc / modules / P a c k a g e n a m e _ M o d u l e n a m e . xml -->
<? xml version = " 1.0 " encoding = " UTF -8 " ? >
< config >
< modules >
< Packagename_Modulename >
< active > true </ active >
< codePool > local </ codePool >
</ Packagename_Modulename >
</ modules >
</ config >
Again, the <Packagename Modulename/> node should use the unique string that
identifies your own module. The <active>true</active> node determines if Ma-
gento loads this particular module’s config.xml into the system. You can use this
to completely shut off a module (although, if other module’s attempt to use that
module’s functionality, object instantiations will fail). The <codePool>local</codePool>
node lets the system know where it can find your module files. The three valid
values are core, community, and local
app / code / core
app / code / community
app / code / local
With all of the above in place, clear your cache and load up the Admin Console.
Head over to
System -> Configuration -> Advanced -> Disable Module ’s Output
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
This configuration panel is one of the few areas of Magento where you can see
a list of all the installed modules. If you followed the above steps correctly, you
should see your module listed. Congratulations, you’ve added a module to the
system!
The Block Action reference ended up being ludicrously huge. See the d block action reference.html
file, distributed with this book.
Visit http://www.pulsestorm.net/nofrills-layout-appendix-d to join the discus-
sion online.
146
Appendix E
The default Magento design package ships with a default Magento theme.
# L o c a t i o n of default theme
app / design / frontend / default / default /*
You could (and can) change the location of this default theme in the Admin
Console
System -> Configuration -> Design -> Themes -> Default
but even with a new folder name this theme is still your default theme. It’s
meant to contain the main design of your store.
If you navigate to
System -> Design
Magento will allow you select a custom theme for a particular date range. The
most obvious use case of this is the holiday special. Put Santa on your store,
watch those sales soar.
147
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
This system worked, but had a small problem. Many stores would never change
the default theme. They’d leave it
default / default
and just modify those files to skin their store. When they upgraded their system,
the default/default theme would also be updated, wiping out their changes. This
was viewed as a untenable state of affairs, and the concept of the base design
package and theme was created.
This is the final fallback. Currently, the default theme that ships with Magento
is mostly implemented in the base design package. This allows designers and
developers to selectively update phtml in the default theme if they want to
change the behavior of something. The intent is that you never edit the base
design package. If you want to change a particular template you add it to your
default theme.
149
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
Figure F.1
ls -l var / cache
total 0
drwxrwxrwx 10 _www staff 340 Mar 15 16:10 mage - -0
drwxrwxrwx 10 _www staff 340 Mar 15 16:10 mage - -1
drwxrwxrwx 6 _www staff 204 Mar 15 16:02 mage - -2
drwxrwxrwx 8 _www staff 272 Mar 15 16:02 mage - -3
drwxrwxrwx 8 _www staff 272 Mar 15 16:10 mage - -4
drwxrwxrwx 12 _www staff 408 Mar 15 16:02 mage - -5
drwxrwxrwx 10 _www staff 340 Mar 15 16:02 mage - -6
drwxrwxrwx 8 _www staff 272 Mar 15 16:02 mage - -7
drwxrwxrwx 12 _www staff 408 Mar 15 16:02 mage - -8
drwxrwxrwx 10 _www staff 340 Mar 15 16:02 mage - -9
drwxrwxrwx 6 _www staff 204 Mar 15 16:02 mage - - a
drwxrwxrwx 10 _www staff 340 Mar 15 16:02 mage - - b
drwxrwxrwx 164 _www staff 5576 Mar 15 16:02 mage - - c
drwxrwxrwx 172 _www staff 5848 Mar 15 16:02 mage - - d
drwxrwxrwx 4 _www staff 136 Mar 15 16:10 mage - - e
drwxrwxrwx 12 _www staff 408 Mar 15 16:10 mage - - f
This folder is where Magento stores its cached data. Delete everything in this
folder to manually clear the Magento cache and restore you store’s functionality.
Visit http://www.pulsestorm.net/nofrills-layout-appendix-f to join the discus-
sion online.
Appendix G
In most MVC model systems a common pattern develops. Developers find they
need to store two general types of data
1. ”Business Logic” data (ex. a product’s SKU)
2. Data that allows the model to function (ex. the database table name)
It’s very common to see developers use a single array (or similar, hash table like
structure) property to store the business logic data, allowing the other class/ob-
ject properties to be used for system functionality. Magento is no different. Any
object that comes from a class that inherits from Varien Object (which includes
both models and blocks) has a protected $ data property
/* *
* Object a t t r i b u t e s
*
* @var array
*/
protected $_data = array ();
This array holds all the object’s business logic data. You can get an array of
key/value pairs for this data with the getData method.
var_dump ( $object - > getData ());
similarly, if you want a specific field back from an object, you can use
$value = $object - > getData ( ’ the_key ’ );
151
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
and you can set multiple keys at once by using setData with an array.
$value = $object - > setData ( array (
’ the_key ’= > ’ value ’
’ the_thing ’= > $thing ,
));
You’ve probably noticed we’re naming our keys using an all lower-case, underscore-
for-spaces convention. While nothing enforces this, it is the standard Magento
convention. Beyond consistency, this also helps when it comes to Magento’s
magic getter and setter methods.
Using PHP’s call method, Magento has implemented their own get and set
methods. If you call a method on an object (with Varien Object in the inheritance
chain) whose name begins with get or set, and there isn’t an existing method
already with the same name, Magento will use the remainder of the method
name to create a data property key, and either get or set the value. That means
this
$object - > setTheKey ( ’ value ’ );
is equivalent to this
$object - > setData ( ’ the_key ’ , ’ value ’ );
That’s why it’s important to keep with the lowercase/underscore key convention.
Magento will convert the leading-camel-case
TheKey
Another neat feature here is that the set method will always return an instance
of the object being set, which enables method chaining
$object - > setFoo ( ’ bar ’) - > setBaz ( ’ hola ’) - > save ();
After using this style interface for a few weeks you’ll be loath to return to typing
out array brackets.
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
case ’ set ’ :
// V a r i e n _ P r o f i l e r :: start ( ’ SETTER : ’. g e t _ c l a s s ( $this ). ’:: ’. $method );
$key = $this - > _underscore ( substr ( $method ,3));
$result = $this - > setData ( $key , isset ( $args [0]) ? $args [0] : null );
// V a r i e n _ P r o f i l e r :: stop ( ’ SETTER : ’. g e t _ c l a s s ( $this ). ’:: ’. $method );
return $result ;
case ’ uns ’ :
// V a r i e n _ P r o f i l e r :: start ( ’ UNS : ’. g e t _ c l a s s ( $this ). ’:: ’. $method );
$key = $this - > _underscore ( substr ( $method ,3));
$result = $this - > unsetData ( $key );
// V a r i e n _ P r o f i l e r :: stop ( ’ UNS : ’. g e t _ c l a s s ( $this ). ’:: ’. $method );
return $result ;
case ’ has ’ :
// V a r i e n _ P r o f i l e r :: start ( ’ HAS : ’. g e t _ c l a s s ( $this ). ’:: ’. $method );
$key = $this - > _underscore ( substr ( $method ,3));
// V a r i e n _ P r o f i l e r :: stop ( ’ HAS : ’. g e t _ c l a s s ( $this ). ’:: ’. $method );
return isset ( $this - > _data [ $key ]);
}
throw new V a r i e n _ E x c e p t i o n ( " Invalid method " . get_class ( $this ) . " :: " .
$method . " ( " . print_r ( $args ,1). " ) " );
}
We’ve changed the <visible/> tag so it contains the value ”1” (boolean for
true). We’ve also added a <label> tag which will be used as the text label
154
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
which describes the field, and a <sort order> field which control where (above
or below) a particular UI element will show up compared to others. The
<value>bazbarfoo</value> tag will set the default value for the UI element.
Figure H.1
You can also augment your fields with some instructional text by using the
<description/> node.
< parameters >
< our_parameter >
< visible >1 </ visible >
< required >1 </ required >
< label > Label for our Paramater </ label >
< type > text </ type >
< value > bazbarfoo </ value >
< sort_order >10 </ sort_order >
< description >
This is the field where we put the thing
</ description >
</ our_parameter >
</ parameters >
Sometimes a free form text field gives users too much control over what values
they enter in a widget. For cases where we want to restrict a user’s choices, we
can use a select or multiselect.
< parameters >
< our_parameter >
< visible >1 </ visible >
< required >1 </ required >
< label > Sohuld I Stay or Should I Go ? </ label >
< type > select </ type >
< value > stay </ value >
< values >
< staying >
< value > stay </ value >
< label > There will be Trouble </ label >
</ staying >
< going >
< value > go </ value >
< label > There will be Double </ label >
</ going >
</ values >
< sort_order >10 </ sort_order >
</ our_parameter >
</ parameters >
The important changes here are we’ve chagne our to <type/> tag to select, and
added a new <values/> node. The sub-nodes of the <values/> node will be used
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
to create the label/value pairs for the HTML <select> elements generated for
the front end. Alternatly, you can provide the name of a source model.
< parameters >
< our_parameter >
< visible >1 </ visible >
< required >1 </ required >
< label > Sohuld I Stay or Should I Go ? </ label >
< type > select </ type >
< value > stay </ value >
< source_model > adminhtml / system_config_source_yesno </ source_model >
< sort_order >10 </ sort_order >
</ our_parameter >
</ parameters >
The string adminhtml/system config source yesno is a class alias for a Magento
model (in this case Mage Adminhtml Model System Config Source Yesno). Source mod-
els are special model classes with a toOptionArray method.
class M a g e _ A d m i n h t m l _ M o d e l _ S y s t e m _ C o n f i g _ S o u r c e _ Y e s n o
{
/* *
* Options getter
*
* @return array
*/
public function toOptionArray ()
{
return array (
array ( ’ value ’ = > 1 , ’ label ’= > Mage :: helper ( ’ adminhtml ’) - > __ ( ’ Yes ’)) ,
array ( ’ value ’ = > 0 , ’ label ’= > Mage :: helper ( ’ adminhtml ’) - > __ ( ’ No ’ )) ,
);
}
This method returns a set of key/value pairs for your select. You may create your
own source models, or use one the models that ships with Magento. Checkout
the PHP files in
app / code / core / Mage / Adminhtml / Model / System / Config / Source
The key nodes here are <type> and <helper block>. Our field type here is label.
Normally, a field type of label will render the label for a field without any
form element. In other words, a form element with no functional value, only in-
structional/branding/experience. However, we’ve also included a <helper block>
node. This node (via the <type/> sub-node) configures a block class that will
render our form.
After configuring this paramater, you’ll need to define your block class. Despite
living in the standard block heirarchy, we do not want to implement our ren-
dering in its toHtml method. Instead, this class needs a special method named
prepareElementHtml
# File : app / code / local / Y o u r p a c k a g e / Y o u r m o d u l e / Block / W i d g e t t e s t . php
class Y o u r p a c k a g e _ Y o u r m o d u l e _ B l o c k _ W i d g e t t e s t extends M a g e _ C o r e _ B l o c k _ A b s t r a c t
{
/* *
* Overly simple example
*/
public function p r e p a r e E l e m e n t H t m l (
V a r i e n _ D a t a _ F o r m _ E l e m e n t _ A b s t r a c t $element )
{
$simple_input = ’ < input type =" text " name =" ’ .
strip_tags ( $element - > getName ()) .
’" value =" ’ .
strip_tags ( $element - > getValue ()).
’"/ > ’;
During the rendering of your paramater’s UI, Magento will call the prepareElementHtml
method of your helper block, passing in a Varien Data Form Element Abstract object.
This $element is the object that Magento will use to render out your form ele-
ment. To implement a custom form element, your job is
1. Grab the form element’s name and value from $element. The value will
contain previously saved values, and the name will be the correct name
for the HTML form element to ensure the form data is saved on post
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
System Configuration
Variables
A simple system configuration system might store a set of key/value pairs some-
thing like this.
$config [ ’ db_name ’] = ’ localhost ’;
$config [ ’ db_password ’] = ’ 12345 ’;
$config [ ’ logo ’] = ’ awesomelogo . gif ’;
etc .
However, in keeping with its core philosophy of ”When in doubt, use XML”,
Magento stores its system configuration values in tree format. The above might
be represented something like this
< system_config >
< store >
< database >
< name > localhost </ name >
< password >12345 </ password >
</ databases >
< design >
< logo > awesomelogo . gif </ logo >
</ design >
</ store >
</ system_config >
159
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
Magento allows each module to define new nodes for this configuration tree,
as well as user interfaces for store owners to enter configuration values in the
Admin Console under
System -> Configuration
This system is beyond the scope of this book, but there’s plenty of information
online. If you’re interested, you can start reading here
http : // a l a n s t o r m . com / c u s t o m _ m a g e n t o _ s y s t e m _ c o n f i g u r a t i o n
Magento Connect
Magento Connect is a lot of things. First and foremost, it’s Magento Inc’s online
repository for free, downloadable extensions. It’s also a package management
system that was, originally, based on the PHP PEAR packaging format. Ma-
gento Connect 2.0 was released along with Magento CE 1.5. This means there’s
two separate package file formats, which is why we’ve included two different sets
of modules.
161
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
You’ll need to reauthorize you admin user. The code that bootstraps the Ma-
gento Connect Manager is separate from the source code of your Magento system
proper.
Installing extensions that have been uploaded to Magento Inc’s central server is
as easy as entering the extension key into the installation field.
If you’ve downloaded a .tgz package file from the internet, Magento 1.5 also
offers a handy upload form, allows you to directly upload an extension
In the root folder of Magento 1.4.2 there’s a shell script named pear. This shell
script in not the standard PEAR installer. It’s a customized installer you may
use to install Magento Connect extensions. To use it, you’ll need to tell your
operating system its allowed to execute it as a program
chmod + x pear
the script will exit. You’re now ready to install and uninstall packages using
the command line installer
./ pear install N o _ F r i l l s_ M a g e nt o _ L a y o u t _ 1 _ s t a r t -1.0.0. tgz
./ pear uninstall \
channel : // connect . m a g e n t o c o m m e r c e . com / c o m m u n i t y / N o _ F r i l l s _ M a g e n t o _ L a y o u t _ 1 _ s t a ...
For Evaluation Only.
Copyright (c) by VeryPDF.com Inc
Edited by VeryPDF PDF Editor Version 2.6
Magento 1.5 removed the pear installer, and introduced a new command line
script (mage) that offers a similar function. Again, you’ll need to give it exe-
cutable permissions
chmod + x mage
After the setup script finishes running, you’ll be able to install extensions from
a file. NOTE: The command has changed to install-file, and the arguments
to uninstall have changed as well
./ mage install - file N o _ F r i l l s _ M a g e n t o_ L a y o u t _ 3 _ s t a r t -1.0.0. tgz
./ mage uninstall community N o _ F r i l l s _ M a g e n t o _ L a y o u t _ 3 _ s t a r t