PHPSpec for Magento

Overview

MageSpec

Build Status Scrutinizer Code Quality Latest Stable Version Packagist Downloads License

Installation

Install using composer

First, add MageSpec to the list of dependencies inside your composer.json and be sure to register few paths for autoloading:

{
    "require-dev": {
        "magetest/magento-phpspec-extension": "^5.0"
    },
    "config": {
        "bin-dir": "bin"
    },
    "autoload": {
        "psr-0": {
            "": [
                "public/app",
                "public/app/code/local",
                "public/app/code/community",
                "public/app/code/core",
                "public/lib"
            ]
        }
    }
}

Then simply install it with composer:

$ composer install

You can read more about Composer on its official webpage.

SpecBDD and TDD

There isn’t any real difference between SpecBDD and TDD. The value of using a xSpec tool instead a regular xUnit tool for TDD is language. The concepts and features of the tool will keep your focus on the “right” things. The focus on verification and structure as opposed to behaviour and design is, of course, a valid one. We happen to find that the latter is more valuable on the long run. It was also the intention of early users of TDD.

SpecBDD and StoryBDD

While with StoryBDD tools like Behat are used to understand and clarify the domain - specifying feature narratives, its need, and what do we mean by them - with SpecBDD we are only focused on the how: the implementation. You are specifying how your classes will achieve those features.

A good StoryBDD tool will let the business talk the domain language and drive the development by putting the focus on what really matters first.

Once you know why you are adding a feature and what it will be, it’s almost time to write code. But not yet! Adding code without a way to validate that it serves the specs just means you will have to go back and rework it, so that it does match the spec. And the later you find out you missed the requirement or added a bug, the harder and more expensive it is to fix. Kent Beck also adds that describing the code before you actually write it is a fear management technique. You don’t have to write all the code, just the spec of the next thing you want to work on. That executable spec will then guide you to what code you need to write. Once you do that, then what you have is a chance to refactor. Because if you change the behaviour of your code the specs will go red. So you spec so that you can refactor, or allow the design of your code to emerge in a sustainable way. SpecBDD tools are designed to guide you in the process, or at least not stand on the way.

It’s valid to assume that StoryBDD and SpecBDD used together are a very effective way to achieve highly customer-focused software.

Basic usage

MageSpec has been developed as PhpSpec extension which means that it depends on it and that we need to tell PhpSpec to load the extension for us. In order to do that we have to create a file in our project root called phpspec.yml and add the following content to it:

extensions:
    MageTest\PhpSpec\MagentoExtension\Extension: ~

However that's not enough. Due to the unusual and non-standard convention used by Magento to store controllers, models, helper and so on, MageSpec implement a custom PhpSpec locator service. Such a locator has to be properly configured accordingly to our project setup which means we need also to add some 'mage_locator' configuration as following:

extensions:
    MageTest\PhpSpec\MagentoExtension\Extension:
        mage_locator:
            src_path: public/app/code
            spec_path: spec/public/app/code

Currently the mage_locator supports five options:

  • namespace (default ''): The base namespace for our source code
  • spec_prefix (default 'spec'): The namespace prefix which will be used to namespace your specs based on your source code namespace
  • src_path (default 'src'): The relative path of your source code
  • spec_path (default '.'): The relative path of your specs
  • code_pool (default 'local'): Specifies the Magento code pool for creating the extension files. Options are 'local' and 'community'

Describing a model

Say we are building a module that tells us if a product has existing reviews. We will work on simple things first and a design will emerge that will reach all the necessary features. Even though I have all the specs from the customer (we have done all our Behat feature files nicely), I know I will discover new things I will need, as soon as I sit down to write my classes.

What is the simplest thing I want to add? It should tell me if a product as a review.

So let’s do this. Well, not the boring bits. Let MageSpec take care of the boring stuff for us. We just need to tell MageSpec we will be working on the Review module's product class. So running the following command:

$ bin/phpspec describe:model 'magespec_reviews/product'

Should give us the following output

Specification for MageSpec_Reviews_Model_Product created in [...]/spec/public/app/code/local/MageSpec/Reviews/Model/ProductSpec.php

Ok. What have we just done? MageSpec has created the spec for us following the standard Magento convention. You can navigate to the spec folder and see the spec there:

<?php

namespace spec;

