Developed with love by KnpLabs Hire us for your project!
88

LiipMagentoBundle

by liip

(BETA) Proof of concept for integrating Magento into Symfony2 applications

MagentoBundle

Integrate Magento into Symfony2 applications.

The Bundle is still a work in progress but the goal is to be able
to talk to Magento from inside Symfony. This means that Magento
app is initialized inside Symfony2, to share a single session,
enable reusing Magento login in Symfony2 and reading content and
layout from Magento.

Installation

  1. Add the following lines in your deps file:

    [LiipMagentoBundle]
        git=http://github.com/liip/LiipMagentoBundle.git
        target=/bundles/Liip/MagentoBundle
    
  2. Run the vendors script:

    $ php bin/vendors install
    
  3. Add the Liip namespace to your autoloader:

    // app/autoload.php
    $loader->registerNamespaces(array(
        'Liip' => __DIR__.'/../vendor/bundles',
        // your other namespaces
    ));
    
  4. Add the bundle to your application kernel:

    // app/AppKernel.php
    public function registerBundles()
    {
        return array(
            // ...
            new Liip\MagentoBundle\LiipMagentoBundle(),
            // ...
        );
    }
    
  5. Configure the bundle

    See Configuration

  6. Fix the Magento autoloader

    $ cd $MAGENTO_DIR
    $ patch -p0 < $SYMFONY_DIR/vendor/bundles/Liip/MagentoBundle/magento-autoloader.patch
    

Configuration

# app/config/config.yml
framework:
    session:
        # use the Magento session handler
        storage_id: liip_magento.session.storage

liip_magento:
    # path to the Mage.php file
    mage_file:  %kernel.root_dir%/../../magento/app/Mage.php
    # not for all store resolvers, mapping to store code
    store_mappings:
        de: de
        en: en
        fr: en
# app/config/security.yml
security:
    factories:
        - "%kernel.root_dir%/../vendor/bundles/Liip/MagentoBundle/Resources/config/security_factories.xml"

    providers:
        magento:
            id: security.user.provider.magento

    firewalls:
        secured_area:
            pattern:    ^/
            anonymous: ~
            magento:
                provider:   magento
                check_path: /login_check
                login_path: /login
            logout:
                path:   /logout
                target: /

Usage

Store Resolver

For accessing customer data we need the correct Magento store to be initialized. Magento loads
the default store which can be configured for the respective group. You can go to System > Manage Stores
then open the item which is in the «Store Name» row (which is actually the group) and select the
«Default Store View».

Store resolvers do figure out which Magento store to initialize. Whenever it can't determine a store
it keeps the default one. Also, if it fails setting the resolved store it goes back to the default store.

The default store resolver is LocaleStore which uses the symfony locale as store code. In case your
store codes do not match the locales you need to use the LocaleStoreResolver which allows you to
configure the mapping with store_mappings of the locale to the store code. This also helps if you need
multiple fallback stores depending on the locale.

For more customized resolvers you may also write your own by implementing StoreResolverInterface. In
that case the default resolver service can be overritten as follows:

# app/config/config.yml
liip_magento:
    service:
        store_resolver: my.store_resolver.id

Retrieving Data and HTML from Magento

In this demo we load the footer block and the number of items in the Magento cart

class MagentoController extends Controller
{
    /**
     * @Template()
     */
    public function indexAction()
    {
        $block = \Mage::getSingleton('core/layout');
        $footer = $block->createBlock('page/html_footer');
        $footer->setTemplate('page/html/footer.phtml');

        $cart = \Mage::helper('checkout/cart')->getCart()->getItemsCount();
        return array('cart' => $cart, 'footer' => $footer->toHTML());
    }
}

Template-snippet for the demo:

{% block content %}

    You have {{ cart }} items in your cart!

    {{ footer | raw}}
{% endblock %}  

Listening to Magento events

Using the Magento Symfony module you can listen to events dispatched by Magento
inside your Symfony application.

Here's an example to handle the customer_address_save_after event, e.g.
to synchronize your CRM backend with Magento customers:

Register your listener in Symfony

services:
    acme_demo_bundle.customer_save_after: 
        class: %acme_demo_bundle.customer_save_after.class%
        arguments: [ @some_service_id ]
        tags:
            - { name: kernel.event_listener, event: mage.customer_save_after, method: synchronize }

Dispatch the event in Magento:

<?xml version="1.0"?>
<config>
    <modules>
        <MyModule_Core>
            <version>0.1.0</version>
        </MyModule_Core>
    </modules> 
    <global>    
      <events>
          <customer_address_save_after>
              <observers>
                  <address_update>
                      <type>singleton</type>
                      <class>MyModule_Core_Customer_Synchronizer</class>
                      <method>synchronize</method>
                  </address_update>
              </observers>
          </customer_address_save_after>
      </events>
    </global>
