Version Notes
Adding multisite capabilities, including image cache generation.
1.1.1.3: Fixed issue with singletons stored in registry resulting in attributes from wrong store being returned in attributes.txt file.
1.1.1.4: Fixed issue with configurable product relationships in items.txt file. Moved "brand" attribute from items.txt to attributes.txt (if exists).
1.1.1.5: Fixed issue with image cache and items.txt not using "small_image". Explicit check to ensure 'unique id' is set in attributes.txt.
Download this release
Release Info
| Developer | Hawksearch Inc. |
| Extension | HawkSearch_Datafeed |
| Version | 1.1.1.6 |
| Comparing to | |
| See all releases | |
Code changes from version 1.0.3.1 to 1.1.1.6
- app/code/community/Hawksearch/Datafeed/Block/System/Config/Frontend/Feed/Cron.php +13 -0
- app/code/community/Hawksearch/Datafeed/Block/System/Config/Frontend/Feed/Cron/Js.php +35 -0
- app/code/community/Hawksearch/Datafeed/Block/System/Config/Frontend/Feed/Generate.php +4 -3
- app/code/community/Hawksearch/Datafeed/Block/System/Config/Frontend/Feed/Generate/Js.php +9 -2
- app/code/community/Hawksearch/Datafeed/Block/System/Config/Frontend/Feed/Generateimagecache/Js.php +11 -1
- app/code/community/Hawksearch/Datafeed/Block/System/Config/Frontend/Feed/Next.php +33 -31
- app/code/community/Hawksearch/Datafeed/Helper/Data.php +7 -3
- app/code/community/Hawksearch/Datafeed/Helper/Feed.php +5 -3
- app/code/community/Hawksearch/Datafeed/Helper/runfeed.php +1 -1
- app/code/community/Hawksearch/Datafeed/Model/Cron.php +113 -24
- app/code/community/Hawksearch/Datafeed/Model/Feed.php +313 -663
- app/code/community/Hawksearch/Datafeed/Model/System/Config/Backend/Cron.php +19 -61
- app/code/community/Hawksearch/Datafeed/Model/System/Config/Source/Store.php +28 -0
- app/code/community/Hawksearch/Datafeed/controllers/Adminhtml/HawkdatagenerateController.php +79 -0
- app/code/community/Hawksearch/Datafeed/controllers/SearchController.php +19 -75
- app/code/community/Hawksearch/Datafeed/etc/config.xml +95 -79
- app/code/community/Hawksearch/Datafeed/etc/system.xml +120 -112
- app/code/community/Hawksearch/Datafeed/sql/hawksearch_datafeed_setup/install-1.0.0.0.php +9 -7
- app/code/community/Hawksearch/Datafeed/sql/hawksearch_datafeed_setup/upgrade-1.0.0.0-1.1.1.0.php +27 -0
- app/design/adminhtml/default/default/template/hawksearch/datafeed/generate/js.phtml +20 -1
- app/design/adminhtml/default/default/template/hawksearch/datafeed/validate.phtml +30 -0
- hawksearch/.htaccess.sample +3 -0
- package.xml +11 -5
app/code/community/Hawksearch/Datafeed/Block/System/Config/Frontend/Feed/Cron.php
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
|
| 3 |
+
class Hawksearch_Datafeed_Block_System_Config_Frontend_Feed_Cron extends Mage_Adminhtml_Block_System_Config_Form_Field {
|
| 4 |
+
|
| 5 |
+
protected $_buttonId = "generate_feed_button";
|
| 6 |
+
|
| 7 |
+
protected function _prepareLayout() {
|
| 8 |
+
$block = $this->getLayout()->createBlock("hawksearch_datafeed/system_config_frontend_feed_cron_js");
|
| 9 |
+
|
| 10 |
+
$this->getLayout()->getBlock('js')->append($block);
|
| 11 |
+
return parent::_prepareLayout();
|
| 12 |
+
}
|
| 13 |
+
}
|
app/code/community/Hawksearch/Datafeed/Block/System/Config/Frontend/Feed/Cron/Js.php
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
/**
|
| 3 |
+
* Copyright (c) 2013 Hawksearch (www.hawksearch.com) - All Rights Reserved
|
| 4 |
+
*
|
| 5 |
+
* THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
|
| 6 |
+
* KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
| 7 |
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
| 8 |
+
* PARTICULAR PURPOSE.
|
| 9 |
+
*/
|
| 10 |
+
|
| 11 |
+
class Hawksearch_Datafeed_Block_System_Config_Frontend_Feed_Cron_Js extends Mage_Adminhtml_Block_Template {
|
| 12 |
+
|
| 13 |
+
/**
|
| 14 |
+
* Sets javascript template to be included in the adminhtml js text_list block
|
| 15 |
+
*/
|
| 16 |
+
protected function _construct() {
|
| 17 |
+
parent::_construct();
|
| 18 |
+
$this->setTemplate('hawksearch/datafeed/validate.phtml');
|
| 19 |
+
}
|
| 20 |
+
|
| 21 |
+
/**
|
| 22 |
+
* Returns the cron string validation url
|
| 23 |
+
*
|
| 24 |
+
* @return string
|
| 25 |
+
*/
|
| 26 |
+
public function getValidateUrl() {
|
| 27 |
+
return Mage::getModel('adminhtml/url')->getUrl(
|
| 28 |
+
'adminhtml/hawkdatagenerate/validateCronString',
|
| 29 |
+
array(
|
| 30 |
+
'_secure' => true,
|
| 31 |
+
'_store' => Mage_Core_Model_App::ADMIN_STORE_ID
|
| 32 |
+
)
|
| 33 |
+
);
|
| 34 |
+
}
|
| 35 |
+
}
|
app/code/community/Hawksearch/Datafeed/Block/System/Config/Frontend/Feed/Generate.php
CHANGED
|
@@ -55,12 +55,13 @@ class Hawksearch_Datafeed_Block_System_Config_Frontend_Feed_Generate extends Mag
|
|
| 55 |
'label' => $this->helper('hawksearch_datafeed')->__('Generate Feeds'),
|
| 56 |
'onclick' => 'javascript:hawkSearchFeed.generateFeed(); return false;'
|
| 57 |
));
|
| 58 |
-
|
| 59 |
if ($this->_feedGenIsLocked()) {
|
| 60 |
-
|
|
|
|
| 61 |
}
|
| 62 |
|
| 63 |
-
return $button->toHtml();
|
| 64 |
}
|
| 65 |
|
| 66 |
/**
|
| 55 |
'label' => $this->helper('hawksearch_datafeed')->__('Generate Feeds'),
|
| 56 |
'onclick' => 'javascript:hawkSearchFeed.generateFeed(); return false;'
|
| 57 |
));
|
| 58 |
+
$force = '';
|
| 59 |
if ($this->_feedGenIsLocked()) {
|
| 60 |
+
$button->setDisabled(true);
|
| 61 |
+
$force = ' <input type="checkbox" value="feedforce" id="feedforce" name="feedforce" onclick="hawkSearchFeed.forceFeed();"> force';
|
| 62 |
}
|
| 63 |
|
| 64 |
+
return $button->toHtml() . $force;
|
| 65 |
}
|
| 66 |
|
| 67 |
/**
|
app/code/community/Hawksearch/Datafeed/Block/System/Config/Frontend/Feed/Generate/Js.php
CHANGED
|
@@ -24,10 +24,17 @@ class Hawksearch_Datafeed_Block_System_Config_Frontend_Feed_Generate_Js extends
|
|
| 24 |
* @return string
|
| 25 |
*/
|
| 26 |
public function getGenerateUrl() {
|
| 27 |
-
return Mage::getUrl('hawksearch_datafeed/search/runFeedGeneration/',
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
array(
|
| 29 |
'_secure' => true,
|
| 30 |
'_store' => Mage_Core_Model_App::ADMIN_STORE_ID
|
| 31 |
-
)
|
|
|
|
| 32 |
}
|
| 33 |
}
|
| 24 |
* @return string
|
| 25 |
*/
|
| 26 |
public function getGenerateUrl() {
|
| 27 |
+
// return Mage::getUrl('hawksearch_datafeed/search/runFeedGeneration/',
|
| 28 |
+
// array(
|
| 29 |
+
// '_secure' => true,
|
| 30 |
+
// '_store' => Mage_Core_Model_App::ADMIN_STORE_ID
|
| 31 |
+
// ));
|
| 32 |
+
return Mage::getModel('adminhtml/url')->getUrl(
|
| 33 |
+
'adminhtml/hawkdatagenerate/runFeedGeneration',
|
| 34 |
array(
|
| 35 |
'_secure' => true,
|
| 36 |
'_store' => Mage_Core_Model_App::ADMIN_STORE_ID
|
| 37 |
+
)
|
| 38 |
+
);
|
| 39 |
}
|
| 40 |
}
|
app/code/community/Hawksearch/Datafeed/Block/System/Config/Frontend/Feed/Generateimagecache/Js.php
CHANGED
|
@@ -23,7 +23,17 @@ class Hawksearch_Datafeed_Block_System_Config_Frontend_Feed_Generateimagecache_J
|
|
| 23 |
*
|
| 24 |
* @return string
|
| 25 |
*/
|
| 26 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
return Mage::getUrl('hawksearch_datafeed/search/runImageCacheGeneration/',
|
| 28 |
array(
|
| 29 |
'_secure' => true,
|
| 23 |
*
|
| 24 |
* @return string
|
| 25 |
*/
|
| 26 |
+
public function getGenerateUrl() {
|
| 27 |
+
return Mage::getModel('adminhtml/url')->getUrl(
|
| 28 |
+
'adminhtml/hawkdatagenerate/runImageCacheGeneration',
|
| 29 |
+
array(
|
| 30 |
+
'_secure' => true,
|
| 31 |
+
'_store' => Mage_Core_Model_App::ADMIN_STORE_ID
|
| 32 |
+
)
|
| 33 |
+
);
|
| 34 |
+
}
|
| 35 |
+
|
| 36 |
+
public function getGenerateUrlold() {
|
| 37 |
return Mage::getUrl('hawksearch_datafeed/search/runImageCacheGeneration/',
|
| 38 |
array(
|
| 39 |
'_secure' => true,
|
app/code/community/Hawksearch/Datafeed/Block/System/Config/Frontend/Feed/Next.php
CHANGED
|
@@ -1,4 +1,5 @@
|
|
| 1 |
<?php
|
|
|
|
| 2 |
/**
|
| 3 |
* Copyright (c) 2013 Hawksearch (www.hawksearch.com) - All Rights Reserved
|
| 4 |
*
|
|
@@ -7,39 +8,40 @@
|
|
| 7 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
| 8 |
* PARTICULAR PURPOSE.
|
| 9 |
*/
|
| 10 |
-
|
| 11 |
class Hawksearch_Datafeed_Block_System_Config_Frontend_Feed_Next extends Mage_Adminhtml_Block_System_Config_Form_Field {
|
| 12 |
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
if(Mage::helper('hawksearch_datafeed/data')->isLoggingEnabled()) {
|
| 24 |
-
Mage::log("No cron job code set for hawksearch_datafeed cron job in config xml.", null,'hawksearch_errors.log');
|
| 25 |
}
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
|
|
|
|
|
|
| 44 |
|
| 45 |
}
|
| 1 |
<?php
|
| 2 |
+
|
| 3 |
/**
|
| 4 |
* Copyright (c) 2013 Hawksearch (www.hawksearch.com) - All Rights Reserved
|
| 5 |
*
|
| 8 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
| 9 |
* PARTICULAR PURPOSE.
|
| 10 |
*/
|
|
|
|
| 11 |
class Hawksearch_Datafeed_Block_System_Config_Frontend_Feed_Next extends Mage_Adminhtml_Block_System_Config_Form_Field {
|
| 12 |
|
| 13 |
+
/**
|
| 14 |
+
* Returns the config xml set job code for the cron job
|
| 15 |
+
*
|
| 16 |
+
* @return string
|
| 17 |
+
*/
|
| 18 |
+
protected function _getHawkSearchCronJobCode() {
|
| 19 |
+
|
| 20 |
+
$jobCode = Mage::getConfig()->getNode('crontab/hawksearch_datafeed/job_code');
|
| 21 |
+
|
| 22 |
+
if (!$jobCode) {
|
| 23 |
+
if (Mage::helper('hawksearch_datafeed/data')->isLoggingEnabled()) {
|
| 24 |
+
Mage::log("No cron job code set for hawksearch_datafeed cron job in config xml.", null, 'hawksearch_errors.log');
|
| 25 |
}
|
| 26 |
+
Mage::throwException("No cron job code set for hawksearch_datafeed cron job in config xml.");
|
| 27 |
+
}
|
| 28 |
+
return $jobCode;
|
| 29 |
+
}
|
| 30 |
+
|
| 31 |
+
/**
|
| 32 |
+
* Renders the next scheduled cron time.
|
| 33 |
+
*
|
| 34 |
+
* @param Varien_Data_Form_Element_Abstract $element
|
| 35 |
+
* @return string
|
| 36 |
+
*/
|
| 37 |
+
protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element) {
|
| 38 |
+
// $helper = Mage::helper('hawksearch_datafeed');
|
| 39 |
+
// $scheduledAt = $helper->getNextRunDateFromCronTime();
|
| 40 |
+
|
| 41 |
+
$scheduledAt = Mage::getSingleton('hawksearch_datafeed/system_config_backend_cron')->getNextRuntime();
|
| 42 |
+
|
| 43 |
+
return sprintf('<span id="%s">%s</span>', $element->getHtmlId(), $scheduledAt);
|
| 44 |
+
}
|
| 45 |
+
|
| 46 |
|
| 47 |
}
|
app/code/community/Hawksearch/Datafeed/Helper/Data.php
CHANGED
|
@@ -66,7 +66,7 @@ class Hawksearch_Datafeed_Helper_Data extends Mage_Core_Helper_Abstract {
|
|
| 66 |
* @return string
|
| 67 |
*/
|
| 68 |
public function getImageWidth() {
|
| 69 |
-
return Mage::getStoreConfig(
|
| 70 |
}
|
| 71 |
|
| 72 |
/**
|
|
@@ -75,7 +75,7 @@ class Hawksearch_Datafeed_Helper_Data extends Mage_Core_Helper_Abstract {
|
|
| 75 |
* @return string
|
| 76 |
*/
|
| 77 |
public function getImageHeight() {
|
| 78 |
-
return Mage::getStoreConfig(
|
| 79 |
}
|
| 80 |
|
| 81 |
/**
|
|
@@ -164,7 +164,8 @@ class Hawksearch_Datafeed_Helper_Data extends Mage_Core_Helper_Abstract {
|
|
| 164 |
*
|
| 165 |
* @return Zend_Date
|
| 166 |
*/
|
| 167 |
-
|
|
|
|
| 168 |
$now = Mage::app()->getLocale()->date();
|
| 169 |
$frequency = $this->getCronFrequency();
|
| 170 |
list($hours, $minutes, $seconds) = explode(',', $this->getCronTime());
|
|
@@ -221,5 +222,8 @@ class Hawksearch_Datafeed_Helper_Data extends Mage_Core_Helper_Abstract {
|
|
| 221 |
return ((float) $usec + (float) $sec);
|
| 222 |
}
|
| 223 |
|
|
|
|
|
|
|
|
|
|
| 224 |
|
| 225 |
}
|
| 66 |
* @return string
|
| 67 |
*/
|
| 68 |
public function getImageWidth() {
|
| 69 |
+
return Mage::getStoreConfig('hawksearch_datafeed/imagecache/image_width');
|
| 70 |
}
|
| 71 |
|
| 72 |
/**
|
| 75 |
* @return string
|
| 76 |
*/
|
| 77 |
public function getImageHeight() {
|
| 78 |
+
return Mage::getStoreConfig('hawksearch_datafeed/imagecache/image_height');
|
| 79 |
}
|
| 80 |
|
| 81 |
/**
|
| 164 |
*
|
| 165 |
* @return Zend_Date
|
| 166 |
*/
|
| 167 |
+
|
| 168 |
+
public function getNextRunDateFromCronTimedead() {
|
| 169 |
$now = Mage::app()->getLocale()->date();
|
| 170 |
$frequency = $this->getCronFrequency();
|
| 171 |
list($hours, $minutes, $seconds) = explode(',', $this->getCronTime());
|
| 222 |
return ((float) $usec + (float) $sec);
|
| 223 |
}
|
| 224 |
|
| 225 |
+
public function getSelectedStores(){
|
| 226 |
+
return explode(',', Mage::getStoreConfig('hawksearch_datafeed/feed/stores'));
|
| 227 |
+
}
|
| 228 |
|
| 229 |
}
|
app/code/community/Hawksearch/Datafeed/Helper/Feed.php
CHANGED
|
@@ -12,7 +12,7 @@ class Hawksearch_Datafeed_Helper_Feed {
|
|
| 12 |
|
| 13 |
protected $_feedFilePath = null;
|
| 14 |
|
| 15 |
-
public function refreshImageCache(
|
| 16 |
$tmppath = sys_get_temp_dir();
|
| 17 |
$tmpfile = tempnam($tmppath, 'hawkfeed_');
|
| 18 |
|
|
@@ -26,8 +26,9 @@ class Hawksearch_Datafeed_Helper_Feed {
|
|
| 26 |
fwrite($f, '#!/bin/sh' . "\n");
|
| 27 |
$phpbin = PHP_BINDIR . DIRECTORY_SEPARATOR . "php";
|
| 28 |
|
| 29 |
-
fwrite($f, "$phpbin $runfile -i
|
| 30 |
|
|
|
|
| 31 |
shell_exec("/bin/sh $tmpfile > /dev/null 2>&1 &");
|
| 32 |
|
| 33 |
}
|
|
@@ -50,6 +51,7 @@ class Hawksearch_Datafeed_Helper_Feed {
|
|
| 50 |
|
| 51 |
fwrite($f, "$phpbin $runfile -r $root -t $tmpfile\n");
|
| 52 |
|
|
|
|
| 53 |
shell_exec("/bin/sh $tmpfile > /dev/null 2>&1 &");
|
| 54 |
|
| 55 |
}
|
|
@@ -73,7 +75,7 @@ class Hawksearch_Datafeed_Helper_Feed {
|
|
| 73 |
* @return string
|
| 74 |
*/
|
| 75 |
public function makeVarPath($directories) {
|
| 76 |
-
$path = Mage::getBaseDir(
|
| 77 |
foreach ($directories as $dir) {
|
| 78 |
$path .= DS . $dir;
|
| 79 |
if (!is_dir($path)) {
|
| 12 |
|
| 13 |
protected $_feedFilePath = null;
|
| 14 |
|
| 15 |
+
public function refreshImageCache() {
|
| 16 |
$tmppath = sys_get_temp_dir();
|
| 17 |
$tmpfile = tempnam($tmppath, 'hawkfeed_');
|
| 18 |
|
| 26 |
fwrite($f, '#!/bin/sh' . "\n");
|
| 27 |
$phpbin = PHP_BINDIR . DIRECTORY_SEPARATOR . "php";
|
| 28 |
|
| 29 |
+
fwrite($f, "$phpbin $runfile -i true -r $root -t $tmpfile\n");
|
| 30 |
|
| 31 |
+
// to debug, change '/dev/null' to some file path writable by the webserver
|
| 32 |
shell_exec("/bin/sh $tmpfile > /dev/null 2>&1 &");
|
| 33 |
|
| 34 |
}
|
| 51 |
|
| 52 |
fwrite($f, "$phpbin $runfile -r $root -t $tmpfile\n");
|
| 53 |
|
| 54 |
+
// to debug, change '/dev/null' to some file path writable by the webserver
|
| 55 |
shell_exec("/bin/sh $tmpfile > /dev/null 2>&1 &");
|
| 56 |
|
| 57 |
}
|
| 75 |
* @return string
|
| 76 |
*/
|
| 77 |
public function makeVarPath($directories) {
|
| 78 |
+
$path = Mage::getBaseDir();
|
| 79 |
foreach ($directories as $dir) {
|
| 80 |
$path .= DS . $dir;
|
| 81 |
if (!is_dir($path)) {
|
app/code/community/Hawksearch/Datafeed/Helper/runfeed.php
CHANGED
|
@@ -24,7 +24,7 @@ if ($helper->thereAreFeedLocks()) {
|
|
| 24 |
}
|
| 25 |
if ($helper->CreateFeedLocks()) {
|
| 26 |
if (isset($opts['i'])) {
|
| 27 |
-
$feed->refreshImageCache(
|
| 28 |
} else {
|
| 29 |
$feed->generateFeed();
|
| 30 |
}
|
| 24 |
}
|
| 25 |
if ($helper->CreateFeedLocks()) {
|
| 26 |
if (isset($opts['i'])) {
|
| 27 |
+
$feed->refreshImageCache();
|
| 28 |
} else {
|
| 29 |
$feed->generateFeed();
|
| 30 |
}
|
app/code/community/Hawksearch/Datafeed/Model/Cron.php
CHANGED
|
@@ -1,4 +1,5 @@
|
|
| 1 |
<?php
|
|
|
|
| 2 |
/**
|
| 3 |
* Copyright (c) 2013 Hawksearch (www.hawksearch.com) - All Rights Reserved
|
| 4 |
*
|
|
@@ -7,31 +8,119 @@
|
|
| 7 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
| 8 |
* PARTICULAR PURPOSE.
|
| 9 |
*/
|
| 10 |
-
|
| 11 |
class Hawksearch_Datafeed_Model_Cron {
|
| 12 |
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
Mage::getModel('hawksearch_datafeed/feed')->generateFeed();
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
}
|
| 37 |
}
|
| 1 |
<?php
|
| 2 |
+
|
| 3 |
/**
|
| 4 |
* Copyright (c) 2013 Hawksearch (www.hawksearch.com) - All Rights Reserved
|
| 5 |
*
|
| 8 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
| 9 |
* PARTICULAR PURPOSE.
|
| 10 |
*/
|
|
|
|
| 11 |
class Hawksearch_Datafeed_Model_Cron {
|
| 12 |
|
| 13 |
+
/**
|
| 14 |
+
* Generates the feeds and sends email of status when done
|
| 15 |
+
*/
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
public function isValidCronString($string) {
|
| 19 |
+
$e = preg_split('#\s+#', $string, null, PREG_SPLIT_NO_EMPTY);
|
| 20 |
+
if (sizeof($e) < 5 || sizeof($e) > 6) {
|
| 21 |
+
return false;
|
| 22 |
+
}
|
| 23 |
+
$isValid = $this->testCronPartSimple(0, $e)
|
| 24 |
+
&& $this->testCronPartSimple(1, $e)
|
| 25 |
+
&& $this->testCronPartSimple(2, $e)
|
| 26 |
+
&& $this->testCronPartSimple(3, $e)
|
| 27 |
+
&& $this->testCronPartSimple(4, $e);
|
| 28 |
+
|
| 29 |
+
if (!$isValid) {
|
| 30 |
+
return false;
|
| 31 |
+
}
|
| 32 |
+
return true;
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
public function testCronPartSimple($p, $e) {
|
| 36 |
+
if ($p === 0) {
|
| 37 |
+
// we only accept a single numeric value for the minute and it must be in range
|
| 38 |
+
if (!ctype_digit($e[$p])) {
|
| 39 |
+
return false;
|
| 40 |
+
}
|
| 41 |
+
if ($e[0] < 0 || $e[0] > 59) {
|
| 42 |
+
return false;
|
| 43 |
+
}
|
| 44 |
+
return true;
|
| 45 |
+
}
|
| 46 |
+
return $this->testCronPart($p, $e);
|
| 47 |
+
}
|
| 48 |
+
|
| 49 |
+
public function testCronPart($p, $e) {
|
| 50 |
+
|
| 51 |
+
if ($e[$p] === '*') {
|
| 52 |
+
return true;
|
| 53 |
+
}
|
| 54 |
+
|
| 55 |
+
foreach (explode(',', $e[$p]) as $v) {
|
| 56 |
+
if (!$this->isValidCronRange($p, $v)) {
|
| 57 |
+
return false;
|
| 58 |
+
}
|
| 59 |
+
}
|
| 60 |
+
return true;
|
| 61 |
+
}
|
| 62 |
+
|
| 63 |
+
private function isValidCronRange($p, $v) {
|
| 64 |
+
static $range = array(array(0, 59), array(0, 23), array(1, 31), array(1, 12), array(0, 6));
|
| 65 |
+
//$n = Mage::getSingleton('cron/schedule')->getNumeric($v);
|
| 66 |
+
|
| 67 |
+
// steps can be used with ranges
|
| 68 |
+
if (strpos($v, '/') !== false) {
|
| 69 |
+
$ops = explode('/', $v);
|
| 70 |
+
if (count($ops) !== 2) {
|
| 71 |
+
return false;
|
| 72 |
+
}
|
| 73 |
+
// step must be digit
|
| 74 |
+
if (!ctype_digit($ops[1])) {
|
| 75 |
+
return false;
|
| 76 |
+
}
|
| 77 |
+
$v = $ops[0];
|
| 78 |
+
}
|
| 79 |
+
if (strpos($v, '-') !== false) {
|
| 80 |
+
$ops = explode('-', $v);
|
| 81 |
+
if(count($ops) !== 2){
|
| 82 |
+
return false;
|
| 83 |
+
}
|
| 84 |
+
if ($ops[0] > $ops[1] || $ops[0] < $range[$p][0] || $ops[0] > $range[$p][1] || $ops[1] < $range[$p][0] || $ops[1] > $range[$p][1]) {
|
| 85 |
+
return false;
|
| 86 |
+
}
|
| 87 |
+
} else {
|
| 88 |
+
$a = Mage::getSingleton('cron/schedule')->getNumeric($v);
|
| 89 |
+
if($a < $range[$p][0] || $a > $range[$p][1]){
|
| 90 |
+
return false;
|
| 91 |
+
}
|
| 92 |
+
}
|
| 93 |
+
return true;
|
| 94 |
+
}
|
| 95 |
+
|
| 96 |
+
public function generateImagecache() {
|
| 97 |
+
if(Mage::getStoreConfigFlag('hawksearch_datafeed/imagecache/cron_enable')) {
|
| 98 |
+
try{
|
| 99 |
+
Mage::getModel('hawksearch_datafeed/feed')->refreshImageCache();
|
| 100 |
+
$msg = "Hawksearch Image cache generated!";
|
| 101 |
+
} catch (Exception $e) {
|
| 102 |
+
$msg = "Hawksearch Image cache generation exception: " . $e->getMessage();
|
| 103 |
+
}
|
| 104 |
+
$this->_sendEmail($msg);
|
| 105 |
+
}
|
| 106 |
+
}
|
| 107 |
+
|
| 108 |
+
public function generateFeeds() {
|
| 109 |
+
if (Mage::getStoreConfigFlag('hawksearch_datafeed/feed/cron_enable')) {
|
| 110 |
+
try {
|
| 111 |
Mage::getModel('hawksearch_datafeed/feed')->generateFeed();
|
| 112 |
+
$msg = "HawkSeach Feed Generated!";
|
| 113 |
+
} catch (Exception $e) {
|
| 114 |
+
$msg = $e->getMessage();
|
| 115 |
+
}
|
| 116 |
+
$this->_sendEmail($msg);
|
| 117 |
+
}
|
| 118 |
+
}
|
| 119 |
+
|
| 120 |
+
/**
|
| 121 |
+
* If there is a system config email set, send out the cron notification email.
|
| 122 |
+
*/
|
| 123 |
+
protected function _sendEmail($msg) {
|
| 124 |
+
Mage::getModel('hawksearch_datafeed/email')->setData('msg', $msg)->send();
|
| 125 |
+
}
|
|
|
|
| 126 |
}
|
app/code/community/Hawksearch/Datafeed/Model/Feed.php
CHANGED
|
@@ -27,18 +27,14 @@ class Hawksearch_Datafeed_Model_Feed extends Mage_Core_Model_Abstract {
|
|
| 27 |
private $countryMap;
|
| 28 |
private $outputFileDelimiter;
|
| 29 |
private $bufferSize;
|
|
|
|
| 30 |
private $outputFileExtension;
|
| 31 |
-
|
| 32 |
|
| 33 |
/**
|
| 34 |
* Constructor
|
| 35 |
*/
|
| 36 |
function __construct() {
|
| 37 |
-
|
| 38 |
-
// Ignore user aborts and allow the script
|
| 39 |
-
// to run forever
|
| 40 |
-
ignore_user_abort(true); // If Varnish decides that the results timed out. Browsers are better behaved.
|
| 41 |
-
set_time_limit(0); // Even with DB calls not counting towards execution time, it's still a long running script.
|
| 42 |
/** @var $helper Hawksearch_Datafeed_Helper_Data */
|
| 43 |
$helper = Mage::helper('hawksearch_datafeed/data');
|
| 44 |
|
|
@@ -52,6 +48,7 @@ class Hawksearch_Datafeed_Model_Feed extends Mage_Core_Model_Abstract {
|
|
| 52 |
|
| 53 |
$this->_feedPath = $helper->getFeedFilePath();
|
| 54 |
if (empty($this->_feedPath)) {
|
|
|
|
| 55 |
$this->_feedPath = Mage::getBaseDir('base') . DS . 'var/hawksearch/feeds';
|
| 56 |
}
|
| 57 |
|
|
@@ -72,6 +69,9 @@ class Hawksearch_Datafeed_Model_Feed extends Mage_Core_Model_Abstract {
|
|
| 72 |
$this->outputFileExtension = $helper->getOutputFileExtension();
|
| 73 |
$this->_storeId = 0;
|
| 74 |
|
|
|
|
|
|
|
|
|
|
| 75 |
parent::__construct();
|
| 76 |
}
|
| 77 |
|
|
@@ -88,372 +88,143 @@ class Hawksearch_Datafeed_Model_Feed extends Mage_Core_Model_Abstract {
|
|
| 88 |
}
|
| 89 |
}
|
| 90 |
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
$
|
| 102 |
-
$
|
| 103 |
-
|
| 104 |
-
$
|
| 105 |
-
$
|
| 106 |
-
|
| 107 |
-
$
|
| 108 |
-
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
|
| 112 |
-
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
|
| 116 |
-
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
| 126 |
-
WHERE
|
| 127 |
-
v.entity_type_id = $this->_entityTypeId
|
| 128 |
-
AND
|
| 129 |
-
a.frontend_input IN ('select', 'multiselect')
|
| 130 |
-
AND a.attribute_code != 'msrp_enabled' AND a.attribute_code != 'msrp_display_actual_price_type' AND a.attribute_code != 'is_recurring' AND a.attribute_code != 'enable_googlecheckout' AND a.attribute_code != 'tax_class_id' AND a.attribute_code != 'visibility' AND a.attribute_code != 'status'
|
| 131 |
-
EOSQL;
|
| 132 |
-
|
| 133 |
-
// Prepare the array of attribute codes and compile a unique list of IDs to dereference
|
| 134 |
-
|
| 135 |
-
if ($rows = $write->fetchAll($sql)) {
|
| 136 |
-
foreach ($rows as $row) {
|
| 137 |
-
$opts = explode(',', $row['value']);
|
| 138 |
-
foreach ($opts as $opt) {
|
| 139 |
-
#print_r($opt);
|
| 140 |
-
if (isset($attributeIds[$row['attribute_code']])) {
|
| 141 |
-
if ((is_numeric($opt)) && !in_array($opt, $attributeIds[$row['attribute_code']])) {
|
| 142 |
-
$attributeIds[$row['attribute_code']][$opt] = $opt;
|
| 143 |
-
$attributeIds['ids'][$opt] = $opt;
|
| 144 |
-
}
|
| 145 |
-
}
|
| 146 |
-
}
|
| 147 |
-
}
|
| 148 |
-
if (!empty($attributeIds['ids'])) {
|
| 149 |
-
$idList = "'" . implode("', '", $attributeIds['ids']) . "'";
|
| 150 |
-
}
|
| 151 |
-
}
|
| 152 |
-
|
| 153 |
-
// Get the list of attribute IDs to dereference and the attribute_codes that they match
|
| 154 |
-
$sql = <<<EOSQL
|
| 155 |
-
SELECT
|
| 156 |
-
v.value, a.attribute_code
|
| 157 |
-
FROM
|
| 158 |
-
$catalogProdEntityInt v
|
| 159 |
-
LEFT JOIN
|
| 160 |
-
$eavAttributeTable a ON v.attribute_id = a.attribute_id
|
| 161 |
-
WHERE
|
| 162 |
-
v.entity_type_id = $this->_entityTypeId
|
| 163 |
-
AND
|
| 164 |
-
a.frontend_input IN ('select', 'multiselect')
|
| 165 |
-
AND a.attribute_code != 'msrp_enabled' AND a.attribute_code != 'msrp_display_actual_price_type' AND a.attribute_code != 'is_recurring' AND a.attribute_code != 'enable_googlecheckout' AND a.attribute_code != 'tax_class_id' AND a.attribute_code != 'visibility' AND a.attribute_code != 'status'
|
| 166 |
-
EOSQL;
|
| 167 |
-
|
| 168 |
-
// Prepare the array of attribute codes and compile a unique list of IDs to dereference
|
| 169 |
-
if ($rows = $write->fetchAll($sql)) {
|
| 170 |
-
foreach ($rows as $row) {
|
| 171 |
-
$opts = explode(',', $row['value']);
|
| 172 |
-
foreach ($opts as $opt) {
|
| 173 |
-
#print_r($opt);
|
| 174 |
-
if (isset($attributeIds[$row['attribute_code']])) {
|
| 175 |
-
if ((is_numeric($opt)) && !empty($attributeIds['ids']) && !in_array($opt, $attributeIds[$row['attribute_code']])) {
|
| 176 |
-
$attributeIds[$row['attribute_code']][$opt] = $opt;
|
| 177 |
-
$attributeIds['ids'][$opt] = $opt;
|
| 178 |
-
}
|
| 179 |
-
}
|
| 180 |
-
}
|
| 181 |
-
}
|
| 182 |
-
|
| 183 |
-
if (!empty($attributeIds['ids'])) {
|
| 184 |
-
$idList = "'" . implode("', '", $attributeIds['ids']) . "'";
|
| 185 |
-
}
|
| 186 |
-
}
|
| 187 |
-
|
| 188 |
|
| 189 |
-
if (!
|
| 190 |
-
|
| 191 |
-
$
|
| 192 |
-
SELECT
|
| 193 |
-
value,
|
| 194 |
-
option_id
|
| 195 |
-
FROM
|
| 196 |
-
$eavOptionValueTable
|
| 197 |
-
WHERE
|
| 198 |
-
option_id IN ($idList)
|
| 199 |
-
EOSQL;
|
| 200 |
-
|
| 201 |
-
// Replace the IDs with their values
|
| 202 |
-
if ($rows = $write->fetchAll($sql)) {
|
| 203 |
-
foreach ($rows as $row) {
|
| 204 |
-
foreach ($attributeIds as &$attrGroup) {
|
| 205 |
-
if (!empty($attrGroup[$row['option_id']])) {
|
| 206 |
-
$attrGroup[$row['option_id']] = $row['value'];
|
| 207 |
-
}
|
| 208 |
-
}
|
| 209 |
-
}
|
| 210 |
-
}
|
| 211 |
}
|
| 212 |
|
| 213 |
-
|
| 214 |
-
|
| 215 |
-
|
| 216 |
-
|
| 217 |
-
|
| 218 |
-
* Generate feed based on store and returns success
|
| 219 |
-
*
|
| 220 |
-
* @return boolean
|
| 221 |
-
*/
|
| 222 |
-
protected function _getAttributeData() {
|
| 223 |
-
$this->log('starting _getAttributeData');
|
| 224 |
-
$filename = $this->_feedPath . DS . "attributes" . '.' . $this->outputFileExtension;
|
| 225 |
-
$arrayExcludeFields = explode(",", $this->_excludedFields);
|
| 226 |
-
|
| 227 |
-
$eavAttributeTable = $this->_tablePrefix . 'eav_attribute';
|
| 228 |
-
$productEntityTable = $this->_tablePrefix . 'catalog_product_entity';
|
| 229 |
-
$eavOptionValueTable = $this->_tablePrefix . 'eav_attribute_option_value';
|
| 230 |
-
$categoryProductTable = $this->_tablePrefix . 'catalog_category_product';
|
| 231 |
-
$productEntityValueTable = $this->_tablePrefix . 'catalog_product_entity_';
|
| 232 |
-
|
| 233 |
-
$tables = array(
|
| 234 |
-
'int',
|
| 235 |
-
'text',
|
| 236 |
-
'varchar',
|
| 237 |
-
'decimal',
|
| 238 |
-
'datetime',
|
| 239 |
-
);
|
| 240 |
-
|
| 241 |
-
$write = $this->_getConnection();
|
| 242 |
-
|
| 243 |
-
$excludeFields = implode("', '", $arrayExcludeFields);
|
| 244 |
-
if (!empty($excludeFields)) {
|
| 245 |
-
$this->log('adding exclude fields');
|
| 246 |
-
$excludeFields = " AND attribute_code NOT IN ('" . $excludeFields . "')";
|
| 247 |
}
|
| 248 |
|
| 249 |
$this->log(sprintf('going to open feed file %s', $filename));
|
| 250 |
$output = new CsvWriter($filename, $this->outputFileDelimiter, $this->bufferSize);
|
| 251 |
$this->log('feed file open, appending header');
|
| 252 |
$output->appendRow(array('unique_id', 'key', 'value'));
|
| 253 |
-
$this->log('header appended');
|
| 254 |
-
|
| 255 |
-
foreach ($tables as $table) {
|
| 256 |
-
$this->log(sprintf('starting to pull from attribute table %s', $table));
|
| 257 |
-
|
| 258 |
-
$done = false;
|
| 259 |
-
$offset = 0;
|
| 260 |
-
$valueTable = $productEntityValueTable . $table;
|
| 261 |
-
if ($table == "catalog_category_product") {
|
| 262 |
-
$this->log('creating query for catalog_category_product');
|
| 263 |
-
|
| 264 |
-
$selectQry = <<<EOSQL
|
| 265 |
-
SELECT
|
| 266 |
-
e.entity_id,
|
| 267 |
-
e.sku,
|
| 268 |
-
a.attribute_code,
|
| 269 |
-
a.source_model,
|
| 270 |
-
a.frontend_input,
|
| 271 |
-
a.attribute_id,
|
| 272 |
-
a.attribute_code As value
|
| 273 |
-
FROM
|
| 274 |
-
$productEntityTable e
|
| 275 |
-
LEFT JOIN
|
| 276 |
-
$eavAttributeTable a ON e.entity_type_id = a.entity_type_id
|
| 277 |
-
WHERE
|
| 278 |
-
e.entity_type_id = $this->_entityTypeId AND a.attribute_code = 'category_ids'
|
| 279 |
-
ORDER BY e.entity_id ASC
|
| 280 |
-
EOSQL;
|
| 281 |
-
|
| 282 |
-
} else {
|
| 283 |
-
$valColumn = "v.value";
|
| 284 |
-
$eaovTable = '';
|
| 285 |
-
if ($table == 'int') {
|
| 286 |
-
$valColumn = "case when a.frontend_input = 'select' and (a.source_model = 'eav/entity_attribute_source_table' or a.source_model = '' or a.source_model IS NULL) then ov.value else v.value end AS value";
|
| 287 |
-
$eaovTable = "LEFT JOIN $eavOptionValueTable ov ON ov.option_id = v.value and ov.store_id = 0";
|
| 288 |
-
} elseif ($table == 'varchar') {
|
| 289 |
-
$valColumn = "case a.frontend_input when 'multiselect' then ov.value else v.value end AS value";
|
| 290 |
-
$eaovTable = "LEFT JOIN $eavOptionValueTable ov ON ov.option_id = v.value and ov.store_id = 0";
|
| 291 |
-
}
|
| 292 |
-
$selectQry = <<<EOSQL
|
| 293 |
-
SELECT
|
| 294 |
-
e.entity_id,
|
| 295 |
-
e.sku,
|
| 296 |
-
a.attribute_code,
|
| 297 |
-
a.source_model,
|
| 298 |
-
a.frontend_input,
|
| 299 |
-
a.attribute_id,
|
| 300 |
-
$valColumn
|
| 301 |
-
FROM
|
| 302 |
-
$productEntityTable e
|
| 303 |
-
LEFT JOIN
|
| 304 |
-
$valueTable v ON e.entity_id = v.entity_id and v.store_id = 0
|
| 305 |
-
LEFT JOIN
|
| 306 |
-
$eavAttributeTable a ON v.attribute_id = a.attribute_id
|
| 307 |
-
$eaovTable
|
| 308 |
-
WHERE
|
| 309 |
-
e.entity_type_id = $this->_entityTypeId
|
| 310 |
-
$excludeFields
|
| 311 |
-
ORDER BY e.entity_id ASC
|
| 312 |
-
EOSQL;
|
| 313 |
-
Mage::log($selectQry);
|
| 314 |
|
| 315 |
-
|
|
|
|
|
|
|
| 316 |
|
| 317 |
-
|
| 318 |
-
|
| 319 |
-
|
| 320 |
-
|
| 321 |
-
|
| 322 |
-
|
| 323 |
-
|
| 324 |
-
|
| 325 |
-
|
| 326 |
-
|
| 327 |
-
|
| 328 |
-
|
| 329 |
-
|
| 330 |
-
|
| 331 |
-
|
| 332 |
-
|
| 333 |
-
|
| 334 |
-
|
| 335 |
-
|
| 336 |
-
|
| 337 |
-
|
| 338 |
-
|
| 339 |
-
|
| 340 |
-
|
| 341 |
-
|
| 342 |
-
|
| 343 |
-
|
| 344 |
-
|
| 345 |
-
|
| 346 |
-
|
| 347 |
-
|
| 348 |
-
$source = Mage::getSingleton($row['source_model']);
|
| 349 |
-
$attribute = Mage::getModel('eav/entity_attribute')->load($row['attribute_id']);
|
| 350 |
-
$source->setAttribute($attribute);
|
| 351 |
-
$output->appendRow(array($row['sku'], $row['attribute_code'], $source->getOptionText($row['value'])));
|
| 352 |
-
} catch (Exception $e) {
|
| 353 |
-
$this->log(sprintf('%s - Caught Exception on line %d or %s: %s', date('c'), $e->getLine(), $e->getFile(), $e->getTraceAsString()));
|
| 354 |
-
$output->appendRow(array($row['sku'], $row['attribute_code'], $row['value']));
|
| 355 |
-
}
|
| 356 |
-
} else {
|
| 357 |
-
$output->appendRow(array($row['sku'], $row['attribute_code'], $row['value']));
|
| 358 |
-
}
|
| 359 |
-
}
|
| 360 |
-
$offset += $this->_batchSize;
|
| 361 |
} else {
|
| 362 |
-
$
|
| 363 |
-
|
|
|
|
|
|
|
|
|
|
| 364 |
}
|
| 365 |
-
} catch (Exception $e) {
|
| 366 |
-
// remove lock
|
| 367 |
-
Mage::helper('hawksearch_datafeed/feed')->RemoveFeedLocks();
|
| 368 |
-
|
| 369 |
-
$this->log(sprintf('%s - Exception thrown on line %d or %s: %s', date('c'), $e->getLine(), $e->getFile(), $e->getTraceAsString()));
|
| 370 |
-
$this->log('exiting function _getAttributeData() due to exception');
|
| 371 |
-
return false;
|
| 372 |
}
|
| 373 |
-
}
|
| 374 |
-
}
|
| 375 |
-
$this->log('going to get product collection for category id selection');
|
| 376 |
-
/* custom attribute code/category_id */
|
| 377 |
-
$collection = Mage::getModel('catalog/product')->getCollection();
|
| 378 |
-
$collection->addAttributeToSelect('sku');
|
| 379 |
-
//$collection->addAttributeToFilter('visibility', array('neq' => Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE));
|
| 380 |
-
if (!Mage::helper('hawksearch_datafeed/data')->getAllowDisabledAttribute()) {
|
| 381 |
-
$this->log('adding status filter');
|
| 382 |
-
$collection->addAttributeToFilter('status', Mage_Catalog_Model_Product_Status::STATUS_ENABLED);
|
| 383 |
-
}
|
| 384 |
-
if (!Mage::helper('hawksearch_datafeed/data')->isIncludeOutOfStockItems()) {
|
| 385 |
-
$this->log('adding out of stock filter');
|
| 386 |
-
/** @var Mage_CatalogInventory_Model_Stock $stockfilter */
|
| 387 |
-
$stockfilter = Mage::getSingleton('cataloginventory/stock');
|
| 388 |
-
$stockfilter->addInStockFilterToCollection($collection);
|
| 389 |
-
}
|
| 390 |
-
|
| 391 |
-
$this->log(sprintf('setting page size to %d', $this->_batchSize));
|
| 392 |
-
$collection->setPageSize($this->_batchSize);
|
| 393 |
-
$totalPages = $collection->getLastPageNumber();
|
| 394 |
-
$this->log(sprintf('retrieved %d total pages', $totalPages));
|
| 395 |
-
|
| 396 |
-
$currentPage = 1;
|
| 397 |
-
do {
|
| 398 |
-
$this->log(sprintf('setting current page to %d', $currentPage));
|
| 399 |
-
$collection->setCurPage($currentPage);
|
| 400 |
-
$collection->clear();
|
| 401 |
-
$this->log(sprintf('going to process %d products on page %d', $collection->count(), $currentPage));
|
| 402 |
-
|
| 403 |
-
/*
|
| 404 |
-
* add ratings information
|
| 405 |
-
*/
|
| 406 |
-
/** @var Mage_Review_Model_Review $review */
|
| 407 |
-
$review = Mage::getSingleton('review/review');
|
| 408 |
-
$review->appendSummary($collection);
|
| 409 |
-
|
| 410 |
-
/** @var Mage_Catalog_Model_Product $product */
|
| 411 |
-
foreach ($collection as $product) {
|
| 412 |
foreach ($product->getCategoryIds() as $id) {
|
| 413 |
$output->appendRow(array($product->getSku(), 'category_id', $id));
|
| 414 |
}
|
| 415 |
-
if(($rs = $product->getRatingSummary()) &&
|
| 416 |
$output->appendRow(array($product->getSku(), 'rating_summary', $rs->getRatingSummary()));
|
| 417 |
$output->appendRow(array($product->getSku(), 'reviews_count', $rs->getReviewsCount()));
|
| 418 |
}
|
| 419 |
-
/* Example of custom attribute generation */
|
| 420 |
-
// $product->load('media_gallery');
|
| 421 |
-
// /** @var Varien_Data_Collection $images */
|
| 422 |
-
// $images = $product->getMediaGalleryImages();
|
| 423 |
-
// $image = $images->getLastItem();
|
| 424 |
-
// $imagePath = $image->getFile();
|
| 425 |
-
// $output->appendRow(array($product->getSku(), 'rollover_image', $imagePath));
|
| 426 |
-
|
| 427 |
-
/* Gallery images should come out sorted,
|
| 428 |
-
but if not, try this instead of getLastItem(): */
|
| 429 |
-
// $pos = 0;
|
| 430 |
-
// foreach ($images as $image) {
|
| 431 |
-
// if ($image->getPosition() >= $pos) {
|
| 432 |
-
// $pos = $image->getPosition();
|
| 433 |
-
// $imagePath = $image->getFile();
|
| 434 |
-
// }
|
| 435 |
-
// }
|
| 436 |
}
|
|
|
|
|
|
|
| 437 |
$currentPage++;
|
| 438 |
-
} while
|
|
|
|
| 439 |
|
| 440 |
-
|
| 441 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 442 |
}
|
| 443 |
|
| 444 |
/**
|
| 445 |
* @return bool
|
| 446 |
* @throws Mage_Core_Exception
|
| 447 |
*/
|
| 448 |
-
protected function _getCategoryData() {
|
| 449 |
$this->log('starting _getCategoryData()');
|
| 450 |
-
$filename = $this->
|
| 451 |
|
| 452 |
-
$collection
|
|
|
|
|
|
|
|
|
|
| 453 |
$collection->addAttributeToSelect(array('name', 'is_active', 'parent_id', 'position'));
|
| 454 |
$collection->addAttributeToFilter('is_active', array('eq' => '1'));
|
| 455 |
$collection->addAttributeToSort('entity_id')->addAttributeToSort('parent_id')->addAttributeToSort('position');
|
| 456 |
|
|
|
|
| 457 |
$collection->setPageSize($this->_batchSize);
|
| 458 |
$pages = $collection->getLastPageNumber();
|
| 459 |
$currentPage = 1;
|
|
@@ -464,21 +235,21 @@ EOSQL;
|
|
| 464 |
$output->appendRow(array('category_id', 'category_name', 'parent_category_id', 'sort_order', 'is_active', 'category_url'));
|
| 465 |
$output->appendRow(array('1', 'Root', '0', '0', '1', '/'));
|
| 466 |
$this->log('header and root appended');
|
| 467 |
-
$base =
|
| 468 |
|
| 469 |
$cats = array();
|
| 470 |
do {
|
| 471 |
-
|
| 472 |
$collection->setCurPage($currentPage);
|
| 473 |
$collection->clear();
|
| 474 |
$collection->load();
|
| 475 |
foreach ($collection as $cat) {
|
| 476 |
$fullUrl = Mage::helper('catalog/category')->getCategoryUrl($cat);
|
| 477 |
$category_url = substr($fullUrl, strlen($base));
|
| 478 |
-
if(substr($category_url, 0, 1) != '/'){
|
| 479 |
$category_url = '/' . $category_url;
|
| 480 |
}
|
| 481 |
-
|
| 482 |
$cats[] = array(
|
| 483 |
'id' => $cat->getId(),
|
| 484 |
'name' => $cat->getName(),
|
|
@@ -491,10 +262,10 @@ EOSQL;
|
|
| 491 |
$currentPage++;
|
| 492 |
} while ($currentPage <= $pages);
|
| 493 |
|
| 494 |
-
$rcid =
|
| 495 |
$myCategories = array();
|
| 496 |
-
foreach($cats as $storecat){
|
| 497 |
-
if($storecat['id'] == $rcid){
|
| 498 |
$myCategories[] = $storecat;
|
| 499 |
}
|
| 500 |
}
|
|
@@ -502,7 +273,7 @@ EOSQL;
|
|
| 502 |
$this->log("using root category id: $rcid");
|
| 503 |
$this->r_find($rcid, $cats, $myCategories);
|
| 504 |
|
| 505 |
-
foreach($myCategories as $final) {
|
| 506 |
$output->appendRow(array(
|
| 507 |
$final['id'],
|
| 508 |
$final['name'],
|
|
@@ -526,145 +297,36 @@ EOSQL;
|
|
| 526 |
* @param $tree
|
| 527 |
*/
|
| 528 |
private function r_find($pid, &$all, &$tree) {
|
| 529 |
-
foreach($all as $item) {
|
| 530 |
-
if($item['pid'] == $pid) {
|
| 531 |
$tree[] = $item;
|
| 532 |
$this->r_find($item['id'], $all, $tree);
|
| 533 |
}
|
| 534 |
}
|
| 535 |
}
|
| 536 |
|
| 537 |
-
protected function _getProductData() {
|
| 538 |
-
$
|
| 539 |
-
|
| 540 |
-
$
|
| 541 |
-
|
| 542 |
-
|
| 543 |
-
|
| 544 |
-
$urlSuffix = '.' . $urlSuffix;
|
| 545 |
-
}
|
| 546 |
-
}
|
| 547 |
-
$this->log(sprintf("using '%s' for the product url suffix", $urlSuffix));
|
| 548 |
-
|
| 549 |
-
$done = false;
|
| 550 |
-
$offset = 0;
|
| 551 |
-
$filename = $this->_feedPath . DS . "items" . '.' . $this->outputFileExtension;
|
| 552 |
-
$brand_sql = "";
|
| 553 |
-
$attrCodes = array();
|
| 554 |
-
$brand_select = "";
|
| 555 |
-
$entity_type_id = $this->_entityTypeId;
|
| 556 |
-
|
| 557 |
-
$this->_batchSize = 10000;
|
| 558 |
-
|
| 559 |
-
$eavTable = $this->_tablePrefix . 'eav_attribute';
|
| 560 |
-
$productEntityTable = $this->_tablePrefix . 'catalog_product_entity';
|
| 561 |
-
$eavOptionValueTable = $this->_tablePrefix . 'eav_attribute_option_value';
|
| 562 |
-
$productRelationTable = $this->_tablePrefix . 'catalog_product_relation';
|
| 563 |
-
$productEntityIntTable = $this->_tablePrefix . 'catalog_product_entity_int';
|
| 564 |
-
$productEntityTextTable = $this->_tablePrefix . 'catalog_product_entity_text';
|
| 565 |
-
$productEntityVarCharTable = $this->_tablePrefix . 'catalog_product_entity_varchar';
|
| 566 |
-
$productEntityDecimalTable = $this->_tablePrefix . 'catalog_product_entity_decimal';
|
| 567 |
-
$productEntityDateTimeTable = $this->_tablePrefix . 'catalog_product_entity_datetime';
|
| 568 |
-
$catalogInventoryStockTable = $this->_tablePrefix . 'cataloginventory_stock_item';
|
| 569 |
-
$productEntityUrlTable = $this->_tablePrefix . 'catalog_product_entity_url_key';
|
| 570 |
-
|
| 571 |
-
//$baseurl = Mage::getUrl();
|
| 572 |
-
//$mediaurl = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA);
|
| 573 |
-
$brandAttribute = Mage::helper('hawksearch_datafeed/data')->getBrandAttribute();
|
| 574 |
-
$allowDisabled = Mage::helper('hawksearch_datafeed/data')->getAllowDisabledAttribute();
|
| 575 |
-
|
| 576 |
-
$write = $this->_getConnection();
|
| 577 |
-
|
| 578 |
-
$attrCodesQuery = <<<EOSQL
|
| 579 |
-
SELECT attribute_id, attribute_code
|
| 580 |
-
FROM $eavTable
|
| 581 |
-
WHERE attribute_code IN
|
| 582 |
-
(
|
| 583 |
-
'name',
|
| 584 |
-
'url_key',
|
| 585 |
-
'image',
|
| 586 |
-
'description',
|
| 587 |
-
'short_description',
|
| 588 |
-
'meta_keyword',
|
| 589 |
-
'visibility',
|
| 590 |
-
'price',
|
| 591 |
-
'special_from_date',
|
| 592 |
-
'special_to_date',
|
| 593 |
-
'msrp',
|
| 594 |
-
'special_price',
|
| 595 |
-
'status',
|
| 596 |
-
'url_key',
|
| 597 |
-
'$brandAttribute'
|
| 598 |
-
)
|
| 599 |
-
AND entity_type_id = '$entity_type_id'
|
| 600 |
-
EOSQL;
|
| 601 |
-
|
| 602 |
-
$this->log('fetching attribute codes');
|
| 603 |
-
if ($codeRows = $write->fetchAll($attrCodesQuery)) {
|
| 604 |
-
foreach ($codeRows as $row) {
|
| 605 |
-
$attrCodes[$row['attribute_code']] = $row['attribute_id'];
|
| 606 |
-
}
|
| 607 |
-
}
|
| 608 |
-
$this->log(sprintf('found %d codes: %s', count($attrCodes), implode("', '", array_keys($attrCodes))));
|
| 609 |
-
|
| 610 |
-
$disabled_sql = '';
|
| 611 |
-
$CONN = ' WHERE ';
|
| 612 |
-
if (!$allowDisabled) {
|
| 613 |
-
$disabled_sql = "LEFT JOIN $productEntityIntTable AS T6 ON P.entity_id = T6.entity_id AND T6.attribute_id = '" . $attrCodes['status'] . "' AND T6.store_id = '" . $this->_storeId . "'";
|
| 614 |
-
}
|
| 615 |
|
| 616 |
-
if (!
|
| 617 |
-
$
|
| 618 |
-
$
|
| 619 |
-
}
|
| 620 |
-
$urlfield = ", CONCAT(V1.value, '" . $urlSuffix . "') AS Link";
|
| 621 |
-
$urljoin = "LEFT JOIN $productEntityUrlTable AS V1 ON P.entity_id = V1.entity_id AND V1.attribute_id = '" . $attrCodes['url_key'] . "' AND V1.store_id = '" . $this->_storeId . "'";
|
| 622 |
-
if (!Mage::getSingleton('core/resource')->getConnection('core_write')->isTableExists('catalog_product_entity_url_key')) {
|
| 623 |
-
$this->log('using catalog_product_entity_url_table');
|
| 624 |
-
$urljoin = ' LEFT JOIN ' . $productEntityVarCharTable . " AS V1 ON P.entity_id = V1.entity_id AND V1.attribute_id = '" . $attrCodes['url_key'] . "' AND V1.store_id = '" . $this->_storeId . "'";
|
| 625 |
}
|
| 626 |
|
| 627 |
-
$select_qry = "SELECT P.attribute_set_id, P.entity_id AS ProductID, P.type_id, P.sku, P.has_options, V.value AS Name, T1.value AS ProdDesc, T2.value AS ShortDesc, T3.value AS MetaKeyword, T5.value AS visibility, D.value AS Price, S.value AS Special_Price, SDF.value As Special_Date_From, SDT.value As Special_Date_To, ST.qty, ST.is_in_stock AS IsInStock, X.value AS Msrp" . $brand_select . ", R.parent_id AS GroupID $urlfield,
|
| 628 |
-
CASE
|
| 629 |
-
WHEN V2.Value IS NULL
|
| 630 |
-
THEN '/no-image.jpg'
|
| 631 |
-
ELSE CONCAT('', V2.value)
|
| 632 |
-
END AS Image
|
| 633 |
-
FROM $productEntityTable AS P
|
| 634 |
-
INNER JOIN " . $productEntityVarCharTable . " AS V ON P.entity_id = V.entity_id AND V.attribute_id = '" . $attrCodes['name'] . "' AND V.store_id = '" . $this->_storeId . "'
|
| 635 |
-
INNER JOIN " . $catalogInventoryStockTable . " AS ST ON P.entity_id = ST.product_id
|
| 636 |
-
INNER JOIN " . $productEntityIntTable . " AS VIS ON VIS.entity_id = P.entity_id AND VIS.value != 1
|
| 637 |
-
" . $urljoin . "
|
| 638 |
-
LEFT JOIN " . $productEntityVarCharTable . " AS V2 ON P.entity_id = V2.entity_id AND V2.attribute_id = '" . $attrCodes['image'] . "' AND V2.store_id = '" . $this->_storeId . "'
|
| 639 |
-
LEFT JOIN " . $productEntityTextTable . " AS T1 ON P.entity_id = T1.entity_id AND T1.attribute_id = '" . $attrCodes['description'] . "' AND T1.store_id = '" . $this->_storeId . "'
|
| 640 |
-
LEFT JOIN " . $productEntityTextTable . " AS T2 ON P.entity_id = T2.entity_id AND T2.attribute_id = '" . $attrCodes['short_description'] . "' AND T2.store_id = '" . $this->_storeId . "'
|
| 641 |
-
LEFT JOIN " . $productEntityTextTable . " AS T3 ON P.entity_id = T3.entity_id AND T3.attribute_id = '" . $attrCodes['meta_keyword'] . "' AND T3 .store_id = '" . $this->_storeId . "'
|
| 642 |
-
LEFT JOIN " . $productEntityIntTable . " AS T5 ON P.entity_id = T5.entity_id AND T5.attribute_id = '" . $attrCodes['visibility'] . "' AND T5.store_id = '" . $this->_storeId . "'
|
| 643 |
-
" . $disabled_sql . "
|
| 644 |
-
LEFT JOIN " . $productEntityDecimalTable . " AS D ON P.entity_id = D.entity_id AND D.attribute_id = '" . $attrCodes['price'] . "' AND D.store_id = '" . $this->_storeId . "'
|
| 645 |
-
LEFT JOIN " . $productEntityDateTimeTable . " AS SDF ON P.entity_id = SDF.entity_id AND SDF.attribute_id = '" . $attrCodes['special_from_date'] . "' AND SDF.store_id = '" . $this->_storeId . "'
|
| 646 |
-
LEFT JOIN " . $productEntityDateTimeTable . " AS SDT ON P.entity_id = SDT.entity_id AND SDT.attribute_id = '" . $attrCodes['special_to_date'] . "' AND SDT.store_id = '" . $this->_storeId . "'
|
| 647 |
-
" . $brand_sql . "
|
| 648 |
-
LEFT JOIN " . $productEntityDecimalTable . " AS X ON P.entity_id = X.entity_id AND X.attribute_id = '" . $attrCodes['msrp'] . "' AND X.store_id = '" . $this->_storeId . "'
|
| 649 |
-
LEFT JOIN " . $productRelationTable . " AS R ON P.entity_id = R.parent_id OR P.entity_id = R.child_id
|
| 650 |
-
LEFT JOIN " . $productEntityDecimalTable . " AS S ON P.entity_id = S.entity_id AND S.attribute_id = '" . $attrCodes['special_price'] . "' AND S.store_id = '" . $this->_storeId . "'";
|
| 651 |
-
|
| 652 |
if (!Mage::helper('hawksearch_datafeed/data')->isIncludeOutOfStockItems()) {
|
| 653 |
-
$this->log('
|
| 654 |
-
|
| 655 |
-
$
|
| 656 |
-
|
| 657 |
-
if (!$allowDisabled) {
|
| 658 |
-
$this->log('filtering disabled items');
|
| 659 |
-
$select_qry .= " $CONN T6.value = 1 ";
|
| 660 |
-
$CONN = ' AND ';
|
| 661 |
}
|
| 662 |
|
| 663 |
-
$
|
| 664 |
-
|
| 665 |
-
$this->log(sprintf('going to open feed file %s', $filename));
|
| 666 |
$output = new CsvWriter($filename, $this->outputFileDelimiter, $this->bufferSize);
|
| 667 |
-
$this->log('appending feed header');
|
| 668 |
$output->appendRow(array(
|
| 669 |
'product_id',
|
| 670 |
'unique_id',
|
|
@@ -687,128 +349,85 @@ EOSQL;
|
|
| 687 |
'is_new',
|
| 688 |
'is_on_sale',
|
| 689 |
'keyword',
|
| 690 |
-
'metric_inventory'
|
| 691 |
-
|
| 692 |
-
$full_query = 'not yet set';
|
| 693 |
-
while (!$done) {
|
| 694 |
-
try {
|
| 695 |
-
$full_query = $select_qry . ' LIMIT ' . $offset . ', ' . $this->_batchSize;
|
| 696 |
-
$this->log(sprintf('going to fetch %d products starting at offset %d', $this->_batchSize, $offset));
|
| 697 |
-
if ($rows = $write->fetchAll($full_query)) {
|
| 698 |
-
$this->log(sprintf('query returned %d rows', count($rows)));
|
| 699 |
-
if (count($rows) > 0) {
|
| 700 |
-
foreach ($rows as $row) {
|
| 701 |
-
//$name = empty($row['Name']) ? $row['Name'] : str_replace("\"", "\"\"", $row['Name']);
|
| 702 |
-
//$description = empty($row['ProdDesc']) ? $row['ProdDesc'] : str_replace("\"", "\"\"", $row['ProdDesc']);
|
| 703 |
-
//$shortdescription = empty($row['ShortDesc']) ? $row['ShortDesc'] : str_replace("\"", "\"\"", $row['ShortDesc']);
|
| 704 |
-
//$metakeyword = empty($row['MetaKeyword']) ? $row['MetaKeyword'] : str_replace("\"", "\"\"", $row['MetaKeyword']);
|
| 705 |
-
|
| 706 |
-
$data_is_on_sale = empty($row['Special_Price']) ? 0 : 1;
|
| 707 |
-
if (isset($row['Brand'])) {
|
| 708 |
-
$select_brand_qry = $write->query("SELECT value FROM " . $eavOptionValueTable . " WHERE `option_id`=\"" . $row['Brand'] . "\" AND store_id ='0'");
|
| 709 |
-
$brandRow = $select_brand_qry->fetch();
|
| 710 |
-
$brand_text = $brandRow['value'];
|
| 711 |
-
} else {
|
| 712 |
-
$brand_text = "";
|
| 713 |
-
}
|
| 714 |
-
$output->appendRow(array(
|
| 715 |
-
$row['ProductID'],
|
| 716 |
-
$row['sku'],
|
| 717 |
-
$row['Name'],
|
| 718 |
-
$row['Link'],
|
| 719 |
-
$row['Image'],
|
| 720 |
-
$row['Msrp'],
|
| 721 |
-
$row['Price'],
|
| 722 |
-
$row['Special_Price'],
|
| 723 |
-
$row['Special_Date_From'],
|
| 724 |
-
$row['Special_Date_To'],
|
| 725 |
-
$row['GroupID'],
|
| 726 |
-
$row['ShortDesc'],
|
| 727 |
-
$row['ProdDesc'],
|
| 728 |
-
$brand_text,
|
| 729 |
-
$row['sku'],
|
| 730 |
-
0, // sort_default
|
| 731 |
-
0, // sort_rating
|
| 732 |
-
0, // is_free_shipping
|
| 733 |
-
0, // is_new
|
| 734 |
-
$data_is_on_sale,
|
| 735 |
-
$row['MetaKeyword'],
|
| 736 |
-
$row['qty']));
|
| 737 |
|
| 738 |
-
|
| 739 |
-
|
| 740 |
-
|
| 741 |
-
} else {
|
| 742 |
-
$this->log('done fetching products');
|
| 743 |
-
$done = true;
|
| 744 |
-
}
|
| 745 |
-
} catch (Exception $e) {
|
| 746 |
-
// remove lock
|
| 747 |
-
Mage::helper('hawksearch_datafeed/feed')->RemoveFeedLocks();
|
| 748 |
|
| 749 |
-
|
| 750 |
-
|
| 751 |
-
|
| 752 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 753 |
}
|
| 754 |
-
|
|
|
|
|
|
|
|
|
|
| 755 |
$this->log('done with _getProductData()');
|
| 756 |
-
return true;
|
| 757 |
}
|
| 758 |
|
| 759 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 760 |
$this->log('starting _getContentData()');
|
| 761 |
-
$
|
| 762 |
-
$
|
| 763 |
-
$baseurl = Mage::getUrl();
|
| 764 |
-
//$filename = $this->_feedPath . "/content.txt";
|
| 765 |
-
$filename = $this->_feedPath . DS . "content" . '.' . $this->outputFileExtension;
|
| 766 |
-
|
| 767 |
-
//$firstRecord = true;
|
| 768 |
-
$cmsPageTable = $this->_tablePrefix . 'cms_page';
|
| 769 |
-
|
| 770 |
-
|
| 771 |
-
$select_qry = "SELECT page_id, title, CONCAT('" . $baseurl . "', identifier) AS Link, content_heading, content, creation_time, is_active FROM " . $cmsPageTable . "";
|
| 772 |
|
| 773 |
-
$
|
| 774 |
-
|
| 775 |
-
$this->log(sprintf('going to open feed file %s', $filename));
|
| 776 |
-
$output = new CsvWriter($filename, $this->outputFileDelimiter, $this->bufferSize);
|
| 777 |
-
$this->log('feed file open, going to append header');
|
| 778 |
$output->appendRow(array('unique_id', 'name', 'url_detail', 'description_short', 'created_date'));
|
| 779 |
-
$this->log('header appended, going to fetch data');
|
| 780 |
-
|
| 781 |
-
$full_query = 'not yet set';
|
| 782 |
-
while (!$done) {
|
| 783 |
-
try {
|
| 784 |
-
$this->log(sprintf('going to fetch %d rows at offset %d', $this->_batchSize, $offset));
|
| 785 |
-
$full_query = $select_qry . ' LIMIT ' . $offset . ', ' . $this->_batchSize;
|
| 786 |
-
if ($rows = $write->fetchAll($full_query)) {
|
| 787 |
-
if (($numRows = count($rows)) && $numRows > 0) {
|
| 788 |
-
foreach ($rows as $row) {
|
| 789 |
-
//$content .= $row['page_id'] . "\t" . $row['title'] . "\t" . $row['Link'] . "\t" . $row['content_heading'] . "\t" . $row['creation_time'] . "\n";
|
| 790 |
-
$output->appendRow(array($row['page_id'], $row['title'], $row['Link'], $row['content_heading'], $row['creation_time']));
|
| 791 |
-
}
|
| 792 |
|
| 793 |
-
|
| 794 |
-
|
| 795 |
-
|
| 796 |
-
|
| 797 |
-
|
| 798 |
-
|
| 799 |
-
|
| 800 |
-
|
| 801 |
-
|
| 802 |
-
|
| 803 |
-
|
| 804 |
-
$this->log(sprintf('%s - Exception thrown on line %d or %s: %s', date('c'), $e->getLine(), $e->getFile(), $e->getTraceAsString()));
|
| 805 |
-
$this->log(sprintf("\nSQL was:\n%s", $full_query));
|
| 806 |
-
$this->log('exiting function _getContentData() due to exception');
|
| 807 |
-
return false;
|
| 808 |
-
}
|
| 809 |
-
} // end while
|
| 810 |
-
$this->log('done fetching content data');
|
| 811 |
-
return true;
|
| 812 |
}
|
| 813 |
|
| 814 |
public function getCountryName($code) {
|
|
@@ -827,99 +446,127 @@ EOSQL;
|
|
| 827 |
}
|
| 828 |
|
| 829 |
public function generateFeed() {
|
| 830 |
-
|
| 831 |
-
|
| 832 |
-
|
| 833 |
-
|
| 834 |
-
|
| 835 |
-
|
| 836 |
-
|
| 837 |
-
|
| 838 |
-
|
| 839 |
-
|
| 840 |
-
|
| 841 |
-
|
| 842 |
-
|
| 843 |
-
|
| 844 |
-
|
| 845 |
-
|
| 846 |
-
|
| 847 |
-
|
| 848 |
-
|
| 849 |
-
|
| 850 |
-
|
| 851 |
-
|
| 852 |
-
|
| 853 |
-
|
| 854 |
-
|
| 855 |
-
|
| 856 |
-
|
| 857 |
-
|
| 858 |
-
|
| 859 |
-
|
| 860 |
-
|
| 861 |
-
|
| 862 |
-
|
| 863 |
-
|
| 864 |
-
|
| 865 |
-
|
| 866 |
-
|
| 867 |
-
|
| 868 |
-
|
| 869 |
-
|
|
|
|
| 870 |
}
|
| 871 |
-
$this->log('
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 872 |
}
|
| 873 |
|
| 874 |
-
public function
|
| 875 |
-
|
| 876 |
-
|
| 877 |
-
// $h = Mage::helper("hawksearch_proxy");
|
| 878 |
-
// if (!empty($h)) {
|
| 879 |
-
// $sid = $h->getCategoryStoreId();
|
| 880 |
-
// }
|
| 881 |
-
$sid = Mage::app()->getDefaultStoreView()->getId();
|
| 882 |
|
| 883 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 884 |
|
| 885 |
-
|
| 886 |
-
$initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation($sid);
|
| 887 |
|
| 888 |
-
|
| 889 |
-
|
| 890 |
-
$products->setPageSize(100);
|
| 891 |
-
$pages = $products->getLastPageNumber();
|
| 892 |
|
| 893 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 894 |
|
| 895 |
-
|
| 896 |
-
$this->log(sprintf('going to page %d of images', $currentPage));
|
| 897 |
-
$products->clear();
|
| 898 |
-
$products->setCurPage($currentPage);
|
| 899 |
-
$products->load();
|
| 900 |
|
| 901 |
-
|
| 902 |
-
if (empty($this->_imageHeight)) {
|
| 903 |
-
$this->log(
|
| 904 |
-
sprintf('going to resize image for url: %s',
|
| 905 |
-
Mage::helper('catalog/image')->init($product, 'small_image')->resize($this->_imageWidth
|
| 906 |
-
)));
|
| 907 |
-
} else {
|
| 908 |
-
$this->log(
|
| 909 |
-
sprintf('going to resize image for url: %s',
|
| 910 |
-
Mage::helper('catalog/image')->init($product, 'small_image')->resize($this->_imageWidth, $this->_imageHeight
|
| 911 |
-
)));
|
| 912 |
-
}
|
| 913 |
-
}
|
| 914 |
|
| 915 |
-
|
|
|
|
| 916 |
|
| 917 |
-
|
|
|
|
|
|
|
| 918 |
|
| 919 |
-
}
|
| 920 |
-
$this->log('done generating image cache, going to remove locks.');
|
| 921 |
Mage::helper('hawksearch_datafeed/feed')->RemoveFeedLocks();
|
| 922 |
-
$
|
| 923 |
}
|
| 924 |
|
| 925 |
/**
|
|
@@ -994,6 +641,9 @@ class CsvWriter {
|
|
| 994 |
if (!$this->outputOpen) {
|
| 995 |
$this->openOutput();
|
| 996 |
}
|
|
|
|
|
|
|
|
|
|
| 997 |
if (false === fputcsv($this->outputFile, $fields, $this->delimiter)) {
|
| 998 |
throw new Exception("CsvWriter: failed to write row.");
|
| 999 |
}
|
| 27 |
private $countryMap;
|
| 28 |
private $outputFileDelimiter;
|
| 29 |
private $bufferSize;
|
| 30 |
+
private $feedSummary;
|
| 31 |
private $outputFileExtension;
|
| 32 |
+
private $productAttributes;
|
| 33 |
|
| 34 |
/**
|
| 35 |
* Constructor
|
| 36 |
*/
|
| 37 |
function __construct() {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 38 |
/** @var $helper Hawksearch_Datafeed_Helper_Data */
|
| 39 |
$helper = Mage::helper('hawksearch_datafeed/data');
|
| 40 |
|
| 48 |
|
| 49 |
$this->_feedPath = $helper->getFeedFilePath();
|
| 50 |
if (empty($this->_feedPath)) {
|
| 51 |
+
$this->log(sprintf('WARNING: feed path not configured, dumping feeds into var/hawksearch/feeds/'));
|
| 52 |
$this->_feedPath = Mage::getBaseDir('base') . DS . 'var/hawksearch/feeds';
|
| 53 |
}
|
| 54 |
|
| 69 |
$this->outputFileExtension = $helper->getOutputFileExtension();
|
| 70 |
$this->_storeId = 0;
|
| 71 |
|
| 72 |
+
$this->feedSummary = new stdClass();
|
| 73 |
+
$this->productAttributes = array('entity_id', 'sku', 'name', 'url', 'small_image', 'msrp', 'price', 'special_price', 'special_from_date', 'special_to_date', 'short_description', 'description', 'meta_keyword', 'qty');
|
| 74 |
+
|
| 75 |
parent::__construct();
|
| 76 |
}
|
| 77 |
|
| 88 |
}
|
| 89 |
}
|
| 90 |
|
| 91 |
+
protected function _getAttributeData(Mage_Core_Model_Store $store) {
|
| 92 |
+
$this->log('starting _getAttributeData');
|
| 93 |
+
$filename = $this->getPathForFile('attributes');
|
| 94 |
+
$labelFilename = $this->getPathForFile('labels');
|
| 95 |
+
|
| 96 |
+
$this->log(sprintf('exporting attribute labels for store %s', $store->getName()));
|
| 97 |
+
$start = time();
|
| 98 |
+
/** @var Mage_Catalog_Model_Resource_Product_Attribute_Collection $pac */
|
| 99 |
+
$pac = Mage::getResourceModel('catalog/product_attribute_collection');
|
| 100 |
+
$pac->addSearchableAttributeFilter();
|
| 101 |
+
$pac->addStoreLabel($store->getId());
|
| 102 |
+
$attributes = array();
|
| 103 |
+
|
| 104 |
+
$labels = new CsvWriter($labelFilename, $this->outputFileDelimiter, $this->bufferSize);
|
| 105 |
+
$labels->appendRow(array('key', 'store_label'));
|
| 106 |
+
/** @var Mage_Catalog_Model_Resource_Eav_Attribute $att */
|
| 107 |
+
foreach ($pac as $att) {
|
| 108 |
+
$attributes[$att->getAttributeCode()] = $att;
|
| 109 |
+
$labels->appendRow(array($att->getAttributeCode(), $att->getStoreLabel()));
|
| 110 |
+
}
|
| 111 |
+
$labels->closeOutput();
|
| 112 |
+
$this->log(sprintf('Label export took %d seconds', time() - $start));
|
| 113 |
+
|
| 114 |
+
/** @var Mage_Catalog_Model_Resource_Product_Collection $products */
|
| 115 |
+
$products = Mage::getModel('catalog/product')->getCollection();
|
| 116 |
+
$feedCodes = array_diff(array_keys($attributes), $this->productAttributes);
|
| 117 |
+
if(!in_array('sku', $feedCodes)) {
|
| 118 |
+
array_push($feedCodes, 'sku');
|
| 119 |
+
}
|
| 120 |
+
$this->log(sprintf('searchable atts: %s', implode(', ', array_keys($attributes))));
|
| 121 |
+
$this->log(sprintf('adding attributes to select: %s', implode(', ', $feedCodes)));
|
| 122 |
+
$products->addAttributeToSelect($feedCodes);
|
| 123 |
+
// $products->addAttributeToFilter('visibility', array('neq' => Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE));
|
| 124 |
+
|
| 125 |
+
$products->addStoreFilter($store);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 126 |
|
| 127 |
+
if (!Mage::helper('hawksearch_datafeed/data')->getAllowDisabledAttribute()) {
|
| 128 |
+
$this->log('adding status filter');
|
| 129 |
+
$products->addAttributeToFilter('status', Mage_Catalog_Model_Product_Status::STATUS_ENABLED);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 130 |
}
|
| 131 |
|
| 132 |
+
if (!Mage::helper('hawksearch_datafeed/data')->isIncludeOutOfStockItems()) {
|
| 133 |
+
$this->log('adding out of stock filter');
|
| 134 |
+
/** @var Mage_CatalogInventory_Model_Stock $stockfilter */
|
| 135 |
+
$stockfilter = Mage::getSingleton('cataloginventory/stock');
|
| 136 |
+
$stockfilter->addInStockFilterToCollection($products);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 137 |
}
|
| 138 |
|
| 139 |
$this->log(sprintf('going to open feed file %s', $filename));
|
| 140 |
$output = new CsvWriter($filename, $this->outputFileDelimiter, $this->bufferSize);
|
| 141 |
$this->log('feed file open, appending header');
|
| 142 |
$output->appendRow(array('unique_id', 'key', 'value'));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 143 |
|
| 144 |
+
$products->setPageSize($this->_batchSize);
|
| 145 |
+
$pages = $products->getLastPageNumber();
|
| 146 |
+
$currentPage = 1;
|
| 147 |
|
| 148 |
+
/** @var Mage_Review_Model_Review $review */
|
| 149 |
+
$review = Mage::getSingleton('review/review');
|
| 150 |
+
|
| 151 |
+
do{
|
| 152 |
+
$this->log(sprintf('starting attribute export for page %d', $currentPage));
|
| 153 |
+
$start = time();
|
| 154 |
+
$products->setCurPage($currentPage);
|
| 155 |
+
$products->clear();
|
| 156 |
+
$review->appendSummary($products);
|
| 157 |
+
$products->load();
|
| 158 |
+
foreach ($products as $product) {
|
| 159 |
+
foreach ($feedCodes as $attcode) {
|
| 160 |
+
if($product->getData($attcode) === null) {
|
| 161 |
+
continue;
|
| 162 |
+
}
|
| 163 |
+
$source = $attributes[$attcode]->getSource();
|
| 164 |
+
if($source instanceof Mage_Eav_Model_Entity_Attribute_Source_Table){
|
| 165 |
+
// TODO: These table based items need to be broken into separate line items
|
| 166 |
+
$output->appendRow(array(
|
| 167 |
+
$product->getSku(),
|
| 168 |
+
$attcode,
|
| 169 |
+
$product->getResource()->getAttribute($attcode)->getFrontend()->getValue($product)
|
| 170 |
+
));
|
| 171 |
+
} elseif($source instanceof Mage_Catalog_Model_Product_Visibility
|
| 172 |
+
|| $source instanceof Mage_Tax_Model_Class_Source_Product
|
| 173 |
+
|| $source instanceof Mage_Catalog_Model_Product_Status ) {
|
| 174 |
+
$output->appendRow(array(
|
| 175 |
+
$product->getSku(),
|
| 176 |
+
$attcode,
|
| 177 |
+
$source->getOptionText($product->getData($attcode))
|
| 178 |
+
));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 179 |
} else {
|
| 180 |
+
$output->appendRow(array(
|
| 181 |
+
$product->getSku(),
|
| 182 |
+
$attcode,
|
| 183 |
+
$product->getData($attcode)
|
| 184 |
+
));
|
| 185 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 186 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 187 |
foreach ($product->getCategoryIds() as $id) {
|
| 188 |
$output->appendRow(array($product->getSku(), 'category_id', $id));
|
| 189 |
}
|
| 190 |
+
if (($rs = $product->getRatingSummary()) && $rs->getReviewsCount() > 0) {
|
| 191 |
$output->appendRow(array($product->getSku(), 'rating_summary', $rs->getRatingSummary()));
|
| 192 |
$output->appendRow(array($product->getSku(), 'reviews_count', $rs->getReviewsCount()));
|
| 193 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 194 |
}
|
| 195 |
+
|
| 196 |
+
$this->log(sprintf('page %d took %d seconds to export', $currentPage, time() - $start));
|
| 197 |
$currentPage++;
|
| 198 |
+
} while($currentPage <= $pages);
|
| 199 |
+
}
|
| 200 |
|
| 201 |
+
private function getPathForFile($basename) {
|
| 202 |
+
//$filename = $this->_feedPath . DS . "hierarchy" . '.' . $this->outputFileExtension;
|
| 203 |
+
$dir = sprintf('%s/%s', $this->_feedPath, end($this->feedSummary->stores));
|
| 204 |
+
$this->log(sprintf('checking for dir: %s', $dir));
|
| 205 |
+
if (!is_dir($dir)) {
|
| 206 |
+
mkdir($dir, 0777, true);
|
| 207 |
+
}
|
| 208 |
+
return sprintf('%s/%s.%s', $dir, $basename, $this->outputFileExtension);
|
| 209 |
}
|
| 210 |
|
| 211 |
/**
|
| 212 |
* @return bool
|
| 213 |
* @throws Mage_Core_Exception
|
| 214 |
*/
|
| 215 |
+
protected function _getCategoryData(Mage_Core_Model_Store $store) {
|
| 216 |
$this->log('starting _getCategoryData()');
|
| 217 |
+
$filename = $this->getPathForFile('hierarchy');
|
| 218 |
|
| 219 |
+
/** @var Mage_Catalog_Model_Resource_Category_Collection $collection */
|
| 220 |
+
/** @var Mage_Catalog_Model_Category $categoryModel */
|
| 221 |
+
$categoryModel = Mage::getModel('catalog/category');
|
| 222 |
+
$collection = $categoryModel->getCollection();
|
| 223 |
$collection->addAttributeToSelect(array('name', 'is_active', 'parent_id', 'position'));
|
| 224 |
$collection->addAttributeToFilter('is_active', array('eq' => '1'));
|
| 225 |
$collection->addAttributeToSort('entity_id')->addAttributeToSort('parent_id')->addAttributeToSort('position');
|
| 226 |
|
| 227 |
+
|
| 228 |
$collection->setPageSize($this->_batchSize);
|
| 229 |
$pages = $collection->getLastPageNumber();
|
| 230 |
$currentPage = 1;
|
| 235 |
$output->appendRow(array('category_id', 'category_name', 'parent_category_id', 'sort_order', 'is_active', 'category_url'));
|
| 236 |
$output->appendRow(array('1', 'Root', '0', '0', '1', '/'));
|
| 237 |
$this->log('header and root appended');
|
| 238 |
+
$base = $store->getBaseUrl();
|
| 239 |
|
| 240 |
$cats = array();
|
| 241 |
do {
|
| 242 |
+
//$this->log(sprintf('getting category page %d', $currentPage));
|
| 243 |
$collection->setCurPage($currentPage);
|
| 244 |
$collection->clear();
|
| 245 |
$collection->load();
|
| 246 |
foreach ($collection as $cat) {
|
| 247 |
$fullUrl = Mage::helper('catalog/category')->getCategoryUrl($cat);
|
| 248 |
$category_url = substr($fullUrl, strlen($base));
|
| 249 |
+
if (substr($category_url, 0, 1) != '/') {
|
| 250 |
$category_url = '/' . $category_url;
|
| 251 |
}
|
| 252 |
+
//$this->log(sprintf("got full category url: %s, returning relative url %s", $fullUrl, $category_url));
|
| 253 |
$cats[] = array(
|
| 254 |
'id' => $cat->getId(),
|
| 255 |
'name' => $cat->getName(),
|
| 262 |
$currentPage++;
|
| 263 |
} while ($currentPage <= $pages);
|
| 264 |
|
| 265 |
+
$rcid = $store->getRootCategoryId();
|
| 266 |
$myCategories = array();
|
| 267 |
+
foreach ($cats as $storecat) {
|
| 268 |
+
if ($storecat['id'] == $rcid) {
|
| 269 |
$myCategories[] = $storecat;
|
| 270 |
}
|
| 271 |
}
|
| 273 |
$this->log("using root category id: $rcid");
|
| 274 |
$this->r_find($rcid, $cats, $myCategories);
|
| 275 |
|
| 276 |
+
foreach ($myCategories as $final) {
|
| 277 |
$output->appendRow(array(
|
| 278 |
$final['id'],
|
| 279 |
$final['name'],
|
| 297 |
* @param $tree
|
| 298 |
*/
|
| 299 |
private function r_find($pid, &$all, &$tree) {
|
| 300 |
+
foreach ($all as $item) {
|
| 301 |
+
if ($item['pid'] == $pid) {
|
| 302 |
$tree[] = $item;
|
| 303 |
$this->r_find($item['id'], $all, $tree);
|
| 304 |
}
|
| 305 |
}
|
| 306 |
}
|
| 307 |
|
| 308 |
+
protected function _getProductData(Mage_Core_Model_Store $store) {
|
| 309 |
+
/** @var Mage_Catalog_Model_Resource_Product_Collection $products */
|
| 310 |
+
$products = Mage::getModel('catalog/product')->getCollection();
|
| 311 |
+
$products->addAttributeToSelect($this->productAttributes);
|
| 312 |
+
//$products->addAttributeToFilter('visibility', array('neq' => Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE));
|
| 313 |
+
$products->addMinimalPrice();
|
| 314 |
+
$products->addStoreFilter($store);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 315 |
|
| 316 |
+
if (!Mage::helper('hawksearch_datafeed/data')->getAllowDisabledAttribute()) {
|
| 317 |
+
$this->log('adding status filter');
|
| 318 |
+
$products->addAttributeToFilter('status', Mage_Catalog_Model_Product_Status::STATUS_ENABLED);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 319 |
}
|
| 320 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 321 |
if (!Mage::helper('hawksearch_datafeed/data')->isIncludeOutOfStockItems()) {
|
| 322 |
+
$this->log('adding out of stock filter');
|
| 323 |
+
/** @var Mage_CatalogInventory_Model_Stock $stockfilter */
|
| 324 |
+
$stockfilter = Mage::getSingleton('cataloginventory/stock');
|
| 325 |
+
$stockfilter->addInStockFilterToCollection($products);
|
|
|
|
|
|
|
|
|
|
|
|
|
| 326 |
}
|
| 327 |
|
| 328 |
+
$filename = $this->getPathForFile('items');
|
|
|
|
|
|
|
| 329 |
$output = new CsvWriter($filename, $this->outputFileDelimiter, $this->bufferSize);
|
|
|
|
| 330 |
$output->appendRow(array(
|
| 331 |
'product_id',
|
| 332 |
'unique_id',
|
| 349 |
'is_new',
|
| 350 |
'is_on_sale',
|
| 351 |
'keyword',
|
| 352 |
+
'metric_inventory',
|
| 353 |
+
'minimal_price'));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 354 |
|
| 355 |
+
$products->setPageSize($this->_batchSize);
|
| 356 |
+
$pages = $products->getLastPageNumber();
|
| 357 |
+
$currentPage = 1;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 358 |
|
| 359 |
+
do {
|
| 360 |
+
$this->log(sprintf('Starting product page %d', $currentPage));
|
| 361 |
+
$products->setCurPage($currentPage);
|
| 362 |
+
$products->clear();
|
| 363 |
+
$start = time();
|
| 364 |
+
$products->load();
|
| 365 |
+
$seconds = time() - $start;
|
| 366 |
+
$this->log(sprintf('it took %d seconds to load product page %d', $seconds, $currentPage));
|
| 367 |
+
$start = time();
|
| 368 |
+
/** @var Mage_Catalog_Model_Product $product */
|
| 369 |
+
foreach ($products as $product) {
|
| 370 |
+
$output->appendRow(array(
|
| 371 |
+
$product->getId(),
|
| 372 |
+
$product->getSku(),
|
| 373 |
+
$product->getName(),
|
| 374 |
+
substr($product->getProductUrl(1), strlen($store->getBaseUrl())),
|
| 375 |
+
$product->getSmallImage(),
|
| 376 |
+
$product->getMsrp(),
|
| 377 |
+
$product->getPrice(),
|
| 378 |
+
$product->getSpecialPrice(),
|
| 379 |
+
$product->getSpecialFromDate(),
|
| 380 |
+
$product->getSpecialToDate(),
|
| 381 |
+
$this->getGroupId($product),
|
| 382 |
+
$product->getShortDescription(),
|
| 383 |
+
$product->getDescription(),
|
| 384 |
+
'',
|
| 385 |
+
$product->getSku(),
|
| 386 |
+
'',
|
| 387 |
+
'',
|
| 388 |
+
'',
|
| 389 |
+
'',
|
| 390 |
+
$product->getSpecialPrice() ? 1 : 0,
|
| 391 |
+
$product->getMetaKeyword(),
|
| 392 |
+
$product->getQty(),
|
| 393 |
+
$product->getMinimalPrice()
|
| 394 |
+
));
|
| 395 |
}
|
| 396 |
+
$this->log(sprintf('it took %d seconds to export page %d', time() - $start, $currentPage));
|
| 397 |
+
$currentPage++;
|
| 398 |
+
} while ($currentPage <= $pages);
|
| 399 |
+
|
| 400 |
$this->log('done with _getProductData()');
|
|
|
|
| 401 |
}
|
| 402 |
|
| 403 |
+
private function getGroupId(Mage_Catalog_Model_Product $product) {
|
| 404 |
+
if ($product->getTypeId() == Mage_Catalog_Model_Product_Type::TYPE_SIMPLE) {
|
| 405 |
+
$vals =implode(",", Mage::getResourceSingleton('catalog/product_type_configurable')
|
| 406 |
+
->getParentIdsByChild($product->getId()));
|
| 407 |
+
if(!empty($vals)){
|
| 408 |
+
return $vals;
|
| 409 |
+
}
|
| 410 |
+
}
|
| 411 |
+
return $product->getId();
|
| 412 |
+
}
|
| 413 |
+
protected function _getContentData(Mage_Core_Model_Store $store){
|
| 414 |
$this->log('starting _getContentData()');
|
| 415 |
+
$collection = Mage::getModel('cms/page')->getCollection();
|
| 416 |
+
$collection->addStoreFilter($store->getId());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 417 |
|
| 418 |
+
$output = new CsvWriter($this->getPathForFile('content'),$this->outputFileDelimiter, $this->bufferSize);
|
|
|
|
|
|
|
|
|
|
|
|
|
| 419 |
$output->appendRow(array('unique_id', 'name', 'url_detail', 'description_short', 'created_date'));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 420 |
|
| 421 |
+
foreach ($collection as $page) {
|
| 422 |
+
$output->appendRow(array(
|
| 423 |
+
$page->getPageId(),
|
| 424 |
+
$page->getTitle(),
|
| 425 |
+
sprintf('%s%s',$store->getBaseUrl(), $page->getIdentifier()),
|
| 426 |
+
$page->getContentHeading(),
|
| 427 |
+
$page->getCreationTime()
|
| 428 |
+
));
|
| 429 |
+
}
|
| 430 |
+
$this->log('done with getting content data');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 431 |
}
|
| 432 |
|
| 433 |
public function getCountryName($code) {
|
| 446 |
}
|
| 447 |
|
| 448 |
public function generateFeed() {
|
| 449 |
+
/*
|
| 450 |
+
* ok, alternate multi store plan
|
| 451 |
+
* Start by looping through the list of
|
| 452 |
+
* selected stores:
|
| 453 |
+
* */
|
| 454 |
+
$selectedStores = Mage::helper('hawksearch_datafeed')->getSelectedStores();
|
| 455 |
+
/** @var Mage_Core_Model_Resource_Store_Collection $stores */
|
| 456 |
+
$stores = Mage::getModel('core/store')->getCollection();
|
| 457 |
+
$stores->addIdFilter($selectedStores);
|
| 458 |
+
/** @var Mage_Core_Model_Store $store */
|
| 459 |
+
foreach ($stores as $store) {
|
| 460 |
+
try {
|
| 461 |
+
Mage::reset();
|
| 462 |
+
Mage::app();
|
| 463 |
+
|
| 464 |
+
$this->log(sprintf('Starting environment for store %s', $store->getName()));
|
| 465 |
+
$appEmulation = Mage::getModel('core/app_emulation');
|
| 466 |
+
$initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation($store->getId());
|
| 467 |
+
|
| 468 |
+
$this->log(sprintf('Setting feed folder for store_code %s', $store->getCode()));
|
| 469 |
+
$this->setFeedFolder($store);
|
| 470 |
+
|
| 471 |
+
//exports Category Data
|
| 472 |
+
$this->_getCategoryData($store);
|
| 473 |
+
|
| 474 |
+
//exports Product Data
|
| 475 |
+
$this->_getProductData($store);
|
| 476 |
+
|
| 477 |
+
//exports Attribute Data
|
| 478 |
+
$this->_getAttributeData($store);
|
| 479 |
+
|
| 480 |
+
//exports CMS / Content Data
|
| 481 |
+
$this->_getContentData($store);
|
| 482 |
+
|
| 483 |
+
// end emulation
|
| 484 |
+
$appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
|
| 485 |
+
|
| 486 |
+
} catch (Exception $e) {
|
| 487 |
+
$this->log(sprintf("General Exception %s at generateFeed() line %d, stack:\n%s", $e->getMessage(), $e->getLine(), $e->getTraceAsString()));
|
| 488 |
+
}
|
| 489 |
+
|
| 490 |
}
|
| 491 |
+
$this->log(sprintf('going to write summary file %s', $this->getSummaryFilename()));
|
| 492 |
+
file_put_contents($this->getSummaryFilename(), json_encode($this->feedSummary));
|
| 493 |
+
$this->log('done generating data feed files, going to remove lock files.');
|
| 494 |
+
Mage::helper('hawksearch_datafeed/feed')->RemoveFeedLocks();
|
| 495 |
+
$this->log('all done, goodbye');
|
| 496 |
+
|
| 497 |
}
|
| 498 |
|
| 499 |
+
public function getSummaryFilename() {
|
| 500 |
+
return sprintf('%s%s%s', Mage::helper('hawksearch_datafeed/feed')->getFeedFilePath(), DS, "hawksearchFeedSummary.json");
|
| 501 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 502 |
|
| 503 |
+
public function setFeedFolder(Mage_Core_Model_Store $store) {
|
| 504 |
+
/*
|
| 505 |
+
* here we need to set up the environment for generating the feed files in the proper folder,
|
| 506 |
+
* as well as preparing the json data file. the folder name will be named with the store code
|
| 507 |
+
* the json data file will contain only basic data about the subfolders (just the name for now.)
|
| 508 |
+
*/
|
| 509 |
+
$this->feedSummary->stores[] = $store->getCode();
|
| 510 |
|
| 511 |
+
}
|
|
|
|
| 512 |
|
| 513 |
+
public function refreshImageCache() {
|
| 514 |
+
$this->log('starting refreshImageCache()');
|
|
|
|
|
|
|
| 515 |
|
| 516 |
+
$selectedStores = Mage::helper('hawksearch_datafeed')->getSelectedStores();
|
| 517 |
+
/** @var Mage_Core_Model_Resource_Store_Collection $stores */
|
| 518 |
+
$stores = Mage::getModel('core/store')->getCollection();
|
| 519 |
+
$stores->addIdFilter($selectedStores);
|
| 520 |
+
/** @var Mage_Core_Model_Store $store */
|
| 521 |
+
foreach ($stores as $store) {
|
| 522 |
+
try {
|
| 523 |
+
$this->log(sprintf('Starting environment for store %s', $store->getName()));
|
| 524 |
+
$appEmulation = Mage::getSingleton('core/app_emulation');
|
| 525 |
+
$initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation($store->getId());
|
| 526 |
+
|
| 527 |
+
$products = Mage::getModel('catalog/product')
|
| 528 |
+
->getCollection()
|
| 529 |
+
->addAttributeToSelect(array('small_image'))
|
| 530 |
+
->addStoreFilter($store);
|
| 531 |
+
$products->setPageSize($this->_batchSize);
|
| 532 |
+
$pages = $products->getLastPageNumber();
|
| 533 |
+
|
| 534 |
+
$currentPage = 1;
|
| 535 |
+
|
| 536 |
+
do {
|
| 537 |
+
$this->log(sprintf('going to page %d of images', $currentPage));
|
| 538 |
+
$products->clear();
|
| 539 |
+
$products->setCurPage($currentPage);
|
| 540 |
+
$products->load();
|
| 541 |
+
|
| 542 |
+
foreach ($products as $product) {
|
| 543 |
+
if (empty($this->_imageHeight)) {
|
| 544 |
+
$this->log(
|
| 545 |
+
sprintf('going to resize image for url: %s',
|
| 546 |
+
Mage::helper('catalog/image')->init($product, 'small_image')->resize($this->_imageWidth
|
| 547 |
+
)));
|
| 548 |
+
} else {
|
| 549 |
+
$this->log(
|
| 550 |
+
sprintf('going to resize image for url: %s',
|
| 551 |
+
Mage::helper('catalog/image')->init($product, 'small_image')->resize($this->_imageWidth, $this->_imageHeight
|
| 552 |
+
)));
|
| 553 |
+
}
|
| 554 |
+
}
|
| 555 |
|
| 556 |
+
$currentPage++;
|
|
|
|
|
|
|
|
|
|
|
|
|
| 557 |
|
| 558 |
+
} while ($currentPage <= $pages);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 559 |
|
| 560 |
+
// end emulation
|
| 561 |
+
$appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
|
| 562 |
|
| 563 |
+
} catch (Exception $e) {
|
| 564 |
+
$this->log(sprintf("General Exception %s at generateFeed() line %d, stack:\n%s", $e->getMessage(), $e->getLine(), $e->getTraceAsString()));
|
| 565 |
+
}
|
| 566 |
|
| 567 |
+
}
|
|
|
|
| 568 |
Mage::helper('hawksearch_datafeed/feed')->RemoveFeedLocks();
|
| 569 |
+
$this->log('Done generating image cache for selected stores, goodbye');
|
| 570 |
}
|
| 571 |
|
| 572 |
/**
|
| 641 |
if (!$this->outputOpen) {
|
| 642 |
$this->openOutput();
|
| 643 |
}
|
| 644 |
+
foreach ($fields as $k => $f) {
|
| 645 |
+
$fields[$k] = strtr($f, array('\"' => '"'));
|
| 646 |
+
}
|
| 647 |
if (false === fputcsv($this->outputFile, $fields, $this->delimiter)) {
|
| 648 |
throw new Exception("CsvWriter: failed to write row.");
|
| 649 |
}
|
app/code/community/Hawksearch/Datafeed/Model/System/Config/Backend/Cron.php
CHANGED
|
@@ -13,65 +13,23 @@ class Hawksearch_Datafeed_Model_System_Config_Backend_Cron extends Mage_Core_Mod
|
|
| 13 |
const CRON_STRING_PATH = 'crontab/jobs/hawksearch_datafeed/schedule/cron_expr';
|
| 14 |
const CRON_MODEL_PATH = 'crontab/jobs/hawksearch_datafeed/run/model';
|
| 15 |
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
intval($time[1]), # Minute
|
| 36 |
-
intval($time[0]), # Hour
|
| 37 |
-
($frequncy == $frequencyMonthly) ? '1' : '*', # Day of the Month
|
| 38 |
-
'*', # Month of the Year
|
| 39 |
-
($frequncy == $frequencyWeekly) ? '1' : '*', # Day of the Week
|
| 40 |
-
);
|
| 41 |
-
|
| 42 |
-
$cronExprString = join(' ', $cronExprArray);
|
| 43 |
-
|
| 44 |
-
try {
|
| 45 |
-
Mage::getModel('core/config_data')
|
| 46 |
-
->load(self::CRON_STRING_PATH, 'path')
|
| 47 |
-
->setValue($cronExprString)
|
| 48 |
-
->setPath(self::CRON_STRING_PATH)
|
| 49 |
-
->save();
|
| 50 |
-
Mage::getModel('core/config_data')
|
| 51 |
-
->load(self::CRON_MODEL_PATH, 'path')
|
| 52 |
-
->setValue((string) Mage::getConfig()->getNode(self::CRON_MODEL_PATH))
|
| 53 |
-
->setPath(self::CRON_MODEL_PATH)
|
| 54 |
-
->save();
|
| 55 |
-
} catch (Exception $e) {
|
| 56 |
-
throw new Exception(Mage::helper('cron')->__('Unable to save the cron expression.'));
|
| 57 |
-
}
|
| 58 |
-
}
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
/**
|
| 62 |
-
* Saves the necessary core config data entries for the cron to pull them from the database
|
| 63 |
-
*/
|
| 64 |
-
public function saveCronTab($cronTab) {
|
| 65 |
-
Mage::getModel('core/config_data')
|
| 66 |
-
->load(self::CRON_STRING_PATH, 'path')
|
| 67 |
-
->setValue($cronTab)
|
| 68 |
-
->setPath(self::CRON_STRING_PATH)
|
| 69 |
-
->save();
|
| 70 |
-
Mage::getModel('core/config_data')
|
| 71 |
-
->load(self::CRON_MODEL_PATH, 'path')
|
| 72 |
-
->setValue((string) Mage::getConfig()->getNode(self::CRON_MODEL_PATH))
|
| 73 |
-
->setPath(self::CRON_MODEL_PATH)
|
| 74 |
-
->save();
|
| 75 |
-
}
|
| 76 |
-
|
| 77 |
}
|
| 13 |
const CRON_STRING_PATH = 'crontab/jobs/hawksearch_datafeed/schedule/cron_expr';
|
| 14 |
const CRON_MODEL_PATH = 'crontab/jobs/hawksearch_datafeed/run/model';
|
| 15 |
|
| 16 |
+
protected function _afterSave(){
|
| 17 |
+
try {
|
| 18 |
+
// hawksearch_datafeed/feed/cron_string
|
| 19 |
+
// hawksearch_datafeed/imagecache/cron_string
|
| 20 |
+
Mage::getModel('core/config_data')
|
| 21 |
+
->load(self::CRON_STRING_PATH, 'path')
|
| 22 |
+
->setValue(trim($this->getValue()))
|
| 23 |
+
->setPath(self::CRON_STRING_PATH)
|
| 24 |
+
->save();
|
| 25 |
+
Mage::getModel('core/config_data')
|
| 26 |
+
->load(self::CRON_MODEL_PATH, 'path')
|
| 27 |
+
->setValue((string) Mage::getConfig()->getNode(self::CRON_MODEL_PATH))
|
| 28 |
+
->setPath(self::CRON_MODEL_PATH)
|
| 29 |
+
->save();
|
| 30 |
+
} catch (Exception $e) {
|
| 31 |
+
throw new Exception(Mage::helper('cron')->__('Unable to save the cron expression.'));
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 35 |
}
|
app/code/community/Hawksearch/Datafeed/Model/System/Config/Source/Store.php
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
|
| 3 |
+
|
| 4 |
+
/**
|
| 5 |
+
* Used in creating options for Yes|No config value selection
|
| 6 |
+
*
|
| 7 |
+
*/
|
| 8 |
+
//class Mage_Adminhtml_Model_System_Config_Source_Yesno
|
| 9 |
+
class Hawksearch_Datafeed_Model_System_Config_Source_Store
|
| 10 |
+
{
|
| 11 |
+
|
| 12 |
+
/**
|
| 13 |
+
* Options getter
|
| 14 |
+
*
|
| 15 |
+
* @return array
|
| 16 |
+
*/
|
| 17 |
+
public function toOptionArray()
|
| 18 |
+
{
|
| 19 |
+
return Mage::getSingleton('adminhtml/system_store')->getStoreValuesForForm(false, false);
|
| 20 |
+
}
|
| 21 |
+
|
| 22 |
+
/**
|
| 23 |
+
* Get options in "key-value" format
|
| 24 |
+
*
|
| 25 |
+
* @return array
|
| 26 |
+
*/
|
| 27 |
+
|
| 28 |
+
}
|
app/code/community/Hawksearch/Datafeed/controllers/Adminhtml/HawkdatagenerateController.php
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
/**
|
| 3 |
+
* Created by PhpStorm.
|
| 4 |
+
* User: magentouser
|
| 5 |
+
* Date: 3/11/15
|
| 6 |
+
* Time: 1:47 PM
|
| 7 |
+
*/
|
| 8 |
+
|
| 9 |
+
class Hawksearch_Datafeed_Adminhtml_HawkdatagenerateController
|
| 10 |
+
extends Mage_Adminhtml_Controller_Action {
|
| 11 |
+
|
| 12 |
+
public function validateCronStringAction() {
|
| 13 |
+
$response = array('valid' => false);
|
| 14 |
+
|
| 15 |
+
$cron = Mage::getSingleton('hawksearch_datafeed/cron');
|
| 16 |
+
if($cron->isValidCronString($this->getRequest()->getParam('cronString'))){
|
| 17 |
+
$response['valid'] = true;
|
| 18 |
+
}
|
| 19 |
+
$this->getResponse()
|
| 20 |
+
->setHeader('Content-Type', 'application/json')
|
| 21 |
+
->setBody(json_encode($response));
|
| 22 |
+
}
|
| 23 |
+
|
| 24 |
+
public function runFeedGenerationAction() {
|
| 25 |
+
$response = array('error' => false);
|
| 26 |
+
try {
|
| 27 |
+
$disabledFuncs = explode(',', ini_get('disable_functions'));
|
| 28 |
+
$isShellDisabled = is_array($disabledFuncs) ? in_array('shell_exec', $disabledFuncs) : true;
|
| 29 |
+
$isShellDisabled = (stripos(PHP_OS, 'win') === false) ? $isShellDisabled : true;
|
| 30 |
+
|
| 31 |
+
if($isShellDisabled) {
|
| 32 |
+
$response['error'] = 'This installation cannot run one off feed generation because the PHP function "shell_exec" has been disabled. Please use cron.';
|
| 33 |
+
} else {
|
| 34 |
+
$helper = Mage::helper('hawksearch_datafeed/feed');
|
| 35 |
+
if(strtolower($this->getRequest()->getParam('force')) == 'true') {
|
| 36 |
+
$helper->RemoveFeedLocks();
|
| 37 |
+
}
|
| 38 |
+
$helper->generateFeedsForAllStores();
|
| 39 |
+
}
|
| 40 |
+
}
|
| 41 |
+
catch (Exception $e) {
|
| 42 |
+
Mage::logException($e);
|
| 43 |
+
$response['error'] = "An unknown error occurred.";
|
| 44 |
+
}
|
| 45 |
+
$this->getResponse()
|
| 46 |
+
->setHeader("Content-Type", "application/json")
|
| 47 |
+
->setBody(json_encode($response));
|
| 48 |
+
}
|
| 49 |
+
/**
|
| 50 |
+
* Refreshes image cache.
|
| 51 |
+
*/
|
| 52 |
+
public function runImageCacheGenerationAction() {
|
| 53 |
+
$response = array("error" => false);
|
| 54 |
+
try {
|
| 55 |
+
$disabledFuncs = explode(',', ini_get('disable_functions'));
|
| 56 |
+
$isShellDisabled = is_array($disabledFuncs) ? in_array('shell_exec', $disabledFuncs) : true;
|
| 57 |
+
$isShellDisabled = (stripos(PHP_OS, 'win') === false) ? $isShellDisabled : true;
|
| 58 |
+
|
| 59 |
+
if($isShellDisabled) {
|
| 60 |
+
$response['error'] = 'This installation cannot run one-off cache generations. Must use cron.';
|
| 61 |
+
} else {
|
| 62 |
+
$helper = Mage::helper('hawksearch_datafeed/feed');
|
| 63 |
+
if(strtolower($this->getRequest()->getParam('force')) == 'true') {
|
| 64 |
+
$helper->RemoveFeedLocks();
|
| 65 |
+
}
|
| 66 |
+
$helper->refreshImageCache();
|
| 67 |
+
}
|
| 68 |
+
}
|
| 69 |
+
catch (Exception $e) {
|
| 70 |
+
Mage::logException($e);
|
| 71 |
+
$response['error'] = "An unknown error occurred.";
|
| 72 |
+
}
|
| 73 |
+
$this->getResponse()
|
| 74 |
+
->setHeader("Content-Type", "application/json")
|
| 75 |
+
->setBody(json_encode($response));
|
| 76 |
+
}
|
| 77 |
+
|
| 78 |
+
}
|
| 79 |
+
|
app/code/community/Hawksearch/Datafeed/controllers/SearchController.php
CHANGED
|
@@ -9,18 +9,18 @@
|
|
| 9 |
*/
|
| 10 |
|
| 11 |
class Hawksearch_Datafeed_SearchController extends Mage_Core_Controller_Front_Action {
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
/**
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
$response = array("error" => false);
|
| 23 |
-
|
| 24 |
/** @var Mage_Catalog_Model_Resource_Product_Collection $coll */
|
| 25 |
$coll = Mage::getModel('catalog/product')->getCollection();
|
| 26 |
$coll->addAttributeToSelect('small_image');
|
|
@@ -29,79 +29,23 @@ class Hawksearch_Datafeed_SearchController extends Mage_Core_Controller_Front_Ac
|
|
| 29 |
));
|
| 30 |
$coll->getSelect()->limit(100);
|
| 31 |
$item = $coll->getLastItem();
|
| 32 |
-
$path = (string)
|
| 33 |
$imageArray = explode("/", $path);
|
| 34 |
$cache_key = "";
|
| 35 |
-
foreach($imageArray as $part) {
|
| 36 |
-
if(preg_match('/[0-9a-fA-F]{32}/', $part)) {
|
| 37 |
$cache_key = $part;
|
| 38 |
}
|
| 39 |
}
|
| 40 |
-
|
| 41 |
$response['cache_key'] = $cache_key;
|
| 42 |
$response['date_time'] = date('Y-m-d H:i:s');
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
}
|
| 47 |
-
$this->getResponse()
|
| 48 |
-
->setHeader("Content-Type", "application/json")
|
| 49 |
-
->setBody(json_encode($response));
|
| 50 |
-
}
|
| 51 |
-
|
| 52 |
-
/**
|
| 53 |
-
* Asynchronous posting to feed generation url for each store.
|
| 54 |
-
*/
|
| 55 |
-
public function runFeedGenerationAction() {
|
| 56 |
-
$response = array("error" => false);
|
| 57 |
-
|
| 58 |
-
try {
|
| 59 |
-
$disabledFuncs = explode(',', ini_get('disable_functions'));
|
| 60 |
-
$isShellDisabled = is_array($disabledFuncs) ? in_array('shell_exec', $disabledFuncs) : true;
|
| 61 |
-
$isShellDisabled = (stripos(PHP_OS, 'win') === false) ? $isShellDisabled : true;
|
| 62 |
-
|
| 63 |
-
if($isShellDisabled) {
|
| 64 |
-
$response['error'] = 'This installation cannot run one off feed generations. Must use cron.';
|
| 65 |
-
} else {
|
| 66 |
-
Mage::helper('hawksearch_datafeed/feed')->generateFeedsForAllStores();
|
| 67 |
-
}
|
| 68 |
-
}
|
| 69 |
-
catch (Exception $e) {
|
| 70 |
-
Mage::logException($e);
|
| 71 |
-
$response['error'] = "An unknown error occurred.";
|
| 72 |
-
}
|
| 73 |
-
$this->getResponse()
|
| 74 |
-
->setHeader("Content-Type", "application/json")
|
| 75 |
-
->setBody(json_encode($response));
|
| 76 |
-
}
|
| 77 |
-
|
| 78 |
-
/**
|
| 79 |
-
* Refreshes image cache based on passed in store id. Defaults store id to default store
|
| 80 |
-
*/
|
| 81 |
-
public function runImageCacheGenerationAction() {
|
| 82 |
-
$response = array("error" => false);
|
| 83 |
-
try {
|
| 84 |
-
$storeId = $this->getRequest()->getParam("storeId");
|
| 85 |
-
|
| 86 |
-
if (!$storeId) {
|
| 87 |
-
$storeId = Mage::app()->getDefaultStoreView()->getId();
|
| 88 |
-
}
|
| 89 |
-
$disabledFuncs = explode(',', ini_get('disable_functions'));
|
| 90 |
-
$isShellDisabled = is_array($disabledFuncs) ? in_array('shell_exec', $disabledFuncs) : true;
|
| 91 |
-
$isShellDisabled = (stripos(PHP_OS, 'win') === false) ? $isShellDisabled : true;
|
| 92 |
-
|
| 93 |
-
if($isShellDisabled) {
|
| 94 |
-
$response['error'] = 'This installation cannot run one-off cache generations. Must use cron.';
|
| 95 |
-
} else {
|
| 96 |
-
Mage::helper('hawksearch_datafeed/feed')->refreshImageCache($storeId);
|
| 97 |
-
}
|
| 98 |
-
}
|
| 99 |
-
catch (Exception $e) {
|
| 100 |
-
Mage::logException($e);
|
| 101 |
-
$response['error'] = "An unknown error occurred.";
|
| 102 |
-
}
|
| 103 |
$this->getResponse()
|
| 104 |
->setHeader("Content-Type", "application/json")
|
| 105 |
->setBody(json_encode($response));
|
| 106 |
-
|
|
|
|
| 107 |
}
|
| 9 |
*/
|
| 10 |
|
| 11 |
class Hawksearch_Datafeed_SearchController extends Mage_Core_Controller_Front_Action {
|
| 12 |
+
|
| 13 |
+
public function templateAction() {
|
| 14 |
+
$this->loadLayout();
|
| 15 |
+
$this->renderLayout();
|
| 16 |
+
}
|
| 17 |
+
|
| 18 |
/**
|
| 19 |
+
* API Call for Image CacheKey to get images from cache on auto resize.
|
| 20 |
+
*/
|
| 21 |
+
public function getCacheKeyAction() {
|
| 22 |
$response = array("error" => false);
|
| 23 |
+
try {
|
| 24 |
/** @var Mage_Catalog_Model_Resource_Product_Collection $coll */
|
| 25 |
$coll = Mage::getModel('catalog/product')->getCollection();
|
| 26 |
$coll->addAttributeToSelect('small_image');
|
| 29 |
));
|
| 30 |
$coll->getSelect()->limit(100);
|
| 31 |
$item = $coll->getLastItem();
|
| 32 |
+
$path = (string)Mage::helper('catalog/image')->init($item, 'small_image');
|
| 33 |
$imageArray = explode("/", $path);
|
| 34 |
$cache_key = "";
|
| 35 |
+
foreach ($imageArray as $part) {
|
| 36 |
+
if (preg_match('/[0-9a-fA-F]{32}/', $part)) {
|
| 37 |
$cache_key = $part;
|
| 38 |
}
|
| 39 |
}
|
| 40 |
+
|
| 41 |
$response['cache_key'] = $cache_key;
|
| 42 |
$response['date_time'] = date('Y-m-d H:i:s');
|
| 43 |
+
} catch (Exception $e) {
|
| 44 |
+
$response['error'] = $e->getMessage();
|
| 45 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
$this->getResponse()
|
| 47 |
->setHeader("Content-Type", "application/json")
|
| 48 |
->setBody(json_encode($response));
|
| 49 |
+
}
|
| 50 |
+
|
| 51 |
}
|
app/code/community/Hawksearch/Datafeed/etc/config.xml
CHANGED
|
@@ -1,86 +1,102 @@
|
|
| 1 |
<?xml version="1.0"?>
|
| 2 |
-
|
| 3 |
/**
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
<config>
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 65 |
<delimiter>tab</delimiter>
|
| 66 |
<buffer_size>65536</buffer_size>
|
| 67 |
<output_file_ext>txt</output_file_ext>
|
| 68 |
-
<feed_path>
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
|
|
|
|
|
|
|
|
|
| 86 |
</config>
|
| 1 |
<?xml version="1.0"?>
|
| 2 |
+
<!--
|
| 3 |
/**
|
| 4 |
+
* Copyright (c) 2013 Hawksearch (www.hawksearch.com) - All Rights Reserved
|
| 5 |
+
*
|
| 6 |
+
* THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
|
| 7 |
+
* KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
| 8 |
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
| 9 |
+
* PARTICULAR PURPOSE.
|
| 10 |
+
*/
|
| 11 |
+
-->
|
| 12 |
<config>
|
| 13 |
+
<modules>
|
| 14 |
+
<Hawksearch_Datafeed>
|
| 15 |
+
<version>1.1.1.6</version>
|
| 16 |
+
</Hawksearch_Datafeed>
|
| 17 |
+
</modules>
|
| 18 |
+
<global>
|
| 19 |
+
<blocks>
|
| 20 |
+
<hawksearch_datafeed>
|
| 21 |
+
<class>Hawksearch_Datafeed_Block</class>
|
| 22 |
+
</hawksearch_datafeed>
|
| 23 |
+
</blocks>
|
| 24 |
+
<helpers>
|
| 25 |
+
<hawksearch_datafeed>
|
| 26 |
+
<class>Hawksearch_Datafeed_Helper</class>
|
| 27 |
+
</hawksearch_datafeed>
|
| 28 |
+
</helpers>
|
| 29 |
+
<models>
|
| 30 |
+
<hawksearch_datafeed>
|
| 31 |
+
<class>Hawksearch_Datafeed_Model</class>
|
| 32 |
+
</hawksearch_datafeed>
|
| 33 |
+
</models>
|
| 34 |
+
<resources>
|
| 35 |
+
<hawksearch_datafeed_setup>
|
| 36 |
+
<setup>
|
| 37 |
+
<module>Hawksearch_Datafeed</module>
|
| 38 |
+
</setup>
|
| 39 |
+
</hawksearch_datafeed_setup>
|
| 40 |
+
</resources>
|
| 41 |
+
</global>
|
| 42 |
+
<admin>
|
| 43 |
+
<routers>
|
| 44 |
+
<adminhtml>
|
| 45 |
+
<args>
|
| 46 |
+
<modules>
|
| 47 |
+
<hawksearch_datafeed after="Mage_Adminhtml">Hawksearch_Datafeed_Adminhtml</hawksearch_datafeed>
|
| 48 |
+
</modules>
|
| 49 |
+
</args>
|
| 50 |
+
</adminhtml>
|
| 51 |
+
</routers>
|
| 52 |
+
</admin>
|
| 53 |
+
<!--the frontend router is used for the image cache key -->
|
| 54 |
+
<frontend>
|
| 55 |
+
<routers>
|
| 56 |
+
<hawksearch_datafeed>
|
| 57 |
+
<use>standard</use>
|
| 58 |
+
<args>
|
| 59 |
+
<module>Hawksearch_Datafeed</module>
|
| 60 |
+
<frontName>hawksearch</frontName>
|
| 61 |
+
</args>
|
| 62 |
+
</hawksearch_datafeed>
|
| 63 |
+
</routers>
|
| 64 |
+
</frontend>
|
| 65 |
+
<default>
|
| 66 |
+
<hawksearch_datafeed>
|
| 67 |
+
<general>
|
| 68 |
+
<enabled>1</enabled>
|
| 69 |
+
<logging_enabled>1</logging_enabled>
|
| 70 |
+
</general>
|
| 71 |
+
<feed>
|
| 72 |
+
<batch_limit>10000</batch_limit>
|
| 73 |
+
<exclude_fields>
|
| 74 |
+
description,short_description,options_container,gift_message_available,status,tax_class_id,required_options,msrp_display_actual_price_type,enable_googlecheckout,created_at,updated_at,sku
|
| 75 |
+
</exclude_fields>
|
| 76 |
+
<stockstatus>0</stockstatus>
|
| 77 |
+
<itemstatus>0</itemstatus>
|
| 78 |
<delimiter>tab</delimiter>
|
| 79 |
<buffer_size>65536</buffer_size>
|
| 80 |
<output_file_ext>txt</output_file_ext>
|
| 81 |
+
<feed_path>hawksearch/feeds</feed_path>
|
| 82 |
+
</feed>
|
| 83 |
+
<imagecache>
|
| 84 |
+
<image_width>135</image_width>
|
| 85 |
+
</imagecache>
|
| 86 |
+
</hawksearch_datafeed>
|
| 87 |
+
<crontab>
|
| 88 |
+
<jobs>
|
| 89 |
+
<hawksearch_datafeed_feed>
|
| 90 |
+
<run>
|
| 91 |
+
<model>hawksearch_datafeed/cron::generateFeeds</model>
|
| 92 |
+
</run>
|
| 93 |
+
</hawksearch_datafeed_feed>
|
| 94 |
+
<hawksearch_datafeed_imagecache>
|
| 95 |
+
<run>
|
| 96 |
+
<model>hawksearch_datafeed/cron::generateImagecache</model>
|
| 97 |
+
</run>
|
| 98 |
+
</hawksearch_datafeed_imagecache>
|
| 99 |
+
</jobs>
|
| 100 |
+
</crontab>
|
| 101 |
+
</default>
|
| 102 |
</config>
|
app/code/community/Hawksearch/Datafeed/etc/system.xml
CHANGED
|
@@ -40,27 +40,27 @@
|
|
| 40 |
<source_model>adminhtml/system_config_source_yesno</source_model>
|
| 41 |
<sort_order>100</sort_order>
|
| 42 |
<show_in_default>1</show_in_default>
|
| 43 |
-
<show_in_website>
|
| 44 |
-
<show_in_store>
|
| 45 |
-
</enabled>
|
| 46 |
<logging_enabled>
|
| 47 |
-
<label>
|
| 48 |
<frontend_type>select</frontend_type>
|
| 49 |
<source_model>adminhtml/system_config_source_yesno</source_model>
|
| 50 |
-
<sort_order>
|
| 51 |
<show_in_default>1</show_in_default>
|
| 52 |
-
<show_in_website>
|
| 53 |
-
<show_in_store>
|
| 54 |
-
</logging_enabled>
|
| 55 |
<version translate="label">
|
| 56 |
<label>Version</label>
|
| 57 |
<frontend_type>label</frontend_type>
|
| 58 |
<frontend_model>hawksearch_datafeed/system_config_form_field_version</frontend_model>
|
| 59 |
-
<sort_order>
|
| 60 |
<show_in_default>1</show_in_default>
|
| 61 |
-
<show_in_website>
|
| 62 |
-
<show_in_store>
|
| 63 |
-
</version>
|
| 64 |
</fields>
|
| 65 |
</general>
|
| 66 |
<feed translate="label" module="hawksearch_datafeed">
|
|
@@ -81,154 +81,162 @@
|
|
| 81 |
<show_in_website>0</show_in_website>
|
| 82 |
<show_in_store>0</show_in_store>
|
| 83 |
</generate>
|
| 84 |
-
<
|
| 85 |
-
<label>
|
| 86 |
-
<frontend_type>
|
| 87 |
-
<
|
| 88 |
-
<
|
| 89 |
-
<sort_order>150</sort_order>
|
| 90 |
-
<show_in_default>1</show_in_default>
|
| 91 |
-
<show_in_website>0</show_in_website>
|
| 92 |
-
<show_in_store>0</show_in_store>
|
| 93 |
-
</generateimagecache>
|
| 94 |
-
<submittal translate="label">
|
| 95 |
-
<label>Next Automatic Feed Generation</label>
|
| 96 |
-
<frontend_type>text</frontend_type>
|
| 97 |
-
<frontend_model>hawksearch_datafeed/system_config_frontend_feed_next</frontend_model>
|
| 98 |
-
<sort_order>200</sort_order>
|
| 99 |
<show_in_default>1</show_in_default>
|
| 100 |
<show_in_website>0</show_in_website>
|
| 101 |
<show_in_store>0</show_in_store>
|
| 102 |
-
</
|
| 103 |
<batch_limit translate="label">
|
| 104 |
<label>Batch Limit</label>
|
| 105 |
<frontend_type>text</frontend_type>
|
| 106 |
<comment>Set the block of blocks to batch at once</comment>
|
| 107 |
-
<sort_order>
|
| 108 |
<show_in_default>1</show_in_default>
|
| 109 |
<show_in_website>0</show_in_website>
|
| 110 |
<show_in_store>0</show_in_store>
|
| 111 |
</batch_limit>
|
| 112 |
-
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
|
| 116 |
-
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
<image_height translate="label">
|
| 122 |
-
<label>Image Height</label>
|
| 123 |
-
<frontend_type>text</frontend_type>
|
| 124 |
-
<comment>Set the height of the small image saved in the cache</comment>
|
| 125 |
-
<sort_order>375</sort_order>
|
| 126 |
-
<show_in_default>1</show_in_default>
|
| 127 |
-
<show_in_website>0</show_in_website>
|
| 128 |
-
<show_in_store>0</show_in_store>
|
| 129 |
-
</image_height>
|
| 130 |
-
<brand_attribute translate="label">
|
| 131 |
-
<label>Brand Attribute Value</label>
|
| 132 |
-
<frontend_type>text</frontend_type>
|
| 133 |
-
<comment>Set attribute_code value for the Brand attribute</comment>
|
| 134 |
-
<sort_order>400</sort_order>
|
| 135 |
-
<show_in_default>1</show_in_default>
|
| 136 |
-
<show_in_website>0</show_in_website>
|
| 137 |
-
<show_in_store>0</show_in_store>
|
| 138 |
-
</brand_attribute>
|
| 139 |
-
<exclude_fields translate="label">
|
| 140 |
-
<label>Attributes to Exclude</label>
|
| 141 |
-
<frontend_type>textarea</frontend_type>
|
| 142 |
-
<comment>Comma Delimited List of attribute_code values to exclude</comment>
|
| 143 |
-
<sort_order>500</sort_order>
|
| 144 |
-
<show_in_default>1</show_in_default>
|
| 145 |
-
<show_in_website>0</show_in_website>
|
| 146 |
-
<show_in_store>0</show_in_store>
|
| 147 |
-
</exclude_fields>
|
| 148 |
<stockstatus translate="label">
|
| 149 |
<label>Allow Out of Stock Items</label>
|
| 150 |
<frontend_type>select</frontend_type>
|
| 151 |
<source_model>adminhtml/system_config_source_yesno</source_model>
|
| 152 |
-
<sort_order>
|
| 153 |
<show_in_default>1</show_in_default>
|
| 154 |
-
<show_in_website>
|
| 155 |
-
<show_in_store>
|
| 156 |
</stockstatus>
|
| 157 |
<itemstatus>
|
| 158 |
<label>Allow Disabled Items</label>
|
| 159 |
<frontend_type>select</frontend_type>
|
| 160 |
<source_model>adminhtml/system_config_source_yesno</source_model>
|
| 161 |
-
<sort_order>
|
| 162 |
<show_in_default>1</show_in_default>
|
| 163 |
-
<show_in_website>
|
| 164 |
-
<show_in_store>
|
| 165 |
</itemstatus>
|
| 166 |
-
<
|
| 167 |
-
<label>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 168 |
<frontend_type>text</frontend_type>
|
| 169 |
-
<
|
| 170 |
-
<
|
|
|
|
|
|
|
|
|
|
| 171 |
<show_in_default>1</show_in_default>
|
| 172 |
<show_in_website>0</show_in_website>
|
| 173 |
<show_in_store>0</show_in_store>
|
| 174 |
-
|
| 175 |
-
|
| 176 |
-
|
|
|
|
|
|
|
|
|
|
| 177 |
<frontend_type>text</frontend_type>
|
| 178 |
-
<
|
| 179 |
-
<sort_order>900</sort_order>
|
| 180 |
<show_in_default>1</show_in_default>
|
| 181 |
<show_in_website>0</show_in_website>
|
| 182 |
<show_in_store>0</show_in_store>
|
| 183 |
-
|
|
|
|
|
|
|
|
|
|
| 184 |
</fields>
|
| 185 |
</feed>
|
| 186 |
-
<
|
| 187 |
-
<label>
|
| 188 |
<frontend_type>text</frontend_type>
|
| 189 |
-
<sort_order>
|
| 190 |
<show_in_default>1</show_in_default>
|
| 191 |
<show_in_website>0</show_in_website>
|
| 192 |
<show_in_store>0</show_in_store>
|
| 193 |
<fields>
|
| 194 |
-
<
|
| 195 |
-
<label>
|
| 196 |
-
<
|
| 197 |
-
<
|
|
|
|
|
|
|
| 198 |
<sort_order>100</sort_order>
|
| 199 |
<show_in_default>1</show_in_default>
|
| 200 |
-
<show_in_website>
|
| 201 |
-
<show_in_store>
|
| 202 |
-
</
|
| 203 |
-
<
|
| 204 |
-
<label>
|
| 205 |
-
<frontend_type>
|
| 206 |
-
<
|
| 207 |
-
<
|
| 208 |
-
<sort_order>200</sort_order>
|
| 209 |
<show_in_default>1</show_in_default>
|
| 210 |
-
<show_in_website>
|
| 211 |
-
<show_in_store>
|
| 212 |
-
</
|
| 213 |
-
<
|
| 214 |
-
<label>
|
| 215 |
-
<frontend_type>
|
| 216 |
-
<
|
|
|
|
| 217 |
<show_in_default>1</show_in_default>
|
| 218 |
-
<show_in_website>
|
| 219 |
-
<show_in_store>
|
| 220 |
-
</
|
| 221 |
-
<
|
| 222 |
-
<label>
|
| 223 |
<frontend_type>select</frontend_type>
|
| 224 |
<source_model>adminhtml/system_config_source_yesno</source_model>
|
| 225 |
-
<sort_order>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 226 |
<show_in_default>1</show_in_default>
|
| 227 |
<show_in_website>1</show_in_website>
|
| 228 |
<show_in_store>1</show_in_store>
|
| 229 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 230 |
</fields>
|
| 231 |
-
</
|
| 232 |
</groups>
|
| 233 |
</hawksearch_datafeed>
|
| 234 |
</sections>
|
| 40 |
<source_model>adminhtml/system_config_source_yesno</source_model>
|
| 41 |
<sort_order>100</sort_order>
|
| 42 |
<show_in_default>1</show_in_default>
|
| 43 |
+
<show_in_website>0</show_in_website>
|
| 44 |
+
<show_in_store>0</show_in_store>
|
| 45 |
+
</enabled>
|
| 46 |
<logging_enabled>
|
| 47 |
+
<label>Enable Logging</label>
|
| 48 |
<frontend_type>select</frontend_type>
|
| 49 |
<source_model>adminhtml/system_config_source_yesno</source_model>
|
| 50 |
+
<sort_order>110</sort_order>
|
| 51 |
<show_in_default>1</show_in_default>
|
| 52 |
+
<show_in_website>0</show_in_website>
|
| 53 |
+
<show_in_store>0</show_in_store>
|
| 54 |
+
</logging_enabled>
|
| 55 |
<version translate="label">
|
| 56 |
<label>Version</label>
|
| 57 |
<frontend_type>label</frontend_type>
|
| 58 |
<frontend_model>hawksearch_datafeed/system_config_form_field_version</frontend_model>
|
| 59 |
+
<sort_order>130</sort_order>
|
| 60 |
<show_in_default>1</show_in_default>
|
| 61 |
+
<show_in_website>0</show_in_website>
|
| 62 |
+
<show_in_store>0</show_in_store>
|
| 63 |
+
</version>
|
| 64 |
</fields>
|
| 65 |
</general>
|
| 66 |
<feed translate="label" module="hawksearch_datafeed">
|
| 81 |
<show_in_website>0</show_in_website>
|
| 82 |
<show_in_store>0</show_in_store>
|
| 83 |
</generate>
|
| 84 |
+
<stores>
|
| 85 |
+
<label>Feed Stores</label>
|
| 86 |
+
<frontend_type>multiselect</frontend_type>
|
| 87 |
+
<source_model>hawksearch_datafeed/system_config_source_store</source_model>
|
| 88 |
+
<sort_order>110</sort_order>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 89 |
<show_in_default>1</show_in_default>
|
| 90 |
<show_in_website>0</show_in_website>
|
| 91 |
<show_in_store>0</show_in_store>
|
| 92 |
+
</stores>
|
| 93 |
<batch_limit translate="label">
|
| 94 |
<label>Batch Limit</label>
|
| 95 |
<frontend_type>text</frontend_type>
|
| 96 |
<comment>Set the block of blocks to batch at once</comment>
|
| 97 |
+
<sort_order>120</sort_order>
|
| 98 |
<show_in_default>1</show_in_default>
|
| 99 |
<show_in_website>0</show_in_website>
|
| 100 |
<show_in_store>0</show_in_store>
|
| 101 |
</batch_limit>
|
| 102 |
+
<!--<exclude_fields translate="label">-->
|
| 103 |
+
<!--<label>Attributes to Exclude</label>-->
|
| 104 |
+
<!--<frontend_type>textarea</frontend_type>-->
|
| 105 |
+
<!--<comment>Comma Delimited List of attribute_code values to exclude</comment>-->
|
| 106 |
+
<!--<sort_order>130</sort_order>-->
|
| 107 |
+
<!--<show_in_default>1</show_in_default>-->
|
| 108 |
+
<!--<show_in_website>0</show_in_website>-->
|
| 109 |
+
<!--<show_in_store>0</show_in_store>-->
|
| 110 |
+
<!--</exclude_fields>-->
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 111 |
<stockstatus translate="label">
|
| 112 |
<label>Allow Out of Stock Items</label>
|
| 113 |
<frontend_type>select</frontend_type>
|
| 114 |
<source_model>adminhtml/system_config_source_yesno</source_model>
|
| 115 |
+
<sort_order>140</sort_order>
|
| 116 |
<show_in_default>1</show_in_default>
|
| 117 |
+
<show_in_website>0</show_in_website>
|
| 118 |
+
<show_in_store>0</show_in_store>
|
| 119 |
</stockstatus>
|
| 120 |
<itemstatus>
|
| 121 |
<label>Allow Disabled Items</label>
|
| 122 |
<frontend_type>select</frontend_type>
|
| 123 |
<source_model>adminhtml/system_config_source_yesno</source_model>
|
| 124 |
+
<sort_order>150</sort_order>
|
| 125 |
<show_in_default>1</show_in_default>
|
| 126 |
+
<show_in_website>0</show_in_website>
|
| 127 |
+
<show_in_store>0</show_in_store>
|
| 128 |
</itemstatus>
|
| 129 |
+
<cron_enable>
|
| 130 |
+
<label>Enable Datafeed Cron task</label>
|
| 131 |
+
<frontend_type>select</frontend_type>
|
| 132 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
| 133 |
+
<sort_order>160</sort_order>
|
| 134 |
+
<show_in_default>1</show_in_default>
|
| 135 |
+
<show_in_website>0</show_in_website>
|
| 136 |
+
<show_in_store>0</show_in_store>
|
| 137 |
+
</cron_enable>
|
| 138 |
+
<cron_string translate="label">
|
| 139 |
+
<label>Cron expression</label>
|
| 140 |
<frontend_type>text</frontend_type>
|
| 141 |
+
<frontend_model>hawksearch_datafeed/system_config_frontend_feed_cron</frontend_model>
|
| 142 |
+
<backend_model>hawksearch_datafeed/system_config_backend_cron</backend_model>
|
| 143 |
+
<comment>Max run interval is hourly, first value must be between 0 and 59</comment>
|
| 144 |
+
<validate>validate-cron-ajax</validate>
|
| 145 |
+
<sort_order>170</sort_order>
|
| 146 |
<show_in_default>1</show_in_default>
|
| 147 |
<show_in_website>0</show_in_website>
|
| 148 |
<show_in_store>0</show_in_store>
|
| 149 |
+
<depends>
|
| 150 |
+
<cron_enable>1</cron_enable>
|
| 151 |
+
</depends>
|
| 152 |
+
</cron_string>
|
| 153 |
+
<cron_email>
|
| 154 |
+
<label>Feed Cron Email</label>
|
| 155 |
<frontend_type>text</frontend_type>
|
| 156 |
+
<sort_order>180</sort_order>
|
|
|
|
| 157 |
<show_in_default>1</show_in_default>
|
| 158 |
<show_in_website>0</show_in_website>
|
| 159 |
<show_in_store>0</show_in_store>
|
| 160 |
+
<depends>
|
| 161 |
+
<cron_enable>1</cron_enable>
|
| 162 |
+
</depends>
|
| 163 |
+
</cron_email>
|
| 164 |
</fields>
|
| 165 |
</feed>
|
| 166 |
+
<imagecache translate="label" module="hawksearch_datafeed">
|
| 167 |
+
<label>Image Cache</label>
|
| 168 |
<frontend_type>text</frontend_type>
|
| 169 |
+
<sort_order>300</sort_order>
|
| 170 |
<show_in_default>1</show_in_default>
|
| 171 |
<show_in_website>0</show_in_website>
|
| 172 |
<show_in_store>0</show_in_store>
|
| 173 |
<fields>
|
| 174 |
+
<generateimagecache translate="label">
|
| 175 |
+
<label>Generate Image Cache</label>
|
| 176 |
+
<frontend_type>button</frontend_type>
|
| 177 |
+
<frontend_model>hawksearch_datafeed/system_config_frontend_feed_generateimagecache
|
| 178 |
+
</frontend_model>
|
| 179 |
+
<comment>Manually generates image cache.</comment>
|
| 180 |
<sort_order>100</sort_order>
|
| 181 |
<show_in_default>1</show_in_default>
|
| 182 |
+
<show_in_website>0</show_in_website>
|
| 183 |
+
<show_in_store>0</show_in_store>
|
| 184 |
+
</generateimagecache>
|
| 185 |
+
<image_width translate="label">
|
| 186 |
+
<label>Image Width</label>
|
| 187 |
+
<frontend_type>text</frontend_type>
|
| 188 |
+
<comment>Set the width of the small image saved in the cache</comment>
|
| 189 |
+
<sort_order>110</sort_order>
|
|
|
|
| 190 |
<show_in_default>1</show_in_default>
|
| 191 |
+
<show_in_website>0</show_in_website>
|
| 192 |
+
<show_in_store>0</show_in_store>
|
| 193 |
+
</image_width>
|
| 194 |
+
<image_height translate="label">
|
| 195 |
+
<label>Image Height</label>
|
| 196 |
+
<frontend_type>text</frontend_type>
|
| 197 |
+
<comment>Set the height of the small image saved in the cache</comment>
|
| 198 |
+
<sort_order>120</sort_order>
|
| 199 |
<show_in_default>1</show_in_default>
|
| 200 |
+
<show_in_website>0</show_in_website>
|
| 201 |
+
<show_in_store>0</show_in_store>
|
| 202 |
+
</image_height>
|
| 203 |
+
<cron_enable>
|
| 204 |
+
<label>Enable Imagecache Cron task</label>
|
| 205 |
<frontend_type>select</frontend_type>
|
| 206 |
<source_model>adminhtml/system_config_source_yesno</source_model>
|
| 207 |
+
<sort_order>130</sort_order>
|
| 208 |
+
<show_in_default>1</show_in_default>
|
| 209 |
+
<show_in_website>0</show_in_website>
|
| 210 |
+
<show_in_store>0</show_in_store>
|
| 211 |
+
</cron_enable>
|
| 212 |
+
<cron_string translate="label">
|
| 213 |
+
<label>Cron expression</label>
|
| 214 |
+
<frontend_type>text</frontend_type>
|
| 215 |
+
<frontend_model>hawksearch_datafeed/system_config_frontend_feed_cron</frontend_model>
|
| 216 |
+
<backend_model>hawksearch_datafeed/system_config_backend_cron</backend_model>
|
| 217 |
+
<comment>Max run interval is hourly, first value must be between 0 and 59</comment>
|
| 218 |
+
<validate>validate-cron-ajax</validate>
|
| 219 |
+
<sort_order>140</sort_order>
|
| 220 |
<show_in_default>1</show_in_default>
|
| 221 |
<show_in_website>1</show_in_website>
|
| 222 |
<show_in_store>1</show_in_store>
|
| 223 |
+
<depends>
|
| 224 |
+
<cron_enable>1</cron_enable>
|
| 225 |
+
</depends>
|
| 226 |
+
</cron_string>
|
| 227 |
+
<cron_email>
|
| 228 |
+
<label>Imagecache Cron Email</label>
|
| 229 |
+
<frontend_type>text</frontend_type>
|
| 230 |
+
<sort_order>150</sort_order>
|
| 231 |
+
<show_in_default>1</show_in_default>
|
| 232 |
+
<show_in_website>0</show_in_website>
|
| 233 |
+
<show_in_store>0</show_in_store>
|
| 234 |
+
<depends>
|
| 235 |
+
<cron_enable>1</cron_enable>
|
| 236 |
+
</depends>
|
| 237 |
+
</cron_email>
|
| 238 |
</fields>
|
| 239 |
+
</imagecache>
|
| 240 |
</groups>
|
| 241 |
</hawksearch_datafeed>
|
| 242 |
</sections>
|
app/code/community/Hawksearch/Datafeed/sql/hawksearch_datafeed_setup/install-1.0.0.0.php
CHANGED
|
@@ -9,11 +9,13 @@
|
|
| 9 |
*/
|
| 10 |
|
| 11 |
//Save cron job to the core config data table
|
|
|
|
|
|
|
| 12 |
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
Mage::getModel("hawksearch_datafeed/system_config_backend_cron")->saveCronTab($cronTab);
|
| 9 |
*/
|
| 10 |
|
| 11 |
//Save cron job to the core config data table
|
| 12 |
+
// the user should configure this. switched to a cron string for scheduling to allow
|
| 13 |
+
// multiple runs per day.
|
| 14 |
|
| 15 |
+
//$frequency = Mage::getConfig()->getNode('default/hawksearch_datafeed/cron/frequency');
|
| 16 |
+
//
|
| 17 |
+
//$time = explode(",", Mage::getConfig()->getNode('default/hawksearch_datafeed/cron/time'));
|
| 18 |
+
//
|
| 19 |
+
//$cronTab = Mage::helper('hawksearch_datafeed')->getCronTimeAsCrontab($frequency, $time);
|
| 20 |
+
//
|
| 21 |
+
//Mage::getModel("hawksearch_datafeed/system_config_backend_cron")->saveCronTab($cronTab);
|
app/code/community/Hawksearch/Datafeed/sql/hawksearch_datafeed_setup/upgrade-1.0.0.0-1.1.1.0.php
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
/**
|
| 3 |
+
* Created by PhpStorm.
|
| 4 |
+
* User: magentouser
|
| 5 |
+
* Date: 2/17/15
|
| 6 |
+
* Time: 2:01 PM
|
| 7 |
+
*/
|
| 8 |
+
|
| 9 |
+
$installer = $this;
|
| 10 |
+
|
| 11 |
+
$installer->startSetup();
|
| 12 |
+
|
| 13 |
+
//$installer->getConnection()->modifyColumn(
|
| 14 |
+
// $this->getTable('table/name'), 'datetime', 'DATETIME'
|
| 15 |
+
//);
|
| 16 |
+
//
|
| 17 |
+
//
|
| 18 |
+
//
|
| 19 |
+
//$cfg = Mage::getModel('core/config_data')
|
| 20 |
+
// ->load('path/to/var', 'path');
|
| 21 |
+
//if($cfg->getId()) {
|
| 22 |
+
// $cfg->setPath('path/to/var')
|
| 23 |
+
// ->save();
|
| 24 |
+
//}
|
| 25 |
+
|
| 26 |
+
|
| 27 |
+
$installer->endSetup();
|
app/design/adminhtml/default/default/template/hawksearch/datafeed/generate/js.phtml
CHANGED
|
@@ -16,15 +16,21 @@
|
|
| 16 |
buttonId: null,
|
| 17 |
init: function () {
|
| 18 |
this.url = '<?php echo $this->getGenerateUrl() ?>';
|
| 19 |
-
this.buttonId = '<?php echo $this->getButtonId()?>';
|
| 20 |
this.displayId = "hawksearch_display_msg";
|
| 21 |
this.isInit = true;
|
|
|
|
| 22 |
},
|
| 23 |
generateFeed: function () {
|
| 24 |
if (!this.isInit) {
|
| 25 |
this.init();
|
| 26 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
new Ajax.Request(this.url, {
|
|
|
|
| 28 |
onSuccess: function (transport) {
|
| 29 |
var response = transport.responseText.evalJSON();
|
| 30 |
this.displayResults(response);
|
|
@@ -49,6 +55,19 @@
|
|
| 49 |
$(this.buttonId).disabled = true;
|
| 50 |
$(this.buttonId).addClassName("disabled");
|
| 51 |
return responseEl.innerHTML = "<?php echo Mage::getModel('hawksearch_datafeed/feed')->getAjaxNotice(); ?>";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 52 |
}
|
| 53 |
}
|
| 54 |
|
| 16 |
buttonId: null,
|
| 17 |
init: function () {
|
| 18 |
this.url = '<?php echo $this->getGenerateUrl() ?>';
|
| 19 |
+
this.buttonId = '<?php echo $this->getButtonId() ?>';
|
| 20 |
this.displayId = "hawksearch_display_msg";
|
| 21 |
this.isInit = true;
|
| 22 |
+
this.forceId = 'feedforce';
|
| 23 |
},
|
| 24 |
generateFeed: function () {
|
| 25 |
if (!this.isInit) {
|
| 26 |
this.init();
|
| 27 |
}
|
| 28 |
+
var isForce = false;
|
| 29 |
+
if($(this.forceId)){
|
| 30 |
+
isForce = $(this.forceId).checked;
|
| 31 |
+
}
|
| 32 |
new Ajax.Request(this.url, {
|
| 33 |
+
parameters: {force: isForce},
|
| 34 |
onSuccess: function (transport) {
|
| 35 |
var response = transport.responseText.evalJSON();
|
| 36 |
this.displayResults(response);
|
| 55 |
$(this.buttonId).disabled = true;
|
| 56 |
$(this.buttonId).addClassName("disabled");
|
| 57 |
return responseEl.innerHTML = "<?php echo Mage::getModel('hawksearch_datafeed/feed')->getAjaxNotice(); ?>";
|
| 58 |
+
},
|
| 59 |
+
forceFeed: function() {
|
| 60 |
+
if (!this.isInit) {
|
| 61 |
+
this.init();
|
| 62 |
+
}
|
| 63 |
+
if($(this.forceId).checked && $(this.buttonId).disabled){
|
| 64 |
+
$(this.buttonId).disabled = false;
|
| 65 |
+
$(this.buttonId).removeClassName("disabled");
|
| 66 |
+
} else {
|
| 67 |
+
$(this.buttonId).disabled = true;
|
| 68 |
+
$(this.buttonId).addClassName("disabled");
|
| 69 |
+
}
|
| 70 |
+
|
| 71 |
}
|
| 72 |
}
|
| 73 |
|
app/design/adminhtml/default/default/template/hawksearch/datafeed/validate.phtml
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
/**
|
| 3 |
+
* Copyright (c) 2013 Hawksearch (www.hawksearch.com) - All Rights Reserved
|
| 4 |
+
*
|
| 5 |
+
* THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
|
| 6 |
+
* KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
| 7 |
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
| 8 |
+
* PARTICULAR PURPOSE.
|
| 9 |
+
*/
|
| 10 |
+
?>
|
| 11 |
+
<script type="text/javascript">
|
| 12 |
+
//<![CDATA[
|
| 13 |
+
Validation.add('validate-cron-ajax', 'Cron string is not valid', function(v){
|
| 14 |
+
var status = false;
|
| 15 |
+
new Ajax.Request('<?php echo $this->getValidateUrl() ?>', {
|
| 16 |
+
asynchronous: false,
|
| 17 |
+
parameters: {cronString: v},
|
| 18 |
+
onSuccess: function(t) {
|
| 19 |
+
var res = t.responseText.evalJSON();
|
| 20 |
+
status = res.valid;
|
| 21 |
+
},
|
| 22 |
+
onFailure: function(t) {
|
| 23 |
+
alert('Unable to validate cron string, please refresh page and try again.');
|
| 24 |
+
status = false;
|
| 25 |
+
}
|
| 26 |
+
});
|
| 27 |
+
return status;
|
| 28 |
+
});
|
| 29 |
+
//]]>
|
| 30 |
+
</script>
|
hawksearch/.htaccess.sample
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Order deny,allow
|
| 2 |
+
Deny from all
|
| 3 |
+
Allow from 127.0.0.1 68.72.70ZZ 12.133 76.227.222 12.198.148
|
package.xml
CHANGED
|
@@ -1,18 +1,24 @@
|
|
| 1 |
<?xml version="1.0"?>
|
| 2 |
<package>
|
| 3 |
<name>HawkSearch_Datafeed</name>
|
| 4 |
-
<version>1.
|
| 5 |
<stability>stable</stability>
|
| 6 |
<license uri="http://opensource.org/licenses/OSL-3.0">Open Software License (OSL)</license>
|
| 7 |
<channel>community</channel>
|
| 8 |
<extends/>
|
| 9 |
<summary>This package generates data feeds in the required format and can be consumed by Hawk Search.</summary>
|
| 10 |
<description>This package generates data feeds in the required format and can be consumed by Hawk Search.</description>
|
| 11 |
-
<notes>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 12 |
<authors><author><name>Hawksearch Inc.</name><user>hawksearch</user><email>mmunoz@thanxmedia.com</email></author></authors>
|
| 13 |
-
<date>2015-
|
| 14 |
-
<time>
|
| 15 |
-
<contents><target name="magecommunity"><dir name="Hawksearch"><dir name="Datafeed"><dir name="Block"><dir name="System"><dir name="Config"><dir name="Form"><dir name="Field"><file name="Version.php" hash="7f72ce91b67d40e68424454a449f1841"/></dir></dir><file name="Form.php" hash="1f6eaf265d3b8c78d3efd93cf93c7f2d"/><dir name="Frontend"><dir name="Feed"><dir name="Clearts"><file name="Js.php" hash="220b75f831af835d97be401798ec9461"/></dir><dir name="Generate"><file name="Js.php" hash="
|
| 16 |
<compatible/>
|
| 17 |
<dependencies><required><php><min>5.1.0</min><max>8.1.0</max></php></required></dependencies>
|
| 18 |
</package>
|
| 1 |
<?xml version="1.0"?>
|
| 2 |
<package>
|
| 3 |
<name>HawkSearch_Datafeed</name>
|
| 4 |
+
<version>1.1.1.6</version>
|
| 5 |
<stability>stable</stability>
|
| 6 |
<license uri="http://opensource.org/licenses/OSL-3.0">Open Software License (OSL)</license>
|
| 7 |
<channel>community</channel>
|
| 8 |
<extends/>
|
| 9 |
<summary>This package generates data feeds in the required format and can be consumed by Hawk Search.</summary>
|
| 10 |
<description>This package generates data feeds in the required format and can be consumed by Hawk Search.</description>
|
| 11 |
+
<notes>Adding multisite capabilities, including image cache generation.
|
| 12 |
+

|
| 13 |
+
1.1.1.3: Fixed issue with singletons stored in registry resulting in attributes from wrong store being returned in attributes.txt file.
|
| 14 |
+

|
| 15 |
+
1.1.1.4: Fixed issue with configurable product relationships in items.txt file. Moved "brand" attribute from items.txt to attributes.txt (if exists). 
|
| 16 |
+

|
| 17 |
+
1.1.1.5: Fixed issue with image cache and items.txt not using "small_image". Explicit check to ensure 'unique id' is set in attributes.txt. </notes>
|
| 18 |
<authors><author><name>Hawksearch Inc.</name><user>hawksearch</user><email>mmunoz@thanxmedia.com</email></author></authors>
|
| 19 |
+
<date>2015-08-20</date>
|
| 20 |
+
<time>21:43:58</time>
|
| 21 |
+
<contents><target name="magecommunity"><dir name="Hawksearch"><dir name="Datafeed"><dir name="Block"><dir name="System"><dir name="Config"><dir name="Form"><dir name="Field"><file name="Version.php" hash="7f72ce91b67d40e68424454a449f1841"/></dir></dir><file name="Form.php" hash="1f6eaf265d3b8c78d3efd93cf93c7f2d"/><dir name="Frontend"><dir name="Feed"><dir name="Clearts"><file name="Js.php" hash="220b75f831af835d97be401798ec9461"/></dir><dir name="Cron"><file name="Js.php" hash="55b49d830aca37d5c5ae11d96ec81cc1"/></dir><file name="Cron.php" hash="828841ead180fccb3c0af4fb5e7f5482"/><dir name="Generate"><file name="Js.php" hash="562dc37edc3260ff16fa07e773d17b4e"/></dir><file name="Generate.php" hash="cf9a8be5b02361c0eb22bd6300e48884"/><dir name="Generateimagecache"><file name="Js.php" hash="fff68a4778f41d6fde39cc4c62b55833"/></dir><file name="Generateimagecache.php" hash="05a3585804163326b33d3a46ab7717b5"/><file name="Next.php" hash="b325b32c2338835a3d05b07cb04966f5"/><file name="Timestamp.php" hash="b12e57c577b7c86b346e0221256de97c"/></dir></dir></dir></dir></dir><dir name="Helper"><file name="Data.php" hash="7ed312d82b25b202dcc2b109ec071495"/><file name="Feed.php" hash="8759e6b295d8fc8f6a55bc5c71379288"/><file name="runfeed.php" hash="58151e345c8749d26bd41b6c61ba84ea"/></dir><dir name="Model"><file name="Cron.php" hash="6115476d7240750803094e6c32d39e27"/><file name="Email.php" hash="f671df12afac28ae10713cd1972bef2c"/><file name="Feed.php" hash="18e74277ba1ba3f2673fb62eb3bc427d"/><dir name="System"><dir name="Config"><dir name="Backend"><file name="Cron.php" hash="03dd40965da119312e5b6eac10f54e75"/></dir><dir name="Source"><file name="Store.php" hash="e72e5e9b13edc13545cdc14e909ffd40"/></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><file name="HawkdatagenerateController.php" hash="57b6b83d727796b9dfc4ca2a6c056ee7"/></dir><file name="SearchController.php" hash="89dc3d5c56282a865aedc435a6f61405"/></dir><dir name="etc"><file name="adminhtml.xml" hash="96daebeddbd749dfe0341818fe2eeabb"/><file name="config.xml" hash="6cc2bd7485c767678c344e704f881360"/><file name="system.xml" hash="c33a25e888174cef61d5b412115a0f3d"/></dir><dir name="sql"><dir name="hawksearch_datafeed_setup"><file name="install-1.0.0.0.php" hash="22abdf6ab3bda0df41795ac5b22f3347"/><file name="upgrade-1.0.0.0-1.1.1.0.php" hash="a39dd9bb5a4c3b4a5e5e45fe99ac4f85"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="hawksearch"><dir name="datafeed"><dir name="clearts"><file name="js.phtml" hash="e277cac474bb3e0d84b47c82c76448ca"/></dir><dir name="generate"><file name="js.phtml" hash="be53e356516c4c39521aaeee89bac1f4"/></dir><dir name="generateimagecache"><file name="js.phtml" hash="aba0594893460ae5763ae243866e7e65"/></dir><file name="validate.phtml" hash="4a7241fe598dfbf2b4abff50ded761bc"/></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Hawksearch_Datafeed.xml" hash="06b94625c6b60d1269fe61c4127d2146"/></dir></target><target name="mageweb"><dir><dir name="hawksearch"><file name=".htaccess.sample" hash="d664f8a18ccd0e491376a78fa63ce6f2"/></dir></dir></target></contents>
|
| 22 |
<compatible/>
|
| 23 |
<dependencies><required><php><min>5.1.0</min><max>8.1.0</max></php></required></dependencies>
|
| 24 |
</package>
|