use PhpSpec\ObjectBehavior;
use Prophecy\Argument;

class MageSpec_Reviews_Model_ProductSpec extends ObjectBehavior
{
    function it_is_initializable()
    {
        $this->shouldHaveType('MageSpec_Reviews_Model_Product');
    }
}

That’s awesome! MageSpec created the spec for me.

But first, let’s see what we have here. Our spec extends the special ObjectBehavior class. This class is special, because it gives you ability to call all the methods of the class you are describing and match the result of the operations against your expectations.

Examples

The object behavior is made of examples. Examples are encased in public methods, started with it_. or its_. phpspec searches for such methods in your specification to run. Why underscores for example names? just_because_its_much_easier_to_read than someLongCamelCasingLikeThat.

Matchers

Matchers are much like assertions in xUnit, except the fact that matchers concentrate on telling how the object should behave instead of verifying how it works. It just expresses better the focus on behaviour and fits better in the test-first cycle. There are 5 matchers in phpspec currently, but almost each one of them has aliases to make your examples read more fluid:

  • Identity (return, be, equal, beEqualTo) - it’s like checking ===
  • Comparison (beLike) - it’s like checking ==
  • Throw (throw -> during) - for testing exceptions
  • Type (beAnInstanceOf, returnAnInstanceOf, haveType) - checks object type
  • ObjectState (have**) - checks object is** method return value

How do you use those? You’re just prefixing them with should or shouldNot depending on what you expect and call them on subject of interest.

Now we are ready to move on. Let’s update that first example to express my next intention:

<?php

namespace spec;

use PhpSpec\ObjectBehavior;
use Prophecy\Argument;

class MageSpec_Reviews_Model_ProductSpec extends ObjectBehavior
{
    // ...

    function it_tells_if_a_product_has_reviews()
    {
        $this->load('SKU');
        $this->hasReviews()->shouldReturn(true);
    }

    // ...
}

Now what? We run the specs. You may not believe this, but MageSpec will understand we are describing a class that doesn’t exist and offer to create it!

$ bin/phpspec

MageSpec_Reviews_Model_Product
  10  ! it is initializable
      class MageSpec_Reviews_Model_Product does not exists.

-----------------------100%----------------------- 1

1 example (1 broken)
11ms

Do you want me to create `MageSpec_Reviews_Model_Product` for you? [Y/n]
Model MageSpec_Reviews_Model_Product created in [...]/public/app/code/local/MageSpec/Reviews/Model/Product.php.

MageSpec has now placed the empty class in the directory.

<?php

class MageSpec_Reviews_Model_Product extends Mage_Core_Model_Abstract
{

}

You run your spec again and... OK, you guessed:

$ bin/phpspec
MageSpec_Reviews_Model_Product
  15  ! it tells if a product has reviews
      method MageSpec_Reviews_Model_Product::load() not found.

-----------------------97%----------------------- 2

2 examples (1 passed, 1 broken)
12ms


Do you want me to create `MageSpec_Reviews_Model_Product::load()` for you? [Y/n]
Method MageSpec_Reviews_Model_Product::load() has been created.

And again...

$ bin/phpspec
MageSpec_Reviews_Model_Product
  15  ! it tells if a product has reviews
      method MageSpec_Reviews_Model_Product::hasReviews() not found.

-----------------------97%----------------------- 2

@ examples (1 passed, 1 broken)
12ms


Do you want me to create `MageSpec_Reviews_Model_Product::hasReviews()` for you? [Y/n]
Method MageSpec_Reviews_Model_Product::hasReviews() has been created

What we just did was moving fast through the amber state into the red. If you check your class you should now see something like this:

<?php

class MageSpec_Reviews_Model_Product extends Mage_Core_Model_Abstract
{
    public function load($argument1)
    {
        // TODO: write logic here
    }

    public function hasReviews()
    {
        // TODO: write logic here
    }
}

We got rid of the fatal errors and ugly messages that resulted from nonnexistent classes and methods and went straight into a real failed spec:

$ bin/phpspec
MageSpec_Reviews_Model_Product
  15  ✘ it tells if a product has reviews
      expected true, but got null.

-----------------------97%----------------------- 2

2 examples (1 passed, 1 failed)
11ms

According to the TDD rules we now have full permission to write code. Red means “time to add code”; red is great! Now we add just enough code to make the spec green, quickly. There will be time to get it right, but first just get it green.

