Version Notes
Created 16th April, 2017 Compatibility: 1.9.2.4 - CSV Product feed for Adwords compatibility, Conversion tracking, Product feed images and sale price improvements
Download this release
Release Info
Developer | ROI Hunter |
Extension | roihunter_easy |
Version | 1.1.0 |
Comparing to | |
See all releases |
Code changes from version 1.0.9 to 1.1.0
- app/code/community/Businessfactory/Roihuntereasy/Block/Adminhtml/Admin.php +23 -0
- app/code/community/Businessfactory/Roihuntereasy/Block/CheckoutAnalytics.php +49 -14
- app/code/community/Businessfactory/Roihuntereasy/Model/CheckoutObserver.php +28 -24
- app/code/community/Businessfactory/Roihuntereasy/Model/Cron.php +406 -214
- app/code/community/Businessfactory/Roihuntereasy/controllers/CronController.php +36 -21
- app/code/community/Businessfactory/Roihuntereasy/controllers/FeedController.php +5 -1
- app/code/community/Businessfactory/Roihuntereasy/controllers/StoredetailsController.php +89 -105
- app/code/community/Businessfactory/Roihuntereasy/etc/config.xml +11 -5
- app/code/community/Businessfactory/Roihuntereasy/sql/businessfactory_roihuntereasy_setup/{install-1.0.0.php → install-1.0.9.php} +0 -0
- app/code/community/Businessfactory/Roihuntereasy/sql/businessfactory_roihuntereasy_setup/upgrade-1.0.9-1.1.0.php +20 -0
- app/design/adminhtml/default/default/template/businessfactory_roihuntereasy/admin.phtml +3 -1
- app/design/frontend/base/default/template/businessfactory_roihuntereasy/checkout_analytics.phtml +7 -3
- package.xml +5 -5
app/code/community/Businessfactory/Roihuntereasy/Block/Adminhtml/Admin.php
CHANGED
@@ -13,6 +13,29 @@ class Businessfactory_Roihuntereasy_Block_Adminhtml_Admin extends Mage_Adminhtml
|
|
13 |
return Mage::getIsDeveloperMode() ? "developer" : "production";
|
14 |
}
|
15 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
public function getDefaultStoreId()
|
17 |
{
|
18 |
return Mage::app()
|
13 |
return Mage::getIsDeveloperMode() ? "developer" : "production";
|
14 |
}
|
15 |
|
16 |
+
public function isStagingActive()
|
17 |
+
{
|
18 |
+
$filename = "roi_hunter_staging_active";
|
19 |
+
$io = new Varien_Io_File();
|
20 |
+
$io->open(array("path" => Mage::getBaseDir()));
|
21 |
+
if ($io->fileExists($filename)) {
|
22 |
+
return true;
|
23 |
+
}
|
24 |
+
else {
|
25 |
+
return false;
|
26 |
+
}
|
27 |
+
}
|
28 |
+
|
29 |
+
public function getIframeBaseUrl()
|
30 |
+
{
|
31 |
+
if ($this->isStagingActive()) {
|
32 |
+
return "//goostav-fe-staging.roihunter.com/";
|
33 |
+
}
|
34 |
+
else {
|
35 |
+
return "//magento.roihunter.com/";
|
36 |
+
}
|
37 |
+
}
|
38 |
+
|
39 |
public function getDefaultStoreId()
|
40 |
{
|
41 |
return Mage::app()
|
app/code/community/Businessfactory/Roihuntereasy/Block/CheckoutAnalytics.php
CHANGED
@@ -4,40 +4,43 @@ class Businessfactory_Roihuntereasy_Block_CheckoutAnalytics extends Businessfact
|
|
4 |
|
5 |
protected $prodId;
|
6 |
protected $prodPrice;
|
|
|
7 |
|
8 |
public function _toHtml() {
|
9 |
try {
|
10 |
// find out if session was set
|
11 |
-
$
|
12 |
-
$
|
13 |
-
$
|
14 |
|
15 |
-
if ($
|
16 |
-
$pagetype = $
|
17 |
|
18 |
// render template with remarketing tag
|
19 |
-
if ($pagetype === "checkout"
|
20 |
-
$this->prodId = $
|
21 |
-
$this->prodPrice = $
|
|
|
22 |
|
23 |
// unset session value
|
24 |
-
Mage::getSingleton(
|
25 |
|
26 |
return parent::_toHtml();
|
27 |
}
|
28 |
}
|
29 |
} catch (Exception $exception) {
|
30 |
-
Mage::log(__METHOD__ . " exception.", null,
|
31 |
-
Mage::log($exception, null,
|
32 |
}
|
33 |
|
34 |
-
return
|
35 |
}
|
36 |
|
37 |
public function getProdId()
|
38 |
{
|
39 |
if (!$this->prodId) {
|
40 |
-
Mage::log("Product ID not found during " . __METHOD__, null,
|
|
|
41 |
}
|
42 |
return json_encode($this->prodId);
|
43 |
}
|
@@ -45,8 +48,40 @@ class Businessfactory_Roihuntereasy_Block_CheckoutAnalytics extends Businessfact
|
|
45 |
public function getProdPrice()
|
46 |
{
|
47 |
if (!$this->prodPrice) {
|
48 |
-
Mage::log("Product price not found during " . __METHOD__, null,
|
|
|
49 |
}
|
50 |
return $this->prodPrice;
|
51 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
52 |
}
|
4 |
|
5 |
protected $prodId;
|
6 |
protected $prodPrice;
|
7 |
+
protected $conversionCurrency;
|
8 |
|
9 |
public function _toHtml() {
|
10 |
try {
|
11 |
// find out if session was set
|
12 |
+
$productRemarketingBase64 = Mage::getSingleton("customer/session")->getMyValue();
|
13 |
+
$productRemarketingJson = base64_decode($productRemarketingBase64);
|
14 |
+
$productRemarketing = json_decode($productRemarketingJson, true);
|
15 |
|
16 |
+
if ($productRemarketing && array_key_exists("pagetype", $productRemarketing)) {
|
17 |
+
$pagetype = $productRemarketing["pagetype"];
|
18 |
|
19 |
// render template with remarketing tag
|
20 |
+
if ($pagetype === "checkout") {
|
21 |
+
$this->prodId = $productRemarketing["id"];
|
22 |
+
$this->prodPrice = $productRemarketing["price"];
|
23 |
+
$this->conversionCurrency = $productRemarketing["currency"];
|
24 |
|
25 |
// unset session value
|
26 |
+
Mage::getSingleton("customer/session")->unsMyValue();
|
27 |
|
28 |
return parent::_toHtml();
|
29 |
}
|
30 |
}
|
31 |
} catch (Exception $exception) {
|
32 |
+
Mage::log(__METHOD__ . " exception.", null, "errors.log");
|
33 |
+
Mage::log($exception->getMessage(), null, "errors.log");
|
34 |
}
|
35 |
|
36 |
+
return "";
|
37 |
}
|
38 |
|
39 |
public function getProdId()
|
40 |
{
|
41 |
if (!$this->prodId) {
|
42 |
+
Mage::log("Product ID not found during " . __METHOD__, null, "errors.log");
|
43 |
+
return null;
|
44 |
}
|
45 |
return json_encode($this->prodId);
|
46 |
}
|
48 |
public function getProdPrice()
|
49 |
{
|
50 |
if (!$this->prodPrice) {
|
51 |
+
Mage::log("Product price not found during " . __METHOD__, null, "errors.log");
|
52 |
+
return null;
|
53 |
}
|
54 |
return $this->prodPrice;
|
55 |
}
|
56 |
+
|
57 |
+
public function getConversionLabel()
|
58 |
+
{
|
59 |
+
try {
|
60 |
+
$collection=$this->getCollection();
|
61 |
+
|
62 |
+
if (($mainItem = ($collection->getLastItem())) == NULL) {
|
63 |
+
Mage::log("Table record not found during " . __METHOD__, null, "errors.log");
|
64 |
+
return null;
|
65 |
+
}
|
66 |
+
|
67 |
+
if (($conversionLabel = $mainItem->getConversionLabel()) == NULL) {
|
68 |
+
Mage::log("Conversion label not found during " . __METHOD__, null, "errors.log");
|
69 |
+
return null;
|
70 |
+
}
|
71 |
+
|
72 |
+
return $conversionLabel;
|
73 |
+
} catch (Exception $exception) {
|
74 |
+
Mage::log(__METHOD__ . " exception.", null, "errors.log");
|
75 |
+
Mage::log($exception->getMessage(), null, "errors.log");
|
76 |
+
return null;
|
77 |
+
}
|
78 |
+
}
|
79 |
+
|
80 |
+
public function getConversionCurrency()
|
81 |
+
{
|
82 |
+
if (!$this->conversionCurrency) {
|
83 |
+
Mage::log("Conversion currency not found during " . __METHOD__, null, "errors.log");
|
84 |
+
}
|
85 |
+
return $this->conversionCurrency;
|
86 |
+
}
|
87 |
}
|
app/code/community/Businessfactory/Roihuntereasy/Model/CheckoutObserver.php
CHANGED
@@ -4,7 +4,7 @@ class Businessfactory_Roihuntereasy_Model_CheckoutObserver extends Mage_Core_Mod
|
|
4 |
{
|
5 |
public function _construct()
|
6 |
{
|
7 |
-
$this->_init(
|
8 |
}
|
9 |
|
10 |
public function setRemarketingTag(Varien_Event_Observer $observer)
|
@@ -17,39 +17,41 @@ class Businessfactory_Roihuntereasy_Model_CheckoutObserver extends Mage_Core_Mod
|
|
17 |
}
|
18 |
|
19 |
$conversionValue = 0;
|
|
|
20 |
$productIds = array();
|
21 |
$configurableParentItems = array();
|
22 |
$configurableChildItems = array();
|
23 |
|
24 |
-
$collection = Mage::getResourceModel(
|
25 |
-
->addFieldToFilter(
|
26 |
|
27 |
foreach ($collection as $order) {
|
28 |
$conversionValue += $order->getBaseGrandTotal();
|
|
|
29 |
|
30 |
// returns all order items
|
31 |
-
// configurable items are
|
32 |
$items = $order->getAllItems();
|
33 |
foreach ($items as $item) {
|
34 |
-
$
|
35 |
-
$
|
36 |
|
37 |
-
if ($
|
38 |
// simple product - write directly to the result IDs array
|
39 |
-
if ($
|
40 |
array_push($productIds, "mag_".$item->getProductId());
|
41 |
-
Mage::log("Writing simple product", null,
|
42 |
}
|
43 |
// configurable parent product
|
44 |
-
else if ($
|
45 |
array_push($configurableParentItems, $item);
|
46 |
-
Mage::log("Storing configurable parent product", null,
|
47 |
}
|
48 |
}
|
49 |
// configurable child product
|
50 |
else {
|
51 |
array_push($configurableChildItems, $item);
|
52 |
-
Mage::log("Storing configurable child product", null,
|
53 |
}
|
54 |
}
|
55 |
}
|
@@ -57,11 +59,9 @@ class Businessfactory_Roihuntereasy_Model_CheckoutObserver extends Mage_Core_Mod
|
|
57 |
// create map of parent IDS : parent objects
|
58 |
$parentItemIdToProductIdMap = array();
|
59 |
foreach ($configurableParentItems as $item) {
|
60 |
-
$parentItemIdToProductIdMap[$item[
|
61 |
}
|
62 |
|
63 |
-
Mage::log("Configurable parent products map: %s" % ($parentItemIdToProductIdMap), null, 'debug.log');
|
64 |
-
|
65 |
// iterate over children items a find parent item in the map
|
66 |
foreach ($configurableChildItems as $item) {
|
67 |
$id = "mag_".$parentItemIdToProductIdMap[$item["parent_item_id"]]."_".$item["product_id"];
|
@@ -69,21 +69,25 @@ class Businessfactory_Roihuntereasy_Model_CheckoutObserver extends Mage_Core_Mod
|
|
69 |
}
|
70 |
|
71 |
// create Google Adwords data
|
72 |
-
$
|
73 |
-
|
74 |
-
|
75 |
-
|
|
|
76 |
);
|
77 |
-
|
78 |
-
|
|
|
|
|
|
|
79 |
|
80 |
// set session
|
81 |
-
Mage::getSingleton(
|
82 |
|
83 |
return $this;
|
84 |
} catch (Exception $exception) {
|
85 |
-
Mage::log(__METHOD__ . " exception.", null,
|
86 |
-
Mage::log($exception, null,
|
87 |
}
|
88 |
}
|
89 |
}
|
4 |
{
|
5 |
public function _construct()
|
6 |
{
|
7 |
+
$this->_init("roihuntereasy/roihuntereasy");
|
8 |
}
|
9 |
|
10 |
public function setRemarketingTag(Varien_Event_Observer $observer)
|
17 |
}
|
18 |
|
19 |
$conversionValue = 0;
|
20 |
+
$currency = null;
|
21 |
$productIds = array();
|
22 |
$configurableParentItems = array();
|
23 |
$configurableChildItems = array();
|
24 |
|
25 |
+
$collection = Mage::getResourceModel("sales/order_collection")
|
26 |
+
->addFieldToFilter("entity_id", array("in" => $orderIds));
|
27 |
|
28 |
foreach ($collection as $order) {
|
29 |
$conversionValue += $order->getBaseGrandTotal();
|
30 |
+
$currency = $order->getStoreCurrencyCode();
|
31 |
|
32 |
// returns all order items
|
33 |
+
// configurable items are divided into two items - one simple with parent_item_id and one configurable with item_id
|
34 |
$items = $order->getAllItems();
|
35 |
foreach ($items as $item) {
|
36 |
+
$parentItemId = $item->getParentItemId();
|
37 |
+
$productType = $item->getProductType();
|
38 |
|
39 |
+
if ($parentItemId == null) {
|
40 |
// simple product - write directly to the result IDs array
|
41 |
+
if ($productType == "simple") {
|
42 |
array_push($productIds, "mag_".$item->getProductId());
|
43 |
+
Mage::log("Writing simple product", null, "debug.log");
|
44 |
}
|
45 |
// configurable parent product
|
46 |
+
else if ($productType == "configurable") {
|
47 |
array_push($configurableParentItems, $item);
|
48 |
+
Mage::log("Storing configurable parent product", null, "debug.log");
|
49 |
}
|
50 |
}
|
51 |
// configurable child product
|
52 |
else {
|
53 |
array_push($configurableChildItems, $item);
|
54 |
+
Mage::log("Storing configurable child product", null, "debug.log");
|
55 |
}
|
56 |
}
|
57 |
}
|
59 |
// create map of parent IDS : parent objects
|
60 |
$parentItemIdToProductIdMap = array();
|
61 |
foreach ($configurableParentItems as $item) {
|
62 |
+
$parentItemIdToProductIdMap[$item["item_id"]] = $item["product_id"];
|
63 |
}
|
64 |
|
|
|
|
|
65 |
// iterate over children items a find parent item in the map
|
66 |
foreach ($configurableChildItems as $item) {
|
67 |
$id = "mag_".$parentItemIdToProductIdMap[$item["parent_item_id"]]."_".$item["product_id"];
|
69 |
}
|
70 |
|
71 |
// create Google Adwords data
|
72 |
+
$checkoutRemarketingData = array(
|
73 |
+
"pagetype" => "checkout",
|
74 |
+
"id" => $productIds,
|
75 |
+
"price" => $conversionValue,
|
76 |
+
"currency" => $currency
|
77 |
);
|
78 |
+
|
79 |
+
Mage::log("Setting temporary customer session value: ".json_encode($checkoutRemarketingData), null, "debug.log");
|
80 |
+
|
81 |
+
$checkoutRemarketingJson = json_encode($checkoutRemarketingData);
|
82 |
+
$checkout_RemarketingBase64 = base64_encode($checkoutRemarketingJson);
|
83 |
|
84 |
// set session
|
85 |
+
Mage::getSingleton("customer/session")->setMyValue($checkout_RemarketingBase64);
|
86 |
|
87 |
return $this;
|
88 |
} catch (Exception $exception) {
|
89 |
+
Mage::log(__METHOD__ . " exception.", null, "errors.log");
|
90 |
+
Mage::log($exception, null, "errors.log");
|
91 |
}
|
92 |
}
|
93 |
}
|
app/code/community/Businessfactory/Roihuntereasy/Model/Cron.php
CHANGED
@@ -7,25 +7,33 @@ class Businessfactory_Roihuntereasy_Model_Cron extends Mage_Core_Model_Abstract
|
|
7 |
parent::_construct();
|
8 |
}
|
9 |
|
10 |
-
|
11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
}
|
13 |
|
14 |
/**
|
15 |
* Method start new feed creation process, if not another feed creation process running.
|
16 |
*/
|
17 |
-
public function createFeed()
|
18 |
{
|
19 |
-
Mage::log(__METHOD__ . " cron", null,
|
20 |
-
$filename = "businessFactoryRoiHunterEasyFeedSign";
|
21 |
$io = new Varien_Io_File();
|
22 |
|
23 |
try {
|
24 |
$io->setAllowCreateFolders(true);
|
25 |
-
$io->open(array(
|
26 |
|
27 |
if ($io->fileExists($filename)) {
|
28 |
-
Mage::log("Feed generation already running.", null,
|
29 |
return false;
|
30 |
}
|
31 |
|
@@ -34,7 +42,7 @@ class Businessfactory_Roihuntereasy_Model_Cron extends Mage_Core_Model_Abstract
|
|
34 |
$io->streamClose();
|
35 |
|
36 |
// Generate feed
|
37 |
-
$this->generateAndSaveFeed();
|
38 |
|
39 |
// Delete file
|
40 |
$io->rm($filename);
|
@@ -43,8 +51,8 @@ class Businessfactory_Roihuntereasy_Model_Cron extends Mage_Core_Model_Abstract
|
|
43 |
|
44 |
return true;
|
45 |
} catch (Exception $exception) {
|
46 |
-
Mage::log(__METHOD__ . " exception.", null,
|
47 |
-
Mage::log($exception, null,
|
48 |
|
49 |
// Try delete file also when exception occurred.
|
50 |
try {
|
@@ -52,8 +60,8 @@ class Businessfactory_Roihuntereasy_Model_Cron extends Mage_Core_Model_Abstract
|
|
52 |
|
53 |
$io->close();
|
54 |
} catch (Exception $exception) {
|
55 |
-
Mage::log(__METHOD__ . " exception.", null,
|
56 |
-
Mage::log($exception, null,
|
57 |
}
|
58 |
return false;
|
59 |
}
|
@@ -62,102 +70,53 @@ class Businessfactory_Roihuntereasy_Model_Cron extends Mage_Core_Model_Abstract
|
|
62 |
/**
|
63 |
* Feed generation function
|
64 |
*/
|
65 |
-
private function generateAndSaveFeed()
|
66 |
{
|
67 |
-
|
68 |
-
$
|
|
|
|
|
69 |
|
|
|
70 |
$io = new Varien_Io_File();
|
71 |
$io->setAllowCreateFolders(true);
|
72 |
-
$io->open(array(
|
73 |
|
74 |
-
//
|
75 |
if ($io->fileExists($pathTemp)) {
|
76 |
$io->rm($pathTemp);
|
77 |
}
|
78 |
$io->streamOpen($pathTemp);
|
79 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
80 |
try {
|
81 |
-
$
|
82 |
-
|
83 |
-
|
84 |
-
$
|
85 |
-
|
86 |
-
$xmlWriter->startElement('rss');
|
87 |
-
$xmlWriter->writeAttribute('version', '2.0');
|
88 |
-
$xmlWriter->writeAttributeNs('xmlns', 'g', null, 'http://base.google.com/ns/1.0');
|
89 |
-
$xmlWriter->startElement('channel');
|
90 |
-
$xmlWriter->writeElement('title', 'ROI Hunter Easy - Magento data feed');
|
91 |
-
$xmlWriter->writeElement('description', 'Magento data feed used in Google Merchants');
|
92 |
-
$xmlWriter->writeElement('link', Mage::app()->getStore()->getBaseUrl());
|
93 |
-
|
94 |
-
$total_time_start = microtime(true);
|
95 |
-
$time_start = microtime(true);
|
96 |
-
$products = $this->getProductCollection();
|
97 |
-
$time_end = microtime(true);
|
98 |
-
$execution_time = ($time_end - $time_start);
|
99 |
-
Mage::log('getProductCollection count: ' . count($products) . '. Execution time: ' . $execution_time, null, 'cron.log');
|
100 |
-
|
101 |
-
$this->count = 0;
|
102 |
-
|
103 |
-
// debug variables
|
104 |
-
$limit_enabled = false;
|
105 |
-
$simple_products_count = 0;
|
106 |
-
$configurable_products_count = 0;
|
107 |
-
$simple_products_limit = 2;
|
108 |
-
$configurable_products_limit = 1;
|
109 |
-
|
110 |
-
foreach ($products as $_product) {
|
111 |
-
|
112 |
-
switch ($_product->getTypeId()) {
|
113 |
-
case 'downloadable':
|
114 |
-
if ($_product->getPrice() <= 0) {
|
115 |
-
// $this->_logger->info("Skip this");
|
116 |
-
break;
|
117 |
-
}
|
118 |
-
// Else same processing as simple product
|
119 |
-
case 'simple':
|
120 |
-
if (!$limit_enabled || $simple_products_count < $simple_products_limit) {
|
121 |
-
$this->write_simple_product($_product, $xmlWriter);
|
122 |
-
$simple_products_count++;
|
123 |
-
}
|
124 |
-
break;
|
125 |
-
case 'configurable':
|
126 |
-
if (!$limit_enabled || $configurable_products_count < $configurable_products_limit) {
|
127 |
-
$this->write_configurable_product($_product, $xmlWriter);
|
128 |
-
$configurable_products_count++;
|
129 |
-
}
|
130 |
-
break;
|
131 |
-
}
|
132 |
-
if ($limit_enabled && $simple_products_count >= $simple_products_limit && $configurable_products_count >= $configurable_products_limit) {
|
133 |
-
break;
|
134 |
-
}
|
135 |
-
|
136 |
-
$this->count++;
|
137 |
-
if ($this->count >= 512) {
|
138 |
-
$this->count = 0;
|
139 |
-
// After each 512 products flush memory to file.
|
140 |
-
$io->streamWrite($xmlWriter->flush());
|
141 |
-
}
|
142 |
}
|
143 |
|
144 |
-
$xmlWriter->endElement();
|
145 |
-
$xmlWriter->endElement();
|
146 |
-
$xmlWriter->endDocument();
|
147 |
-
|
148 |
-
// Final memory flush, rename temporary file and feed is done.
|
149 |
-
$io->streamWrite($xmlWriter->flush());
|
150 |
$io->streamClose();
|
151 |
|
152 |
if ($io->mv($pathTemp, $pathFinal)) {
|
153 |
-
Mage::log("Created feed renamed successful", null,
|
154 |
} else {
|
155 |
-
Mage::log("ERROR: Created feed renamed unsuccessful", null,
|
156 |
}
|
157 |
|
158 |
-
$
|
159 |
-
$
|
160 |
-
Mage::log(
|
161 |
} catch (Exception $e) {
|
162 |
Mage::throwException($e);
|
163 |
}
|
@@ -167,28 +126,179 @@ class Businessfactory_Roihuntereasy_Model_Cron extends Mage_Core_Model_Abstract
|
|
167 |
return true;
|
168 |
}
|
169 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
170 |
public function getProductCollection()
|
171 |
{
|
172 |
-
$collection = Mage::getModel(
|
173 |
|
174 |
// select necessary attributes
|
175 |
-
$collection->addAttributeToSelect(
|
176 |
-
$collection->addAttributeToSelect(
|
177 |
-
$collection->addAttributeToSelect(
|
178 |
-
$collection->addAttributeToSelect(
|
179 |
-
$collection->addAttributeToSelect(
|
180 |
-
$collection->addAttributeToSelect(
|
181 |
-
$collection->addAttributeToSelect(
|
182 |
-
$collection->addAttributeToSelect(
|
183 |
-
$collection->addAttributeToSelect(
|
184 |
|
185 |
// Allow only visible products
|
186 |
$visibility = array(
|
187 |
Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH,
|
188 |
Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_CATALOG
|
189 |
);
|
190 |
-
$collection->addAttributeToFilter(
|
191 |
-
$collection->addAttributeToFilter(
|
192 |
|
193 |
// setting correct Product URL
|
194 |
$collection->addUrlRewrite();
|
@@ -196,34 +306,66 @@ class Businessfactory_Roihuntereasy_Model_Cron extends Mage_Core_Model_Abstract
|
|
196 |
->getDefaultStoreView()
|
197 |
->getStoreId();
|
198 |
$collection->setStoreId($storeId);
|
|
|
|
|
199 |
Mage::app()->setCurrentStore($storeId);
|
200 |
|
201 |
$collection->load();
|
202 |
|
203 |
-
Mage::log("Default store ID: " . $storeId, null,
|
204 |
|
205 |
return $collection;
|
206 |
}
|
207 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
208 |
/**
|
209 |
* @param $_product
|
210 |
* @param XMLWriter $xmlWriter
|
211 |
*/
|
212 |
-
private function
|
213 |
{
|
214 |
-
$xmlWriter->startElement(
|
215 |
|
216 |
-
// ID belongs to the simple product
|
217 |
-
$xmlWriter->writeElement(
|
218 |
-
$xmlWriter->writeElement(
|
219 |
|
220 |
// process common attributes
|
221 |
-
$this->
|
222 |
// process advanced attributes
|
223 |
-
$this->
|
224 |
// categories
|
225 |
-
$catCollection = $this->
|
226 |
-
$this->
|
227 |
|
228 |
$xmlWriter->endElement();
|
229 |
}
|
@@ -232,171 +374,221 @@ class Businessfactory_Roihuntereasy_Model_Cron extends Mage_Core_Model_Abstract
|
|
232 |
* @param Mixed $_product
|
233 |
* @param XMLWriter $xmlWriter
|
234 |
*/
|
235 |
-
function
|
236 |
{
|
237 |
-
$xmlWriter->writeElement(
|
238 |
-
$xmlWriter->writeElement(
|
239 |
// Product URL
|
240 |
-
// $_product->getData(
|
241 |
-
$xmlWriter->writeElement(
|
242 |
|
243 |
// replaced getAttributeText with safer option
|
244 |
-
$attributeCode =
|
245 |
if ($_product->getData($attributeCode) !== null){
|
246 |
-
$xmlWriter->writeElement(
|
247 |
-
}
|
248 |
-
|
249 |
-
$xmlWriter->writeElement('g:condition', 'new');
|
250 |
-
// TODO add more attributes if needed.
|
251 |
-
// $xmlWriter->writeElement('g:size_system', 'uk');
|
252 |
-
// $xmlWriter->writeElement('g:age_group', 'adult');
|
253 |
-
|
254 |
-
// $xmlWriter->writeElement('g:identifier_exists', 'TRUE');
|
255 |
-
// $xmlWriter->writeElement('g:adult', $this->do_is_adult($_product));
|
256 |
-
}
|
257 |
-
|
258 |
-
// /**
|
259 |
-
// * @param Mixed $_product
|
260 |
-
// * @return string
|
261 |
-
// */
|
262 |
-
// function do_is_adult($_product)
|
263 |
-
// {
|
264 |
-
// // TODO add decision if needed.
|
265 |
-
//// switch ($_product->getAttributeText('familysafe')) {
|
266 |
-
//// case 'No':
|
267 |
-
//// $isadult = "FALSE";
|
268 |
-
//// default:
|
269 |
-
//// $isadult = "TRUE";
|
270 |
-
//// }
|
271 |
-
// return ("FALSE");
|
272 |
-
// }
|
273 |
-
|
274 |
-
/**
|
275 |
-
* @param Mixed $product
|
276 |
-
* @return mixed
|
277 |
-
*/
|
278 |
-
function get_description($product)
|
279 |
-
{
|
280 |
-
$description = $product->getShortDescription();
|
281 |
-
if (!$description) {
|
282 |
-
$description = $product->getDescription();
|
283 |
}
|
284 |
-
return ($description);
|
285 |
-
}
|
286 |
-
|
287 |
-
/**
|
288 |
-
* @param Mixed $product
|
289 |
-
* @return string
|
290 |
-
*/
|
291 |
-
function get_image_url($product)
|
292 |
-
{
|
293 |
-
$productMediaConfig = Mage::getModel('catalog/product_media_config');
|
294 |
-
$baseImageUrl = $productMediaConfig->getMediaUrl($product->getImage());
|
295 |
|
296 |
-
|
297 |
}
|
298 |
|
299 |
/**
|
300 |
* @param Mixed $_product
|
301 |
* @param XMLWriter $xmlWriter
|
302 |
*/
|
303 |
-
function
|
304 |
{
|
305 |
-
$xmlWriter->writeElement(
|
306 |
|
307 |
-
// $this->_logger->debug(
|
308 |
-
$xmlWriter->writeElement(
|
309 |
if (strlen($_product->getEan()) > 7) {
|
310 |
-
$xmlWriter->writeElement(
|
311 |
}
|
312 |
|
313 |
-
$xmlWriter->writeElement(
|
314 |
-
$xmlWriter->writeElement(
|
315 |
// replaced getAttributeText with safer option
|
316 |
-
$attributeCode =
|
317 |
if ($_product->getData($attributeCode) !== null){
|
318 |
-
$xmlWriter->writeElement(
|
319 |
}
|
320 |
// replaced getAttributeText with safer option
|
321 |
-
$attributeCode =
|
322 |
if ($_product->getData($attributeCode) !== null){
|
323 |
-
$xmlWriter->writeElement(
|
324 |
}
|
325 |
|
326 |
-
$xmlWriter->writeElement(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
327 |
}
|
328 |
|
329 |
/**
|
330 |
* @param Mixed $_product
|
331 |
* @return string
|
332 |
*/
|
333 |
-
function
|
334 |
{
|
335 |
$stockItem = $_product->getStockItem();
|
336 |
if($stockItem->getIsInStock())
|
337 |
{
|
338 |
-
$stockval =
|
339 |
}
|
340 |
else
|
341 |
{
|
342 |
-
$stockval =
|
343 |
}
|
344 |
|
345 |
return $stockval;
|
346 |
}
|
347 |
|
348 |
/**
|
349 |
-
* @param Mixed $
|
350 |
-
* @
|
351 |
*/
|
352 |
-
function
|
353 |
{
|
354 |
-
|
355 |
-
|
356 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
357 |
}
|
|
|
|
|
358 |
}
|
359 |
|
360 |
/**
|
361 |
-
* @param Mixed $
|
362 |
-
* @return
|
363 |
*/
|
364 |
-
function
|
365 |
{
|
366 |
-
|
367 |
-
|
368 |
-
|
369 |
-
|
|
|
|
|
|
|
370 |
}
|
371 |
|
372 |
/**
|
373 |
-
* @param Mixed $
|
374 |
-
* @
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
375 |
*/
|
376 |
-
|
377 |
{
|
378 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
379 |
|
380 |
-
|
381 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
382 |
|
383 |
-
|
384 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
385 |
|
386 |
-
|
387 |
-
|
388 |
-
|
389 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
390 |
|
391 |
-
|
392 |
-
|
393 |
-
|
394 |
-
|
395 |
-
|
396 |
-
|
|
|
397 |
|
398 |
-
|
399 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
400 |
}
|
|
|
|
|
401 |
}
|
402 |
}
|
7 |
parent::_construct();
|
8 |
}
|
9 |
|
10 |
+
/**
|
11 |
+
* Method start new feed creation process from cron schedule.
|
12 |
+
*/
|
13 |
+
public function scheduleFeed($schedule) {
|
14 |
+
Mage::log(__METHOD__ . ": scheduled feed generation. ", null, "cron.log");
|
15 |
+
|
16 |
+
$jobsRoot = Mage::getConfig()->getNode("crontab/jobs");
|
17 |
+
$jobConfig = $jobsRoot->{$schedule->getJobCode()};
|
18 |
+
$fileFormat = (string) $jobConfig->format;
|
19 |
+
$this->createFeed($fileFormat);
|
20 |
}
|
21 |
|
22 |
/**
|
23 |
* Method start new feed creation process, if not another feed creation process running.
|
24 |
*/
|
25 |
+
public function createFeed($fileFormat="xml")
|
26 |
{
|
27 |
+
Mage::log($fileFormat . ": " . __METHOD__ . " cron", null, "cron.log");
|
28 |
+
$filename = "businessFactoryRoiHunterEasyFeedSign" . $fileFormat;
|
29 |
$io = new Varien_Io_File();
|
30 |
|
31 |
try {
|
32 |
$io->setAllowCreateFolders(true);
|
33 |
+
$io->open(array("path" => Mage::getBaseDir()));
|
34 |
|
35 |
if ($io->fileExists($filename)) {
|
36 |
+
Mage::log($fileFormat. ": Feed generation already running.", null, "cron.log");
|
37 |
return false;
|
38 |
}
|
39 |
|
42 |
$io->streamClose();
|
43 |
|
44 |
// Generate feed
|
45 |
+
$this->generateAndSaveFeed($fileFormat);
|
46 |
|
47 |
// Delete file
|
48 |
$io->rm($filename);
|
51 |
|
52 |
return true;
|
53 |
} catch (Exception $exception) {
|
54 |
+
Mage::log($fileFormat . ": " . __METHOD__ . " exception.", null, "errors.log");
|
55 |
+
Mage::log($exception->getMessage(), null, "errors.log");
|
56 |
|
57 |
// Try delete file also when exception occurred.
|
58 |
try {
|
60 |
|
61 |
$io->close();
|
62 |
} catch (Exception $exception) {
|
63 |
+
Mage::log($fileFormat . ": " . __METHOD__ . " exception.", null, "errors.log");
|
64 |
+
Mage::log($exception->getMessage(), null, "errors.log");
|
65 |
}
|
66 |
return false;
|
67 |
}
|
70 |
/**
|
71 |
* Feed generation function
|
72 |
*/
|
73 |
+
private function generateAndSaveFeed($fileFormat)
|
74 |
{
|
75 |
+
// create tmp file for writing blocks of the products
|
76 |
+
$pathTemp = "roi_hunter_easy_feed_temp." . $fileFormat;
|
77 |
+
// set the name of the final file (tmp is renamed to this named after the operation is completed)
|
78 |
+
$pathFinal = "roi_hunter_easy_feed_final." . $fileFormat;
|
79 |
|
80 |
+
// create IO Stream for writing
|
81 |
$io = new Varien_Io_File();
|
82 |
$io->setAllowCreateFolders(true);
|
83 |
+
$io->open(array("path" => Mage::getBaseDir() . "/feeds"));
|
84 |
|
85 |
+
// remove the temporary file if exists
|
86 |
if ($io->fileExists($pathTemp)) {
|
87 |
$io->rm($pathTemp);
|
88 |
}
|
89 |
$io->streamOpen($pathTemp);
|
90 |
|
91 |
+
// get collection of all products
|
92 |
+
$products = $this->getProductCollection();
|
93 |
+
|
94 |
+
// measurement variables
|
95 |
+
$totalTimeStart = microtime(true);
|
96 |
+
$timeStart = microtime(true);
|
97 |
+
$timeEnd = microtime(true);
|
98 |
+
$executionTime = ($timeEnd - $timeStart);
|
99 |
+
Mage::log("getProductCollection count: " . count($products) . ". Execution time: " . $executionTime, null, "cron.log");
|
100 |
+
|
101 |
try {
|
102 |
+
if ($fileFormat === "xml") {
|
103 |
+
$this->generateAndSaveFeedXML($products, $io);
|
104 |
+
}
|
105 |
+
else if ($fileFormat === "csv") {
|
106 |
+
$this->generateAndSaveFeedCSV($products, $io);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
107 |
}
|
108 |
|
|
|
|
|
|
|
|
|
|
|
|
|
109 |
$io->streamClose();
|
110 |
|
111 |
if ($io->mv($pathTemp, $pathFinal)) {
|
112 |
+
Mage::log("Created feed renamed successful", null, "cron.log");
|
113 |
} else {
|
114 |
+
Mage::log("ERROR: Created feed renamed unsuccessful", null, "cron.log");
|
115 |
}
|
116 |
|
117 |
+
$totalTimeEnd = microtime(true);
|
118 |
+
$totalExecutionTime = ($totalTimeEnd - $totalTimeStart);
|
119 |
+
Mage::log("total execution time: " . $totalExecutionTime, null, "cron.log");
|
120 |
} catch (Exception $e) {
|
121 |
Mage::throwException($e);
|
122 |
}
|
126 |
return true;
|
127 |
}
|
128 |
|
129 |
+
/**
|
130 |
+
* Feed generation function
|
131 |
+
*/
|
132 |
+
private function generateAndSaveFeedCSV($products, $io) {
|
133 |
+
// CSV headers
|
134 |
+
$csvHeader = array(
|
135 |
+
"ID",
|
136 |
+
"Item title",
|
137 |
+
"Final URL",
|
138 |
+
"Image URL",
|
139 |
+
"Item description",
|
140 |
+
"Price",
|
141 |
+
"Sale price"
|
142 |
+
);
|
143 |
+
|
144 |
+
// write headers to CSV file
|
145 |
+
$io->streamWriteCsv($csvHeader);
|
146 |
+
|
147 |
+
$this->count = 0;
|
148 |
+
foreach ($products as $_product) {
|
149 |
+
switch ($_product->getTypeId()) {
|
150 |
+
case "downloadable":
|
151 |
+
if ($_product->getPrice() <= 0) {
|
152 |
+
break;
|
153 |
+
}
|
154 |
+
// Else same processing as simple product
|
155 |
+
case "simple":
|
156 |
+
$productDict = $this->getSimpleProductDict($_product);
|
157 |
+
$io->streamWriteCsv($productDict);
|
158 |
+
break;
|
159 |
+
case "configurable":
|
160 |
+
$productDictArray = $this->getConfigurableProductDict($_product);
|
161 |
+
foreach ($productDictArray as $productDict){
|
162 |
+
$io->streamWriteCsv($productDict);
|
163 |
+
}
|
164 |
+
break;
|
165 |
+
}
|
166 |
+
}
|
167 |
+
|
168 |
+
}
|
169 |
+
|
170 |
+
/**
|
171 |
+
* @param Mixed $_product
|
172 |
+
* @param XMLWriter $xmlWriter
|
173 |
+
*/
|
174 |
+
private function getConfigurableProductDict($_product)
|
175 |
+
{
|
176 |
+
$conf = Mage::getModel("catalog/product_type_configurable")->setProduct($_product);
|
177 |
+
$simpleCollection = $conf->getUsedProductCollection()->addAttributeToSelect("*")->addFilterByRequiredOptions();
|
178 |
+
|
179 |
+
$productArray = array();
|
180 |
+
|
181 |
+
foreach ($simpleCollection as $_childproduct) {
|
182 |
+
$productDict = array(
|
183 |
+
"ID" => $this->getId($_product, $_childproduct),
|
184 |
+
"Item title" => $this->getTitle($_product),
|
185 |
+
"Final URL" => $this->getProductUrl($_product),
|
186 |
+
"Image URL" => $this->getImageUrl($_childproduct),
|
187 |
+
"Item description" => $this->getDescription($_product),
|
188 |
+
"Price" => $this->getPrice($_childproduct, true),
|
189 |
+
"Sale price" => $this->getSalePrice($_childproduct, true),
|
190 |
+
);
|
191 |
+
array_push($productArray, $productDict);
|
192 |
+
}
|
193 |
+
return $productArray;
|
194 |
+
}
|
195 |
+
|
196 |
+
/**
|
197 |
+
* @param $_product
|
198 |
+
* @param XMLWriter $xmlWriter
|
199 |
+
*/
|
200 |
+
private function getSimpleProductDict($_product)
|
201 |
+
{
|
202 |
+
$productDict = array(
|
203 |
+
"ID" => $this->getId($_product, null),
|
204 |
+
"Item title" => $this->getTitle($_product),
|
205 |
+
"Final URL" => $this->getProductUrl($_product),
|
206 |
+
"Image URL" => $this->getImageUrl($_product),
|
207 |
+
"Item description" => $this->getDescription($_product),
|
208 |
+
"Price" => $this->getPrice($_product, true),
|
209 |
+
"Sale price" => $this->getSalePrice($_product, true),
|
210 |
+
);
|
211 |
+
return $productDict;
|
212 |
+
}
|
213 |
+
|
214 |
+
/**
|
215 |
+
* Feed generation function
|
216 |
+
*/
|
217 |
+
private function generateAndSaveFeedXML($products, $io) {
|
218 |
+
// debug variables
|
219 |
+
$limitEnabled = false;
|
220 |
+
$simpleProductsCount = 0;
|
221 |
+
$configurableProductsCount = 0;
|
222 |
+
$simpleProductsLimit = 1;
|
223 |
+
$configurableProductsLimit = 0;
|
224 |
+
|
225 |
+
$xmlWriter = new XMLWriter();
|
226 |
+
$xmlWriter->openMemory();
|
227 |
+
$xmlWriter->startDocument("1.0", "UTF-8");
|
228 |
+
$xmlWriter->setIndent(true);
|
229 |
+
|
230 |
+
$xmlWriter->startElement("rss");
|
231 |
+
$xmlWriter->writeAttribute("version", "2.0");
|
232 |
+
$xmlWriter->writeAttributeNs("xmlns", "g", null, "http://base.google.com/ns/1.0");
|
233 |
+
$xmlWriter->startElement("channel");
|
234 |
+
$xmlWriter->writeElement("title", "ROI Hunter Easy - Magento data feed");
|
235 |
+
$xmlWriter->writeElement("description", "Magento data feed used in Google Merchants");
|
236 |
+
$xmlWriter->writeElement("link", Mage::app()->getStore()->getBaseUrl());
|
237 |
+
|
238 |
+
$this->count = 0;
|
239 |
+
foreach ($products as $_product) {
|
240 |
+
|
241 |
+
switch ($_product->getTypeId()) {
|
242 |
+
case "downloadable":
|
243 |
+
if ($_product->getPrice() <= 0) {
|
244 |
+
break;
|
245 |
+
}
|
246 |
+
// Else same processing as simple product
|
247 |
+
case "simple":
|
248 |
+
if (!$limitEnabled || $simpleProductsCount < $simpleProductsLimit) {
|
249 |
+
$this->writeSimpleProductXML($_product, $xmlWriter);
|
250 |
+
$simpleProductsCount++;
|
251 |
+
}
|
252 |
+
break;
|
253 |
+
case "configurable":
|
254 |
+
if (!$limitEnabled || $configurableProductsCount < $configurableProductsLimit) {
|
255 |
+
$this->writeConfigurableProductXML($_product, $xmlWriter);
|
256 |
+
$configurableProductsCount++;
|
257 |
+
}
|
258 |
+
break;
|
259 |
+
}
|
260 |
+
if ($limitEnabled && $simpleProductsCount >= $simpleProductsLimit && $configurableProductsCount >= $configurableProductsLimit) {
|
261 |
+
break;
|
262 |
+
}
|
263 |
+
|
264 |
+
$this->count++;
|
265 |
+
if ($this->count >= 512) {
|
266 |
+
$this->count = 0;
|
267 |
+
// After each 512 products flush memory to file.
|
268 |
+
$io->streamWrite($xmlWriter->flush());
|
269 |
+
}
|
270 |
+
}
|
271 |
+
|
272 |
+
$xmlWriter->endElement();
|
273 |
+
$xmlWriter->endElement();
|
274 |
+
$xmlWriter->endDocument();
|
275 |
+
|
276 |
+
// Final memory flush, rename temporary file and feed is done.
|
277 |
+
$io->streamWrite($xmlWriter->flush());
|
278 |
+
}
|
279 |
+
|
280 |
public function getProductCollection()
|
281 |
{
|
282 |
+
$collection = Mage::getModel("catalog/product")->getCollection();
|
283 |
|
284 |
// select necessary attributes
|
285 |
+
$collection->addAttributeToSelect("name");
|
286 |
+
$collection->addAttributeToSelect("short_description");
|
287 |
+
$collection->addAttributeToSelect("description");
|
288 |
+
$collection->addAttributeToSelect("price");
|
289 |
+
$collection->addAttributeToSelect("special_price");
|
290 |
+
$collection->addAttributeToSelect("size");
|
291 |
+
$collection->addAttributeToSelect("color");
|
292 |
+
$collection->addAttributeToSelect("pattern");
|
293 |
+
$collection->addAttributeToSelect("image");
|
294 |
|
295 |
// Allow only visible products
|
296 |
$visibility = array(
|
297 |
Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH,
|
298 |
Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_CATALOG
|
299 |
);
|
300 |
+
$collection->addAttributeToFilter("visibility", $visibility);
|
301 |
+
$collection->addAttributeToFilter("status", Mage_Catalog_Model_Product_Status::STATUS_ENABLED);
|
302 |
|
303 |
// setting correct Product URL
|
304 |
$collection->addUrlRewrite();
|
306 |
->getDefaultStoreView()
|
307 |
->getStoreId();
|
308 |
$collection->setStoreId($storeId);
|
309 |
+
// adding website filter removes products unavailable in the store on the frontend
|
310 |
+
$collection->addStoreFilter($storeId);
|
311 |
Mage::app()->setCurrentStore($storeId);
|
312 |
|
313 |
$collection->load();
|
314 |
|
315 |
+
Mage::log("Default store ID: " . $storeId, null, "cron.log");
|
316 |
|
317 |
return $collection;
|
318 |
}
|
319 |
|
320 |
+
/**
|
321 |
+
* @param Mixed $_product
|
322 |
+
* @param XMLWriter $xmlWriter
|
323 |
+
*/
|
324 |
+
private function writeConfigurableProductXML($_product, $xmlWriter)
|
325 |
+
{
|
326 |
+
$catCollection = $this->getProductTypes($_product);
|
327 |
+
|
328 |
+
$conf = Mage::getModel("catalog/product_type_configurable")->setProduct($_product);
|
329 |
+
$simpleCollection = $conf->getUsedProductCollection()->addAttributeToSelect("*")->addFilterByRequiredOptions();
|
330 |
+
|
331 |
+
foreach ($simpleCollection as $_childproduct) {
|
332 |
+
$xmlWriter->startElement("item");
|
333 |
+
|
334 |
+
// ID belongs to the child product"s ID to make this product unique
|
335 |
+
$xmlWriter->writeElement("g:id", $this->getId($_product, $_childproduct));
|
336 |
+
$xmlWriter->writeElement("g:item_group_id", $this->getItemGroupId($_product));
|
337 |
+
$xmlWriter->writeElement("g:display_ads_id", $this->getDisplayAdsId($_product, $_childproduct));
|
338 |
+
|
339 |
+
// process common attributes
|
340 |
+
$this->writeParentProductAttributesXML($_product, $xmlWriter);
|
341 |
+
// process advanced attributes
|
342 |
+
$this->writeChildProductAttributesXML($_childproduct, $xmlWriter);
|
343 |
+
// categories
|
344 |
+
$this->writeProductTypesXml($catCollection, $xmlWriter);
|
345 |
+
|
346 |
+
$xmlWriter->endElement();
|
347 |
+
}
|
348 |
+
}
|
349 |
+
|
350 |
/**
|
351 |
* @param $_product
|
352 |
* @param XMLWriter $xmlWriter
|
353 |
*/
|
354 |
+
private function writeSimpleProductXML($_product, $xmlWriter)
|
355 |
{
|
356 |
+
$xmlWriter->startElement("item");
|
357 |
|
358 |
+
// ID belongs to the simple product"s SKU
|
359 |
+
$xmlWriter->writeElement("g:id", $this->getId($_product, null));
|
360 |
+
$xmlWriter->writeElement("g:display_ads_id", $this->getDisplayAdsId($_product, null));
|
361 |
|
362 |
// process common attributes
|
363 |
+
$this->writeParentProductAttributesXML($_product, $xmlWriter);
|
364 |
// process advanced attributes
|
365 |
+
$this->writeChildProductAttributesXML($_product, $xmlWriter);
|
366 |
// categories
|
367 |
+
$catCollection = $this->getProductTypes($_product);
|
368 |
+
$this->writeProductTypesXml($catCollection, $xmlWriter);
|
369 |
|
370 |
$xmlWriter->endElement();
|
371 |
}
|
374 |
* @param Mixed $_product
|
375 |
* @param XMLWriter $xmlWriter
|
376 |
*/
|
377 |
+
function writeParentProductAttributesXML($_product, $xmlWriter)
|
378 |
{
|
379 |
+
$xmlWriter->writeElement("g:title", $this->getTitle($_product));
|
380 |
+
$xmlWriter->writeElement("g:description", $this->getDescription($_product));
|
381 |
// Product URL
|
382 |
+
// $_product->getData("request_path") can return product handle like - aviator-sunglasses.html
|
383 |
+
$xmlWriter->writeElement("g:link", $this->getProductUrl($_product));
|
384 |
|
385 |
// replaced getAttributeText with safer option
|
386 |
+
$attributeCode = "manufacturer";
|
387 |
if ($_product->getData($attributeCode) !== null){
|
388 |
+
$xmlWriter->writeElement("g:brand", $_product->getAttributeText($attributeCode));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
389 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
390 |
|
391 |
+
$xmlWriter->writeElement("g:condition", "new");
|
392 |
}
|
393 |
|
394 |
/**
|
395 |
* @param Mixed $_product
|
396 |
* @param XMLWriter $xmlWriter
|
397 |
*/
|
398 |
+
function writeChildProductAttributesXML($_product, $xmlWriter)
|
399 |
{
|
400 |
+
$xmlWriter->writeElement("g:image_link", $this->getImageUrl($_product));
|
401 |
|
402 |
+
// $this->_logger->debug("gtin: " . $_product->getEan());
|
403 |
+
$xmlWriter->writeElement("g:mpn", $_product->getSku());
|
404 |
if (strlen($_product->getEan()) > 7) {
|
405 |
+
$xmlWriter->writeElement("g:gtin", $_product->getEan());
|
406 |
}
|
407 |
|
408 |
+
$xmlWriter->writeElement("g:price", $this->getPrice($_product));
|
409 |
+
$xmlWriter->writeElement("g:sale_price", $this->getSalePrice($_product));
|
410 |
// replaced getAttributeText with safer option
|
411 |
+
$attributeCode = "color";
|
412 |
if ($_product->getData($attributeCode) !== null){
|
413 |
+
$xmlWriter->writeElement("g:color", $_product->getAttributeText($attributeCode));
|
414 |
}
|
415 |
// replaced getAttributeText with safer option
|
416 |
+
$attributeCode = "size";
|
417 |
if ($_product->getData($attributeCode) !== null){
|
418 |
+
$xmlWriter->writeElement("g:size", $_product->getAttributeText($attributeCode));
|
419 |
}
|
420 |
|
421 |
+
$xmlWriter->writeElement("g:availability", $this->doIsInStock($_product));
|
422 |
+
}
|
423 |
+
|
424 |
+
/**
|
425 |
+
* @param Mixed $catCollection
|
426 |
+
* @param XMLWriter $xmlWriter
|
427 |
+
*/
|
428 |
+
function writeProductTypesXML($catCollection, $xmlWriter)
|
429 |
+
{
|
430 |
+
/** @var Mixed $category */
|
431 |
+
foreach ($catCollection as $category) {
|
432 |
+
$xmlWriter->writeElement("g:product_type", $category->getName());
|
433 |
+
}
|
434 |
}
|
435 |
|
436 |
/**
|
437 |
* @param Mixed $_product
|
438 |
* @return string
|
439 |
*/
|
440 |
+
function doIsInStock($_product)
|
441 |
{
|
442 |
$stockItem = $_product->getStockItem();
|
443 |
if($stockItem->getIsInStock())
|
444 |
{
|
445 |
+
$stockval = "in stock";
|
446 |
}
|
447 |
else
|
448 |
{
|
449 |
+
$stockval = "out of stock";
|
450 |
}
|
451 |
|
452 |
return $stockval;
|
453 |
}
|
454 |
|
455 |
/**
|
456 |
+
* @param Mixed $_product
|
457 |
+
* @return mixed
|
458 |
*/
|
459 |
+
function getProductTypes($_product)
|
460 |
{
|
461 |
+
// SELECT name FROM category
|
462 |
+
// if I want to load more attributes, I need to select them first
|
463 |
+
// loading and selecting is processor intensive! Selecting more attributes will result in longer delay!
|
464 |
+
return $_product->getCategoryCollection()->addAttributeToSelect("name")->load();
|
465 |
+
}
|
466 |
+
|
467 |
+
/**
|
468 |
+
* @param Mixed $product
|
469 |
+
* @return string price
|
470 |
+
*/
|
471 |
+
function getProductUrl($product)
|
472 |
+
{
|
473 |
+
return $product->getUrlInStore();
|
474 |
+
}
|
475 |
+
|
476 |
+
/**
|
477 |
+
* @param Mixed $product
|
478 |
+
* @return string price
|
479 |
+
*/
|
480 |
+
function getCurrency()
|
481 |
+
{
|
482 |
+
return $currentCurrencyCode = Mage::app()->getStore()->getCurrentCurrencyCode();
|
483 |
+
}
|
484 |
+
|
485 |
+
/**
|
486 |
+
* @param Mixed $product
|
487 |
+
* @return string price
|
488 |
+
*/
|
489 |
+
function getSalePrice($product, $withCurrency=false)
|
490 |
+
{
|
491 |
+
$price = $product->getFinalPrice();
|
492 |
+
|
493 |
+
if ($price && $withCurrency) {
|
494 |
+
$price = $price." ".$this->getCurrency();
|
495 |
}
|
496 |
+
|
497 |
+
return $price;
|
498 |
}
|
499 |
|
500 |
/**
|
501 |
+
* @param Mixed $product
|
502 |
+
* @return string price
|
503 |
*/
|
504 |
+
function getPrice($product, $withCurrency=false)
|
505 |
{
|
506 |
+
$price = $product->getPrice();
|
507 |
+
|
508 |
+
if ($withCurrency) {
|
509 |
+
$price = $price." ".$this->getCurrency();
|
510 |
+
}
|
511 |
+
|
512 |
+
return $price;
|
513 |
}
|
514 |
|
515 |
/**
|
516 |
+
* @param Mixed $product
|
517 |
+
* @return string item_group_id
|
518 |
+
*/
|
519 |
+
function getItemGroupId($product)
|
520 |
+
{
|
521 |
+
return "mag_".$product->getId();
|
522 |
+
}
|
523 |
+
|
524 |
+
/**
|
525 |
+
* @param Mixed $product
|
526 |
+
* @return string display_ads_id
|
527 |
*/
|
528 |
+
function getDisplayAdsId($product, $childproduct=null)
|
529 |
{
|
530 |
+
if ($childproduct) {
|
531 |
+
return "mag_".$product->getId()."_".$childproduct->getId();
|
532 |
+
}
|
533 |
+
else {
|
534 |
+
return "mag_".$product->getId();
|
535 |
+
}
|
536 |
+
}
|
537 |
|
538 |
+
/**
|
539 |
+
* @param Mixed $product
|
540 |
+
* @return string id
|
541 |
+
*/
|
542 |
+
function getId($product, $childproduct=null)
|
543 |
+
{
|
544 |
+
if ($childproduct) {
|
545 |
+
return "mag_".$product->getId()."_".$childproduct->getId();
|
546 |
+
}
|
547 |
+
else {
|
548 |
+
return "mag_".$product->getId();
|
549 |
+
}
|
550 |
+
}
|
551 |
|
552 |
+
/**
|
553 |
+
* @param Mixed $product
|
554 |
+
* @return string title
|
555 |
+
*/
|
556 |
+
function getTitle($product)
|
557 |
+
{
|
558 |
+
return $product->getName();
|
559 |
+
}
|
560 |
|
561 |
+
/**
|
562 |
+
* @param Mixed $product
|
563 |
+
* @return string description
|
564 |
+
*/
|
565 |
+
function getDescription($product)
|
566 |
+
{
|
567 |
+
$description = $product->getShortDescription();
|
568 |
+
if (!$description) {
|
569 |
+
$description = $product->getDescription();
|
570 |
+
}
|
571 |
+
return $description;
|
572 |
+
}
|
573 |
|
574 |
+
/**
|
575 |
+
* @param Mixed $product
|
576 |
+
* @return string image URL
|
577 |
+
*/
|
578 |
+
function getImageUrl($product)
|
579 |
+
{
|
580 |
+
$imageUrl = null;
|
581 |
|
582 |
+
// try to retrieve base image URL
|
583 |
+
if ($product->getImage() != "no_selection" && $product->getImage()){
|
584 |
+
$productMediaConfig = Mage::getModel("catalog/product_media_config");
|
585 |
+
$imageUrl = $productMediaConfig->getMediaUrl($product->getImage());
|
586 |
+
}
|
587 |
+
// retrieve cached image URL
|
588 |
+
else {
|
589 |
+
$imageUrl = Mage::helper("catalog/image")->init($product, "image");
|
590 |
}
|
591 |
+
|
592 |
+
return $imageUrl;
|
593 |
}
|
594 |
}
|
app/code/community/Businessfactory/Roihuntereasy/controllers/CronController.php
CHANGED
@@ -4,10 +4,16 @@ class Businessfactory_Roihuntereasy_CronController extends Mage_Core_Controller_
|
|
4 |
{
|
5 |
protected $cron;
|
6 |
|
|
|
|
|
7 |
public function _construct()
|
8 |
{
|
9 |
parent::_construct();
|
10 |
$this->cron = new Businessfactory_Roihuntereasy_Model_Cron();
|
|
|
|
|
|
|
|
|
11 |
}
|
12 |
|
13 |
/**
|
@@ -39,16 +45,15 @@ class Businessfactory_Roihuntereasy_CronController extends Mage_Core_Controller_
|
|
39 |
return;
|
40 |
}
|
41 |
|
42 |
-
|
43 |
-
$resultCode = $this->cron->createFeed();
|
44 |
if($resultCode == true){
|
45 |
-
$response->setBody(json_encode('
|
46 |
} else {
|
47 |
-
$response->setBody(json_encode('
|
48 |
}
|
49 |
} catch (Exception $exception) {
|
50 |
Mage::log(__METHOD__ . " exception.", null, 'errors.log');
|
51 |
-
Mage::log($exception, null, 'errors.log');
|
52 |
Mage::log($request, null, 'errors.log');
|
53 |
$response->setHttpResponseCode(500);
|
54 |
$response->setBody(json_encode('Feed generation failed.'));
|
@@ -93,27 +98,28 @@ class Businessfactory_Roihuntereasy_CronController extends Mage_Core_Controller_
|
|
93 |
}
|
94 |
}
|
95 |
|
96 |
-
|
97 |
-
$
|
98 |
-
|
|
|
|
|
99 |
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
|
|
107 |
}
|
108 |
|
109 |
-
|
110 |
-
|
111 |
-
Mage::log("Cron generating started manually.", null, 'cron.log');
|
112 |
-
$resultCode = $this->cron->createFeed();
|
113 |
if($resultCode == true){
|
114 |
-
$response->setBody(json_encode('
|
115 |
} else {
|
116 |
-
$response->setBody(json_encode('
|
117 |
}
|
118 |
} catch (Exception $exception) {
|
119 |
Mage::log(__METHOD__ . " exception.", null, 'errors.log');
|
@@ -129,5 +135,14 @@ class Businessfactory_Roihuntereasy_CronController extends Mage_Core_Controller_
|
|
129 |
}
|
130 |
}
|
131 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
132 |
}
|
133 |
|
4 |
{
|
5 |
protected $cron;
|
6 |
|
7 |
+
protected $supportedFileFormats;
|
8 |
+
|
9 |
public function _construct()
|
10 |
{
|
11 |
parent::_construct();
|
12 |
$this->cron = new Businessfactory_Roihuntereasy_Model_Cron();
|
13 |
+
$this->supportedFileFormats = array(
|
14 |
+
"xml",
|
15 |
+
"csv"
|
16 |
+
);
|
17 |
}
|
18 |
|
19 |
/**
|
45 |
return;
|
46 |
}
|
47 |
|
48 |
+
$resultCode = $this->generateSupportedFeeds();
|
|
|
49 |
if($resultCode == true){
|
50 |
+
$response->setBody(json_encode('Feeds generated.'));
|
51 |
} else {
|
52 |
+
$response->setBody(json_encode('One or more feeds not generated. See logs for more info.'));
|
53 |
}
|
54 |
} catch (Exception $exception) {
|
55 |
Mage::log(__METHOD__ . " exception.", null, 'errors.log');
|
56 |
+
Mage::log($exception->getMessage(), null, 'errors.log');
|
57 |
Mage::log($request, null, 'errors.log');
|
58 |
$response->setHttpResponseCode(500);
|
59 |
$response->setBody(json_encode('Feed generation failed.'));
|
98 |
}
|
99 |
}
|
100 |
|
101 |
+
// remove file locks
|
102 |
+
foreach ($this->supportedFileFormats as $fileFormat) {
|
103 |
+
$filename = "businessFactoryRoiHunterEasyFeedSign".$fileFormat;
|
104 |
+
$io = new Varien_Io_File();
|
105 |
+
$io->open(array('path' => Mage::getBaseDir()));
|
106 |
|
107 |
+
if (!$io->fileExists($filename)) {
|
108 |
+
$response->setBody(json_encode("Reset already completed."));
|
109 |
+
}
|
110 |
+
else {
|
111 |
+
// try to delete feed generation sign.
|
112 |
+
$io->rm($filename);
|
113 |
+
$response->setBody(json_encode("Reset completed."));
|
114 |
+
}
|
115 |
}
|
116 |
|
117 |
+
// regenerate feeds
|
118 |
+
$resultCode = $this->generateSupportedFeeds();
|
|
|
|
|
119 |
if($resultCode == true){
|
120 |
+
$response->setBody(json_encode('Feeds generated.'));
|
121 |
} else {
|
122 |
+
$response->setBody(json_encode('One or more feeds not generated. See logs for more info.'));
|
123 |
}
|
124 |
} catch (Exception $exception) {
|
125 |
Mage::log(__METHOD__ . " exception.", null, 'errors.log');
|
135 |
}
|
136 |
}
|
137 |
|
138 |
+
protected function generateSupportedFeeds() {
|
139 |
+
$resultCode = true;
|
140 |
+
foreach ($this->supportedFileFormats as $fileFormat) {
|
141 |
+
Mage::log("Cron generating started manually for file format: " . $fileFormat, null, 'cron.log');
|
142 |
+
$resultCode = $resultCode && $this->cron->createFeed($fileFormat);
|
143 |
+
}
|
144 |
+
return $resultCode;
|
145 |
+
}
|
146 |
+
|
147 |
}
|
148 |
|
app/code/community/Businessfactory/Roihuntereasy/controllers/FeedController.php
CHANGED
@@ -7,7 +7,11 @@ class Businessfactory_Roihuntereasy_FeedController extends Mage_Core_Controller_
|
|
7 |
Mage::log("Get product feed called.", null, 'feed.log');
|
8 |
|
9 |
try {
|
10 |
-
$
|
|
|
|
|
|
|
|
|
11 |
|
12 |
if (file_exists($file)) {
|
13 |
header('Content-Description: File Transfer');
|
7 |
Mage::log("Get product feed called.", null, 'feed.log');
|
8 |
|
9 |
try {
|
10 |
+
$format = $this->getRequest()->getParam("format");
|
11 |
+
if (!isset($format) || trim($format)==='') {
|
12 |
+
$format = "xml";
|
13 |
+
}
|
14 |
+
$file = "feeds/roi_hunter_easy_feed_final." . $format;
|
15 |
|
16 |
if (file_exists($file)) {
|
17 |
header('Content-Description: File Transfer');
|
app/code/community/Businessfactory/Roihuntereasy/controllers/StoredetailsController.php
CHANGED
@@ -8,6 +8,14 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
8 |
$this->renderLayout();
|
9 |
}
|
10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
/**
|
12 |
* http://store.com/roihuntereasy/storedetails/check
|
13 |
*/
|
@@ -15,14 +23,8 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
15 |
{
|
16 |
Mage::log(__METHOD__ . "- Check called.");
|
17 |
|
18 |
-
$request = $this->getRequest();
|
19 |
$response = $this->getResponse();
|
20 |
-
|
21 |
-
$response->setHeader('Content-type', 'application/json');
|
22 |
-
$response->setHeader('Access-Control-Allow-Origin', '*', true);
|
23 |
-
$response->setHeader('Access-Control-Allow-Methods', 'OPTIONS,GET,POST', true);
|
24 |
-
$response->setHeader('Access-Control-Max-Age', '60', true);
|
25 |
-
$response->setHeader('Access-Control-Allow-Headers', 'X-Authorization', true);
|
26 |
|
27 |
$response->setBody(json_encode("rh-easy-active."));
|
28 |
}
|
@@ -36,14 +38,9 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
36 |
|
37 |
$request = $this->getRequest();
|
38 |
$response = $this->getResponse();
|
|
|
39 |
|
40 |
-
$
|
41 |
-
$response->setHeader('Access-Control-Allow-Origin', '*', true);
|
42 |
-
$response->setHeader('Access-Control-Allow-Methods', 'OPTIONS,GET,POST', true);
|
43 |
-
$response->setHeader('Access-Control-Max-Age', '60', true);
|
44 |
-
$response->setHeader('Access-Control-Allow-Headers', 'X-Authorization', true);
|
45 |
-
|
46 |
-
if ($request->getMethod() === 'GET') {
|
47 |
$this->processDebugGET();
|
48 |
}
|
49 |
}
|
@@ -60,9 +57,9 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
60 |
|
61 |
try {
|
62 |
// If table not empty, require authorization.
|
63 |
-
$mainItemCollection = Mage::getModel(
|
64 |
if ($mainItemCollection->count() > 0) {
|
65 |
-
$authorizationHeader = $this->getRequest()->getHeader(
|
66 |
$dataEntity = $mainItemCollection->getLastItem();
|
67 |
// If data exist check for client token.
|
68 |
if ($dataEntity->getClientToken() != null && $dataEntity->getClientToken() !== $authorizationHeader) {
|
@@ -73,16 +70,16 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
73 |
}
|
74 |
|
75 |
$resultData = $_SERVER;
|
76 |
-
$resultData[
|
77 |
-
$resultData[
|
78 |
-
$resultData[
|
79 |
-
$resultData[
|
80 |
|
81 |
$response->setBody(json_encode($resultData));
|
82 |
} catch (Exception $exception) {
|
83 |
-
Mage::log(__METHOD__ . " exception.", null,
|
84 |
-
Mage::log($exception, null,
|
85 |
-
Mage::log($request, null,
|
86 |
$response->setHttpResponseCode(500);
|
87 |
}
|
88 |
}
|
@@ -92,18 +89,13 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
92 |
*/
|
93 |
public function logsAction()
|
94 |
{
|
95 |
-
Mage::log(__METHOD__ . "- Debug called.",
|
96 |
|
97 |
$request = $this->getRequest();
|
98 |
$response = $this->getResponse();
|
|
|
99 |
|
100 |
-
$
|
101 |
-
$response->setHeader('Access-Control-Allow-Origin', '*', true);
|
102 |
-
$response->setHeader('Access-Control-Allow-Methods', 'OPTIONS,GET,POST', true);
|
103 |
-
$response->setHeader('Access-Control-Max-Age', '60', true);
|
104 |
-
$response->setHeader('Access-Control-Allow-Headers', 'X-Authorization', true);
|
105 |
-
|
106 |
-
if ($request->getMethod() === 'GET') {
|
107 |
$this->processLogsGET();
|
108 |
}
|
109 |
}
|
@@ -120,9 +112,9 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
120 |
|
121 |
try {
|
122 |
// If table not empty, require authorization.
|
123 |
-
$mainItemCollection = Mage::getModel(
|
124 |
if ($mainItemCollection->count() > 0) {
|
125 |
-
$authorizationHeader = $this->getRequest()->getHeader(
|
126 |
$dataEntity = $mainItemCollection->getLastItem();
|
127 |
// If data exist check for client token.
|
128 |
if ($dataEntity->getClientToken() != null && $dataEntity->getClientToken() !== $authorizationHeader) {
|
@@ -133,8 +125,8 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
133 |
}
|
134 |
|
135 |
$zipFilename = "all_logs.zip";
|
136 |
-
$rootPath = Mage::getBaseDir(
|
137 |
-
$zipAbsolutePath = $rootPath .
|
138 |
|
139 |
|
140 |
$zip = new ZipArchive();
|
@@ -154,35 +146,35 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
154 |
|
155 |
foreach ($files as $name => $file) {
|
156 |
// Skip directories (they would be added automatically)
|
157 |
-
if (!$file->isDir() && strpos($file->getFilename(),
|
158 |
// Get real and relative path for current file
|
159 |
$filePath = $file->getRealPath();
|
160 |
$relativePath = substr($filePath, strlen($rootPath));
|
161 |
// Add current file to archive
|
162 |
if ($zip->addFile($filePath, $relativePath) !== true) {
|
163 |
-
Mage::log("cannot add file to zip", null,
|
164 |
$response->setBody("cannot add file to zip");
|
165 |
return;
|
166 |
}
|
167 |
else {
|
168 |
-
Mage::log("added file to zip", null,
|
169 |
}
|
170 |
}
|
171 |
}
|
172 |
// Zip archive will be created only after closing object
|
173 |
$zip->close();
|
174 |
|
175 |
-
header(
|
176 |
-
header(
|
177 |
-
header(
|
178 |
-
header(
|
179 |
-
header(
|
180 |
-
header(
|
181 |
readfile($zipAbsolutePath);
|
182 |
} catch (Exception $exception) {
|
183 |
-
Mage::log(__METHOD__ . " exception.", null,
|
184 |
-
Mage::log($exception, null,
|
185 |
-
Mage::log($request, null,
|
186 |
$response->setHttpResponseCode(500);
|
187 |
}
|
188 |
}
|
@@ -194,16 +186,11 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
194 |
{
|
195 |
$request = $this->getRequest();
|
196 |
$response = $this->getResponse();
|
|
|
197 |
|
198 |
-
$
|
199 |
-
$response->setHeader('Access-Control-Allow-Origin', '*', true);
|
200 |
-
$response->setHeader('Access-Control-Allow-Methods', 'OPTIONS,GET,POST', true);
|
201 |
-
$response->setHeader('Access-Control-Max-Age', '60', true);
|
202 |
-
$response->setHeader('Access-Control-Allow-Headers', 'X-Authorization', true);
|
203 |
-
|
204 |
-
if ($request->getMethod() === 'GET') {
|
205 |
$this->processStateGET();
|
206 |
-
} else if ($request->getMethod() ===
|
207 |
$this->processStatePOST();
|
208 |
}
|
209 |
}
|
@@ -220,7 +207,7 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
220 |
$response = $this->getResponse();
|
221 |
|
222 |
try {
|
223 |
-
$mainItemCollection = Mage::getModel(
|
224 |
// If table empty, then create new item.
|
225 |
if ($mainItemCollection->count() <= 0) {
|
226 |
$response->setBody(json_encode("Entry not exist."));
|
@@ -229,9 +216,9 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
229 |
$response->setBody(json_encode($mainItemCollection->getLastItem()->getCreationState()));
|
230 |
}
|
231 |
} catch (Exception $exception) {
|
232 |
-
Mage::log(__METHOD__ . " exception.", null,
|
233 |
-
Mage::log($exception, null,
|
234 |
-
Mage::log($request, null,
|
235 |
$response->setHttpResponseCode(500);
|
236 |
}
|
237 |
}
|
@@ -250,8 +237,8 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
250 |
try {
|
251 |
// Get request params
|
252 |
$requestData = $request->getParams();
|
253 |
-
$authorizationHeader = $request->getHeader(
|
254 |
-
$newCreationState = $request->getParam(
|
255 |
|
256 |
if ($newCreationState === NULL) {
|
257 |
$response->setBody(json_encode("Missing parameter."));
|
@@ -259,12 +246,12 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
259 |
return;
|
260 |
} else {
|
261 |
// Prepare database item. If table empty, then create new item.
|
262 |
-
$mainItemCollection = Mage::getModel(
|
263 |
if ($mainItemCollection->count() <= 0) {
|
264 |
-
$dataEntity = Mage::getModel(
|
265 |
$dataEntity->setDescription("New");
|
266 |
} else {
|
267 |
-
$dataEntity = Mage::getModel(
|
268 |
$dataEntity->setDescription("Updated");
|
269 |
|
270 |
// If data already exist check for client token.
|
@@ -284,9 +271,9 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
284 |
)));
|
285 |
}
|
286 |
} catch (Exception $exception) {
|
287 |
-
Mage::log(__METHOD__ . " exception.", null,
|
288 |
-
Mage::log($exception, null,
|
289 |
-
Mage::log($request, null,
|
290 |
$response->setHttpResponseCode(500);
|
291 |
}
|
292 |
}
|
@@ -298,16 +285,11 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
298 |
{
|
299 |
$request = $this->getRequest();
|
300 |
$response = $this->getResponse();
|
|
|
301 |
|
302 |
-
$
|
303 |
-
$response->setHeader('Access-Control-Allow-Origin', '*', true);
|
304 |
-
$response->setHeader('Access-Control-Allow-Methods', 'OPTIONS,GET,POST', true);
|
305 |
-
$response->setHeader('Access-Control-Max-Age', '60', true);
|
306 |
-
$response->setHeader('Access-Control-Allow-Headers', 'X-Authorization', true);
|
307 |
-
|
308 |
-
if ($request->getMethod() === 'GET') {
|
309 |
$this->processAddGET();
|
310 |
-
} else if ($request->getMethod() ===
|
311 |
$this->processAddPOST();
|
312 |
}
|
313 |
}
|
@@ -324,8 +306,8 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
324 |
$response = $this->getResponse();
|
325 |
|
326 |
try {
|
327 |
-
$mainItemCollection = Mage::getModel(
|
328 |
-
$authorizationHeader = $this->getRequest()->getHeader(
|
329 |
|
330 |
// If table empty, then create new item.
|
331 |
if ($mainItemCollection->count() <= 0) {
|
@@ -342,9 +324,9 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
342 |
$response->setBody(json_encode($dataEntity->getData()));
|
343 |
}
|
344 |
} catch (Exception $exception) {
|
345 |
-
Mage::log(__METHOD__ . " exception.", null,
|
346 |
-
Mage::log($exception, null,
|
347 |
-
Mage::log($request, null,
|
348 |
$response->setHttpResponseCode(500);
|
349 |
}
|
350 |
}
|
@@ -363,18 +345,18 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
363 |
try {
|
364 |
// Get request params
|
365 |
$requestData = $request->getParams();
|
366 |
-
Mage::log("Process add request with data: ", null,
|
367 |
-
Mage::log($requestData, null,
|
368 |
|
369 |
-
$authorizationHeader = $request->getHeader(
|
370 |
|
371 |
// Prepare database item. If table empty, then create new item.
|
372 |
-
$mainItemCollection = Mage::getModel(
|
373 |
if ($mainItemCollection->count() <= 0) {
|
374 |
-
$dataEntity = Mage::getModel(
|
375 |
$dataEntity->setDescription("New");
|
376 |
} else {
|
377 |
-
$dataEntity = Mage::getModel(
|
378 |
$dataEntity->setDescription("Updated");
|
379 |
|
380 |
// If data already exist check for client token.
|
@@ -387,7 +369,7 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
387 |
|
388 |
// Save clientToken only if not exist
|
389 |
if ($dataEntity->getClientToken() == NULL) {
|
390 |
-
$client_token = $request->getParam(
|
391 |
if ($client_token == NULL) {
|
392 |
$response->setBody(json_encode("Missing client token"));
|
393 |
$response->setHttpResponseCode(422);
|
@@ -399,7 +381,7 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
399 |
|
400 |
// Save AccessToken only if not exist
|
401 |
if ($dataEntity->getAccessToken() == NULL) {
|
402 |
-
$goostav_access_token = $request->getParam(
|
403 |
if ($goostav_access_token == NULL) {
|
404 |
$response->setBody(json_encode("Missing tokens"));
|
405 |
$response->setHttpResponseCode(422);
|
@@ -411,32 +393,34 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
411 |
|
412 |
|
413 |
// Save status and errors if something failed
|
414 |
-
$status = $request->getParam(
|
415 |
if ($status != NULL) $dataEntity->setStatus($status);
|
416 |
-
$errors = $request->getParam(
|
417 |
if ($errors != NULL) $dataEntity->setErrors($errors);
|
418 |
|
419 |
|
420 |
// Save customer id
|
421 |
-
$customerId = $request->getParam(
|
422 |
if ($customerId != NULL) $dataEntity->setCustomerId($customerId);
|
423 |
// Save conversion id
|
424 |
-
$conversionId = $request->getParam(
|
425 |
if ($conversionId != NULL) $dataEntity->setConversionId($conversionId);
|
426 |
|
427 |
// Set managed merchants
|
428 |
-
$managedMerchants = $request->getParam(
|
429 |
-
if ($managedMerchants !== NULL) $dataEntity->setManagedMerchants($managedMerchants ===
|
430 |
// Set adult content
|
431 |
-
$adultOriented = $request->getParam(
|
432 |
-
if ($adultOriented !== NULL) $dataEntity->setAdultOriented($adultOriented ===
|
433 |
-
|
|
|
|
|
434 |
|
435 |
// Persist data
|
436 |
$dataEntity->save();
|
437 |
|
438 |
// Create verification file
|
439 |
-
$filename = $request->getParam(
|
440 |
$this->createVerificationFile($filename);
|
441 |
|
442 |
// Return response
|
@@ -444,9 +428,9 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
444 |
"data" => $requestData
|
445 |
)));
|
446 |
} catch (Exception $exception) {
|
447 |
-
Mage::log(__METHOD__ . " exception.", null,
|
448 |
-
Mage::log($exception, null,
|
449 |
-
Mage::log($request, null,
|
450 |
$response->setHttpResponseCode(500);
|
451 |
}
|
452 |
}
|
@@ -463,7 +447,7 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
463 |
// Apache
|
464 |
$io = new Varien_Io_File();
|
465 |
$io->setAllowCreateFolders(true);
|
466 |
-
$io->open(array(
|
467 |
|
468 |
if ($io->fileExists($filename)) {
|
469 |
$io->rm($filename);
|
@@ -476,11 +460,11 @@ class Businessfactory_Roihuntereasy_StoredetailsController extends Mage_Core_Con
|
|
476 |
// Nginx - check if it is necessary to create file in public folder
|
477 |
|
478 |
} else {
|
479 |
-
Mage::log(
|
480 |
}
|
481 |
} catch (Exception $exception) {
|
482 |
-
Mage::log(__METHOD__ . " exception.", null,
|
483 |
-
Mage::log($exception, null,
|
484 |
}
|
485 |
}
|
486 |
}
|
8 |
$this->renderLayout();
|
9 |
}
|
10 |
|
11 |
+
protected function setResponseHeaders(& $response) {
|
12 |
+
$response->setHeader("Content-type", "application/json");
|
13 |
+
$response->setHeader("Access-Control-Allow-Origin", "*", true);
|
14 |
+
$response->setHeader("Access-Control-Allow-Methods", "OPTIONS,GET,POST", true);
|
15 |
+
$response->setHeader("Access-Control-Max-Age", "60", true);
|
16 |
+
$response->setHeader("Access-Control-Allow-Headers", "X-Authorization", true);
|
17 |
+
}
|
18 |
+
|
19 |
/**
|
20 |
* http://store.com/roihuntereasy/storedetails/check
|
21 |
*/
|
23 |
{
|
24 |
Mage::log(__METHOD__ . "- Check called.");
|
25 |
|
|
|
26 |
$response = $this->getResponse();
|
27 |
+
$this->setResponseHeaders($response);
|
|
|
|
|
|
|
|
|
|
|
28 |
|
29 |
$response->setBody(json_encode("rh-easy-active."));
|
30 |
}
|
38 |
|
39 |
$request = $this->getRequest();
|
40 |
$response = $this->getResponse();
|
41 |
+
$this->setResponseHeaders($response);
|
42 |
|
43 |
+
if ($request->getMethod() === "GET") {
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
$this->processDebugGET();
|
45 |
}
|
46 |
}
|
57 |
|
58 |
try {
|
59 |
// If table not empty, require authorization.
|
60 |
+
$mainItemCollection = Mage::getModel("businessfactory_roihuntereasy/main")->getCollection();
|
61 |
if ($mainItemCollection->count() > 0) {
|
62 |
+
$authorizationHeader = $this->getRequest()->getHeader("X-Authorization");
|
63 |
$dataEntity = $mainItemCollection->getLastItem();
|
64 |
// If data exist check for client token.
|
65 |
if ($dataEntity->getClientToken() != null && $dataEntity->getClientToken() !== $authorizationHeader) {
|
70 |
}
|
71 |
|
72 |
$resultData = $_SERVER;
|
73 |
+
$resultData["Magento_Mode"] = Mage::getIsDeveloperMode() ? "developer" : "production";;
|
74 |
+
$resultData["PHP_Version"] = phpversion();
|
75 |
+
$resultData["Magento_Version"] = Mage::getVersion();
|
76 |
+
$resultData["ROI_Hunter_Easy_Version"] = (string) Mage::getConfig()->getNode()->modules->Businessfactory_Roihuntereasy->version;
|
77 |
|
78 |
$response->setBody(json_encode($resultData));
|
79 |
} catch (Exception $exception) {
|
80 |
+
Mage::log(__METHOD__ . " exception.", null, "errors.log");
|
81 |
+
Mage::log($exception, null, "errors.log");
|
82 |
+
Mage::log($request, null, "errors.log");
|
83 |
$response->setHttpResponseCode(500);
|
84 |
}
|
85 |
}
|
89 |
*/
|
90 |
public function logsAction()
|
91 |
{
|
92 |
+
Mage::log(__METHOD__ . "- Debug called.", "debug.log");
|
93 |
|
94 |
$request = $this->getRequest();
|
95 |
$response = $this->getResponse();
|
96 |
+
$this->setResponseHeaders($response);
|
97 |
|
98 |
+
if ($request->getMethod() === "GET") {
|
|
|
|
|
|
|
|
|
|
|
|
|
99 |
$this->processLogsGET();
|
100 |
}
|
101 |
}
|
112 |
|
113 |
try {
|
114 |
// If table not empty, require authorization.
|
115 |
+
$mainItemCollection = Mage::getModel("businessfactory_roihuntereasy/main")->getCollection();
|
116 |
if ($mainItemCollection->count() > 0) {
|
117 |
+
$authorizationHeader = $this->getRequest()->getHeader("X-Authorization");
|
118 |
$dataEntity = $mainItemCollection->getLastItem();
|
119 |
// If data exist check for client token.
|
120 |
if ($dataEntity->getClientToken() != null && $dataEntity->getClientToken() !== $authorizationHeader) {
|
125 |
}
|
126 |
|
127 |
$zipFilename = "all_logs.zip";
|
128 |
+
$rootPath = Mage::getBaseDir("log");
|
129 |
+
$zipAbsolutePath = $rootPath . "/" . $zipFilename;
|
130 |
|
131 |
|
132 |
$zip = new ZipArchive();
|
146 |
|
147 |
foreach ($files as $name => $file) {
|
148 |
// Skip directories (they would be added automatically)
|
149 |
+
if (!$file->isDir() && strpos($file->getFilename(), "all_logs.zip") === false) {
|
150 |
// Get real and relative path for current file
|
151 |
$filePath = $file->getRealPath();
|
152 |
$relativePath = substr($filePath, strlen($rootPath));
|
153 |
// Add current file to archive
|
154 |
if ($zip->addFile($filePath, $relativePath) !== true) {
|
155 |
+
Mage::log("cannot add file to zip", null, "cro.log");
|
156 |
$response->setBody("cannot add file to zip");
|
157 |
return;
|
158 |
}
|
159 |
else {
|
160 |
+
Mage::log("added file to zip", null, "cro.log");
|
161 |
}
|
162 |
}
|
163 |
}
|
164 |
// Zip archive will be created only after closing object
|
165 |
$zip->close();
|
166 |
|
167 |
+
header("Content-Description: File Transfer");
|
168 |
+
header("Content-Type: application/octet-stream");
|
169 |
+
header("Content-Disposition: attachment; filename='" . basename($zipAbsolutePath) ."'");
|
170 |
+
header("Expires: 0");
|
171 |
+
header("Cache-Control: must-revalidate");
|
172 |
+
header("Pragma: public");
|
173 |
readfile($zipAbsolutePath);
|
174 |
} catch (Exception $exception) {
|
175 |
+
Mage::log(__METHOD__ . " exception.", null, "errors.log");
|
176 |
+
Mage::log($exception, null, "errors.log");
|
177 |
+
Mage::log($request, null, "errors.log");
|
178 |
$response->setHttpResponseCode(500);
|
179 |
}
|
180 |
}
|
186 |
{
|
187 |
$request = $this->getRequest();
|
188 |
$response = $this->getResponse();
|
189 |
+
$this->setResponseHeaders($response);
|
190 |
|
191 |
+
if ($request->getMethod() === "GET") {
|
|
|
|
|
|
|
|
|
|
|
|
|
192 |
$this->processStateGET();
|
193 |
+
} else if ($request->getMethod() === "POST") {
|
194 |
$this->processStatePOST();
|
195 |
}
|
196 |
}
|
207 |
$response = $this->getResponse();
|
208 |
|
209 |
try {
|
210 |
+
$mainItemCollection = Mage::getModel("businessfactory_roihuntereasy/main")->getCollection();
|
211 |
// If table empty, then create new item.
|
212 |
if ($mainItemCollection->count() <= 0) {
|
213 |
$response->setBody(json_encode("Entry not exist."));
|
216 |
$response->setBody(json_encode($mainItemCollection->getLastItem()->getCreationState()));
|
217 |
}
|
218 |
} catch (Exception $exception) {
|
219 |
+
Mage::log(__METHOD__ . " exception.", null, "errors.log");
|
220 |
+
Mage::log($exception, null, "errors.log");
|
221 |
+
Mage::log($request, null, "errors.log");
|
222 |
$response->setHttpResponseCode(500);
|
223 |
}
|
224 |
}
|
237 |
try {
|
238 |
// Get request params
|
239 |
$requestData = $request->getParams();
|
240 |
+
$authorizationHeader = $request->getHeader("X-Authorization");
|
241 |
+
$newCreationState = $request->getParam("new_state");
|
242 |
|
243 |
if ($newCreationState === NULL) {
|
244 |
$response->setBody(json_encode("Missing parameter."));
|
246 |
return;
|
247 |
} else {
|
248 |
// Prepare database item. If table empty, then create new item.
|
249 |
+
$mainItemCollection = Mage::getModel("businessfactory_roihuntereasy/main")->getCollection();
|
250 |
if ($mainItemCollection->count() <= 0) {
|
251 |
+
$dataEntity = Mage::getModel("businessfactory_roihuntereasy/main");
|
252 |
$dataEntity->setDescription("New");
|
253 |
} else {
|
254 |
+
$dataEntity = Mage::getModel("businessfactory_roihuntereasy/main")->load($mainItemCollection->getLastItem()->getId());
|
255 |
$dataEntity->setDescription("Updated");
|
256 |
|
257 |
// If data already exist check for client token.
|
271 |
)));
|
272 |
}
|
273 |
} catch (Exception $exception) {
|
274 |
+
Mage::log(__METHOD__ . " exception.", null, "errors.log");
|
275 |
+
Mage::log($exception, null, "errors.log");
|
276 |
+
Mage::log($request, null, "errors.log");
|
277 |
$response->setHttpResponseCode(500);
|
278 |
}
|
279 |
}
|
285 |
{
|
286 |
$request = $this->getRequest();
|
287 |
$response = $this->getResponse();
|
288 |
+
$this->setResponseHeaders($response);
|
289 |
|
290 |
+
if ($request->getMethod() === "GET") {
|
|
|
|
|
|
|
|
|
|
|
|
|
291 |
$this->processAddGET();
|
292 |
+
} else if ($request->getMethod() === "POST") {
|
293 |
$this->processAddPOST();
|
294 |
}
|
295 |
}
|
306 |
$response = $this->getResponse();
|
307 |
|
308 |
try {
|
309 |
+
$mainItemCollection = Mage::getModel("businessfactory_roihuntereasy/main")->getCollection();
|
310 |
+
$authorizationHeader = $this->getRequest()->getHeader("X-Authorization");
|
311 |
|
312 |
// If table empty, then create new item.
|
313 |
if ($mainItemCollection->count() <= 0) {
|
324 |
$response->setBody(json_encode($dataEntity->getData()));
|
325 |
}
|
326 |
} catch (Exception $exception) {
|
327 |
+
Mage::log(__METHOD__ . " exception.", null, "errors.log");
|
328 |
+
Mage::log($exception, null, "errors.log");
|
329 |
+
Mage::log($request, null, "errors.log");
|
330 |
$response->setHttpResponseCode(500);
|
331 |
}
|
332 |
}
|
345 |
try {
|
346 |
// Get request params
|
347 |
$requestData = $request->getParams();
|
348 |
+
Mage::log("Process add request with data: ", null, "debug.log");
|
349 |
+
Mage::log(json_encode($requestData), null, "debug.log");
|
350 |
|
351 |
+
$authorizationHeader = $request->getHeader("X-Authorization");
|
352 |
|
353 |
// Prepare database item. If table empty, then create new item.
|
354 |
+
$mainItemCollection = Mage::getModel("businessfactory_roihuntereasy/main")->getCollection();
|
355 |
if ($mainItemCollection->count() <= 0) {
|
356 |
+
$dataEntity = Mage::getModel("businessfactory_roihuntereasy/main");
|
357 |
$dataEntity->setDescription("New");
|
358 |
} else {
|
359 |
+
$dataEntity = Mage::getModel("businessfactory_roihuntereasy/main")->load($mainItemCollection->getLastItem()->getId());
|
360 |
$dataEntity->setDescription("Updated");
|
361 |
|
362 |
// If data already exist check for client token.
|
369 |
|
370 |
// Save clientToken only if not exist
|
371 |
if ($dataEntity->getClientToken() == NULL) {
|
372 |
+
$client_token = $request->getParam("client_token");
|
373 |
if ($client_token == NULL) {
|
374 |
$response->setBody(json_encode("Missing client token"));
|
375 |
$response->setHttpResponseCode(422);
|
381 |
|
382 |
// Save AccessToken only if not exist
|
383 |
if ($dataEntity->getAccessToken() == NULL) {
|
384 |
+
$goostav_access_token = $request->getParam("access_token");
|
385 |
if ($goostav_access_token == NULL) {
|
386 |
$response->setBody(json_encode("Missing tokens"));
|
387 |
$response->setHttpResponseCode(422);
|
393 |
|
394 |
|
395 |
// Save status and errors if something failed
|
396 |
+
$status = $request->getParam("status");
|
397 |
if ($status != NULL) $dataEntity->setStatus($status);
|
398 |
+
$errors = $request->getParam("errors");
|
399 |
if ($errors != NULL) $dataEntity->setErrors($errors);
|
400 |
|
401 |
|
402 |
// Save customer id
|
403 |
+
$customerId = $request->getParam("id");
|
404 |
if ($customerId != NULL) $dataEntity->setCustomerId($customerId);
|
405 |
// Save conversion id
|
406 |
+
$conversionId = $request->getParam("conversion_id");
|
407 |
if ($conversionId != NULL) $dataEntity->setConversionId($conversionId);
|
408 |
|
409 |
// Set managed merchants
|
410 |
+
$managedMerchants = $request->getParam("managed_merchants");
|
411 |
+
if ($managedMerchants !== NULL) $dataEntity->setManagedMerchants($managedMerchants === "true");
|
412 |
// Set adult content
|
413 |
+
$adultOriented = $request->getParam("adult_oriented");
|
414 |
+
if ($adultOriented !== NULL) $dataEntity->setAdultOriented($adultOriented === "true");
|
415 |
+
// Set conversion label
|
416 |
+
$conversionLabel = $request->getParam("conversion_label");
|
417 |
+
if ($conversionLabel !== NULL) $dataEntity->setConversionLabel($conversionLabel);
|
418 |
|
419 |
// Persist data
|
420 |
$dataEntity->save();
|
421 |
|
422 |
// Create verification file
|
423 |
+
$filename = $request->getParam("site_verification_token");
|
424 |
$this->createVerificationFile($filename);
|
425 |
|
426 |
// Return response
|
428 |
"data" => $requestData
|
429 |
)));
|
430 |
} catch (Exception $exception) {
|
431 |
+
Mage::log(__METHOD__ . " exception.", null, "errors.log");
|
432 |
+
Mage::log($exception, null, "errors.log");
|
433 |
+
Mage::log($request, null, "errors.log");
|
434 |
$response->setHttpResponseCode(500);
|
435 |
}
|
436 |
}
|
447 |
// Apache
|
448 |
$io = new Varien_Io_File();
|
449 |
$io->setAllowCreateFolders(true);
|
450 |
+
$io->open(array("path" => Mage::getBaseDir()));
|
451 |
|
452 |
if ($io->fileExists($filename)) {
|
453 |
$io->rm($filename);
|
460 |
// Nginx - check if it is necessary to create file in public folder
|
461 |
|
462 |
} else {
|
463 |
+
Mage::log("ERROR: Cannot create verification file. Missing filename", null, "errors.log");
|
464 |
}
|
465 |
} catch (Exception $exception) {
|
466 |
+
Mage::log(__METHOD__ . " exception.", null, "errors.log");
|
467 |
+
Mage::log($exception, null, "errors.log");
|
468 |
}
|
469 |
}
|
470 |
}
|
app/code/community/Businessfactory/Roihuntereasy/etc/config.xml
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
<config>
|
3 |
<modules>
|
4 |
<Businessfactory_Roihuntereasy>
|
5 |
-
<version>1.0
|
6 |
</Businessfactory_Roihuntereasy>
|
7 |
</modules>
|
8 |
<admin>
|
@@ -118,10 +118,16 @@
|
|
118 |
</global>
|
119 |
<crontab>
|
120 |
<jobs>
|
121 |
-
<
|
122 |
-
<schedule><cron_expr
|
123 |
-
<run><model>businessfactory_roihuntereasy/cron::
|
124 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
125 |
</jobs>
|
126 |
</crontab>
|
127 |
</config>
|
2 |
<config>
|
3 |
<modules>
|
4 |
<Businessfactory_Roihuntereasy>
|
5 |
+
<version>1.1.0</version>
|
6 |
</Businessfactory_Roihuntereasy>
|
7 |
</modules>
|
8 |
<admin>
|
118 |
</global>
|
119 |
<crontab>
|
120 |
<jobs>
|
121 |
+
<businessfactory_roihuntereasy_xml>
|
122 |
+
<schedule><cron_expr>0 */2 * * *</cron_expr></schedule>
|
123 |
+
<run><model>businessfactory_roihuntereasy/cron::scheduleFeed</model></run>
|
124 |
+
<format>xml</format>
|
125 |
+
</businessfactory_roihuntereasy_xml>
|
126 |
+
<businessfactory_roihuntereasy_csv>
|
127 |
+
<schedule><cron_expr>0 */2 * * *</cron_expr></schedule>
|
128 |
+
<run><model>businessfactory_roihuntereasy/cron::scheduleFeed</model></run>
|
129 |
+
<format>csv</format>
|
130 |
+
</businessfactory_roihuntereasy_csv>
|
131 |
</jobs>
|
132 |
</crontab>
|
133 |
</config>
|
app/code/community/Businessfactory/Roihuntereasy/sql/businessfactory_roihuntereasy_setup/{install-1.0.0.php → install-1.0.9.php}
RENAMED
File without changes
|
app/code/community/Businessfactory/Roihuntereasy/sql/businessfactory_roihuntereasy_setup/upgrade-1.0.9-1.1.0.php
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
$installer = $this;
|
4 |
+
$connection = $installer->getConnection();
|
5 |
+
|
6 |
+
$installer->startSetup();
|
7 |
+
|
8 |
+
$installer->getConnection()
|
9 |
+
->addColumn($installer->getTable('businessfactory_roihuntereasy/main'),
|
10 |
+
'conversion_label',
|
11 |
+
array(
|
12 |
+
'type' => Varien_Db_Ddl_Table::TYPE_TEXT, 255,
|
13 |
+
'nullable' => true,
|
14 |
+
'default' => null,
|
15 |
+
'length' => 255,
|
16 |
+
'comment' => 'Conversion Label'
|
17 |
+
)
|
18 |
+
);
|
19 |
+
|
20 |
+
$installer->endSetup();
|
app/design/adminhtml/default/default/template/businessfactory_roihuntereasy/admin.phtml
CHANGED
@@ -16,6 +16,7 @@
|
|
16 |
var creationState = "<?php echo($this->getMainItemEntry() ? $this->getMainItemEntry()->getCreationState() : null); ?>";
|
17 |
var magentoMode = "<?php echo $this->getDevelopmentMode(); ?>";
|
18 |
var pluginVersion = "magento_" + "<?php echo $this->getPluginVersion(); ?>";
|
|
|
19 |
|
20 |
console.log("mode: " + magentoMode);
|
21 |
console.log("baseUrl: " + storeUrl);
|
@@ -31,6 +32,7 @@
|
|
31 |
"storeCountry": storeCountry,
|
32 |
"storeMode": magentoMode,
|
33 |
"pluginVersion": pluginVersion,
|
|
|
34 |
|
35 |
// Database part
|
36 |
"customerId": customerId,
|
@@ -63,7 +65,7 @@
|
|
63 |
</script>
|
64 |
|
65 |
<!--"http://localhost:3000" "http://magento.roihunter.com/" -->
|
66 |
-
<iframe src="
|
67 |
id="RoiHunterEasyIFrame"
|
68 |
scrolling="yes"
|
69 |
frameBorder="0"
|
16 |
var creationState = "<?php echo($this->getMainItemEntry() ? $this->getMainItemEntry()->getCreationState() : null); ?>";
|
17 |
var magentoMode = "<?php echo $this->getDevelopmentMode(); ?>";
|
18 |
var pluginVersion = "magento_" + "<?php echo $this->getPluginVersion(); ?>";
|
19 |
+
var stagingActive = <?php echo json_encode($this->isStagingActive()); ?>;
|
20 |
|
21 |
console.log("mode: " + magentoMode);
|
22 |
console.log("baseUrl: " + storeUrl);
|
32 |
"storeCountry": storeCountry,
|
33 |
"storeMode": magentoMode,
|
34 |
"pluginVersion": pluginVersion,
|
35 |
+
"stagingActive": stagingActive,
|
36 |
|
37 |
// Database part
|
38 |
"customerId": customerId,
|
65 |
</script>
|
66 |
|
67 |
<!--"http://localhost:3000" "http://magento.roihunter.com/" -->
|
68 |
+
<iframe src="<?php echo $this->getIframeBaseUrl(); ?>"
|
69 |
id="RoiHunterEasyIFrame"
|
70 |
scrolling="yes"
|
71 |
frameBorder="0"
|
app/design/frontend/base/default/template/businessfactory_roihuntereasy/checkout_analytics.phtml
CHANGED
@@ -3,6 +3,8 @@
|
|
3 |
$_prodSku = $this->getProdId();
|
4 |
$_prodPrice = $this->getProdPrice();
|
5 |
$_conversionId = $this->getConversionId();
|
|
|
|
|
6 |
|
7 |
?>
|
8 |
|
@@ -15,7 +17,7 @@ Remarketing tags may not be associated with personally identifiable information
|
|
15 |
var google_conversion_id = <?php echo $_conversionId ?>;
|
16 |
var google_custom_params = {
|
17 |
ecomm_prodid: <?php echo $_prodSku ?>,
|
18 |
-
ecomm_pagetype:
|
19 |
ecomm_totalvalue: <?php echo $_prodPrice ?>,
|
20 |
};
|
21 |
var google_remarketing_only = true;
|
@@ -36,7 +38,9 @@ Remarketing tags may not be associated with personally identifiable information
|
|
36 |
var google_conversion_language = "en_US";
|
37 |
var google_conversion_format = "1";
|
38 |
var google_conversion_color = "666666";
|
39 |
-
var
|
|
|
|
|
40 |
var google_conversion_value = <?php echo $_prodPrice ?>;
|
41 |
/* ]]> */
|
42 |
</script>
|
@@ -44,5 +48,5 @@ Remarketing tags may not be associated with personally identifiable information
|
|
44 |
</script>
|
45 |
<noscript>
|
46 |
<img height=1 width=1 border=0 src="//www.googleadservices.com/pagead/
|
47 |
-
conversion/<?php echo $_conversionId ?>/?value=<?php echo $_prodPrice ?>&guid=ON&script=0">
|
48 |
</noscript>
|
3 |
$_prodSku = $this->getProdId();
|
4 |
$_prodPrice = $this->getProdPrice();
|
5 |
$_conversionId = $this->getConversionId();
|
6 |
+
$_conversionLabel = $this->getConversionLabel();
|
7 |
+
$_currency = $this->getConversionCurrency();
|
8 |
|
9 |
?>
|
10 |
|
17 |
var google_conversion_id = <?php echo $_conversionId ?>;
|
18 |
var google_custom_params = {
|
19 |
ecomm_prodid: <?php echo $_prodSku ?>,
|
20 |
+
ecomm_pagetype: "purchase",
|
21 |
ecomm_totalvalue: <?php echo $_prodPrice ?>,
|
22 |
};
|
23 |
var google_remarketing_only = true;
|
38 |
var google_conversion_language = "en_US";
|
39 |
var google_conversion_format = "1";
|
40 |
var google_conversion_color = "666666";
|
41 |
+
var google_conversion_label = "<?php echo $_conversionLabel ?>";
|
42 |
+
var google_conversion_currency = "<?php echo $_currency ?>";
|
43 |
+
var google_remarketing_only = false;
|
44 |
var google_conversion_value = <?php echo $_prodPrice ?>;
|
45 |
/* ]]> */
|
46 |
</script>
|
48 |
</script>
|
49 |
<noscript>
|
50 |
<img height=1 width=1 border=0 src="//www.googleadservices.com/pagead/
|
51 |
+
conversion/<?php echo $_conversionId ?>/?value=<?php echo $_prodPrice ?>&currency_code=<?php echo $_currency ?>&label=<?php echo $_conversionLabel ?>&guid=ON&script=0">
|
52 |
</noscript>
|
package.xml
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
<?xml version="1.0"?>
|
2 |
<package>
|
3 |
<name>roihunter_easy</name>
|
4 |
-
<version>1.0
|
5 |
<stability>stable</stability>
|
6 |
<license>AFL 3.0</license>
|
7 |
<channel>community</channel>
|
@@ -40,11 +40,11 @@ Extension update: 0.00 &#x20AC;&#xD;
|
|
40 |
No support fee&#xD;
|
41 |
No contract duration&#xD;
|
42 |
* Extension do not cover your Google Adwords Ad Spend. </description>
|
43 |
-
<notes>Created
|
44 |
<authors><author><name>ROI Hunter</name><user>MAG003490427</user><email>petr.skornok@b.cz</email></author></authors>
|
45 |
-
<date>2017-04-
|
46 |
-
<time>
|
47 |
-
<contents><target name="magecommunity"><dir name="Businessfactory"><dir name="Roihuntereasy"><dir name="Block"><file name="AddedToCartAnalytics.php" hash="eeb701f487b06ed82e0754aefb192fab"/><dir name="Adminhtml"><file name="Admin.php" hash="
|
48 |
<compatible/>
|
49 |
<dependencies><required><php><min>5.5.0</min><max>7.0.0</max></php></required></dependencies>
|
50 |
</package>
|
1 |
<?xml version="1.0"?>
|
2 |
<package>
|
3 |
<name>roihunter_easy</name>
|
4 |
+
<version>1.1.0</version>
|
5 |
<stability>stable</stability>
|
6 |
<license>AFL 3.0</license>
|
7 |
<channel>community</channel>
|
40 |
No support fee&#xD;
|
41 |
No contract duration&#xD;
|
42 |
* Extension do not cover your Google Adwords Ad Spend. </description>
|
43 |
+
<notes>Created 16th April, 2017 Compatibility: 1.9.2.4 - CSV Product feed for Adwords compatibility, Conversion tracking, Product feed images and sale price improvements</notes>
|
44 |
<authors><author><name>ROI Hunter</name><user>MAG003490427</user><email>petr.skornok@b.cz</email></author></authors>
|
45 |
+
<date>2017-04-19</date>
|
46 |
+
<time>16:17:32</time>
|
47 |
+
<contents><target name="magecommunity"><dir name="Businessfactory"><dir name="Roihuntereasy"><dir name="Block"><file name="AddedToCartAnalytics.php" hash="eeb701f487b06ed82e0754aefb192fab"/><dir name="Adminhtml"><file name="Admin.php" hash="696ce1b1e1c03cb4d69bd547bb95396c"/><dir name="System"><dir name="Config"><file name="Cronbutton.php" hash="a07a6cfbd52a9a96fb4ec78cc8270924"/><file name="Resetbutton.php" hash="7721bb62feafe5d9d2951e70bfb0c30e"/></dir></dir></dir><file name="CategoryViewAnalytics.php" hash="8a47d9b4b0ad88c2e3fc1aa38258c465"/><file name="CheckoutAnalytics.php" hash="774200dbb45c1a3f832950b9c89d8557"/><file name="Database.php" hash="4333ce4f66b762097cb50b4f04a7a4d2"/><file name="ProductViewAnalytics.php" hash="033e6702927d92ae5f2d388f00b46bd5"/></dir><dir name="Helper"><file name="Data.php" hash="05ee8de6f74805d4a2b4643b0b0fe33a"/></dir><dir name="Model"><file name="AddedToCartObserver.php" hash="4e6d394f8f0902904e357f441aca6289"/><file name="CheckoutObserver.php" hash="8849a591a83dbd4e9aa7900c13176bb0"/><file name="Cron.php" hash="4ba20cd18f139d89a2ed30cdaf5ffb46"/><file name="Main.php" hash="06766b59391b52aaa701d8bf01e80d1a"/><file name="Options.php" hash="f6ecd5ab10cfcc5e0948b236bb873932"/><dir name="Resource"><dir name="Main"><file name="Collection.php" hash="9b66b73b312ac16e270c1435a789fdb9"/></dir><file name="Main.php" hash="1432c450ff554fb5057d1d6c4fd26c3c"/></dir></dir><dir name="controllers"><dir name="Adminhtml"><file name="RoihuntereasyController.php" hash="687380dafaffd792a281e2bfd653d027"/></dir><file name="CronController.php" hash="7fae1e9140232183349a25e1267192a0"/><file name="FeedController.php" hash="4d3bca0c750174772ec91b0da4cc4182"/><file name="IndexController.php" hash="33c2a22770591cbeb7fb394d3654d904"/><file name="ResetController.php" hash="1a6c578829957c0a2ec2a4085ed5a089"/><file name="RoihuntereasyController.php" hash="b2b37f613badb75be2198e6643ef8d85"/><file name="StoredetailsController.php" hash="5440a2526b90a4bea9b0bf20486ac2b0"/></dir><dir name="etc"><file name="adminhtml.xml" hash="bbab6af370448895030570a657469a15"/><file name="config.xml" hash="ccb69bc13d9921bc514b4d213aaf0575"/><file name="system.xml" hash="718ea25db00b6a500b8783f9c8e1ba5c"/></dir><dir name="sql"><dir name="businessfactory_roihuntereasy_setup"><file name="install-1.0.9.php" hash="f490ddfd229eb5680e68fb7ec55a5820"/><file name="upgrade-1.0.9-1.1.0.php" hash="9a3aa2942881aad0e386c6284c012b4c"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="businessfactory_roihuntereasy.xml" hash="fa2e345d2461459e15c641731d1b114a"/></dir><dir name="template"><dir name="businessfactory_roihuntereasy"><file name="admin.phtml" hash="5688c1f85088716c6f3e9ef8cbed49f2"/><dir name="system"><dir name="config"><file name="cronbutton.phtml" hash="758b97b5da81c92aaeb175e4b0142288"/><file name="resetbutton.phtml" hash="7aedce71c5d21bfce1a08c77e603143d"/></dir></dir></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="businessfactory_roihuntereasy.xml" hash="e1379f4d0a022d6740d0a6d96fd9fbed"/></dir><dir name="template"><dir name="businessfactory_roihuntereasy"><file name="added_to_cart_view_analytics.phtml" hash="8679d7940136d046ce46d2bc9aa2b522"/><file name="category_view_analytics.phtml" hash="420fe9c183c444e655250efa0b037da4"/><file name="checkout_analytics.phtml" hash="65de844a372d10f6f215382c988dbe2a"/><file name="index.phtml" hash="a69cff3727b7bba2be7154b94b86ff08"/><file name="product_view_analytics.phtml" hash="a9ce50a31d64edcc70b2bbabd2ebf227"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Businessfactory_Roihuntereasy.xml" hash="d46e92b8a1b158bfdc47b9daa3274a3d"/></dir></target></contents>
|
48 |
<compatible/>
|
49 |
<dependencies><required><php><min>5.5.0</min><max>7.0.0</max></php></required></dependencies>
|
50 |
</package>
|