session magento shopping-cart

session - MĂșltiples sitios web de Magento comparten carrito de compras



shopping-cart (1)

Tengo un pequeño dilema con el sitio web de Magento que estoy construyendo. Tengo dos sitios web con una tienda configurada para permitir el pago de múltiples monedas para cada sitio. Por lo tanto, la única diferencia entre los dos sitios (en dos dominios diferentes) que se administran a través de una instalación de magento común es la moneda de visualización y la moneda de pago. Todo está funcionando bien hasta ahora. Sin embargo, estoy tratando de compartir la sesión de pago entre los sitios para que el carrito de compra se mantenga igual al cambiar entre los sitios. Logré obtener el ID de sesión correcto agregado a la url de conmutación para que cada sitio sepa qué sesión estamos buscando. Sin embargo, el método que muestra el carrito de compras no parece funcionar independientemente del sitio web, por ejemplo, en

Mage_Checkout_Model_Session

_getQuoteIdKey () -> usa el ID del sitio web actual para verificar el ID de la oferta en la sesión.

¡Y no puedo imaginar qué / cómo sobrescribir esta funcionalidad para que cada sitio web comparta exactamente los mismos datos del carrito de compras!

mi $ _SESSION [''checkout''] variable muestra lo mismo en cada sitio, pero con este ID de sitio web incluido, los datos no sirven para el carrito de compras: ''quote_id_4'' => string ''13'' (longitud = 2)

¿Alguna idea de si esto es posible en absoluto?


Después de buscar una respuesta a esto y tropecé con la misma pregunta que se hacía desde 2009 sin una solución definitiva, finalmente tuve que buscar en el fondo del código yo mismo, y listo, tengo una solución funcional. Aquí una guía detallada para cualquier persona que quiera configurar Magento con

  • múltiples monedas que no solo se muestran, sino que se facturan en la moneda seleccionada
  • comparte el carrito de compras en sitios web y no solo en tiendas

El principal problema con esta combinación es que con la estructura predeterminada de Magento, solo puedes hacer una u otra, no las dos combinadas.