<?php

class MageSpec_Reviews_Model_Product
{

    public function load($argument1)
    {
        // TODO: write logic here
    }

    public function hasReviews()
    {
        return true;
    }
}

And voilà:

$ bin/phpspec
----------------------100%----------------------- 2

2 example (2 passed)
11ms

If you are interested in know more about spec in PHP you better have a look to the official PhpSpec page or, if you are more in general interested in the whole TDD/SpecBDD cycle there are heaps of resources out there already. Here are just a couple for you look at:

Additional supported commands

As per today, MageSpec currently allows you to describe different Magento classes. Following you can find a brief list.

Describing a block

$ bin/phpspec describe:block 'vendorname_modulename/blockname'

Describing a helper

$ bin/phpspec describe:helper 'vendorname_modulename/helpername'

Describing a controller

$ bin/phpspec describe:controller 'vendorname_modulename/helpername'

Issue Submission

Make sure you've read the issue submission guidelines before you open a new issue.

Contribute

See the contributing docs

License and Authors

Authors: https://github.com/MageTest/MageSpec/contributors

Copyright (C) 2012-2013

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Comments
  • Auto create new method in Block class not working

    Auto create new method in Block class not working

    When i specify a new method in my specification,

    function it_prompts_me_to_create_new_method()
    {
        $this->foo()->shouldReturn(true);
    }
    

    and then run phpspec I should be prompted to create this method stub, right? Anyhow, this isn´t happening. Instead phpspec throws me a Varien_Exception like so: skarmbild_2014-08-29_13_42

    This is only happening with the Blocks. All the other types, controllers, models, helpers, resource models are working.

    • I am on OSX 10.8.4
    • Latest composer build
    • Magento CE 1.9.0.1

    Thanks

    opened by dwickstrom 10
  • Merged feature/code-pool-selection

    Merged feature/code-pool-selection

    Adds functionality for supporting the community code pool, this can be controller by adding a new codepool parameter to the phpspec.yml like so:

    extensions: [MageTest\PhpSpec\MagentoExtension\Extension]
    mage_locator:
      spec_prefix: 'spec'
      src_path: 'public/app/code'
      spec_path: 'spec/public/app/code'
      code_pool: 'community'
    

    Code generation and autoloading are working properly. Any instances of the hardcoded local codepool have been replaced with the matching variables and all the generators and locators have been updated.

    I'm open to discuss the changes if there are any questions.

    opened by amacgregor 9
  • PHPSpec 3 support

    PHPSpec 3 support

    Hi guys,

    I was wondering what the state of play is w.r.t. PHPSpec 3 support? Is this working now, or is there anything left to be done that I could help with?

    Thanks,

    Sam

    opened by Sam-Burns 8
  • Redeclared class error

    Redeclared class error

    I followed the basic usage part in the README. It was nice and clear until i run "bin/phpspec run". It showed this error:

    PHP Fatal error: Cannot redeclare class spec\Magespec_Reviews_Model_ProductSpec in /var/ww w/Spec\htdocs\app\code\local\Magespec\Reviews\Model\ProductSpec.php on line 14

    I'm using the version 2.0.0. Error still exists when I changed the version to "dev-develop".

    Please help.

    opened by vernard 7
  • Update phpspec to RC4

    Update phpspec to RC4

    The version of phpspec being used is 9 months old, and contains several bugs that have since been fixed. This PR updates it to the most recent release, 2.0-RC4.

    opened by shanethehat 6
  • Command

    Command "describe:resource_model" is not defined.

    Hello,

    I got this error when I do describe:resource_model 'magespec_reviews/product'

    [Symfony\Component\Console\Exception\CommandNotFoundException] Command "describe:resource_model" is not defined. Did you mean one of these? describe:controller describe:helper describe:block describe:model describe

    I initially wanted to follow your example, but instead of proposing me to create the load method, I encountered this error:

    Mage_Core_Exception("Resource is not set.")

    In case here is my composer.json: { "repositories": [ { "type":"composer", "url":"https://packages.firegento.com" } ], "minimum-stability": "dev", "require": { "magento-hackathon/magento-composer-installer": "3.0.*", "aydin-hassan/magento-core-composer-installer": "~1.2", "firegento/magento": "1.9.2.0", "colinmollenhour/modman": "@stable", "magetest/magento-phpspec-extension": "~3.0" }, "require-dev": { "magento-hackathon/composer-command-integrator": "*", "phpspec/phpspec": "~2.0" }, "config": { "bin-dir": "html/bin", "autoload": {"psr-0": {"": "html"}}, "secure-http": false }, "extra": { "magento-root-dir": "html/", "magento-deploystrategy": "link", "magento-force": 1 }, "autoload": { "psr-0": { "": [ "html/app", "html/app/code/local", "html/app/code/community", "html/app/code/core", "html/lib" ] } } }

    Am I not getting the right version of MageSpec?

    Thanks,

    Matias

    opened by matiaso 4
  • Can't set specification code pool to be community

    Can't set specification code pool to be community

    I noticed that DescribeModelCommand has a flag that allows you to choose whether you want to use the local or the community code pool. Unfortunately, the functionality for that flag doesn't appear to have been implemented. When you run bin/phpspec describe:model --community 'test_test/test', it still creates the specification in local.

    Ideally the flag should be available -- and working -- for each command, e.g. helper, resource, etc, What do you guys think?

    opened by thaiphan 4
  • PHP Fatal error:  Can't inherit abstract function PhpSpec\Locator\ResourceLocatorInterface::getPriority()

    PHP Fatal error: Can't inherit abstract function PhpSpec\Locator\ResourceLocatorInterface::getPriority()

    I get the following error when I run specs:

    PHP Fatal error: Can't inherit abstract function PhpSpec\Locator\ResourceLocatorInterface::getPriority() (previously declared abstract in MageTest\PhpSpec\MagentoExtension\Locator\Magento\AbstractResourceLocator) in /vagrant/vendor/inviqa/worldpay-module/vendor/magetest/magento-phpspec-extension/src/MageTest/PhpSpec/MagentoExtension/Locator/Magento/ModelLocator.php on line 37

    Environment:

    • Php version 5.3.3
    • PhpSpec version 2.3.0
    • OS: CentOS release 6.7

    If I remove the abstract method declaration, it works. See https://github.com/MageTest/MageSpec/blob/develop/src/MageTest/PhpSpec/MagentoExtension/Locator/Magento/AbstractResourceLocator.php#L216-L219

    opened by elvetemedve 3
  • Remove resource models

    Remove resource models

    Removed resource models for 2 reasons:

    • Creating spec for resource models and invoking _invoke throws errors
    • Is there value in creating a spec for resource model ? Are we just creating helpers now ?
    opened by jamescowie 3
  • Modman workflow support

    Modman workflow support

    Hello people,

    How about modman support? I´ve try to hack around with setting some different paths in the config, but it doesn´t seem to be doable currently.

    This is the structure I´d like to work with:

    .modman/Namespace_Name/app/.. spec/Namespace_Name/app/.. src/app/..

    What do you think?

    opened by dwickstrom 3
  • Describing non-magento objects fails

    Describing non-magento objects fails

    When trying to describe non Magento objects in a Magespec enabled project using namespaces and class names that do not contain underscores, the Magespec locators fall over due to undefined index errors.

    bug 
    opened by shanethehat 3
  • Add further integration tests for phpspec config files

    Add further integration tests for phpspec config files

    All the feature files use Given Magespec has a standard configuration. It would be good to add further tests to include non-standard configuration such as using a formatter, bootstrapping a file and possibly different spec and src locations

    enhancement 
    opened by maxbaldanza 0
  • Refactor `LocatorAssembler` so that it doesn't use phpspec internal method

    Refactor `LocatorAssembler` so that it doesn't use phpspec internal method

    LocatorAssember uses addConfigurator which is marked as internal only: https://github.com/phpspec/phpspec/blob/fe554bfeb5cfe7f5c54fee10cd07ba6dfe733b45/src/PhpSpec/ServiceContainer/IndexedServiceContainer.php#L191

    Refactor to remove this usage.

    enhancement 
    opened by maxbaldanza 0
  • Support for Magento static functions?

    Support for Magento static functions?

    I know, I know, we try really hard to push the whole "static functions are bad, mmmkay" message. Bear with me though, because either there's some work to do or I need some help coming back to sanity.

    So lately I've been trying to decide what this extension is for exactly. When I started using it, it was an opinionated tool that was moving towards the idea of Magento modules been decoupled from the framework. If a module was decoupled and supported some bastardised form of DI then we could test code in isolation, and that sounded great. Sure, there were still some bumps in the road that lead to some very curious behaviour when Varien's magic conflicted with phpspec's magic, but generally we could drive our module writing with specs and all was well.

    More recently though I've been getting on board with the idea that it's business logic that should not be framework specific. Objects that represent the domain of the business, and therefore the core value of a project, should be libraries of pure language, with interfaces provided wherever an edge exists. This allows for an ease of transition between entire frameworks, but leaves Magento modules as rather thin wrappers between the framework and generic library code. Generally there is no need for a tool to drive the design of thin framework wrappers, that can be safely covered by integration tests. So what is MageSpec for?

    Pragmatism

    Sometimes, for whatever reason, separating code out into an external library just isn't worth the effort. Maybe there is very little chance the code will be reused. Maybe there needs to be some framework specific logic that would be just too absurd to decouple.

    Utility

    Generating XML is the example that comes foremost in my mind. Nasty repetitive tasks that can be easily automated.

    Gateway drug

    A lot of developers who have learned their craft with Magento are not familiar with TDD or SpecBDD or whatever we're calling it these days. They often see MageSpec as a drop in replacement for PHPUnt, and become confused when their tests blow up because of framework coupling.

    Add support for static functions

    I'm hoping that this overly long issue will generate some feedback on the idea that I'm toying with, namely that MageSpec could support Magento's static functionality in some way. I'm not really thinking of implementation details yet, but I'm thinking about stuff like:

    • Magento class loading methods return doubles
    • Custom matchers for other static interactions like loading config or logging
    • Doubles of Magento objects support all the magical behaviour of Varien objects without the framework bootstrapping
    • All of the above enabled/disabled by a 'strict mode' config option

    What do you all think?

    question 
    opened by shanethehat 1
  • MageSpec not load Mage::* class

    MageSpec not load Mage::* class

    Look for my environment:

    Suppose that I have this model: Company/ModuleName/Model/Gateway:

    class Company_ModuleName_Model_Gateway {
        public function getBaseUrl() {
            if (Mage::getStoreConfig("payment_services/payment/environment") == 'homolog'){
                $url = 'http://homolog.example.com/sendRequest.aspx';
            } else {
                $url = 'http://example.com/sendRequest.aspx';
            }
    
            return $url;
        }
    }
    

    And this spec Company_ModuleName_Model_GatewaySpec:

    class Company_ModuleName_Model_GatewaySpec {
        function it_should_be_return_the_base_url()
        {
            $this->getBaseUrl()->shouldBeLike('http://homolog.example.com/sendRequest.aspx');
        }
    }
    

    But when run $ bin/phpspec run, I receive this error: PHP Fatal error: Class 'Mage' not found in /home/joridos/Documents/projects/magento/magento-test/.modman/magento-clearsale/app/code/community/Cammino/Clearsale/Model/Gateway.php on line 151

    This is because this call: Mage::getStoreConfig("payment_services/payment/environment").

    How I solve this?

    question 
    opened by jonatanrdsantos 3
  • Unused matchers

    Unused matchers

    There are a number of matcher objects in Magespec that do not appear to be used anywhere.

    The following matchers are currently defined:

    • BeInArea
    • BeOfType
    • Contain
    • DispatchEvent
    • HaveHeader
    • HaveName
    • HaveStatus
    • MatcherCollection
    • RenderLayoutHandle
    • RenderTemplate
    • RespondWith
    • Translate

    Of these, only BeInArea has any contents. It appears to be trying to use an underlying Mage object to determine which site area a controller exists in. Since we do not currently support an underlying Mage object, this seems like it requires a decision on how integrated Magespec should be.

    For all the empty matchers, we need to decide whether they should be implemented or not. Some of them will not be at all practical in a non-integrated tool.

    enhancement question 
    opened by shanethehat 0
