liip/LiipMagentoBundle

Name: LiipMagentoBundle

Owner: Liip

Description: [DEPRECATED] Proof of concept for integrating Magento into Symfony2 applications

Created: 2011-09-14 08:29:47.0

Updated: 2017-12-05 09:21:10.0

Pushed: 2017-12-05 09:20:54.0

Homepage: http://blog.liip.ch/archive/2011/09/21/integrating-magento-into-symfony2.html

Size: 56

Language: PHP

GitHub Committers

UserMost Recent Commit# Commits

Other Committers

UserEmailMost Recent Commit# Commits

README

UNMAINTAINED

This bundle is no longer maintained. Feel free to fork it if needed.

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:

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

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

    pp/autoload.php
    der->registerNamespaces(array(
    'Liip' => __DIR__.'/../vendor/bundles',
    // your other namespaces
    
    
  4. Add the bundle to your application kernel:

    pp/AppKernel.php
    ic function registerBundles()
    
    return array(
        // ...
        new Liip\MagentoBundle\LiipMagentoBundle(),
        // ...
    );
    
    
  5. Configure the bundle

    See Configuration

  6. Fix the Magento autoloader

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

Configuration

p/config/config.yml
ework:
session:
    # use the Magento session handler
    storage_id: liip_magento.session.storage

_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

p/config/security.yml
rity:
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:

p/config/config.yml
_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

s 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:

lock content %}

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

{{ footer | raw}}
ndblock %}  

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

ices:
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:

l version="1.0"?>
fig>
<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>
nfig>
hp
p 
s 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
he example:

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

ServerName mysite.local

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

rtualHost>

tualHost *:80>
DocumentRoot "/var/www/mysite/magento"

ServerName shop.mysite.local

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

rtualHost>

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)
he example: 

tualHost *: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>
rtualHost>

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.


This work is supported by the National Institutes of Health's National Center for Advancing Translational Sciences, Grant Number U24TR002306. This work is solely the responsibility of the creators and does not necessarily represent the official views of the National Institutes of Health.