Así que primero configuremos Magento para varias monedas.

  • Cree un sitio web para cada moneda con una vista de tienda y tienda correspondiente (no solo vistas de tiendas, sitios web completos)
  • Configure Sistema - Configuración - Configuración de moneda por sitio web en la moneda respectiva. Las tres entradas Base Currecny, Moneda de pantalla predeterminada y Monedas permitidas se deben establecer en solo una y la misma moneda.
  • Regrese al ámbito de configuración general predeterminado y configure Sistema - Configuración - Catálogo - - - Precio el alcance del precio del catálogo en "Sitio web"
  • También puede definir las tasas de cambio en Sistema - Administrar tipos de cambio
  • Para cada alcance del sitio web, establezca el sistema adecuado - Configuración - Web - URL base segura y no segura.
  • En su archivo .htaccess, agregue esto en la parte superior (reemplace los dominios y el código del sitio web apropiado que ingresó al configurar los sitios web (aquí http: //website-us.local con base_us y http: //website-uk.local con código) base_uk)

    SetEnvIf Sitio web del host-us.local MAGE_RUN_CODE = base_us SetEnvIf Sitio web del host-us.local MAGE_RUN_TYPE = sitio web SetEnvIf Host ^ sitio web-us.local MAGE_RUN_CODE = base_us SetEnvIf Host ^ sitio web-us.local MAGE_RUN_TYPE = sitio web

    SetEnvIf Host website-uk.local MAGE_RUN_CODE = base_uk SetEnvIf Host website-uk.local MAGE_RUN_TYPE = sitio web SetEnvIf Host ^ website-uk.local MAGE_RUN_CODE = base_uk SetEnvIf Host ^ website-uk.local MAGE_RUN_TYPE = sitio web

  • Sobrescriba el método convertPrice en Mage / Core / Model / Store y cambie el método convertPrice - esto asegurará que los precios se muestren siempre en la conversión correcta Y el signo de moneda correcto.

    /** * Convert price from default currency to current currency * * @param double $price * @param boolean $format Format price to currency format * @param boolean $includeContainer Enclose into <span class="price"><span> * @return double */ public function convertPrice($price, $format = false, $includeContainer = true) { $categories = Mage::getModel(''catalog/category'')->getCollection(); $categ_ids=$categories->getAllIds(); $baseCurrencyCode = Mage::app()->getBaseCurrencyCode(); $allowedCurrencies = Mage::getModel(''directory/currency'')->getConfigAllowCurrencies(); $currencyRates = Mage::getModel(''directory/currency'')->getCurrencyRates($baseCurrencyCode,array_values($allowedCurrencies)); if ($this->getCurrentCurrency() && $this->getBaseCurrency()) { $value = $this->getBaseCurrency()->convert($price, $this->getCurrentCurrency()); } else { $value = $price; } if($this->getCurrentCurrencyCode() != $baseCurrencyCode) { $value = $price * $currencyRates[$this->getCurrentCurrencyCode()]; } if ($this->getCurrentCurrency() && $format) { $value = $this->formatPrice($value, $includeContainer); } return $value; }

    }

Pero, por supuesto, también queremos compartir los datos de los usuarios, el carrito y el inicio de sesión en todos los sitios web que acabamos de configurar.

  • Mientras se encuentra en el ámbito de configuración predeterminado, configure Sistema - Configuración - Configuración del cliente - Opciones de uso compartido de la cuenta - Comparta las cuentas del cliente en Global

  • Sobrescriba magento / app / code / core / Mage / Checkout / Model / Session.php y reemplace este método:

    función protegida _getQuoteIdKey () {return ''quote_id''; // devuelve ''quote_id_''. $ sitios web [1]; }

  • Sobrescriba magento / app / code / core / Mage / Sales / Model / Quote.php y cambie el método getSharedStoreIds a:

    función pública getSharedStoreIds () {$ ids = $ this -> _ getData (''shared_store_ids''); if (is_null ($ ids) ||! is_array ($ ids)) {$ arrStoreIds = array (); foreach (Mage :: getModel (''core / web'') -> getCollection () as $ sitio web) {$ arrStoreIds = array_merge ($ arrStoreIds, $ sitio web-> getStoreIds ()); } return $ arrStoreIds; / * if ($ sitio web = $ this-> getWebsite ()) {return $ sitio web-> getStoreIds (); } var_dump ($ this-> getStore () -> getWebsite () -> getStoreIds ()); exit (); devuelve $ this-> getStore () -> getWebsite () -> getStoreIds (); * /} return $ ids; }

  • Sobrescribir magento / app / code / core / Mage / Customers / Model / Customer.php y cambiar de nuevo el método getSharedWebsiteIds () a:

    función pública getSharedWebsiteIds () {$ ids = $ this -> _ getData (''shared_website_ids''); if ($ ids === null) {$ ids = array (); if ((bool) $ this-> getSharingConfig () -> isWebsiteScope ()) {$ ids [] = $ this-> getWebsiteId (); } else {foreach (Mage :: app () -> getWebsites () as $ sitio web) {$ ids [] = $ sitio web-> getId (); }} $ this-> setData (''shared_website_ids'', $ ids); } return $ ids; }

  • Si usa la opción de lista de deseos, debe hacer lo mismo con el método en magento / app / code / core / Mage / Wishlist / Model / Wishlist.php y cambiar getSharedWebsiteIds para que no solo cargue los id. De tienda del sitio web actual, sino también de todos de ellos

  • Ahora también tenemos que implementar un cambio de moneda (sitio web) en las tiendas frontend y pasar las identificaciones de sesión correctas para que magento sepa qué tiendas buscar. Imité el cambio de moneda aquí y agregué el siguiente menú desplegable a

magento / app / design / frontend / default / yourtheme / template / directory / currency.phtml

Esto carga todos los sitios web y aplica el ID de sesión actual como una cadena de consulta para que magento sepa en cualquier dominio qué sesión usar.

<?php /** * Currency switcher * * @see Mage_Directory_Block_Currency */ ?> <div class="top-currency"> <?php $websites = Mage::getModel(''core/website'')->getCollection(); $this_session_id = Mage::getSingleton(''core/session'', array(''name'' => ''frontend''))->getSessionId(); ?> <select id="website-changer" onChange="document.location=this.options[selectedIndex].value"> <?php foreach($websites as $website): $default_store = $website->getDefaultStore(); $website_currency = $default_store->getBaseCurrency()->getCurrencyCode(); $url_obj = new Mage_Core_Model_Url(); $default_store_path = $url_obj->getBaseUrl(array(''_store''=> $default_store->getCode())); $default_store_path .= Mage::getSingleton(''core/url'')->escape(ltrim(Mage::app()->getRequest()->getRequestString(), ''/'')); $default_store_path = explode(''?'', $default_store_path); $default_store_path = $default_store_path[0] . ''?SID='' . $this_session_id; ?> <option <? if(strstr($default_store_path,Mage::getBaseUrl())):?>selected="selected"<?endif; ?> value="<?=$default_store_path ?>"> <?=$website_currency?> </option> <?endforeach;?> </select> </div>

Esta cadena de consulta solo se aplicará la primera vez que cambie, pero magento recordará la identificación de sesión después de la almacenada en una cookie.

  • Para que esto funcione correctamente, sobrescriba

magento / app / code / core / Mage / Core / Model / Session / Abstract / Varien.php

y

Reemplace esto

// potential custom logic for session id (ex. switching between hosts) $this->setSessionId();

con

// potential custom logic for session id (ex. switching between hosts) /* Amend to ensure shopping carts are shared between websites */ if (isset($_COOKIE[''lastsid''])) { session_decode(file_get_contents(Mage::getBaseDir(''session'').''/sess_''.$_COOKIE[''lastsid''])); setcookie (''lastsid'', '''', time() - 3600); } if (isset($_GET[''SID''])) { $this->setSessionId($_GET[''SID'']); session_decode(file_get_contents(Mage::getBaseDir(''session'') . ''/sess_'' . $_GET[''SID''])); setcookie(''lastsid'', $_GET[''SID'']); $_COOKIE[''lastsid''] = $_GET[''SID'']; } else { $this->setSessionId(); } /* Amend end */

Esto ahora debería mostrar varias monedas, cobrar en varias monedas en varios sitios web y además de compartir inicios de sesión y carritos de compra. Esta solución es una colección de conocimiento que encontré en las interwebs combinado con algunas partes que descubrí, así que ¡gracias a todos los que me dieron consejos!