Releases(5.0.0)
Owner
MageTest
MageTest
A tool that allows to quickly export data from Magento 1 and Magento 2 store and import it back into Magento 2

Simple Import / Export tool A tool that allows to quickly export data from Magento 1 and Magento 2 store and import it back into Magento 2. Table data

EcomDev B.V. 51 Dec 5, 2022
This Magento 2 extension integrates EasyTranslate into Magento 2.

EasyTranslate Magento 2 Connector This Magento 2 extension integrates EasyTranslate into Magento 2. Mind that you need to have an account with EasyTra

Easytranslate ApS 0 Oct 7, 2022
Magento-Functions - A Resource of Magento Functions

Magento-Functions A Resource of Magento Functions Table of Contents Category Product User Cart Checkout General Account [Working w/ URL's] (#urls) Cat

Bryan Littlefield 28 Apr 19, 2021
Magento - Magento Community Editions

Magento Community Edition /// THIS REPOSITORY IS DEPREACTED /// 1.9.4.1 will be the last version update. Please switch over to OpenMage! Either to the

FireGento e. V. 107 Oct 17, 2022
Magento-Vagrant-Puppet-Nginx - Installs magento and a nginx server

Magento-Vagrant-Puppet-Nginx Installs Magento MySQL PHP PHP-FPM Nginx n98-magerun Setup git submodule init git submodule update vagrant up Modify pupp

Christian Münch 61 Aug 10, 2022
Docker-magento - Docker image for Magento 1.6 to 1.9

Docker image for Magento 1.x This repo creates a Docker image for Magento 1.x. Please note The primary goal of this repo is to create Docker images fo

Fu Cheng 144 Nov 18, 2022
Magento-composer-installer - Composer installer for Magento modules

!!! support the maintainer of this project via Patreon: https://www.patreon.com/Flyingmana Magento Composer Installer The purpose of this project is t

null 213 Sep 24, 2022
Chef-magento - Installs and Configures a Magento project

Description Requirements Chef 0.10.0 or higher required (for Chef environment use). Platform Debian, Ubuntu CentOS, Red Hat, Fedora Your basebox must

Inviqa 3 Jun 30, 2020
Cookbook-magento - Collection of recipes to build app stack for the Magento deployments with Chef

Magento Cookbook Collection of recipes to build app stack for the Magento deployments with Chef Installation With Berkshelf echo "cookbook 'magento',

Yevhen Viktorov 37 Sep 26, 2020
Magento-bulk - Bulk Import/Export helper scripts and CLI utilities for Magento Commerce

Magento Bulk Bulk operations for Magento. Configuration Copy config.php.sample to config.php and edit it. Product Attribute Management List All Attrib

Bippo Indonesia 23 Dec 20, 2022
Phpcs-magento-rules - A set of PHPCS rules used by made.com when hacking Magento

Made.com PHPCS Magento Rules A set of PHPCS rules used by made.com when hacking Magento. Pre-Requisites PHPCS Installation Short Version Clone this re

Made.com Tech Team 26 Jun 3, 2020
This Magento extension provides a Real Full Page Caching for Magento powered by Varnish with support of Session-Based information caching (Cart, Customer Accounts, ...) via ESI includes

This Magento extension provides a Real Full Page Caching (FPC) for Magento powered by Varnish with support of Session-Based information caching (Cart, Customer Accounts, ...) via ESI includes

Hugues Alary 95 Feb 11, 2022
Automatically load the next page of products in Magento. Easy to install and configure, this module works 100% out of the box with vanilla Magento 1.9.x and earlier.

Automatically load the next page of products in Magento. Easy to install and configure, this module works 100% out of the box with vanilla Magento 1.9.x and earlier.

Strategery 123 Nov 20, 2021
Foundation 3 Framework for Magento 1.7. Foundation styles and libraries. Magento Responsive theme. Off-canvas Left-Right sidebar columns for mobile.

Magento Foundation 3 Framework Zurb Foundation 3 framework for Magento 1.7. Magento Foundation 3 Version 1.3.0. Demo page: http://magendation.internet

Nando Boronat 62 Apr 1, 2022
[ONLY Magento 2.0.x Compatible] Code samples for Magento developers

Synopsis This project is a collection of samples to demonstrate technologies introduced in Magento 2. You will find the most simple extension along wi

Magento 58 Dec 26, 2022
Magento 2 Blog Extension is a better blog extension for Magento 2 platform. These include all useful features of Wordpress CMS

Magento 2 Blog extension FREE Magento 2 Better Blog by Mageplaza is integrated right into the Magento backend so you can manage your blog and your e-c

Mageplaza 113 Dec 14, 2022