</config>
<?php 
class MyModule_Core_Customer_Synchronizer
{

    public function synchronize(Varien_Event_Observer $observer) 
    {                
        $mageEvent = $observer->getEvent();
        $symfonyEvent = new MageEvent($mageEvent);        
        $container = Mage::getSingleton('Symfony_Core_DependencyInjection_Container');
        $container->get('event_dispatcher')->dispatch('mage.customer_save_after', $symfonyEvent)        

    }
}

More configuration examples

Example 1 - Run magento on a subdomain

  • Create 2 virtual hosts, one for Symfony and one for Magento, e.g. mysite.local and shop.mysite.local:
Apache example:

<VirtualHost *:80>
    DocumentRoot "/var/www/mysite/symfony/web"

    ServerName mysite.local

    <Directory "/var/www/mysite/symfony/web">
        AllowOverride All
    </Directory>

</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/var/www/mysite/magento"

    ServerName shop.mysite.local

    <Directory "/var/www/mysite/magento">
        AllowOverride All
    </Directory>

</VirtualHost>
  • Setup Magento (e.g. in ../project/magento), and configure the cookie path to / and the cookie domain to .local
  • Setup Symfony (e.g. in ../project/symfony) and the LiipMagentoBundle
  • Add the login and login_check routes and setup the login form, see the Symfony docs

After that, you should have synced sessions between mysite.local and shop.mysite.local
meaning that logging in/out on either side will login/logout the user on the opposite side.

Example 2 - Run magento as an alias (e.g. mysite.com/shop)

  • Create 1 virtual hosts and add an alias for Magento :
Apache example: 

<VirtualHost *:80>
    DocumentRoot "/var/www/mysite/symfony/web"

    ServerName mysite.local

    Alias /shop /var/www/mysite/magento

    <Directory "/var/www/mysite/symfony/web">
        AllowOverride All
    </Directory>

    <Directory "/var/www/mysite/magento">
        AllowOverride All
    </Directory>
</VirtualHost>

  • Setup Magento (e.g. in ../project/magento), and configure the cookie path to / and the cookie domain to .local
  • Setup Symfony (e.g. in ../project/symfony) and the LiipMagentoBundle
  • Add the login and login_check routes and setup the login form see the Symfony docs

After that, you should have synced sessions between mysite.local and mysite.local/shop
meaning that logging in/out on either side will login/logout the user on the opposite side.

Copyright (c) 2010-2011 Liip

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.
  • Merge pull request #15 from hifi7/patch-1
    By fabian, 4 years ago
  • Fix __construct error:
    By hacfi, 4 years ago
  • Added composer.json
    By fabian, 4 years ago
  • Not needed, will be overridden by Security Factory
    By fabian, 4 years ago
  • Fixing Symfony Securiy
    By fabian, 4 years ago
  • Merge pull request #12 from pulse00/tests
    By lsmith77, 5 years ago
  • Merge pull request #13 from pulse00/master
    By fabian, 5 years ago
  • fixes store_resolver override
    By pulse00, 5 years ago
  • Merge pull request #11 from pulse00/master
    By fabian, 5 years ago
  • added base testcase class
    By pulse00, 5 years ago
  • added event example to Readme
    By pulse00, 5 years ago
  • fixed code-style
    By pulse00, 5 years ago
  • added MageEvent
    By pulse00, 5 years ago
  • Merge branch 'user'
    By pulse00, 5 years ago
  • added MagentoUserInterface
    By fabian, 5 years ago
  • Merge pull request #10 from pulse00/master
    By fabian, 5 years ago
  • Merge branch 'user' of http://github.com/pulse00/LiipMagentoBundle into user
    By pulse00, 5 years ago
  • added MagentoUserInterface
    By pulse00, 5 years ago
  • MageListener gets store resolver injected implicitly
    By pulse00, 5 years ago
  • reverted to instance of check for user class
    By pulse00, 5 years ago
  • Merge branch 'master' of https://github.com/liip/LiipMagentoBundle
    By pulse00, 5 years ago
  • fixed caching
    By pulse00, 5 years ago
  • replaces FileLoader by TemplateLocator implementation
    By pulse00, 5 years ago
  • added FileLoader for Magento Templates
    By pulse00, 5 years ago
  • Merge branch 'master' of https://github.com/pulse00/LiipMagentoBundle
    By pulse00, 5 years ago
  • made userProvider classes configurable
    By pulse00, 5 years ago
  • Merge pull request #4 from pulse00/master
    By rndstr, 5 years ago
  • added missing use statements
    By pulse00, 5 years ago
  • Merge branch 'master' of github.com:pulse00/LiipMagentoBundle
    By pulse00, 5 years ago
  • fixed line length
    By pulse00, 5 years ago