├── .gitignore
├── LICENSE
├── README.md
├── magento-1
├── .gitignore
├── 0_intro.markdown
├── 1_building_layouts_programatically.markdown
├── 2_page_layout.markdown
├── 3_package_layout.markdown
├── 4_bringing_it_together.markdown
├── 5_advanced_layout_features.markdown
├── 6_cms_page.markdown
├── 7_widgets.markdown
├── LICENSE
├── No_Frills_Magento_Layout.tex
├── README.md
├── a_appendix_blocks.markdown
├── b_appendix_class_alias.markdown
├── bin
│ ├── build-html.bash
│ ├── build-latex.bash
│ ├── build-sample.bash
│ ├── build.bash
│ ├── chapters_to_html.php
│ ├── chapters_to_tex.php
│ ├── chapters_to_tex_sample.php
│ ├── cleanup.php
│ ├── code_from_chapters.php
│ ├── color_code.php
│ ├── combine_html_chapters.php
│ ├── editing-regex.txt
│ ├── files.php
│ ├── finalize.php
│ ├── finalize_sample.php
│ ├── hyphenate.php
│ ├── markdown.php
│ ├── remove_code.php
│ ├── search.php
│ ├── ss.php
│ ├── to_shell.php
│ └── xmlverbatim.xsl
├── c_appendix_creating_modules.markdown
├── code
│ ├── 1.4.2
│ │ ├── No_Frills_Magento_Layout_1_end-1.0.0.tgz
│ │ ├── No_Frills_Magento_Layout_1_start-1.0.0.tgz
│ │ ├── No_Frills_Magento_Layout_2_end-1.0.0.tgz
│ │ ├── No_Frills_Magento_Layout_2_start-1.0.0.tgz
│ │ ├── No_Frills_Magento_Layout_3_end-1.0.0.tgz
│ │ ├── No_Frills_Magento_Layout_3_start-1.0.0.tgz
│ │ ├── No_Frills_Magento_Layout_5_end-1.0.0.tgz
│ │ ├── No_Frills_Magento_Layout_5_start-1.0.0.tgz
│ │ ├── No_Frills_Magento_Layout_7_end-1.0.0.tgz
│ │ └── No_Frills_Magento_Layout_7_start-1.0.0.tgz
│ └── 1.5 or higher
│ │ ├── No_Frills_Magento_Layout_1_end-1.0.0.tgz
│ │ ├── No_Frills_Magento_Layout_1_start-1.0.0.tgz
│ │ ├── No_Frills_Magento_Layout_2_end-1.0.0.tgz
│ │ ├── No_Frills_Magento_Layout_2_start-1.0.0.tgz
│ │ ├── No_Frills_Magento_Layout_3_end-1.0.0.tgz
│ │ ├── No_Frills_Magento_Layout_3_start-1.0.0.tgz
│ │ ├── No_Frills_Magento_Layout_5_end-1.0.0.tgz
│ │ ├── No_Frills_Magento_Layout_5_start-1.0.0.tgz
│ │ ├── No_Frills_Magento_Layout_7_end-1.0.0.tgz
│ │ └── No_Frills_Magento_Layout_7_start-1.0.0.tgz
├── cover.html
├── d_block_action_reference.html
├── d_block_action_reference.markdown
├── e_theme_and_layout_resolution.markdown
├── f_appendix_clearing_cache.markdown
├── g_appendix_setters_and_getters.markdown
├── h_widget_field_rendering_options.markdown
├── i_system_config.markdown
├── images
│ ├── appendix_f
│ │ └── cache-manage.png
│ ├── appendix_g
│ │ └── field.png
│ ├── chapter1
│ │ ├── helloworld.png
│ │ ├── nofirst.png
│ │ ├── start.png
│ │ └── twocities.png
│ ├── chapter2
│ │ ├── after.png
│ │ ├── before.png
│ │ ├── complex.png
│ │ └── with-content.png
│ ├── chapter3
│ │ ├── blank-theme.png
│ │ ├── blank-with-handles.png
│ │ └── config-package.png
│ ├── chapter4
│ │ ├── package-layout-files.png
│ │ ├── page-layout.gif
│ │ └── page-layout.png
│ ├── chapter5
│ │ ├── order-base.png
│ │ └── order-before-two.png
│ ├── chapter6
│ │ ├── cms-page.png
│ │ ├── page-info.png
│ │ └── page1.png
│ └── chapter7
│ │ ├── instance-displayon.png
│ │ ├── instance-pageselected.png
│ │ ├── instance-set-data.png
│ │ ├── instance-step1.png
│ │ ├── instance-step2-always.png
│ │ ├── invalidated.png
│ │ ├── show-hide.png
│ │ ├── widget-window-with-data.png
│ │ ├── widget-window.png
│ │ └── with-template.png
├── j_magento_connect.markdown
├── nofrills.latex
├── subs.php
├── test.php
├── texput.log
└── var
│ ├── guide.html
│ ├── h.js
│ ├── shell.html
│ └── shell.tex
└── magento-2
├── .gitignore
├── LICENSE
├── README.md
├── build.php
├── nofrills.latex
└── src
├── .DS_Store
├── _url_writing.md
├── appendix-areas.md
├── appendix-autoload.md
├── appendix-cache.md
├── appendix-cli.md
├── appendix-components.md
├── appendix-curl.md
├── appendix-di.md
├── appendix-frontend-build.md
├── appendix-install-module.md
├── appendix-interfaces.md
├── appendix-magento-modes.md
├── appendix-unix-find.md
├── appendix-view-source.md
├── chapter-0-introduction.md
├── chapter-1-blocks-template-php.md
├── chapter-10-knockout-scopes.md
├── chapter-2-layout-xml.md
├── chapter-3-layouthandles.md
├── chapter-4-page-layout.md
├── chapter-5-themes.md
├── chapter-6-advanced-xml-loading.md
├── chapter-7-frontend-css.md
├── chapter-8-frontend-javascript.md
└── chapter-9-frontend-advanced-topics.md
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | ALL RIGHTS RESERVED Copyright © Pulse Storm LLC and Alana Storm
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # magento-layout-no-frills
2 |
3 | Repo for No Frills Magento Layout Copyright © Pulse Storm LLC and Alana Storm
4 |
5 | ## Next Steps
6 |
7 | Here's where this repo is headed over the next `[regional time period]`. If you're feeling excited about taking something on just say hello first to make sure the change would be welcome, and then have at it.
8 |
9 | Also, pull requests to fix grammar, typos, or technical content will _always_ be engaged with.
10 |
11 | - [ ] Get Source for both Magento 1 and Magento 2 No Frills Magento Layout uploaded to repo and building with manual build steps
12 | - [ ] Magento 2: Are there Modules to include?
13 | - [ ] Automate the build via docker, github actions, etc.
14 | - [ ] Reconsider pandoc + LaTeX as the build system -- is there a better way to make an ebook in 20xx?
15 | - [ ] Make a grammar/typo pass using more modern tools/checkers
16 |
17 |
18 |
--------------------------------------------------------------------------------
/magento-1/.gitignore:
--------------------------------------------------------------------------------
1 | _nofrills_layout_pandoc
2 | deliverable
--------------------------------------------------------------------------------
/magento-1/0_intro.markdown:
--------------------------------------------------------------------------------
1 | No Frills Magento Layout: Introduction
2 | ==================================================
3 |
4 | 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.
5 |
6 | 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.
7 |
8 | 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 developers an unprecedented level of power to change their layouts without having to touch a single line of PHP code.
9 |
10 | 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.
11 |
12 |
13 | Who this Book is For
14 | --------------------------------------------------
15 | This book is for interactive developers and software engineers who want to fully understand Magento's XML based Layout system.
16 |
17 | By interactive developer we mean someone who both designs online experiences, and **implements** them using a mix of HTML/CSS/Javascript and some glue/template programming in a dynamic language like PHP, Ruby, Python, or one of those language's many template systems. There are parts of the book where we'll dive in depth into how a particular system is built, but only so that you can better understand the context of where and when to use it. Designer-coders are quickly taking over the agency world, and this book seeks to give them the tools they need to succeed.
18 |
19 | Software engineer always seemed a fancier title than most jobs entail, so substitute software developer, or even PHP developer, if you're uncomfortable with engineer. Chances are if you work for a shop that does more than just crank out web stores you're going to be asked to extend, enhance, and generally abuse Magento, including the Layout system. In teaching you the practical, this book will also teach and inform on the engineering assumptions of the Layout system. After reading through this book you'll not only understand how to use the Layout system, you'll understand why it was built the way it was, which in turn will help you make better engineering decisions on your own project.
20 |
21 | This book assumes some basic PHP and Magento knowledge. If you haven't already done so, reviewing the Magento Knowledge Base, as well as the additional articles on the author's website will help you get where you need to with Magento.
22 |
23 | > http://www.magentocommerce.com/knowledge-base
24 | > http://alanastorm.com/category/magento
25 |
26 | You don't need to be a Magento master, but you should be passably familiar with the application. If you aren't, you will be by the time you're done! While the main text of the Book is focused on the Layout and related systems, whenever a deeper knowledge of Magento is needed the Appendixes will give you the overview you need to keep working.
27 |
28 | No Frills
29 | --------------------------------------------------
30 | 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.
31 |
32 | With that in mind, lets get started!
33 |
34 | Installing Modules
35 | --------------------------------------------------
36 | This book was distributed with an archive containing several versions of a Magento module named ') !== 0)
24 | {
25 | throw new Exception("Unexpected format at " . __LINE__ . " in " . __FILE__);
26 | }
27 | else
28 | {
29 | $string = trim(remove_start_and_end('p',$string));
30 | }
31 | return '\begin{quote}' . "\n" .
32 | escape_tex_characters($string) . "\n" .
33 | '\end{quote}';
34 | //return '\subparagraph{'.escape_tex_characters($string).'} ' . "\n";;
35 | }
36 |
37 | function format_p($node)
38 | {
39 | $string = remove_start_and_end('p',$node);
40 | return escape_tex_characters($string);
41 | }
42 |
43 | function format_h3($node)
44 | {
45 | $section = remove_start_and_end('h2',$node);
46 | return sprintf('\subsection{%s}',escape_tex_characters($section));
47 | }
48 |
49 | function format_h2($node)
50 | {
51 | $section = remove_start_and_end('h2',$node);
52 | return sprintf('\section{%s}',escape_tex_characters($section));
53 | }
54 |
55 | function format_pre($node)
56 | {
57 | $code = remove_start_and_end('pre',$node);
58 | $code = remove_start_and_end('code',$code);
59 | $code = str_replace("\n\n","\n",$code); //not sure why
60 |
61 | //unspecialchars
62 | $code = htmlspecialchars_decode($code);
63 | //no tex escpanig for listings
64 | // \begin{lstlisting}
65 | // (.+?)}six',$string,$matches);
80 | $items = array();
81 | foreach($matches[1] as $line)
82 | {
83 | $final_line = $line;
84 | if(strpos($final_line,' ') === 0)
85 | {
86 | $final_line = remove_start_and_end('p',$line);
87 | }
88 | $items[] = $final_line;
89 | }
90 | $s_items = '';
91 | foreach($items as $item)
92 | {
93 | $s_items .= '\item ' . escape_tex_characters($item) . "\n";
94 | }
95 | return $s_items;
96 | }
97 |
98 | function format_ul($node)
99 | {
100 | $s_items = get_list_items_from_node($node);
101 | $list = '\begin{itemize}' . "\n" .
102 | $s_items .
103 | '\end{itemize}' . "\n";
104 | return $list;
105 | }
106 |
107 | function format_ol($node)
108 | {
109 | file_put_contents('/tmp/test.log',"--------------------------------------------------\n",FILE_APPEND);
110 | file_put_contents('/tmp/test.log',$node->asXml()."\n",FILE_APPEND);
111 | $s_items = get_list_items_from_node($node);
112 | file_put_contents('/tmp/test.log',"$s_items\n",FILE_APPEND);
113 | file_put_contents('/tmp/test.log',"--------------------------------------------------\n",FILE_APPEND);
114 |
115 | $list = '\begin{enumerate}' . "\n" .
116 | $s_items .
117 | '\end{enumerate}' . "\n";
118 | return $list;
119 | }
120 |
121 | function html_to_tex($contents)
122 | {
123 | $tex = array();
124 | $xml = simplexml_load_string(' ',$book);
8 | file_put_contents($argv[1], $book);
9 | }
10 | main($argv);
--------------------------------------------------------------------------------
/magento-1/bin/remove_code.php:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env php
2 | .+?}six','',$contents);
7 | }
8 | main($argv);
9 | exit(0);
--------------------------------------------------------------------------------
/magento-1/bin/search.php:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env php
2 |
16 |
31 | ';
32 |
33 | echo str_replace('####',$argv[1],$template), "\n\n";
34 | }
35 | main($argv);
--------------------------------------------------------------------------------
/magento-1/bin/to_shell.php:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env php
2 | (.*)Nofrills\_Booklayout
. If you want to add code to a Magento system, you create a module. The Nofrills\_Booklayout
module is where the example code in this book will go. You'll be building this module up as you go along. For each chapter in the book, we've included the module as it should be at the start of the chapter, and how it should be at the end.
37 |
38 | You'll also find a copy of each and every code example in the code/all
folder. If you don't want to manually type in code examples from the book, copy and paste the contents of these files into your source code editor.
39 |
40 | There are two ways to install the module. The first is manually. If you extract the files, you'll see a folder structure like
41 |
42 | app/code/local/Nofrills_Magento
43 | app/module/etc/Nofrills_Magento.xml
44 | app/.....
45 |
46 | 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
47 |
48 | > http://alanastorm.com/magento\_controller\_hello\_world
49 |
50 | If you're not up for a manual install, 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.
51 |
52 | Parting Words
53 | --------------------------------------------------
54 | A few last things before we start. Magento has a special operating mode called DEVELOPER\_MODE
. When running in DEVELOPER\_MODE
Magento is less tolerant of small coding errors, and will not hide fatal errors and uncaught exceptions from the end user. You'd never want to run a production store in DEVELOPER\_MODE
, but it can make working with and learning the system much easier. You'll want to turn DEVELOPER\_MODE
on while working your way through this book. You can do this by either
55 |
56 | 1. Adding SetEnv MAGE\_IS\_DEVELOPER_MODE 1
to your .htaccess file
57 |
58 | 2. Alternately, editing index.php
59 |
60 | If you choose the second option, look for lines in your index.php
file something like
61 |
62 | if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE'])) {
63 | Mage::setIsDeveloperMode(true);
64 | }
65 |
66 | You'll want to make sure the Mage::setIsDeveloperMode(true);
call is made. Also, while you're in index.php
, it'd be a good idea to tell PHP to show errors by changing this
67 |
68 | #ini_set('display_errors', 1);
69 |
70 | to this
71 |
72 | ini_set('display_errors', 1);
73 |
74 | 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.
75 |
76 | Magento's a fast changing platform, and while the concepts in this book 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
77 |
78 | THIS BOOK AND SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
79 | CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
80 | INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
81 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
82 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
83 | BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
84 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
85 | TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
86 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
87 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
88 | TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
89 | THE USE OF THIS BOOK AND SOFTWARE, EVEN IF ADVISED OF THE
90 | POSSIBILITY OF SUCH DAMAGE.
91 |
92 | Bugs in the Book
93 | --------------------------------------------------
94 | If you're having trouble working your way through the examples, post a detailed question to the programming Q&A site Stack Overflow
95 |
96 | > http://stackoverflow.com/tags/magento
97 |
98 | with the following tags
99 |
100 | magento magento-nofrills
101 |
102 | 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 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.
103 |
104 | 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 community.
105 |
106 |
107 | About the Author
108 | --------------------------------------------------
109 | No Frills Magento Layout was written by Alana Storm. Alana's an industry veteran with over 12 years on-the-job experience, and an active member of the Magento community. He's written the go-to developer documentation for the Magento Knowledge Base, and is the author of the popular debugging extension Commerce Bug. You can read more about Alana and her Magento products at the following URLs
110 |
111 | > http://alanastorm.com/
112 | > http://store.pulsestorm.net/
113 |
114 | Let's Go
115 | --------------------------------------------------
116 | 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.
117 |
118 | *Visit http://www.pulsestorm.net/nofrills-layout-introduction to join the discussion online.*
--------------------------------------------------------------------------------
/magento-1/4_bringing_it_together.markdown:
--------------------------------------------------------------------------------
1 | Bringing it All Together
2 | ==================================================
3 | 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
4 |
5 |
6 | How a Magento Layout is Built
7 | --------------------------------------------------
8 | Somewhere in a controller action, the programmer creating the controller action method tells Magento that it's time to load the layout. The end result of loading a layout is a Page Layout XML tree, (see *Figure 4.1*)
9 |
10 |
11 |
12 | To load a Page Layout, Magento will pick and choose Layout Update XML fragments from a repository of Layout Update XML fragments. This repository of Layout Update XML fragments is known as the Package Layout. The Package Layout is loaded from disk by combining several XML files into a single tree, (see *Figure 4.2*)
13 |
14 |
15 |
16 | Users of the Magento system can add to the Package Layout by
17 |
18 | 1. Creating and editing a
local.xml
file
19 | 2. Adding a custom XML file to the Layout via a module's config.xml
file
20 | 3. Least desirably, but most commonly, editing or replacing existing Package Layout files in their their theme's layout
21 |
22 | The Package Layout organizes its many Layout Update XML fragments by handle. During a normal page request life cycle, various parts of the Magento system will tell the Layout Update Manager that, when the time comes, Layout 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.
23 |
24 | 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.
25 |
26 | 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.
27 |
28 |
29 | What is the Page Layout
30 | --------------------------------------------------
31 | The Page Layout is a list of instruction for Magento. Programmer types may call it a meta-programing language, or a domain-specific language. Regardless of what you call, the last step of **loading** a Layout is for Magento to use the Page Layout to create and instantiate a nested tree of block objects. These are PHP Objects, each one ultimately responsible for rendering a chunk of HTML.
32 |
33 | That's the layout loaded. The controller action programer may, at this point, choose to manipulate the layout object further. This may include adding, removing, or setting properties on blocks. The Magento Admin Console application does this regularly. The Magento frontend (cart) application tends not to do this. Irrespective of how, after loading a Layout and fiddling with it if they wish, the controller action developer then tells Magento it's time to render the layout object
34 |
35 | Rendering a Layout
36 | --------------------------------------------------
37 | During the creation of Page Layout, certain Layout Update XML fragments marked certain blocks as "output blocks". When we say certain blocks, this is almost always a single block, and equally almost always this is the block named root
. This root block renders a page template. This template, in turn, includes calls to render child blocks. Some of these child blocks render via a template file, others are core/text\_list
blocks which automatically render all their children. Others render via pure PHP in the \_toHtml
method. This blocks rendering sub-blocks, rending sub-sub-blocks can continue many layers deep.
38 |
39 | The end result of this rendering is a single string variable containing all the HTML from the cascading render. The string is then passed into a Magento response object, which is responsible for outputting the HTML page.
40 |
41 | That, in a nutshell, is the Layout system.
42 |
43 | *Visit http://www.pulsestorm.net/nofrills-layout-chapter-four to join the discussion online.*
--------------------------------------------------------------------------------
/magento-1/LICENSE:
--------------------------------------------------------------------------------
1 | ALL RIGHTS RESERVED Copyright © Pulse Storm LLC and Alana Storm
--------------------------------------------------------------------------------
/magento-1/README.md:
--------------------------------------------------------------------------------
1 | # No Frills Magento 1 Layout
2 |
3 | Build is currently a manual process. You'll need
4 |
5 | - PHP
6 |
7 | - A LaTeX with `pdflatex`
8 |
9 | installed. To run the build invoke the following command
10 |
11 | % ./bin/build.bash
12 |
13 | Build will drop files in
14 |
15 | ./deliverable/nofrills_layout
16 |
17 | Build PDF with
18 |
19 | pdflatex deliverable/nofrills_layout/No_Frills_Magento_Layout.tex
20 |
--------------------------------------------------------------------------------
/magento-1/b_appendix_class_alias.markdown:
--------------------------------------------------------------------------------
1 | Class Aliases
2 | ==================================================
3 | Magento uses a factory pattern for instantiating certain objects. Don't let the design patterny name scare you though, it's not that complicated.
4 |
5 | In raw PHP, if you wanted to instantiate an object from a class, you'd say something like
6 |
7 | $customer = new Product();
8 |
9 | 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.
10 |
11 | In Magento, when you want to instantiate an object from a class, you use code like this
12 |
13 | $customer = Mage::getModel('catalog/product');
14 |
15 | This is calling a static method on the Mage
class named getModel
. This method will examine Magento's configuration, and ask
16 |
17 | > What model class does the string catalog/product
associate with.
18 |
19 | Magento will answer back "Mage\_Catalog\_Model\_Product"
, and then a "Mage\_Catalog\_Model\_Product"
will be instantiated. This catalog/product
string is known as the class alias.
20 |
21 | Magento uses this instantiation method for
22 |
23 | 1. Block classes: $layout->createBlock('foo/bar')
24 | 2. Helper classes: Mage::helper('foo/bar')
25 | 3. Model classes: Mage::getModel('foo/bar'),Mage::getModel('foo/bar')
26 |
27 | The createBlock
, helper
, and getModel
methods are all factories. They make objects or a particular type.
28 |
29 | Why so Complicated?
30 | --------------------------------------------------
31 | This may seem like a lot of misdirection for something as simple as a class declaration, but that misdirection brings some benefits along for the ride. It helps create a type system around classes, Magento itself knows what classes have or have not been declared at any one time, the shorthand saves some verbosity in typing, and it helps enable one of Magento's unique PHP feature, class rewrites (similar to duck-typing or monkey-patching in the Ruby and Python communities)
32 |
33 | What Class?
34 | --------------------------------------------------
35 | This is all well and good, but can sometimes leave you wondering what class alias corresponds to what class definition. The easiest thing to do is use the free, online demo of Commerce Bug
36 |
37 | http://commercebugdemo.pulsestorm.net/
38 |
39 | The class URI lookup tab will let you lookup which class aliases correspond to which PHP classes for a core system.
40 |
41 | 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
42 |
43 | <models>
, <helpers>
, and <blocks>
).
52 |
53 | Next, each of the <models>
, <helpers>
, and <blocks>
contains a number of "group" nodes
54 |
55 | /
is the group name. Magento will use this to determine which of the group nodes it should look in next.
66 |
67 | Finally, each group node contains, at minimum, a class node <class>
68 |
69 | <rewrite/>
node that will tell Magento to replace one class with another. This is Magento's famous class rewrite system. Using the following
88 |
89 | catalog/product_review
is instantiated, is should use a Yourpackage\_Yourmodule\_Model\_Someclass
.
98 |
99 | *Visit http://www.pulsestorm.net/nofrills-layout-appendix-b to join the discussion online.*
--------------------------------------------------------------------------------
/magento-1/bin/build-html.bash:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | bin/chapters_to_html.php
4 | bin/code_from_chapters.php
5 | bin/to_shell.php book.html
6 | bin/color_code.php book.html
7 | bin/hyphenate.php book.html
8 | bin/finalize.php
9 | bin/cleanup.php
10 | #bin/remove_code.php /tmp/book_in_shell.html > /tmp/no_code.html
--------------------------------------------------------------------------------
/magento-1/bin/build-latex.bash:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | bin/chapters_to_html.php
4 | bin/code_from_chapters.php
5 | bin/chapters_to_tex.php
6 |
7 | #bin/to_shell.php book.html
8 | #bin/color_code.php book.html
9 | #bin/hyphenate.php book.html
10 | bin/finalize.php
11 | bin/cleanup.php
--------------------------------------------------------------------------------
/magento-1/bin/build-sample.bash:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | bin/chapters_to_html.php
4 | bin/code_from_chapters.php
5 | bin/chapters_to_tex_sample.php
6 | bin/finalize_sample.php
7 | bin/cleanup.php
--------------------------------------------------------------------------------
/magento-1/bin/build.bash:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | bin/chapters_to_html.php
4 | bin/code_from_chapters.php
5 | bin/to_shell.php book.html
6 | bin/color_code.php book.html
7 | bin/hyphenate.php book.html
8 | bin/finalize.php
9 | bin/chapters_to_tex.php
10 | bin/cleanup.php
11 | mv book.html deliverable/nofrills_layout
12 | #bin/remove_code.php /tmp/book_in_shell.html > /tmp/no_code.html
--------------------------------------------------------------------------------
/magento-1/bin/chapters_to_html.php:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env php
2 | asXml();
14 | }
15 | $string = substr($string, strlen($tag)+2);
16 | $string = substr($string, 0,strlen($string)-(strlen($tag)+3));
17 | return $string;
18 | }
19 |
20 | function format_blockquote($node)
21 | {
22 | $string = trim(remove_start_and_end('blockquote',$node));
23 | if(strpos($string, '(.+?)
}six','format_inline_code',$string); //code samples
140 | $string = str_replace('\\>','\\textgreater ',$string); //escaped htmlspecialchars
141 | $string = str_replace('\\<','\\textless ',$string); //escaped htmlspecialchars
142 | $string = str_replace('\\&','\\&',$string); //escaped htmlspecialchars
143 | $string = preg_replace_callback('{}','format_images',$string); //images
144 | $string = str_replace('appendix\_f','appendix_f',$string); //lazy fixing
145 | $string = str_replace('appendix\_g','appendix_g',$string); //lazy fixing
146 |
147 | #could probably combine some of these, but seems cleaner to do one by one
148 | //inline code end of sentence
149 | $string = preg_replace('%(texttt\{.+?\}) ([\\\]normalsize) \.%','$1$2.',$string);
150 |
151 | //inline code wuth a following comma
152 | $string = preg_replace('%(texttt\{.+?\}) ([\\\]normalsize) ,%','$1$2,',$string);
153 |
154 | //inline code wuth a following a paren
155 | $string = preg_replace('%(texttt\{.+?\}) ([\\\]normalsize) \)%','$1$2)',$string);
156 |
157 | //inline code wuth a following a quote
158 | $string = preg_replace('%(texttt\{.+?\}) ([\\\]normalsize) \'%','$1$2\'',$string);
159 |
160 | //one offs
161 | $string = preg_replace('%(texttt\{insert}) ([\\\]normalsize) (ing)%','$1$2 $3',$string);
162 |
163 | //one offs
164 | $string = preg_replace('%(texttt\{foreach}) ([\\\]normalsize) (ing)%','$1$2 $3',$string);
165 |
166 | return $string;
167 | }
168 |
169 | function format_images($matches)
170 | {
171 | $string = '\begin{figure}[htb]
172 | \begin{center}
173 | \leavevmode
174 | \includegraphics[width=1\textwidth]{'.$matches[1].'}
175 | \end{center}
176 | \caption{}
177 | %\label{fig:awesome_image}
178 | \end{figure}' . "\n";
179 | return $string;
180 | }
181 | function format_inline_code($matches)
182 | {
183 | // $inside = str_replace('\_','_',$matches[1]);
184 | $inside = $matches[1];
185 | return '\footnotesize\texttt{'.$inside.'} \normalsize ';
186 | }
187 |
188 | function get_chapter_contents()
189 | {
190 | include('files.php');
191 | $files = array_map('markdown_to_html',$files);
192 |
193 | $chapter_contents = array();
194 | foreach($files as $file)
195 | {
196 | $lines = file('build/' . $file);
197 | $title = array_shift($lines);
198 | $contents = trim(implode("\n",$lines));
199 | $contents = html_to_tex($contents);
200 |
201 | $chapter_contents[trim(strip_tags($title))] = $contents;
202 | }
203 | return $chapter_contents;
204 | }
205 | function main($argv)
206 | {
207 | $contents = get_chapter_contents();
208 |
209 | $main_file = array();
210 | $appendix = false;
211 | foreach($contents as $title=>$contents)
212 | {
213 | $file_name = preg_replace('{[^a-z0-9]}i','_',$title);
214 | $full_path = 'build/'.$file_name.'.tex';
215 | file_put_contents($full_path,$contents);
216 | if(!$appendix && strpos($title, 'Magento Block Hierarchy') === 0)
217 | {
218 | $main_file[] = '\appendix';
219 | }
220 | $main_file[] = '\chapter{'.$title.'}';
221 |
222 | $main_file[] = $contents;
223 | // $main_file[] = '\input{'.$full_path.'}';
224 | }
225 | $for_main_file = implode("\n",$main_file);
226 | $book = file_get_contents('var/shell.tex');
227 | $book = str_replace('includeshere',$for_main_file,$book);
228 | file_put_contents('No_Frills_Magento_Layout.tex',$book);
229 | }
230 | main($argv);
--------------------------------------------------------------------------------
/magento-1/bin/chapters_to_tex_sample.php:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env php
2 | $contents)
27 | {
28 | $file_name = preg_replace('{[^a-z0-9]}i','_',$title);
29 | $full_path = 'build/'.$file_name.'.tex';
30 | file_put_contents($full_path,$contents);
31 | if(is_full_chapter($file_name))
32 | {
33 | if(!$appendix && strpos($title, 'Magento Block Hierarchy') === 0)
34 | {
35 | $main_file[] = '\appendix';
36 | }
37 | $main_file[] = '\chapter{'.$title.'}';
38 | $main_file[] = $contents;
39 | }
40 | else
41 | {
42 | if(!$appendix && strpos($title, 'Magento Block Hierarchy') === 0)
43 | {
44 | $main_file[] = '\appendix';
45 | }
46 | $main_file[] = '\chapter{'.$title.'}';
47 | $main_file[] = 'This PDF is a sample, and contains Chapter 0, Chapter 7, and ' .
48 | 'Appendix B. Get the entire book online!' . "\n\n" .
49 | "http://store.pulsestorm.net/products/no-frills-magento-layout" . "\n";
50 | $main_file[] = parse_sub_sections($contents);
51 | }
52 | }
53 | $for_main_file = implode("\n",$main_file);
54 | $book = file_get_contents('var/shell.tex');
55 | $book = str_replace('includeshere',$for_main_file,$book);
56 | $book = str_replace('Prepared for Robert Hoffner; ','',$book);
57 | file_put_contents('No_Frills_Magento_Layout.tex',$book);
58 | }
59 | main_sample($argv);
--------------------------------------------------------------------------------
/magento-1/bin/cleanup.php:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env php
2 |
(.+?)
}six',$chapter,$matches);
17 | $fragments = $matches[1];
18 |
19 | $dir_name = 'code/all/' . str_replace('.html','',$file);
20 | if(!is_dir($dir_name))
21 | {
22 | mkdir($dir_name);
23 | }
24 |
25 | $c=1;
26 | foreach($fragments as $fragment)
27 | {
28 | file_put_contents($dir_name . '/'
29 | . $c . '.txt',htmlspecialchars_decode($fragment));
30 | $c++;
31 | }
32 | }
33 | }
34 | main($argv);
--------------------------------------------------------------------------------
/magento-1/bin/color_code.php:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env php
2 | 1 && count($gt) != count($lt))
52 | {
53 | return 'PHP';
54 | }
55 |
56 | if(count($brackets) > 1)
57 | {
58 | return 'PHP';
59 | }
60 |
61 | if(count($gt) == count($lt) && count($lt) > 1)
62 | {
63 | return 'XML';
64 | }
65 |
66 | return 'Unknown';
67 | }
68 |
69 | function nf_format_php($code)
70 | {
71 | $code = trim(htmlspecialchars_decode($code));
72 | $added = false;
73 | if(strpos($code,''
82 | . "\n"
83 | . '<?php
',
84 | '',
85 | $code);
86 | }
87 |
88 | $code = str_replace('->','‑>',$code);
89 |
90 | return $code;
91 | }
92 |
93 | function nf_format_navigation($code)
94 | {
95 | return "
";
96 | }
97 |
98 | function nf_format_xml($code)
99 | {
100 | // $code = trim(htmlspecialchars_decode($code));
101 | // $xp = new XsltProcessor();
102 | // $xsl = new DomDocument;
103 | // $xsl->load('bin/xmlverbatim.xsl');
104 | // $xp->importStyleSheet($xsl);
105 | //
106 | // $xml= new DomDocument;
107 | // $xml->loadXml('$code
";
111 | }
112 |
113 | function nf_format_unknown($code)
114 | {
115 | return "$code
";
116 | }
117 |
118 |
119 | function format_code($code)
120 | {
121 | $type = code_type($code[1]);
122 | $callback = strtolower('nf_format_'.$type);
123 | return $callback($code[1]);
124 | }
125 |
126 | function main($argv)
127 | {
128 | $book = file_get_contents($argv[1]);
129 | $book = preg_replace_callback('{$code
}six',
130 | 'format_code',
131 | $book);
132 |
133 | file_put_contents($argv[1], $book);
134 | }
135 | main($argv);
--------------------------------------------------------------------------------
/magento-1/bin/combine_html_chapters.php:
--------------------------------------------------------------------------------
1 | Prepared for Lucas Radaelli. Contents Copyright 2011 Pulse Storm LLC';
12 | }
13 |
14 | file_put_contents('build/all.html',$html);
15 | symlink('../images','build/images');
16 | }
17 | main($argv);
--------------------------------------------------------------------------------
/magento-1/bin/editing-regex.txt:
--------------------------------------------------------------------------------
1 | Checking for a possible miscapitolized Block
2 |
3 | ack '[^a-zA-Z_/]Block' *.markdown
4 |
5 | Lowercased HTML in prose
6 |
7 | ack '[^a-zA-Z_/$.]html' *.markdown
8 |
9 | test list instead of text list
10 |
11 | ack -i 'test[ _]list' *.markdown
12 |
13 | Word "out" in a sentance. Won't catch the first sentance of a paragrapth
14 |
15 | [\.\!\?].+?\bout\b.*?[\.\!\?]
16 |
17 | Out Examples
18 |
19 | ack -i '\bout example'
20 |
21 | No plurel
22 |
23 | ack 'name which' *.markdown
24 |
25 | Checking for a possible miscapitolized Helper
26 |
27 | ack '[^a-zA-Z_/]Helper' *.markdown
28 |
29 | Checking for bad plural
30 |
31 | ack -i 'it add the' *.markdownAlan
32 |
33 | Checking for a possible miscapitolized Helper
34 | ack '[^a-zA-Z_/]Model' *.markdown
35 |
--------------------------------------------------------------------------------
/magento-1/bin/files.php:
--------------------------------------------------------------------------------
1 | }m','(.+?)
By Alana Storm
48 |}six', 20 | '
',$shell);
23 | file_put_contents($argv[1],$book);
24 | }
25 | main($argv);
--------------------------------------------------------------------------------
/magento-1/c_appendix_creating_modules.markdown:
--------------------------------------------------------------------------------
1 | Creating Code Modules
2 | ==================================================
3 | The word **module** has come to be one of the most abused in software development. 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.
4 |
5 | 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.
6 |
7 | If you look in
8 |
9 | app/code/core/Mage
10 |
11 | you'll see around 50 - 60 different folders. Each of these is a single module. A module may contain controllers, models, helpers, blocks, SQL Install files, extra configuration files for changing Magento system behavior, new classes for Extending the SOAP and RPC APIs, the list goes on and on. Rather than have a single folder with, say, 200 controller files, Magento uses code modules to organize them by functionality.
12 |
13 | When you want to add code to Magento, either to change existing functionality or add new functionality, you'll also add a new module. However, your module will go in
14 |
15 | app/code/local/*
16 |
17 | instead of app/code/core
. This is part of Magento's Code Pool feature, which is separate from the module feature. The local
code pool is where you're can put your own code, such that it won't be overridden by Magento's system updates. Magento also has a
18 |
19 | app/code/community/*
20 |
21 | code pool, which is meant for installation of modules from third-parties.
22 |
23 | Adding a Module
24 | --------------------------------------------------
25 | The first step to creating a module is picking a *Package Name* or *Namespace*. If Bill Gates was making a Magento module, he might pick the name *Microsoft*. Once you've selected your name, create a folder in local
26 |
27 | mkdir app/code/local/Packagename
28 |
29 | 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.
30 |
31 | 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.
32 |
33 | When you've picked a name, create a folder inside your package name folder
34 |
35 | mkdir app/code/local/Packagename/Modulename
36 |
37 | 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
38 |
39 | mkdir app/code/local/Packagename/Modulename/etc
40 |
41 | and then create the following file
42 |
43 |
44 | <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
53 |
54 | class Packagename_Modulename_IndexController {}
55 | class Packagename_Modulename_Block_Myblock {}
56 |
57 | Enabling your Module
58 | --------------------------------------------------
59 | There's one last step you'll need to take if you want to let Magento know about your module. If you browse to
60 |
61 | app/etc/modules/
62 |
63 | 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 particular module. Create an XML file using the unique Packagename_Modulename string with the following contents.
64 |
65 |
66 |
67 | <Packagename_Modulename/>
node should use the unique string that identifies your own module. The <active>true</active>
node determines if Magento 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
77 |
78 | app/code/core
79 | app/code/community
80 | app/code/local
81 |
82 | With all of the above in place, clear your cache and load up the Admin Console. Head over to
83 |
84 | System -> Configuration -> Advanced -> Disable Module's Output
85 |
86 | 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!
87 |
88 | Next Steps
89 | --------------------------------------------------
90 | Of course, a module is useless without additional code. Going into everything you can do with a module would be a book in and of itself. However, the general pattern is, before you can add a type of class to your module (model, helper, etc.) you need to add some code to your config.xml
. This lets the system know that "hey, this module has feature X and use these classes". This is what makes Magento a **configuration** based MVC system, rather than a convention based one.
91 |
92 | *Visit http://www.pulsestorm.net/nofrills-layout-appendix-c to join the discussion online.*
--------------------------------------------------------------------------------
/magento-1/code/1.4.2/No_Frills_Magento_Layout_1_end-1.0.0.tgz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/astorm/magento-layout-no-frills/73ca6d82cd020929c5c0a1baae0fad5c821d56e2/magento-1/code/1.4.2/No_Frills_Magento_Layout_1_end-1.0.0.tgz
--------------------------------------------------------------------------------
/magento-1/code/1.4.2/No_Frills_Magento_Layout_1_start-1.0.0.tgz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/astorm/magento-layout-no-frills/73ca6d82cd020929c5c0a1baae0fad5c821d56e2/magento-1/code/1.4.2/No_Frills_Magento_Layout_1_start-1.0.0.tgz
--------------------------------------------------------------------------------
/magento-1/code/1.4.2/No_Frills_Magento_Layout_2_end-1.0.0.tgz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/astorm/magento-layout-no-frills/73ca6d82cd020929c5c0a1baae0fad5c821d56e2/magento-1/code/1.4.2/No_Frills_Magento_Layout_2_end-1.0.0.tgz
--------------------------------------------------------------------------------
/magento-1/code/1.4.2/No_Frills_Magento_Layout_2_start-1.0.0.tgz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/astorm/magento-layout-no-frills/73ca6d82cd020929c5c0a1baae0fad5c821d56e2/magento-1/code/1.4.2/No_Frills_Magento_Layout_2_start-1.0.0.tgz
--------------------------------------------------------------------------------
/magento-1/code/1.4.2/No_Frills_Magento_Layout_3_end-1.0.0.tgz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/astorm/magento-layout-no-frills/73ca6d82cd020929c5c0a1baae0fad5c821d56e2/magento-1/code/1.4.2/No_Frills_Magento_Layout_3_end-1.0.0.tgz
--------------------------------------------------------------------------------
/magento-1/code/1.4.2/No_Frills_Magento_Layout_3_start-1.0.0.tgz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/astorm/magento-layout-no-frills/73ca6d82cd020929c5c0a1baae0fad5c821d56e2/magento-1/code/1.4.2/No_Frills_Magento_Layout_3_start-1.0.0.tgz
--------------------------------------------------------------------------------
/magento-1/code/1.4.2/No_Frills_Magento_Layout_5_end-1.0.0.tgz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/astorm/magento-layout-no-frills/73ca6d82cd020929c5c0a1baae0fad5c821d56e2/magento-1/code/1.4.2/No_Frills_Magento_Layout_5_end-1.0.0.tgz
--------------------------------------------------------------------------------
/magento-1/code/1.4.2/No_Frills_Magento_Layout_5_start-1.0.0.tgz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/astorm/magento-layout-no-frills/73ca6d82cd020929c5c0a1baae0fad5c821d56e2/magento-1/code/1.4.2/No_Frills_Magento_Layout_5_start-1.0.0.tgz
--------------------------------------------------------------------------------
/magento-1/code/1.4.2/No_Frills_Magento_Layout_7_end-1.0.0.tgz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/astorm/magento-layout-no-frills/73ca6d82cd020929c5c0a1baae0fad5c821d56e2/magento-1/code/1.4.2/No_Frills_Magento_Layout_7_end-1.0.0.tgz
--------------------------------------------------------------------------------
/magento-1/code/1.4.2/No_Frills_Magento_Layout_7_start-1.0.0.tgz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/astorm/magento-layout-no-frills/73ca6d82cd020929c5c0a1baae0fad5c821d56e2/magento-1/code/1.4.2/No_Frills_Magento_Layout_7_start-1.0.0.tgz
--------------------------------------------------------------------------------
/magento-1/code/1.5 or higher/No_Frills_Magento_Layout_1_end-1.0.0.tgz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/astorm/magento-layout-no-frills/73ca6d82cd020929c5c0a1baae0fad5c821d56e2/magento-1/code/1.5 or higher/No_Frills_Magento_Layout_1_end-1.0.0.tgz
--------------------------------------------------------------------------------
/magento-1/code/1.5 or higher/No_Frills_Magento_Layout_1_start-1.0.0.tgz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/astorm/magento-layout-no-frills/73ca6d82cd020929c5c0a1baae0fad5c821d56e2/magento-1/code/1.5 or higher/No_Frills_Magento_Layout_1_start-1.0.0.tgz
--------------------------------------------------------------------------------
/magento-1/code/1.5 or higher/No_Frills_Magento_Layout_2_end-1.0.0.tgz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/astorm/magento-layout-no-frills/73ca6d82cd020929c5c0a1baae0fad5c821d56e2/magento-1/code/1.5 or higher/No_Frills_Magento_Layout_2_end-1.0.0.tgz
--------------------------------------------------------------------------------
/magento-1/code/1.5 or higher/No_Frills_Magento_Layout_2_start-1.0.0.tgz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/astorm/magento-layout-no-frills/73ca6d82cd020929c5c0a1baae0fad5c821d56e2/magento-1/code/1.5 or higher/No_Frills_Magento_Layout_2_start-1.0.0.tgz
--------------------------------------------------------------------------------
/magento-1/code/1.5 or higher/No_Frills_Magento_Layout_3_end-1.0.0.tgz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/astorm/magento-layout-no-frills/73ca6d82cd020929c5c0a1baae0fad5c821d56e2/magento-1/code/1.5 or higher/No_Frills_Magento_Layout_3_end-1.0.0.tgz
--------------------------------------------------------------------------------
/magento-1/code/1.5 or higher/No_Frills_Magento_Layout_3_start-1.0.0.tgz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/astorm/magento-layout-no-frills/73ca6d82cd020929c5c0a1baae0fad5c821d56e2/magento-1/code/1.5 or higher/No_Frills_Magento_Layout_3_start-1.0.0.tgz
--------------------------------------------------------------------------------
/magento-1/code/1.5 or higher/No_Frills_Magento_Layout_5_end-1.0.0.tgz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/astorm/magento-layout-no-frills/73ca6d82cd020929c5c0a1baae0fad5c821d56e2/magento-1/code/1.5 or higher/No_Frills_Magento_Layout_5_end-1.0.0.tgz
--------------------------------------------------------------------------------
/magento-1/code/1.5 or higher/No_Frills_Magento_Layout_5_start-1.0.0.tgz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/astorm/magento-layout-no-frills/73ca6d82cd020929c5c0a1baae0fad5c821d56e2/magento-1/code/1.5 or higher/No_Frills_Magento_Layout_5_start-1.0.0.tgz
--------------------------------------------------------------------------------
/magento-1/code/1.5 or higher/No_Frills_Magento_Layout_7_end-1.0.0.tgz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/astorm/magento-layout-no-frills/73ca6d82cd020929c5c0a1baae0fad5c821d56e2/magento-1/code/1.5 or higher/No_Frills_Magento_Layout_7_end-1.0.0.tgz
--------------------------------------------------------------------------------
/magento-1/code/1.5 or higher/No_Frills_Magento_Layout_7_start-1.0.0.tgz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/astorm/magento-layout-no-frills/73ca6d82cd020929c5c0a1baae0fad5c821d56e2/magento-1/code/1.5 or higher/No_Frills_Magento_Layout_7_start-1.0.0.tgz
--------------------------------------------------------------------------------
/magento-1/cover.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 5 |
6 | 40 | 41 |
51 |