Commit 081c335a by dhn

Merge branch 'developer' of http://47.99.244.21:9999/root/joshine into Branch_developer

parents af4c4ce4 5e2b4cc7
<?php
namespace Cadence\Fbpixel\Block;
use Magento\Framework\View\Element\Template;
class AbstractBlock
extends \Magento\Framework\View\Element\Template
{
/** @var \Cadence\Fbpixel\Helper\Data $_helper */
protected $_helper;
public function __construct(
\Cadence\Fbpixel\Helper\Data $helper,
Template\Context $context,
array $data = []
) {
$this->_helper = $helper;
parent::__construct( $context, $data );
}
public function getHelper(){
return $this->_helper;
}
public function getSession(){
return $this->getHelper()->getSession();
}
public function getCurrencyCode(){
return $this->getHelper()->getCurrencyCode();
}
}
\ No newline at end of file
<?php
namespace Cadence\Fbpixel\CustomerData;
use Magento\Customer\CustomerData\SectionSourceInterface;
use Magento\Customer\Helper\Session\CurrentCustomer;
class Fpc implements SectionSourceInterface
{
/** @var \Cadence\Fbpixel\Helper\Data $_helper */
protected $_helper;
/** @var \Magento\Framework\Url\Helper\Data $_urlHelper */
protected $_urlBuilder;
protected $_customerSession;
protected $_currentCustomer;
public function __construct(
\Magento\Framework\UrlInterface $urlBuilder,
\Magento\Customer\Model\Session $customerSession,
\Cadence\Fbpixel\Helper\Data $helper,
CurrentCustomer $currentCustomer
) {
$this->_urlBuilder = $urlBuilder;
$this->_customerSession = $customerSession;
$this->_helper = $helper;
$this->_currentCustomer = $currentCustomer;
}
/**
* Get data
*
* @return array
*/
public function getSectionData() {
$data = [
'events' => []
];
if ($this->_helper->getSession()->hasAddToCart()) {
// Get the add-to-cart information since it's unique to the user
// but might be displayed on a cached page
$data['events'][] = [
'eventName' => 'AddToCart',
'eventAdditional' => $this->_helper->getSession()->getAddToCart()
];
}
return $data;
}
}
\ No newline at end of file
<?php
namespace Cadence\Fbpixel\Helper;
use Magento\Catalog\Model\Product;
use Magento\Catalog\Model\ProductRepository;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\App\Helper\AbstractHelper;
use Magento\Store\Model\ScopeInterface;
class Data extends AbstractHelper{
/** @var \Magento\Checkout\Model\Session $_checkoutSession */
protected $_checkoutSession;
/** @var \Magento\Sales\Model\OrderFactory $_orderFactory */
protected $_orderFactory;
/** @var ScopeConfigInterface $_scopeConfig */
protected $_scopeConfig;
/** @var \Magento\Sales\Model\Order $_order */
protected $_order;
/** @var \Magento\Catalog\Model\ProductRepository $_productRepository */
protected $_productRepository;
/** @var \Magento\Store\Model\StoreManagerInterface $_storeManager */
protected $_storeManager;
/** @var \Cadence\Fbpixel\Model\Session $_fbPixelSession */
protected $_fbPixelSession;
public function __construct(
\Magento\Checkout\Model\Session $checkoutSession,
\Magento\Sales\Model\OrderFactory $orderFactory,
\Magento\Catalog\Model\ProductRepository $productRepository,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Framework\App\Helper\Context $context,
\Cadence\Fbpixel\Model\Session $fbPixelSession
) {
$this->_checkoutSession = $checkoutSession;
$this->_orderFactory = $orderFactory;
$this->_scopeConfig = $context->getScopeConfig();
$this->_productRepository = $productRepository;
$this->_storeManager = $storeManager;
$this->_fbPixelSession = $fbPixelSession;
parent::__construct( $context );
}
public function isVisitorPixelEnabled()
{
return $this->_scopeConfig->getValue('cadence_fbpixel/visitor/enabled');
}
public function isConversionPixelEnabled()
{
return $this->_scopeConfig->getValue("cadence_fbpixel/conversion/enabled");
}
public function isAddToCartPixelEnabled()
{
return $this->_scopeConfig->getValue("cadence_fbpixel/add_to_cart/enabled");
}
public function isAddToWishlistPixelEnabled()
{
return $this->_scopeConfig->getValue('cadence_fbpixel/add_to_wishlist/enabled');
}
public function isInitiateCheckoutPixelEnabled()
{
return $this->_scopeConfig->getValue('cadence_fbpixel/inititiate_checkout/enabled');
}
public function isViewProductPixelEnabled()
{
return $this->_scopeConfig->getValue('cadence_fbpixel/view_product/enabled');
}
public function isSearchPixelEnabled()
{
return $this->_scopeConfig->getValue('cadence_fbpixel/search/enabled');
}
public function getVisitorPixelId()
{
return $this->_scopeConfig->getValue("cadence_fbpixel/visitor/pixel_id");
}
/**
* @param $event
* @param $data
* @return string
*/
public function getPixelHtml($event, $data = false)
{
$json = '';
if ($data) {
$json = ', ' . json_encode($data);
}
$html = <<<HTML
<!-- Begin Facebook {$event} Pixel -->
<script type="text/javascript">
fbq('track', '{$event}'{$json});
</script>
<!-- End Facebook {$event} Pixel -->
HTML;
return $html;
}
public function getOrderIDs()
{
$orderIDs = array();
/** @var \Magento\Sales\Model\Order\Item $item */
foreach($this->getOrder()->getAllVisibleItems() as $item){
$product = $this->_productRepository->getById($item->getProductId());
$orderIDs = array_merge($orderIDs, $this->_getProductTrackID($product));
}
return json_encode(array_unique($orderIDs));
}
public function getOrder(){
if(!$this->_order){
$this->_order = $this->_checkoutSession->getLastRealOrder();
}
return $this->_order;
}
protected function _getProductTrackID($product)
{
$productType = $product->getTypeID();
if($productType == "grouped") {
return $this->_getProductIDs($product);
} else {
return $this->_getProductID($product);
}
}
protected function _getProductIDs($product)
{
/** @var \Magento\Catalog\Model\Product $product */
$group = $product->getTypeInstance()->setProduct($product);
/** @var \Magento\GroupedProduct\Model\Product\Type\Grouped $group */
$group_collection = $group->getAssociatedProductCollection($product);
$ids = array();
foreach ($group_collection as $group_product) {
$ids[] = $this->_getProductID($group_product);
}
return $ids;
}
protected function _getProductID($product)
{
return array(
$product->getSku()
);
}
public function getOrderItemsCount()
{
$order = $this->getOrder();
$qty = 0;
/** @var \Magento\Sales\Model\Order\Item $item */
foreach($order->getAllVisibleItems() as $item) {
// Get a whole number
$qty += round($item->getQtyOrdered());
}
return $qty;
}
public function getCurrencyCode(){
return $this->_storeManager->getStore()->getCurrentCurrency()->getCode();
}
public function getSession(){
return $this->_fbPixelSession;
}
}
\ No newline at end of file
<?php
namespace Cadence\Fbpixel\Model;
class Session extends \Magento\Framework\Session\SessionManager
{
/**
* @var array
*/
protected $_ephemeralData = [];
/**
* @param $data
* @return $this
*/
public function setAddToCart($data)
{
$this->setData('add_to_cart', $data);
return $this;
}
/**
* @return mixed|null
*/
public function getAddToCart()
{
if ($this->hasAddToCart()) {
$data = $this->getData('add_to_cart');
$this->unsetData('add_to_cart');
return $data;
}
return null;
}
/**
* @return bool
*/
public function hasAddToCart()
{
return $this->hasData('add_to_cart');
}
/**
* @param $data
* @return $this
*/
public function setAddToWishlist($data)
{
$this->setData('add_to_wishlist', $data);
return $this;
}
/**
* @return mixed|null
*/
public function getAddToWishlist()
{
if ($this->hasAddToWishlist()) {
$data = $this->getData('add_to_wishlist');
$this->unsetData('add_to_wishlist');
return $data;
}
return null;
}
/**
* @return bool
*/
public function hasAddToWishlist()
{
return $this->hasData('add_to_wishlist');
}
/**
* @return bool
*/
public function hasInitiateCheckout()
{
$has = $this->hasData('initiate_checkout');
if ($has) {
$this->unsetData('initiate_checkout');
}
return $has;
}
/**
* @return $this
*/
public function setInitiateCheckout()
{
$this->setData('initiate_checkout', true);
return $this;
}
/**
* @return bool
*/
public function hasViewProduct()
{
return $this->_hasEphemeral('view_product');
}
/**
* @return mixed|null
*/
public function getViewProduct()
{
if ($this->hasViewProduct()) {
$data = $this->_getEphemeral('view_product');
$this->_unsetEphemeral('view_product');
return $data;
}
return null;
}
/**
* @param $data
* @return $this
*/
public function setViewProduct($data)
{
$this->_setEphemeral('view_product', $data);
return $this;
}
/**
* @return bool
*/
public function hasSearch()
{
return $this->_hasEphemeral('search');
}
/**
* @return mixed|null
*/
public function getSearch()
{
if ($this->hasSearch()) {
$data = $this->_getEphemeral('search');
$this->_unsetEphemeral('search');
return $data;
}
return null;
}
/**
* @param $value
* @return $this
*/
public function setSearch($value)
{
$this->_setEphemeral('search', $value);
return $this;
}
/**
* @param $key
* @param $value
* @return $this
*/
protected function _setEphemeral($key, $value)
{
$this->_ephemeralData[$key] = $value;
return $this;
}
/**
* @param $key
* @return mixed
*/
protected function _getEphemeral($key)
{
return isset($this->_ephemeralData[$key])
? $this->_ephemeralData[$key]
: null;
}
/**
* @param $key
* @return bool
*/
protected function _hasEphemeral($key)
{
return isset($this->_ephemeralData[$key]);
}
/**
* @param $key
* @return $this
*/
protected function _unsetEphemeral($key)
{
unset($this->_ephemeralData[$key]);
return $this;
}
}
\ No newline at end of file
<?php
namespace Cadence\Fbpixel\Observer;
use Magento\Framework\Event\ObserverInterface;
class CatalogControllerProductInitAfter implements ObserverInterface {
/** @var \Cadence\Fbpixel\Model\Session $_fbPixelSession */
protected $_fbPixelSession;
/** @var \Magento\Checkout\Model\Session $_checkoutSession */
protected $_checkoutSession;
/** @var \Cadence\Fbpixel\Helper\Data $_fbPixelHelper */
protected $_fbPixelHelper;
public function __construct(
\Cadence\Fbpixel\Model\Session $fbPixelSession,
\Magento\Checkout\Model\Session $checkoutSession,
\Cadence\Fbpixel\Helper\Data $helper
) {
$this->_fbPixelSession = $fbPixelSession;
$this->_checkoutSession = $checkoutSession;
$this->_fbPixelHelper = $helper;
}
/**
* @param \Magento\Framework\Event\Observer $observer
*
* @return void
*/
public function execute( \Magento\Framework\Event\Observer $observer ) {
/** @var Mage_Catalog_Model_Product $product */
$product = $observer->getProduct();
if (!$this->_fbPixelHelper->isViewProductPixelEnabled() || !$product) {
return $this;
}
$data = [
'content_type' => 'product',
'content_ids' => [$product->getSku()],
'value' => $product->getFinalPrice(),
'currency' => $this->_fbPixelHelper->getCurrencyCode(),
'content_name' => $product->getName()
];
$this->_fbPixelSession->setViewProduct($data);
return $this;
}
}
\ No newline at end of file
<?php
namespace Cadence\Fbpixel\Observer;
use Magento\Framework\Event\ObserverInterface;
class InitiateCheckout implements ObserverInterface {
/** @var \Cadence\Fbpixel\Model\Session $_fbPixelSession */
protected $_fbPixelSession;
/** @var \Magento\Checkout\Model\Session $_checkoutSession */
protected $_checkoutSession;
/** @var \Cadence\Fbpixel\Helper\Data $_fbPixelHelper */
protected $_fbPixelHelper;
public function __construct(
\Cadence\Fbpixel\Model\Session $fbPixelSession,
\Magento\Checkout\Model\Session $checkoutSession,
\Cadence\Fbpixel\Helper\Data $helper
) {
$this->_fbPixelSession = $fbPixelSession;
$this->_checkoutSession = $checkoutSession;
$this->_fbPixelHelper = $helper;
}
/**
* @param \Magento\Framework\Event\Observer $observer
*
* @return void
*/
public function execute( \Magento\Framework\Event\Observer $observer ) {
if (!$this->_fbPixelHelper->isInitiateCheckoutPixelEnabled()) {
return $this;
}
if (!count($this->_checkoutSession->getQuote()->getAllVisibleItems())) {
return $this;
}
$this->_fbPixelSession->setInitiateCheckout();
return $this;
}
}
\ No newline at end of file
<?php
namespace Cadence\Fbpixel\Observer;
use Magento\Framework\Event\ObserverInterface;
class SalesQuoteProductAddAfter implements ObserverInterface {
/** @var \Cadence\Fbpixel\Model\Session $_fbPixelSession */
protected $_fbPixelSession;
/** @var \Magento\Checkout\Model\Session $_checkoutSession */
protected $_checkoutSession;
/** @var \Cadence\Fbpixel\Helper\Data $_fbPixelHelper */
protected $_fbPixelHelper;
public function __construct(
\Cadence\Fbpixel\Model\Session $fbPixelSession,
\Magento\Checkout\Model\Session $checkoutSession,
\Cadence\Fbpixel\Helper\Data $helper
) {
$this->_fbPixelSession = $fbPixelSession;
$this->_checkoutSession = $checkoutSession;
$this->_fbPixelHelper = $helper;
}
/**
* @param \Magento\Framework\Event\Observer $observer
*
* @return void
*/
public function execute( \Magento\Framework\Event\Observer $observer ) {
if(!$this->_fbPixelHelper->isAddToCartPixelEnabled()){
return $this;
}
$items = $observer->getItems();
$candidates = array_replace([
'content_ids' => [],
'value' => 0.00
], $this->_fbPixelSession->getAddToCart() ?: array());
/** @var \Magento\Sales\Model\Order\Item $item */
foreach ($items as $item) {
if ($item->getParentItem()) {
continue;
}
$candidates['content_ids'][] = $item->getSku();
$candidates['value'] += $item->getProduct()->getFinalPrice() * $item->getProduct()->getQty();
}
$data = array(
'content_type' => 'product',
'content_ids' => $candidates['content_ids'],
'value' => $candidates['value'],
'currency' => $this->_fbPixelHelper->getCurrencyCode()
);
$this->_fbPixelSession->setAddToCart($data);
return $this;
}
}
\ No newline at end of file
<?php
namespace Cadence\Fbpixel\Observer;
use Magento\Framework\Event\ObserverInterface;
class Search implements ObserverInterface {
/** @var \Cadence\Fbpixel\Model\Session $_fbPixelSession */
protected $_fbPixelSession;
/** @var \Magento\Checkout\Model\Session $_checkoutSession */
protected $_checkoutSession;
/** @var \Cadence\Fbpixel\Helper\Data $_fbPixelHelper */
protected $_fbPixelHelper;
/** @var \Magento\Search\Helper\Data $_searchHelper */
protected $_searchHelper;
public function __construct(
\Cadence\Fbpixel\Model\Session $fbPixelSession,
\Magento\Checkout\Model\Session $checkoutSession,
\Cadence\Fbpixel\Helper\Data $helper,
\Magento\Search\Helper\Data $searchHelper
) {
$this->_fbPixelSession = $fbPixelSession;
$this->_checkoutSession = $checkoutSession;
$this->_fbPixelHelper = $helper;
$this->_searchHelper = $searchHelper;
}
/**
* @param \Magento\Framework\Event\Observer $observer
*
* @return void
*/
public function execute( \Magento\Framework\Event\Observer $observer ) {
$text = $this->_searchHelper->getEscapedQueryText();
if (!$this->_fbPixelHelper->isSearchPixelEnabled() || !$text || !strlen($text)) {
return $this;
}
$data = [
'search_string' => $text
];
$this->_fbPixelSession->setSearch($data);
return $this;
}
}
\ No newline at end of file
<?php
namespace Cadence\Fbpixel\Observer;
use Magento\Framework\Event\ObserverInterface;
class WishlistAddProduct implements ObserverInterface {
/** @var \Cadence\Fbpixel\Model\Session $_fbPixelSession */
protected $_fbPixelSession;
/** @var \Magento\Checkout\Model\Session $_checkoutSession */
protected $_checkoutSession;
/** @var \Cadence\Fbpixel\Helper\Data $_fbPixelHelper */
protected $_fbPixelHelper;
public function __construct(
\Cadence\Fbpixel\Model\Session $fbPixelSession,
\Magento\Checkout\Model\Session $checkoutSession,
\Cadence\Fbpixel\Helper\Data $helper
) {
$this->_fbPixelSession = $fbPixelSession;
$this->_checkoutSession = $checkoutSession;
$this->_fbPixelHelper = $helper;
}
/**
* @param \Magento\Framework\Event\Observer $observer
*
* @return void
*/
public function execute( \Magento\Framework\Event\Observer $observer ) {
/** @var \Magento\Catalog\Model\Product $product */
$product = $observer->getProduct();
if (!$this->_fbPixelHelper->isAddToWishlistPixelEnabled() || !$product) {
return $this;
}
$data = [
'content_type' => 'product',
'content_ids' => [$product->getSku()],
'value' => $product->getFinalPrice(),
'currency' => $this->_fbPixelHelper->getCurrencyCode()
];
$this->_fbPixelSession->setAddToWishlist($data);
return $this;
}
}
\ No newline at end of file
# cadence/m2-fbpixel
## Magento 2 Facebook Pixel Implementation
This extension adds support to Magento 2 for the Facebook Pixel and its associated events.
Current event support:
* Purchase (Checkout)
* ViewContent
* AddToCart
* AddToWishlist
* Initiate Checkout
* View Page
### License
GPL 3.0
### More Info
For user guide & full details see: https://www.cadence-labs.com/2017/09/free-magento-2-facebook-tracking-pixel-extension/
{
"name": "cadence/fbpixel-m2",
"description": "Facebook Pixel & Events Support For Magento 2.x",
"keywords": [
"Magento",
"Magento 2",
"Facebook Pixel",
"Facebook"
],
"type": "magento2-module",
"version": "1.0.0",
"license": [
"MIT"
],
"authors": [
{
"name": "Cadence Labs",
"homepage": "https://www.cadence-labs.com",
"email": "info@cadence-labs.com"
}
],
"autoload": {
"files": [
"registration.php"
],
"psr-4": {
"Cadence\\Fbpixel\\": ""
}
}
}
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
<acl>
<resources>
<resource id="Magento_Backend::admin">
<resource id="Magento_Backend::stores">
<resource id="Magento_Backend::stores_settings">
<resource id="Magento_Config::config">
<!-- this resource id we can use in system.xml for section -->
<resource id="Cadence_Fbpixel::config_cadence_fbpixel" title="Cadence Labs Facebook Pixel" sortOrder="90" />
</resource>
</resource>
</resource>
</resource>
</resources>
</acl>
</config>
\ No newline at end of file
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd">
<system>
<tab id="cadence" translate="label" sortOrder="500">
<label>Cadence</label>
</tab>
<section id="cadence_fbpixel" translate="label" type="text" sortOrder="3000" showInDefault="1" showInWebsite="1" showInStore="1" >
<class>separator-top</class>
<label>Facebook Pixel</label>
<tab>cadence</tab>
<resource>Cadence_Fbpixel::config_cadence_fbpixel</resource>
<group id="visitor" translate="label" type="text" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Visitor Pixel</label>
<field id="enabled" translate="label" type="select" sortOrder="1" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Enable</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
</field>
<field id="pixel_id" translate="label" type="text" sortOrder="1" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Pixel ID</label>
<comment>This is the pixelId for the facebook pixel (see the install guide for instructions on where to find this).</comment>
</field>
</group>
<group id="conversion" translate="label" type="text" sortOrder="20" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Conversion Event (Optional)</label>
<field id="enabled" translate="label" type="select" sortOrder="1" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Enable</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<comment>The base pixel must be enabled to track conversions. Includes parameters for grand total and currency.</comment>
</field>
</group>
<group id="add_to_cart" translate="label" type="text" sortOrder="30" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Add To Cart (Optional)</label>
<field id="enabled" translate="label" type="select" sortOrder="1" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Enable</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<comment>The base pixel must be enabled to track addToCart. Includes parameters for all product SKU's added, the total value for added products, and currency.</comment>
</field>
</group>
<group id="add_to_wishlist" translate="label" type="text" sortOrder="40" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Add To Wishlist (Optional)</label>
<field id="enabled" translate="label" type="select" sortOrder="1" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Enable</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<comment>The base pixel must be enabled to track addToWishlist. Includes parameters for the product sku added, price of product, and currency.</comment>
</field>
</group>
<group id="inititiate_checkout" translate="label" type="text" sortOrder="50" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Initiate Checkout (Optional)</label>
<field id="enabled" translate="label" type="select" sortOrder="1" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Enable</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<comment>The base pixel must be enabled to track initiateCheckout. Includes no parameters</comment>
</field>
</group>
<group id="view_product" translate="label" type="text" sortOrder="60" showInDefault="1" showInWebsite="1" showInStore="1">
<label>View Product (Optional)</label>
<field id="enabled" translate="label" type="select" sortOrder="1" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Enable</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<comment>The base pixel must be enabled to track viewProduct. Includes parameters for product price, product name, product sku, and currency</comment>
</field>
</group>
<group id="search" translate="label" type="text" sortOrder="70" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Search (Optional)</label>
<field id="enabled" translate="label" type="select" sortOrder="1" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Enable</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<comment>The base pixel must be enabled to track search. Includes a parameter for the search string.</comment>
</field>
</group>
</section>
</system>
</config>
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd">
<default>
<cadence_fbpixel>
<visitor>
<enable>0</enable>
</visitor>
<conversion>
<enable>0</enable>
</conversion>
</cadence_fbpixel>
</default>
</config>
\ No newline at end of file
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<virtualType name="Cadence\Fbpixel\Model\Session\Storage" type="Magento\Framework\Session\Storage">
<arguments>
<argument name="namespace" xsi:type="string">cadence_fbpixel</argument>
</arguments>
</virtualType>
<type name="Cadence\Fbpixel\Model\Session">
<arguments>
<argument name="storage" xsi:type="object">Cadence\Fbpixel\Model\Session\Storage</argument>
</arguments>
</type>
</config>
\ No newline at end of file
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="sales_quote_product_add_after">
<observer name="cadence_fbpixel_add_to_cart" instance="Cadence\Fbpixel\Observer\SalesQuoteProductAddAfter" />
</event>
<event name="wishlist_add_product">
<observer name="cadence_fbpixel_add_to_wishlist" instance="Cadence\Fbpixel\Observer\WishlistAddProduct" />
</event>
<event name="controller_action_predispatch_multishipping_checkout_index">
<observer name="cadence_fbpixel_initiate_checkout_multi" instance="Cadence\Fbpixel\Observer\InitiateCheckout" />
</event>
<event name="controller_action_predispatch_checkout_onepage_index">
<observer name="cadence_fbpixel_initiate_checkout_onepage" instance="Cadence\Fbpixel\Observer\InitiateCheckout" />
</event>
<event name="controller_action_predispatch_checkout_index_index">
<observer name="cadence_fbpixel_initiate_checkout_index_index" instance="Cadence\Fbpixel\Observer\InitiateCheckout" />
</event>
<event name="controller_action_predispatch_catalogsearch_result_index">
<observer name="cadence_fbpixel_search" instance="Cadence\Fbpixel\Observer\Search" />
</event>
<event name="catalog_controller_product_init_after">
<observer name="cadence_fbpixel_product_init_after" instance="Cadence\Fbpixel\Observer\CatalogControllerProductInitAfter" />
</event>
</config>
\ No newline at end of file
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Customer:etc/sections.xsd">
<action name="checkout/cart/add">
<section name="cadence-fbpixel-fpc"/>
</action>
</config>
\ No newline at end of file
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Cadence_Fbpixel" setup_version="0.1.0">
<sequence>
<module name="Magento_Directory"/>
<module name="Magento_Checkout"/>
<module name="Magento_Sales"/>
<module name="Magento_Ui"/>
</sequence>
</module>
</config>
\ No newline at end of file
<?xml version="1.0"?>
<!--
/**
* Copyright © 2017 Cadence Labs LLC. All rights reserved.
*/
-->
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceContainer name="after.body.start">
<block class="Cadence\Fbpixel\Block\AbstractBlock" name="cadence_fbpixel_conversion" template="Cadence_Fbpixel::cadence/fbpixel/conversion.phtml"/>
</referenceContainer>
</body>
</page>
<?xml version="1.0"?>
<!--
/**
* Copyright © 2017 Cadence Labs LLC. All rights reserved.
*/
-->
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="head.additional">
<block class="Cadence\Fbpixel\Block\AbstractBlock" name="cadence_fbpixel_visitor" template="Cadence_Fbpixel::cadence/fbpixel/visitor.phtml"/>
<block class="Cadence\Fbpixel\Block\AbstractBlock" name="cadence_fbpixel_events" template="Cadence_Fbpixel::cadence/fbpixel/events.phtml" />
</referenceBlock>
<referenceBlock name="after.body.start">
<block class="Magento\Framework\View\Element\Template" name="cadence.fbpixel.fpc" before="-"
template="Cadence_Fbpixel::cadence/fbpixel/fpc.phtml">
<arguments>
<argument name="jsLayout" xsi:type="array">
<item name="components" xsi:type="array">
<item name="cadenceFbpixelFpc" xsi:type="array">
<item name="component" xsi:type="string">Cadence_Fbpixel/js/view/cadence-fbpixel-fpc</item>
</item>
</item>
</argument>
</arguments>
</block>
</referenceBlock>
</body>
</page>
\ No newline at end of file
<?xml version="1.0"?>
<!--
/**
* Copyright © 2017 Cadence Labs LLC. All rights reserved.
*/
-->
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceContainer name="after.body.start">
<block class="Cadence\Fbpixel\Block\AbstractBlock" name="cadence_fbpixel_conversion" template="Cadence_Fbpixel::cadence/fbpixel/conversion.phtml"/>
</referenceContainer>
</body>
</page>
\ No newline at end of file
<?php
/** @var Cadence\Fbpixel\Block\AbstractBlock $block */
$helper = $block->getHelper();
if (!$helper->isConversionPixelEnabled()) {
return;
}
$id = $helper->getVisitorPixelId();
?>
<?php
/** @var Magento\Sales\Model\Order $order */
$order = $helper->getOrder();
if (!$order) {
//Failsafe for bad order id
return;
}
$grand_total = round($order->getGrandTotal(), 2);
$currency_code = $block->getCurrencyCode();
$orderIds = $helper->getOrderIDs();
$numItems = $helper->getOrderItemsCount();
?>
<!-- Facebook Conversion Code for Conversions -->
<script>
fbq('track','Purchase', {
value: <?php echo $grand_total ?>,
currency: '<?php echo $currency_code ?>',
content_ids: <?php echo $orderIds ?>,
content_type: 'product',
num_items: <?php echo $numItems; ?>
});
</script>
<noscript><img height="1" width="1" style="display:none"
src="https://www.facebook.com/tr?id=<?php echo $id ?>&ev=Purchase&cd[value]=<?php echo $grand_total ?>&cd[currency]=<?php echo $currency_code ?>&cd[num_items]=<?php echo $numItems ?>&noscript=1"
/></noscript>
\ No newline at end of file
<?php
/** @var Cadence\Fbpixel\Block\AbstractBlock $block */
$helper = $block->getHelper();
$session = $block->getSession();
$id = $helper->getVisitorPixelId();
?>
<?php /*if ($helper->isAddToCartPixelEnabled() && $session->hasAddToCart()) : ?>
<?php echo $helper->getPixelHtml('AddToCart', $session->getAddToCart()); ?>
<?php endif;
AddToCart Handled by FPC
*/ ?>
<?php if ($helper->isAddToWishlistPixelEnabled() && $session->hasAddToWishlist()): ?>
<?php echo $helper->getPixelHtml('AddToWishlist', $session->getAddToWishlist()); ?>
<?php endif; ?>
<?php if ($helper->isInitiateCheckoutPixelEnabled() && $session->hasInitiateCheckout()): ?>
<?php echo $helper->getPixelHtml('InitiateCheckout'); ?>
<?php endif; ?>
<?php if ($helper->isViewProductPixelEnabled() && $session->hasViewProduct()): ?>
<?php echo $helper->getPixelHtml('ViewContent', $session->getViewProduct()); ?>
<?php endif; ?>
<?php if ($helper->isSearchPixelEnabled() && $session->hasSearch()): ?>
<?php echo $helper->getPixelHtml('Search', $session->getSearch()); ?>
<?php endif; ?>
<div data-role="cadence-fbpixel-fpc" style="display:none;">
</div>
<script type="text/x-magento-init">
{"[data-role='cadence-fbpixel-fpc']": {"Magento_Ui/js/core/app": <?php echo $block->getJsLayout();?>}}
</script>
\ No newline at end of file
<?php
/** @var Cadence\Fbpixel\Block\AbstractBlock $block */
$helper = $block->getHelper();
if (!$helper->isVisitorPixelEnabled()) {
return;
}
$id = $helper->getVisitorPixelId();
?>
<!-- Facebook Pixel Code -->
<script>
!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;
n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,
document,'script','//connect.facebook.net/en_US/fbevents.js');
fbq('init', '<?php echo $id ?>');
fbq('track', "PageView");
</script>
<noscript><img height="1" width="1" style="display:none"
src="https://www.facebook.com/tr?id=<?php echo $id ?>&ev=PageView&noscript=1"
/></noscript>
<!-- End Facebook Pixel Code -->
/**
* Copyright © 2013-2017 Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
define([
'ko',
'uiComponent',
'Magento_Customer/js/customer-data'
], function (ko, Component, customerData) {
'use strict';
return Component.extend({
initialize: function () {
var self = this;
self._super();
//console.log(customerData.get('cadence-fbpixel-fpc')());
customerData.get('cadence-fbpixel-fpc').subscribe(function(loadedData){
//console.log(loadedData);
if (loadedData && "undefined" !== typeof loadedData.events) {
for (var eventCounter = 0; eventCounter < loadedData.events.length; eventCounter++) {
var eventData = loadedData.events[eventCounter];
//console.log(eventData);
if ("undefined" !== typeof eventData.eventAdditional && eventData.eventAdditional) {
//console.log("Tracking: " + eventData.eventName + " , with data: ");
//console.log(eventData.eventAdditional);
fbq('track', eventData.eventName, eventData.eventAdditional || {});
}
}
customerData.set('cadence-fbpixel-fpc', {});
}
});
}
});
});
\ No newline at end of file
......@@ -6,6 +6,7 @@
*/
namespace Joshine\CouponPusher\Controller\Ajax;
use Joshine\CouponPusher\Helper\CustomerChecker;
use Magento\Customer\Api\AccountManagementInterface as CustomerAccountManagement;
use Magento\Customer\Model\Session;
use Magento\Customer\Model\Url as CustomerUrl;
......@@ -50,6 +51,8 @@ class Subscribe extends SubscriberController implements HttpPostActionInterface
private $resultJsonFactory;
private $customerChecker;
/**
* Initialize dependencies.
*
......@@ -71,12 +74,14 @@ class Subscribe extends SubscriberController implements HttpPostActionInterface
CustomerAccountManagement $customerAccountManagement,
SubscriptionManagerInterface $subscriptionManager,
EmailValidator $emailValidator = null,
CustomerChecker $customerChecker,
JsonFactory $jsonFactory
) {
$this->customerAccountManagement = $customerAccountManagement;
$this->subscriptionManager = $subscriptionManager;
$this->emailValidator = $emailValidator ?: ObjectManager::getInstance()->get(EmailValidator::class);
$this->resultJsonFactory = $jsonFactory;
$this->customerChecker = $customerChecker;
parent::__construct(
$context,
$subscriberFactory,
......@@ -184,6 +189,7 @@ class Subscribe extends SubscriberController implements HttpPostActionInterface
'data' => $message,
'coupon_code' => $this->getCouponCode()
];
$this->setSubscribeCookie();
} catch (LocalizedException $e) {
$message = ['error' => $e->getMessage()];
} catch (\Exception $e) {
......@@ -240,4 +246,9 @@ class Subscribe extends SubscriberController implements HttpPostActionInterface
ScopeInterface::SCOPE_STORE
);
}
private function setSubscribeCookie()
{
$this->customerChecker->setSubscribeCookie();
}
}
......@@ -2,6 +2,17 @@
namespace Joshine\CouponPusher\Helper;
class Constant {
const FIRST_VISITOR = 'first_visitor';
const OTHER = 'other';
const FIRST_VISITOR = 'first_visitor';
const HAS_SUBSCRIBE = 'has_subscribe';
const STOP_COUPON_PUSH = 'coupon_push_stop';
const NOT_SUBSCRIBE = 'not_subscribe';
const HAS_SUBSCRIBE_COOKIE_DURATION = 86400 * 365;
const HAS_VISITED_COOKIE_KEY = 'has_visited';
const HAS_VISITED_COOKIE_DURATION = 86400 * 365;
const OTHER = 'other';
}
<?php
namespace Joshine\CouponPusher\Helper;
class CustomerChecker implements \Magento\Framework\Data\CollectionDataSourceInterface
{
const HAS_VISITED_COOKIE_KEY = 'has_visited';
const HAS_VISITED_COOKIE_DURATION = 86400 * 30;
protected $_cookieManager;
......@@ -29,28 +28,54 @@ class CustomerChecker implements \Magento\Framework\Data\CollectionDataSourceInt
public function checkFirstVisit(): bool
{
$previousTimestamp = $this->_cookieManager->getCookie(self::HAS_VISITED_COOKIE_KEY);
if (!$previousTimestamp) {
$metadata = $this->_cookieMetadataFactory
->createPublicCookieMetadata()
->setPath('/')
->setDuration(self::HAS_VISITED_COOKIE_DURATION);
$this->_cookieManager->setPublicCookie(
self::HAS_VISITED_COOKIE_KEY,
'true',
$metadata
);
return true;
}
return false;
return is_null($this->_cookieManager->getCookie(Constant::HAS_VISITED_COOKIE_KEY));
}
public function setFirstVisitCookie()
{
$this->setCookie(Constant::HAS_VISITED_COOKIE_KEY, 'true', Constant::HAS_VISITED_COOKIE_DURATION);
}
public function checkSubscribed(): bool
{
return !is_null($this->_cookieManager->getCookie(Constant::HAS_SUBSCRIBE));
}
public function setSubscribeCookie()
{
$this->setCookie(Constant::HAS_SUBSCRIBE, 'true', Constant::HAS_SUBSCRIBE_COOKIE_DURATION);
}
public function setCookie($key, $data, $time)
{
$metadata = $this->_cookieMetadataFactory
->createPublicCookieMetadata()
->setPath('/')
->setDuration($time);
$this->_cookieManager->setPublicCookie(
$key,
$data,
$metadata
);
}
//访客细分
public function getCustomerSegments(): string
{
if ($this->checkFirstVisit()) {
$this->setFirstVisitCookie();
return Constant::FIRST_VISITOR;
}
if (!$this->checkSubscribed()) {
return Constant::NOT_SUBSCRIBE;
}
if ($this->checkSubscribed()) {
return Constant::HAS_SUBSCRIBE;
}
return Constant::OTHER;
}
}
......@@ -5,8 +5,8 @@ namespace Joshine\CouponPusher\Model;
use Joshine\CouponPusher\Helper\Constant;
use Joshine\CouponPusher\Helper\CustomerChecker;
use Joshine\CouponPusher\Model\Strategy\ContractPushStrategy;
use Joshine\CouponPusher\Model\Strategy\FirstVisitorPushStrategy;
use Joshine\CouponPusher\Model\Strategy\NopePushStrategy;
use Joshine\CouponPusher\Model\Strategy\SubscribePushStrategy;
use Joshine\CouponPusher\Model\Strategy\StopPushStrategy;
use Magento\Framework\ObjectManagerInterface;
class PushStrategyManager
......@@ -26,10 +26,18 @@ class PushStrategyManager
public function tagToStrategy($tag): string
{
$map = [
Constant::FIRST_VISITOR => FirstVisitorPushStrategy::class,
//第一次访问推送订阅券
Constant::FIRST_VISITOR => SubscribePushStrategy::class,
//未订阅,持续推送订阅券
Constant::NOT_SUBSCRIBE => SubscribePushStrategy::class,
//已订阅停止推送
Constant::HAS_SUBSCRIBE => StopPushStrategy::class,
];
if (!isset($map[$tag])) {
return NopePushStrategy::class;
return StopPushStrategy::class;
}
return $map[$tag];
}
......
......@@ -4,7 +4,7 @@ namespace Joshine\CouponPusher\Model\Strategy;
use Joshine\CouponPusher\Block\CouponNopeAlert;
class NopePushStrategy implements ContractPushStrategy
class StopPushStrategy implements ContractPushStrategy
{
/**
......
......@@ -3,23 +3,37 @@
namespace Joshine\CouponPusher\Model\Strategy;
use Joshine\CouponPusher\Block\CouponSubscribeAlert;
use Joshine\CouponPusher\Helper\Constant;
use Joshine\CouponPusher\Helper\CustomerChecker;
class FirstVisitorPushStrategy implements ContractPushStrategy
class SubscribePushStrategy implements ContractPushStrategy
{
/**
* @var \Magento\Framework\View\Element\BlockFactory
*/
private $blockFactory;
private $customerChecker;
public function __construct(
\Magento\Framework\View\Element\BlockFactory $blockFactory
\Magento\Framework\View\Element\BlockFactory $blockFactory,
CustomerChecker $customerChecker
)
{
$this->blockFactory = $blockFactory;
$this->customerChecker = $customerChecker;
}
public function push()
{
//停推10分钟
$this->stopPushTerm();
return $this->blockFactory->createBlock(CouponSubscribeAlert::class)->toHtml();
}
public function stopPushTerm()
{
$this->customerChecker->setCookie(Constant::STOP_COUPON_PUSH, 'true', 60 * 10);
}
}
\ No newline at end of file
......@@ -216,8 +216,8 @@ class ReviewInfo extends \Magento\Framework\App\Action\Action {
$res = [];
foreach ($collect->getItems() as $item) {
$res['full'][] = ['url'=>$block->getFullImagePath($item), 'image_id'=>$item->getId()] ;
$res['thumb'][] = ['url'=>$block->getResizedImagePathByLimit($item, 100), 'image_id'=>$item->getId()] ; ;
$res['full'][] = ['url'=>$block->getResizedImagePathByLimit($item, 400), 'image_id'=>$item->getId()] ;
$res['thumb'][] = ['url'=>$block->getResizedImagePathByLimit($item, 80), 'image_id'=>$item->getId()] ; ;
}
return $res;
}
......
......@@ -77,7 +77,6 @@
}
.joshine-review-container .joshine-review-list-item .joshine-review-nickname {
width: 100%;
white-space: nowrap;
margin-bottom: 15px;
}
......
<?php
namespace Joshine\Script\Console\Command;
use Joshine\Script\Model\ImageQueryResource;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Framework\Api\SearchCriteriaBuilder;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class ProductFirstImageAsBaseFixer extends Command
{
protected $imageQueryResource;
protected $productRepository;
protected $searchCriteriaBuilder;
public function __construct(
ImageQueryResource $imageQueryResource,
ProductRepositoryInterface $productRepository,
SearchCriteriaBuilder $searchCriteriaBuilder,
string $name = null)
{
$this->imageQueryResource = $imageQueryResource;
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
$this->productRepository = $productRepository;
parent::__construct($name);
}
protected function configure()
{
$this->setName('joshine:fix-base-image')->setDescription('设置第一张产品图为base image');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$collection = $objectManager->create('Magento\Catalog\Model\ResourceModel\Product\Collection')->addFilter('type_id', 'configurable', 'eq');
foreach ($collection as $item) {
$pid = $item->getId();
$this->fixBaseImage($input, $output, $pid);
}
}
protected function fixBaseImage($input, $output, $productId)
{
$mainImage = $this->imageQueryResource->getProductMainImage($productId);
$firstImage = $this->imageQueryResource->getFirstImages($productId);
$output->writeln('first image' . $firstImage);
$output->writeln("main image".$mainImage);
if (empty($firstImage)) {
$output->writeln('first image is null, break');
return;
}
if (empty($mainImage)) {
$output->writeln('base image is null, break');
return;
}
$lastImage = $this->imageQueryResource->getLastImage($productId);
if ($mainImage != $lastImage) {
$output->writeln('base image not last, break');
return;
}
if ($mainImage != $firstImage) {
$output->writeln('fix product ' . $mainImage . ' product id: ' . $productId);
//change main image
$this->imageQueryResource->changeBaseImageTo($productId, $firstImage);
}
}
}
\ No newline at end of file
<?php
namespace Joshine\Script\Model;
use Magento\Framework\App\ResourceConnection;
class ImageQueryResource
{
/**
* @var ResourceConnection
*/
private $resourceConnection;
/**
* @var \Magento\Eav\Model\Config
*/
private $config;
public function __construct(
ResourceConnection $resourceConnection,
\Magento\Eav\Model\Config $config
) {
$this->resourceConnection = $resourceConnection;
$this->config = $config;
}
public function getProductMainImage(int $productId)
{
$mainImageAttribute = $this->config->getAttribute(\Magento\Catalog\Model\Product::ENTITY, 'image');
$select = $this->resourceConnection->getConnection()->select();
$select->from($this->resourceConnection->getTableName('catalog_product_entity_' . $mainImageAttribute->getBackendType()));
$select->where('entity_id=?', $productId);
$select->where('attribute_id=?', $mainImageAttribute->getId());
$select->reset(\Magento\Framework\DB\Select::COLUMNS);
$select->columns(['value']);
return $this->resourceConnection->getConnection()->fetchOne($select);
}
/**
* @param int $productId
* select * from catalog_product_entity_media_gallery_value as v
inner join catalog_product_entity_media_gallery as g on g.value_id=v.value_id
where entity_id=1802
order by position
*/
public function getAllImages(int $productId)
{
$select = $this->resourceConnection->getConnection()->select();
$select->from(['v' => $this->resourceConnection->getTableName('catalog_product_entity_media_gallery_value')]);
$select->join(
['g' => 'catalog_product_entity_media_gallery'],
'g.value_id=v.value_id',
[]
);
$select->where('entity_id=?', $productId);
$select->reset(\Magento\Framework\DB\Select::COLUMNS);
$select->columns(['v.value_id', 'v.position', 'g.value']);
$select->order('v.position');
return $this->resourceConnection->getConnection()->fetchAll($select);
}
/**
* @param int $productId
* select * from catalog_product_entity_media_gallery_value as v
inner join catalog_product_entity_media_gallery as g on g.value_id=v.value_id
where entity_id=1802
order by position
*/
public function getFirstImages(int $productId)
{
$select = $this->resourceConnection->getConnection()->select();
$select->from(['v' => $this->resourceConnection->getTableName('catalog_product_entity_media_gallery_value')]);
$select->join(
['g' => 'catalog_product_entity_media_gallery'],
'g.value_id=v.value_id',
[]
);
$select->where('entity_id=?', $productId);
$select->reset(\Magento\Framework\DB\Select::COLUMNS);
$select->columns(['g.value', 'v.position']);
$select->order('v.position');
$select->limit(1);
return $this->resourceConnection->getConnection()->fetchOne($select);
}
public function updatePosition(int $valueId, int $position)
{
/*$this->resourceConnection->getConnection()->update(
$this->resourceConnection->getTableName('catalog_product_entity_media_gallery_value'),
['position' => $position],
['value_id=?' => $valueId]
);*/
}
public function changeBaseImageTo($productId, $firstImage)
{
$this->resourceConnection->getConnection()->update(
$this->resourceConnection->getTableName('catalog_product_entity_varchar'),
['value' => $firstImage],
[
'entity_id=?' => $productId,
'attribute_id=?' => 87
],
);
}
public function getLastImage($productId)
{
$select = $this->resourceConnection->getConnection()->select();
$select->from(['v' => $this->resourceConnection->getTableName('catalog_product_entity_media_gallery_value')]);
$select->join(
['g' => 'catalog_product_entity_media_gallery'],
'g.value_id=v.value_id',
[]
);
$select->where('entity_id=?', $productId);
$select->reset(\Magento\Framework\DB\Select::COLUMNS);
$select->columns(['g.value', 'v.position']);
$select->order('v.position DESC');
$select->limit(1);
return $this->resourceConnection->getConnection()->fetchOne($select);
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Customer\CustomerData\SectionPoolInterface">
<type name="Magento\Framework\Console\CommandListInterface">
<arguments>
<argument name="sectionSourceMap" xsi:type="array">
<item name="cadence-fbpixel-fpc" xsi:type="string">Cadence\Fbpixel\CustomerData\Fpc</item>
<argument name="commands" xsi:type="array">
<item name="joshine_fix-base-image" xsi:type="object">Joshine\Script\Console\Command\ProductFirstImageAsBaseFixer</item>
</argument>
</arguments>
</type>
</config>
</config>
\ No newline at end of file
<?xml version="1.0"?>
<!--
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Joshine_Script" setup_version="0.0.1"/>
</config>
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Cadence_Fbpixel',
'Joshine_Script',
__DIR__
);
\ No newline at end of file
);
......@@ -143,7 +143,7 @@ else
data-mage-init='{"shoppingCart":{"emptyCartButton": ".action.clear",
"updateCartActionContainer": "#update_cart_action_container"}}'>
<caption class="table-caption"><?= $block->escapeHtml(__('Shopping Cart Items')) ?></caption>
<thead><td><div class="item-summary"><?= $block->escapeHtml(__('Item Summary')) ?></div></td></thead>
<thead><td colspan="4"><div class="item-summary"><?= $block->escapeHtml(__('Item Summary')) ?></div></td></thead>
<tr>
<td class="col item first" scope="col"><span><?= $block->escapeHtml(__('Item')) ?></span></td>
<td class="col price" scope="col"><span><?= $block->escapeHtml(__('Price')) ?></span></td>
......@@ -221,7 +221,9 @@ require(['jquery'], function ($) {
var fixHeight = $('.area-blk-notitle').height();
$(window).scroll(function () {
$(window).scroll(function () {
if($('.area-blk-notitle').length < 1){
return false;
}
var scrollTop = $(document).scrollTop();
var fixTop = $('.area-blk-notitle').offset().top;
var tableTop = $('#shopping-cart-table').offset().top;
......
......@@ -54,7 +54,7 @@ $subtotalStr = $block->escapeHtml(
<div class="now-grand-total" style="font-size: 18px;width:100%;">
<div style="float: left;text-align: left;"><strong>Order Total:</strong></div>
<div style="float: right;text-align: right;"><?= $subtotalStr ?></div>
<div style="float: right;text-align: right;" id="now-grand-total"><?= $subtotalStr ?></div>
</div>
......
......@@ -72,7 +72,7 @@ define([
return priceUtils.formatPrice(price, quote.getPriceFormat());
},
getGrandTotal:function(){
return this.getFormattedPrice(this.totals['grand_total']);
return this.getFormattedPrice(this.totals['base_subtotal']);
},
/**
* Set items to observable field
......
......@@ -5,8 +5,9 @@
define([
'Magento_Checkout/js/view/summary/abstract-total',
'Magento_Checkout/js/model/quote'
], function (Component, quote) {
'Magento_Checkout/js/model/quote',
'jquery'
], function (Component, quote,$) {
'use strict';
return Component.extend({
......@@ -38,7 +39,9 @@ define([
* @return {*|String}
*/
getValue: function () {
return this.getFormattedPrice(this.getPureValue());
var price = this.getFormattedPrice(this.getPureValue());
$('#now-grand-total').html(price)
return price;
}
});
});
......@@ -4,7 +4,15 @@
* See COPYING.txt for license details.
*/
?>
<style>
@media (min-width: 1024px){
h1.page-title {
margin: 0 auto !important;
width: 20%;
line-height: 3;
}
}
</style>
<div id="checkout-loader" data-role="checkout-loader" class="loading-mask" data-mage-init='{"checkoutLoader": {}}'>
<div class="loader">
<img src="<?php echo $block->getViewFileUrl('images/loader-1.gif'); ?>"
......
......@@ -5,6 +5,16 @@
*/
?>
<style>
@media (min-width: 1024px){
h1.page-title {
margin: 0 auto !important;
width: 20%;
line-height: 3;
}
}
</style>
<div>
<?php echo $block->getCheckoutForm(); ?>
......
......@@ -443,9 +443,6 @@ img.sparsh-mfp-img {
font-size: 1.3rem;
line-height: 1;
border-radius: 0;
-webkit-box-shadow: 3px 3px 4px 0 rgba(0, 0, 0, 0.3);
-moz-box-shadow: 3px 3px 4px 0 rgba(0, 0, 0, 0.3);
box-shadow: 3px 3px 4px 0 rgba(0, 0, 0, 0.3);
}
.products-grid a.sparsh-quick-view-button:before,
.products-list a.sparsh-quick-view-button:before {
......@@ -673,14 +670,16 @@ a.sparsh-quick-view-button{
}
#sparsh-quick-view-button-phone{
opacity: 0.6;
opacity: 0.8;
visibility: visible;
display: inline-block;
width: 50%;
background-color:transparent;
padding: 0;
border:1px solid black;
border-radius: 10px;
padding: 0.2em;
background-clip: content-box;
background-color: hsla(0,0%,100%,.8);
border-radius: 50%;
text-align: center;
width: 55%;
font-size: 1.1em;
}
......@@ -749,7 +748,8 @@ a.sparsh-quick-view-button{
}
.quick-view-icon-shop-car{
width: 80%;
opacity: 1;
padding: .19em;
height: auto;
}
......
......@@ -40,8 +40,8 @@ define(
btnQuickView += '<a rel="' + groupName + '" class="' + config.defaultClassName + ' ' + config.handlerClassName + ' sparsh-quick-view-button-phone " id="sparsh-quick-view-button-phone" href="' + url + '"';
btnQuickView += ' title="' + config.popupTitle + '"';
btnQuickView += ' >';
btnQuickView += '<svg t="1677047956598" class="quick-view-icon-shop-car" viewBox="0 0 1028 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5146" ><path d="M332.8 790.528q19.456 0 36.864 7.168t30.208 19.968 20.48 30.208 7.68 36.864-7.68 36.864-20.48 30.208-30.208 20.48-36.864 7.68q-20.48 0-37.888-7.68t-30.208-20.48-20.48-30.208-7.68-36.864 7.68-36.864 20.48-30.208 30.208-19.968 37.888-7.168zM758.784 792.576q19.456 0 37.376 7.168t30.72 19.968 20.48 30.208 7.68 36.864-7.68 36.864-20.48 30.208-30.72 20.48-37.376 7.68-36.864-7.68-30.208-20.48-20.48-30.208-7.68-36.864 7.68-36.864 20.48-30.208 30.208-19.968 36.864-7.168zM930.816 210.944q28.672 0 44.544 7.68t22.528 18.944 6.144 24.064-3.584 22.016-13.312 37.888-22.016 62.976-23.552 68.096-18.944 53.248q-13.312 40.96-33.28 56.832t-49.664 15.872l-35.84 0-65.536 0-86.016 0-96.256 0-253.952 0 14.336 92.16 517.12 0q49.152 0 49.152 41.984 0 20.48-9.728 35.84t-38.4 14.336l-49.152 0-94.208 0-118.784 0-119.808 0-99.328 0-55.296 0q-20.48 0-34.304-9.216t-23.04-24.064-14.848-32.256-8.704-32.768q-1.024-6.144-5.632-29.696t-11.264-58.88-14.848-78.848-16.384-87.552q-19.456-103.424-44.032-230.4l-76.8 0q-15.36 0-25.6-7.68t-16.896-18.432-9.216-23.04-2.56-22.528q0-20.48 13.824-33.792t37.376-12.288l103.424 0q20.48 0 32.768 6.144t19.456 15.36 10.24 18.944 5.12 16.896q2.048 8.192 4.096 23.04t4.096 30.208q3.072 18.432 6.144 38.912l700.416 0zM892.928 302.08l-641.024-2.048 35.84 185.344 535.552 1.024z" p-id="5147" fill="black"></path></svg></a>';
//btnQuickView += '<svg t="1677047956598" class="quick-view-icon-shop-car" viewBox="0 0 1028 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5146" ><path d="M332.8 790.528q19.456 0 36.864 7.168t30.208 19.968 20.48 30.208 7.68 36.864-7.68 36.864-20.48 30.208-30.208 20.48-36.864 7.68q-20.48 0-37.888-7.68t-30.208-20.48-20.48-30.208-7.68-36.864 7.68-36.864 20.48-30.208 30.208-19.968 37.888-7.168zM758.784 792.576q19.456 0 37.376 7.168t30.72 19.968 20.48 30.208 7.68 36.864-7.68 36.864-20.48 30.208-30.72 20.48-37.376 7.68-36.864-7.68-30.208-20.48-20.48-30.208-7.68-36.864 7.68-36.864 20.48-30.208 30.208-19.968 36.864-7.168zM930.816 210.944q28.672 0 44.544 7.68t22.528 18.944 6.144 24.064-3.584 22.016-13.312 37.888-22.016 62.976-23.552 68.096-18.944 53.248q-13.312 40.96-33.28 56.832t-49.664 15.872l-35.84 0-65.536 0-86.016 0-96.256 0-253.952 0 14.336 92.16 517.12 0q49.152 0 49.152 41.984 0 20.48-9.728 35.84t-38.4 14.336l-49.152 0-94.208 0-118.784 0-119.808 0-99.328 0-55.296 0q-20.48 0-34.304-9.216t-23.04-24.064-14.848-32.256-8.704-32.768q-1.024-6.144-5.632-29.696t-11.264-58.88-14.848-78.848-16.384-87.552q-19.456-103.424-44.032-230.4l-76.8 0q-15.36 0-25.6-7.68t-16.896-18.432-9.216-23.04-2.56-22.528q0-20.48 13.824-33.792t37.376-12.288l103.424 0q20.48 0 32.768 6.144t19.456 15.36 10.24 18.944 5.12 16.896q2.048 8.192 4.096 23.04t4.096 30.208q3.072 18.432 6.144 38.912l700.416 0zM892.928 302.08l-641.024-2.048 35.84 185.344 535.552 1.024z" p-id="5147" fill="black"></path></svg></a>';
btnQuickView += `<svg t="1680586108031" class="quick-view-icon-shop-car" className="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1303" width="64" height="64"><path d="M512 96c140.478 0 253.715 119.82 255.966 267.516L768 368v16h96c35.346 0 64 28.654 64 64v352c0 70.692-57.308 128-128 128H224c-70.692 0-128-57.308-128-128V448c0-35.346 28.654-64 64-64h96v-16c0-149.747 114.103-272 256-272zM256 448h-64c-17.673 0-32 14.327-32 32v320c0 34.993 28.084 63.426 62.942 63.991L224 864h576c34.993 0 63.426-28.084 63.991-62.942L864 800V480c0-17.673-14.327-32-32-32h-64v64c0 17.673-14.327 32-32 32-17.496 0-31.713-14.042-31.996-31.47L704 512v-64H320v64c0 17.673-14.327 32-32 32-17.496 0-31.713-14.042-32-31.47V448z m256 80c17.673 0 32 14.327 32 32v64h64c17.673 0 32 14.327 32 32 0 17.673-14.327 32-32 32h-64v64c0 17.673-14.327 32-32 32-17.673 0-32-14.327-32-32v-64h-64c-17.673 0-32-14.327-32-32 0-17.673 14.327-32 32-32h64v-64c0-17.673 14.327-32 32-32z m0-368c-104.471 0-190.269 90.807-191.974 204.546L320 368v16h384v-16c0-115.35-86.474-208-192-208z" fill="#000000" p-id="1304"></path></svg>`;
btnQuickView += '</div>';
$(this).find(config.btnContainer).prepend(btnQuickView);
$(this).addClass('sparsh-quick-view-item');
......
......@@ -116,8 +116,13 @@ $_helper = $block->getData('outputHelper');
<a href="<?= $escaper->escapeUrl($_product->getProductUrl()) ?>"
class="product photo product-item-photo"
tabindex="-1">
<?= $productImage->toHtml() ?>
<img class="hoverImg" width="<?= $productImage->getWidth() ?>" height="<?= $productImage->getHeight() ?>" src="<?= $hoverImg ?>">
<?php
$productImageRaw = $imageHelper->init($_product, $imageDisplayArea)->setImageFile($productImage->getFile())->resize($productImage->getWidth(),$productImage->getHeight())->getUrl();
?>
<img class="product-image-photo" src="<?= $productImageRaw ?>" loading="lazy" width="<?= $productImage->getWidth() ?>" height="<?= $productImage->getHeight() ?>" alt="Image">
<?php if ($hoverImg): ?>
<img class="hoverImg" width="<?= $productImage->getWidth() ?>" height="<?= $productImage->getHeight() ?>" src="<?= $hoverImg ?>">
<?php endif; ?>
</a>
<div class="product details product-item-details">
<?php $_productNameStripped = $block->stripTags($_product->getName(), null, true); ?>
......@@ -226,7 +231,7 @@ $_helper = $block->getData('outputHelper');
<script>
dataLayer = [];
dataLayer.push({
'event' : <?= $googleGtmName ?>,
'event' : '<?= $googleGtmName ?>',
'value' : <?= $price ?>,
'item' : <?= json_encode($items, true) ?>
})
......
......@@ -896,7 +896,7 @@ $full_free_ship = $_helper->currency($full_free, true, false);
<?php $serializedCheckoutConfig = /* @noEscape */ $block->getSerializedCheckoutConfig();
$scriptString = <<<script
window.checkoutConfig = {$serializedCheckoutConfig};
window.checkoutConfig.flatrate_price = {$flatraPrice};
window.checkoutConfig.flatrate_price = '{$flatraPrice}';
window.checkoutConfig.full_free_ship = '{$full_free_ship}';
// Create aliases for customer.js model from customer module
window.isCustomerLoggedIn = window.checkoutConfig.isCustomerLoggedIn;
......
......@@ -75,6 +75,6 @@ $logoHeight = $logoSizeResolver !== null && $logoSizeResolver->getHeight()
/
</span>
<img class="logo-secure" src="/media/wysiwyg/logo-secure.png" />
<span class="cut-font">SECURE CHECKOUT</span>
<span class="cut-font"><?= __('SECURE CHECKOUT') ?></span>
</span>
</a>
......@@ -2299,10 +2299,13 @@ button.action.submit.primary {
height: 40px;
background-clip: content-box!important;
padding: 5px;
margin-left: 3%!important;
border: 1px solid rgba(23,23,23,0.3);
}
.product-info-main .swatch-option.color, .swatch-option.image{
margin-right: 3% !important;
}
.swatch-option.color.selected{
border: 2px solid black!important;
}
......@@ -2321,7 +2324,7 @@ button.action.submit.primary {
background: none!important;
border:2px solid rgba(23, 23, 23, 0.3);
border-radius: 15px;
margin-left: 10px;
margin-right: 10px;
}
.swatch-option.text.selected{
......
Options -Indexes
<IfModule mod_php5.c>
php_flag engine 0
</IfModule>
<IfModule mod_php7.c>
php_flag engine 0
</IfModule>
AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi
Options -ExecCGI
<FilesMatch ".+\.(ph(p[3457]?|t|tml)|[aj]sp|p[ly]|sh|cgi|shtml?|html?)$">
SetHandler default-handler
</FilesMatch>
<IfModule mod_rewrite.c>
############################################
## enable rewrites
Options +FollowSymLinks
RewriteEngine on
## you can put here your pub/media folder path relative to web root
#RewriteBase /magento/pub/media/
############################################
## never rewrite for existing files
RewriteCond %{REQUEST_FILENAME} !-f
############################################
## rewrite everything else to get.php
RewriteRule .* ../get.php [L]
</IfModule>
############################################
## setting MIME types
# JavaScript
AddType application/javascript js jsonp
AddType application/json json
# CSS
AddType text/css css
# Images and icons
AddType image/x-icon ico
AddType image/gif gif
AddType image/png png
AddType image/jpeg jpg
AddType image/jpeg jpeg
AddType image/webp webp
AddType image/avif avif
AddType image/avif-sequence avifs
# SVG
AddType image/svg+xml svg svgz
# Fonts
AddType application/vnd.ms-fontobject eot
AddType application/x-font-ttf ttf
AddType application/x-font-otf otf
AddType application/x-font-woff woff
AddType application/font-woff2 woff2
# Archives and exports
AddType application/zip gzip
AddType application/x-gzip gz gzip
AddType application/x-bzip2 bz2
AddType text/csv csv
AddType application/xml xml
<IfModule mod_headers.c>
<FilesMatch .*\.(ico|jpg|jpeg|png|gif|svg|svgz|webp|avif|avifs|js|css|eot|ttf|otf|woff|woff2)$>
Header append Cache-Control public
</FilesMatch>
<FilesMatch .*\.(zip|gz|gzip|bz2|csv|xml)$>
Header append Cache-Control no-store
</FilesMatch>
</IfModule>
<IfModule mod_expires.c>
############################################
## Add default Expires header
## http://developer.yahoo.com/performance/rules.html#expires
ExpiresActive On
# Data
<FilesMatch \.(zip|gz|gzip|bz2|csv|xml)$>
ExpiresDefault "access plus 0 seconds"
</FilesMatch>
ExpiresByType text/xml "access plus 0 seconds"
ExpiresByType text/csv "access plus 0 seconds"
ExpiresByType application/json "access plus 0 seconds"
ExpiresByType application/zip "access plus 0 seconds"
ExpiresByType application/x-gzip "access plus 0 seconds"
ExpiresByType application/x-bzip2 "access plus 0 seconds"
# CSS, JavaScript
<FilesMatch \.(css|js)$>
ExpiresDefault "access plus 1 year"
</FilesMatch>
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"
# Favicon, images
<FilesMatch \.(ico|gif|png|jpg|jpeg|svg|svgz|webp|avif|avifs)$>
ExpiresDefault "access plus 1 year"
</FilesMatch>
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
ExpiresByType image/avif "access plus 1 year"
ExpiresByType image/avif-sequence "access plus 1 year"
# Fonts
<FilesMatch \.(eot|ttf|otf|svg|woff|woff2)$>
ExpiresDefault "access plus 1 year"
</FilesMatch>
ExpiresByType application/vnd.ms-fontobject "access plus 1 year"
ExpiresByType application/x-font-ttf "access plus 1 year"
ExpiresByType application/x-font-otf "access plus 1 year"
ExpiresByType application/x-font-woff "access plus 1 year"
ExpiresByType application/font-woff2 "access plus 1 year"
</IfModule>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment