Fontis_Australia - Version 2.0.4

Version Notes

Currently active are modules for BPAY, direct deposit, Australia Post, the addition of regions and postcodes, and the addition of ABN and phone number to the general configuration values (although currently not in use). Also supports creating product information feeds for the Shopbot, Getprice and MyShopping services.

Download this release

Release Info

Developer Magento Core Team
Extension Fontis_Australia
Version 2.0.4
Comparing to
See all releases


Code changes from version 2.0.3 to 2.0.4

app/code/community/Fontis/Australia/Block/Bpay/Info.php.~1~ DELETED
@@ -1,80 +0,0 @@
1
- <?php
2
- /**
3
- * Fontis Australia Extension
4
- *
5
- * NOTICE OF LICENSE
6
- *
7
- * This source file is subject to the Open Software License (OSL 3.0)
8
- * that is bundled with this package in the file LICENSE.txt.
9
- * It is also available through the world-wide-web at this URL:
10
- * http://opensource.org/licenses/osl-3.0.php
11
- * If you did not receive a copy of the license and are unable to
12
- * obtain it through the world-wide-web, please send an email
13
- * to license@magentocommerce.com so we can send you a copy immediately.
14
- *
15
- * @category Fontis
16
- * @package Fontis_Australia
17
- * @author Chris Norton
18
- * @copyright Copyright (c) 2008 Fontis Pty. Ltd. (http://www.fontis.com.au)
19
- * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
20
- */
21
-
22
-
23
- class Fontis_Australia_Block_Bpay_Info extends Mage_Payment_Block_Info
24
- {
25
-
26
- protected $_billerCode;
27
- protected $_ref;
28
-
29
- protected function _construct()
30
- {
31
- parent::_construct();
32
- $this->setTemplate('fontis/australia/payment/bpay/info.phtml');
33
- }
34
-
35
- /**
36
- * Gets the bank account name as set by the admin.
37
- *
38
- * @return string
39
- */
40
- public function getBillerCode()
41
- {
42
- if (is_null($this->_billerCode)) {
43
- $this->_convertAdditionalData();
44
- }
45
- return $this->_billerCode;
46
- }
47
-
48
- /**
49
- * Gets the ref code for this customer.
50
- *
51
- * @return string
52
- */
53
- public function getRef()
54
- {
55
- Mage::log('Info: ' . print_r($this->getInfo(), true), null, 'bpay.log');
56
- if (is_null($this->_ref)) {
57
- $this->_convertAdditionalData();
58
- }
59
- return $this->_ref;
60
- }
61
-
62
- /**
63
- * Gets any additional data saved by the BPAY payment module.
64
- *
65
- * @return Fontis_Australia_Block_Bpay_Info
66
- */
67
- protected function _convertAdditionalData()
68
- {
69
- $details = @unserialize($this->getInfo()->getAdditionalData());
70
- if (is_array($details)) {
71
- $this->_billerCode = isset($details['biller_code']) ? (string) $details['biller_code'] : '';
72
- $this->_ref = isset($details['ref']) ? (string) $details['ref'] : '';
73
- } else {
74
- $this->_billerCode = '';
75
- $this->_ref = '';
76
- }
77
- return $this;
78
- }
79
-
80
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/community/Fontis/Australia/Model/Getprice/Child.php CHANGED
@@ -23,61 +23,67 @@ if (!isset($argv[1]) or !isset($argv[2]) or !isset($argv[3])) {
23
  exit;
24
  }
25
  $mage_path = $argv[1];
26
- $product_id = $argv[2];
27
  $store_id = $argv[3];
28
 
29
  // Start-up Magento stack
30
  require_once $mage_path . '/app/Mage.php';
31
  Mage::app($store_id);
32
 
33
- // Load product, tax helper and generate final price information
34
- $product = Mage::getModel('catalog/product')->load($product_id);
35
- $tax = Mage::helper('tax');
36
- $final_price = $tax->getPrice($product, $product->getFinalPrice(), true);
37
-
38
  // This array is translated into XML when fed back to the cron parent PHP.
39
- $array = array();
 
 
 
 
 
 
 
 
40
 
41
- $array['num'] = $product->getEntityId();
42
- $array['attribute1'] = htmlspecialchars($product->getName());
43
- $array['upc'] = $product->getSku();
44
- $array['product_url'] = $product->getProductUrl();
45
 
46
- if (Mage::getStoreConfig('fontis_feeds/getpricefeed/manufacturer')) {
47
- $manufacturer_name = $product->getResource()->
48
- getAttribute('manufacturer')->getFrontend()->getValue($product);
49
 
50
- if ($manufacturer_name != 'No') {
51
- $array['manufacturer'] = $manufacturer_name;
 
52
  }
53
- }
54
 
55
- $category_found = false;
56
- $array['category_name'] = '';
57
- foreach($product->getCategoryCollection() as $c) {
58
- $children = $c->getData('children_count');
59
- if ($children <= 0) {
60
- $category_node[0] = $c->getName();
61
 
62
- $loaded_categories = Mage::getModel('catalog/category')
63
- ->getCollection()
64
- ->addIdFilter(array($c->getId()))
65
- ->addAttributeToSelect(array('name'), 'inner')->load();
66
 
67
- foreach($loaded_categories as $loaded_category) {
68
- $array['category_name'] = $loaded_category->getName();
 
 
69
  }
70
- $category_found = true;
71
  }
72
- }
73
- if (!$category_found) {
74
- $array['category_name'] = Mage::getStoreConfig('fontis_feeds/getpricefeed/defaultcategory');
75
- }
76
 
77
- $array['description'] = $product->getDescription();
78
- $array['image'] = (string)Mage::helper('catalog/image')->init($product, 'image');
79
- $array['price'] = $final_price;
80
- $array['currency'] = Mage::getStoreConfig('fontis_feeds/getpricefeed/currency');
 
 
 
81
 
82
  // Serialize and print as a string for the cron parent PHP code to grab.
83
- echo serialize($array);
23
  exit;
24
  }
25
  $mage_path = $argv[1];
26
+ $product_ids = $argv[2];
27
  $store_id = $argv[3];
28
 
29
  // Start-up Magento stack
30
  require_once $mage_path . '/app/Mage.php';
31
  Mage::app($store_id);
32
 
 
 
 
 
 
33
  // This array is translated into XML when fed back to the cron parent PHP.
34
+ $products = array();
35
+ foreach(unserialize($product_ids) as $product_id) {
36
+ // Load product, tax helper and generate final price information
37
+ $product = Mage::getModel('catalog/product')->load($product_id);
38
+ $tax = Mage::helper('tax');
39
+ $final_price = $tax->getPrice($product, $product->getFinalPrice(), true);
40
+
41
+ // Array containing product data.
42
+ $array = array();
43
 
44
+ $array['num'] = $product->getEntityId();
45
+ $array['attribute1'] = $product->getName();
46
+ $array['upc'] = $product->getSku();
47
+ $array['product_url'] = $product->getProductUrl();
48
 
49
+ if (Mage::getStoreConfig('fontis_feeds/getpricefeed/manufacturer')) {
50
+ $manufacturer_name = $product->getResource()->
51
+ getAttribute('manufacturer')->getFrontend()->getValue($product);
52
 
53
+ if ($manufacturer_name != 'No') {
54
+ $array['manufacturer'] = $manufacturer_name;
55
+ }
56
  }
 
57
 
58
+ $category_found = false;
59
+ $array['category_name'] = '';
60
+ foreach($product->getCategoryCollection() as $c) {
61
+ $children = $c->getData('children_count');
62
+ if ($children <= 0) {
63
+ $category_node[0] = $c->getName();
64
 
65
+ $loaded_categories = Mage::getModel('catalog/category')
66
+ ->getCollection()
67
+ ->addIdFilter(array($c->getId()))
68
+ ->addAttributeToSelect(array('name'), 'inner')->load();
69
 
70
+ foreach($loaded_categories as $loaded_category) {
71
+ $array['category_name'] = $loaded_category->getName();
72
+ }
73
+ $category_found = true;
74
  }
 
75
  }
76
+ if (!$category_found) {
77
+ $array['category_name'] = Mage::getStoreConfig('fontis_feeds/getpricefeed/defaultcategory');
78
+ }
 
79
 
80
+ //$array['description'] = htmlspecialchars($product->getDescription());
81
+ $array['image'] = (string)Mage::helper('catalog/image')->init($product, 'image');
82
+ $array['price'] = $final_price;
83
+ $array['currency'] = Mage::getStoreConfig('fontis_feeds/getpricefeed/currency');
84
+
85
+ $products[] = $array;
86
+ }
87
 
88
  // Serialize and print as a string for the cron parent PHP code to grab.
89
+ echo json_encode($products);
app/code/community/Fontis/Australia/Model/Getprice/Cron.php CHANGED
@@ -19,40 +19,74 @@
19
  * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
20
  */
21
 
22
- function addProductXmlCallback($args)
 
 
 
23
  {
24
- $product = $args['product'];
25
- $product->setData($args['row']);
26
- addProductXml($product);
 
 
 
27
  }
28
 
29
- function addProductXml($product)
 
 
30
  {
31
- $product_id = $product->getId();
32
- $store_id = Fontis_Australia_Model_GetPrice_Cron::$store->getId();
33
-
34
- $data = exec("php " . Mage::getBaseDir() . "/app/code/community/Fontis/Australia/Model/Getprice/Child.php " . Mage::getBaseDir() . " " . $product_id . " " . $store_id);
35
- $array = unserialize($data);
36
-
37
- $product_node = Fontis_Australia_Model_GetPrice_Cron::$root_node->addChild('product');
38
-
39
- foreach($array as $key => $val) {
40
- if ($key == "num") {
41
- $product_node->addAttribute($key, $val);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  } else {
43
- $product_node->addChild($key, $val);
 
 
44
  }
 
 
45
  }
46
  }
47
 
48
  class Fontis_Australia_Model_GetPrice_Cron
49
  {
 
 
50
  public static $doc;
51
  public static $root_node;
52
  public static $store;
 
 
53
 
54
  protected function _construct()
55
  {
 
56
  }
57
 
58
  protected function getPath()
@@ -77,7 +111,6 @@ class Fontis_Australia_Model_GetPrice_Cron
77
  public static function update()
78
  {
79
  Mage::log('Fontis/Australia_Model_Getprice_Cron: entered update function');
80
- session_start();
81
 
82
  if (Mage::getStoreConfig('fontis_feeds/getpricefeed/active')) {
83
  $io = new Varien_Io_File();
@@ -87,29 +120,35 @@ class Fontis_Australia_Model_GetPrice_Cron
87
 
88
  foreach(Mage::app()->getStores() as $store) {
89
  $clean_store_name = str_replace('+', '-', strtolower(urlencode($store->getName())));
90
-
91
- $categories_result = self::getCategoriesXml($store);
 
92
  $products_result = self::getProductsXml($store);
93
-
 
94
  // Write the leaf categories xml file:
 
 
95
  $io->write($clean_store_name . '-categories.xml', $categories_result['xml']);
96
 
97
- // Write the entire products xml file:
98
- $io->write($clean_store_name . '-products.xml', $products_result['xml']);
99
-
100
  // Write for each leaf category, their products xml file:
101
  foreach($categories_result['link_ids'] as $link_id) {
 
102
  $subcategory_products_result = self::getProductsXml($store, $link_id);
103
  $io->write($clean_store_name . '-products-'.$link_id.'.xml', $subcategory_products_result['xml']);
104
  }
105
  }
106
 
107
  $io->close();
 
 
108
  }
109
  }
110
 
111
  public function getCategoriesXml($store)
112
  {
 
 
113
  $result = array();
114
  $categories = Mage::getModel('catalog/category')->getCollection()
115
  ->setStoreId($store->getId())
@@ -140,15 +179,16 @@ class Fontis_Australia_Model_GetPrice_Cron
140
  $category_node = $doc->addChild('cat');
141
 
142
  $title_node = $category_node->addChild('name');
143
- $title_node[0] = $category->getName();
144
 
145
  $link_node = $category_node->addChild('link');
146
- $link_node[0] = Mage::getStoreConfig('web/unsecure/base_url') . 'products-' . $category->getId() . '.xml';
 
147
 
148
  $result['link_ids'][] = $category->getId();
149
  }
150
 
151
- $result['xml'] = $doc->asXml();
152
  return $result;
153
  }
154
 
@@ -167,13 +207,15 @@ class Fontis_Australia_Model_GetPrice_Cron
167
 
168
  Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($products);
169
  Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($products);
170
-
171
  if ($cat_id != -1) {
172
  $products->getSelect()->where("e.entity_id IN (
173
  SELECT product_id FROM catalog_category_product WHERE category_id = ".$cat_id."
174
  )");
175
  }
176
 
 
 
177
  $storeUrl = $store->getBaseUrl();
178
  $shopName = $store->getName();
179
  $date = date("d-m-Y", Mage::getModel('core/date')->timestamp(time()));
@@ -182,9 +224,22 @@ class Fontis_Australia_Model_GetPrice_Cron
182
  self::$doc = new SimpleXMLElement('<store url="' . $storeUrl. '" date="'.$date.'" time="'.$time.'" name="' . $shopName . '"></store>');
183
  self::$root_node = self::$doc->addChild('products');
184
 
185
- Mage::getSingleton('core/resource_iterator')->walk($products->getSelect(), array('addProductXmlCallback'), array('product' => $product));
 
 
186
 
187
- $result['xml'] = self::$doc->asXml();
188
  return $result;
189
  }
 
 
 
 
 
 
 
 
 
 
 
190
  }
19
  * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
20
  */
21
 
22
+ // Callback used by the Magento resource iterator walk() method. Adds a
23
+ // product ID to a static array and calls addProductXmlgetPrice() to
24
+ // generate XML when the array reaches the batch size.
25
+ function addProductXmlCallbackGetPrice($args)
26
  {
27
+ Fontis_Australia_Model_GetPrice_Cron::$accumulator[] = $args['row']['entity_id'];
28
+
29
+ $length = count(Fontis_Australia_Model_GetPrice_Cron::$accumulator);
30
+ if($length >= Fontis_Australia_Model_GetPrice_Cron::BATCH_SIZE) {
31
+ addProductXmlGetPrice();
32
+ }
33
  }
34
 
35
+ // Runs a subprocesss to create feed XML for the product IDs in the static
36
+ // array, then empties the array.
37
+ function addProductXmlGetPrice()
38
  {
39
+ $length = count(Fontis_Australia_Model_GetPrice_Cron::$accumulator);
40
+ if($length > 0) {
41
+ Mage::log("Processing product IDs " . Fontis_Australia_Model_GetPrice_Cron::$accumulator[0] .
42
+ " to " . Fontis_Australia_Model_GetPrice_Cron::$accumulator[$length - 1]);
43
+ $store_id = Fontis_Australia_Model_GetPrice_Cron::$store->getId();
44
+
45
+ $data = exec("php " . Mage::getBaseDir() . "/app/code/community/Fontis/Australia/Model/Getprice/Child.php " .
46
+ Mage::getBaseDir() . " '" . serialize(Fontis_Australia_Model_GetPrice_Cron::$accumulator) .
47
+ "' " . $store_id);
48
+ Fontis_Australia_Model_GetPrice_Cron::$accumulator = array();
49
+
50
+ $array = json_decode($data, true);
51
+
52
+ if(is_array($array)) {
53
+ $codes = array();
54
+ foreach($array as $prod) {
55
+ Fontis_Australia_Model_GetPrice_Cron::$debugCount += 1;
56
+ $product_node = Fontis_Australia_Model_GetPrice_Cron::$root_node->addChild('product');
57
+ foreach($prod as $key => $val) {
58
+ if($key == 'Code') {
59
+ $codes[] = $val;
60
+ }
61
+ $product_node->addChild($key, htmlspecialchars($val));
62
+ }
63
+ }
64
+ if(!empty($codes)) {
65
+ Mage::log("Codes: ".implode(",", $codes));
66
+ }
67
  } else {
68
+ Mage::log("Could not unserialize to array:");
69
+ Mage::log($data);
70
+ Mage::log($array);
71
  }
72
+
73
+ Mage::log(strlen($data) . " characters returned");
74
  }
75
  }
76
 
77
  class Fontis_Australia_Model_GetPrice_Cron
78
  {
79
+ const BATCH_SIZE = 100;
80
+
81
  public static $doc;
82
  public static $root_node;
83
  public static $store;
84
+ public static $accumulator;
85
+ public static $debugCount = 0;
86
 
87
  protected function _construct()
88
  {
89
+ self::$accumulator = array();
90
  }
91
 
92
  protected function getPath()
111
  public static function update()
112
  {
113
  Mage::log('Fontis/Australia_Model_Getprice_Cron: entered update function');
 
114
 
115
  if (Mage::getStoreConfig('fontis_feeds/getpricefeed/active')) {
116
  $io = new Varien_Io_File();
120
 
121
  foreach(Mage::app()->getStores() as $store) {
122
  $clean_store_name = str_replace('+', '-', strtolower(urlencode($store->getName())));
123
+
124
+ // Write the entire products xml file:
125
+ Mage::log('Creating GetPrice products file...');
126
  $products_result = self::getProductsXml($store);
127
+ $io->write($clean_store_name . '-products.xml', $products_result['xml']);
128
+
129
  // Write the leaf categories xml file:
130
+ Mage::log('Creating GetPrice categories index file...');
131
+ $categories_result = self::getCategoriesXml($store);
132
  $io->write($clean_store_name . '-categories.xml', $categories_result['xml']);
133
 
 
 
 
134
  // Write for each leaf category, their products xml file:
135
  foreach($categories_result['link_ids'] as $link_id) {
136
+ Mage::log("Creating GetPrice category file for ID {$categories_result['link_ids']}...");
137
  $subcategory_products_result = self::getProductsXml($store, $link_id);
138
  $io->write($clean_store_name . '-products-'.$link_id.'.xml', $subcategory_products_result['xml']);
139
  }
140
  }
141
 
142
  $io->close();
143
+ } else {
144
+ Mage::log('Fontis/Australia_Model_Getprice_Cron: disabled');
145
  }
146
  }
147
 
148
  public function getCategoriesXml($store)
149
  {
150
+ $clean_store_name = str_replace('+', '-', strtolower(urlencode($store->getName())));
151
+
152
  $result = array();
153
  $categories = Mage::getModel('catalog/category')->getCollection()
154
  ->setStoreId($store->getId())
179
  $category_node = $doc->addChild('cat');
180
 
181
  $title_node = $category_node->addChild('name');
182
+ $title_node[0] = htmlspecialchars($category->getName());
183
 
184
  $link_node = $category_node->addChild('link');
185
+ $link_node[0] = Mage::getStoreConfig('web/unsecure/base_url') .
186
+ Mage::getStoreConfig('fontis_feeds/getpricefeed/output') . "/$clean_store_name-products-" . $category->getId() . '.xml';
187
 
188
  $result['link_ids'][] = $category->getId();
189
  }
190
 
191
+ $result['xml'] = self::formatSimpleXML($doc);
192
  return $result;
193
  }
194
 
207
 
208
  Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($products);
209
  Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($products);
210
+
211
  if ($cat_id != -1) {
212
  $products->getSelect()->where("e.entity_id IN (
213
  SELECT product_id FROM catalog_category_product WHERE category_id = ".$cat_id."
214
  )");
215
  }
216
 
217
+ $products->getSelect()->order('product_id');
218
+
219
  $storeUrl = $store->getBaseUrl();
220
  $shopName = $store->getName();
221
  $date = date("d-m-Y", Mage::getModel('core/date')->timestamp(time()));
224
  self::$doc = new SimpleXMLElement('<store url="' . $storeUrl. '" date="'.$date.'" time="'.$time.'" name="' . $shopName . '"></store>');
225
  self::$root_node = self::$doc->addChild('products');
226
 
227
+ Mage::getSingleton('core/resource_iterator')->walk($products->getSelect(), array('addProductXmlCallbackGetPrice'), array('product' => $product));
228
+ // call XML generation function one last time to process remaining batch
229
+ addProductXmlGetPrice();
230
 
231
+ $result['xml'] = self::formatSimpleXML(self::$doc);
232
  return $result;
233
  }
234
+
235
+ public static function formatSimpleXML($doc)
236
+ {
237
+ $dom = new DOMDocument('1.0');
238
+ $dom->preserveWhiteSpace = false;
239
+ $dom->formatOutput = true;
240
+ $dom_sxml = dom_import_simplexml($doc);
241
+ $dom_sxml = $dom->importNode($dom_sxml, true);
242
+ $dom->appendChild($dom_sxml);
243
+ return $dom->saveXML();
244
+ }
245
  }
app/code/community/Fontis/Australia/Model/Myshopping/Child.php CHANGED
@@ -23,79 +23,85 @@ if (!isset($argv[1]) or !isset($argv[2]) or !isset($argv[3])) {
23
  exit;
24
  }
25
  $mage_path = $argv[1];
26
- $product_id = $argv[2];
27
  $store_id = $argv[3];
28
 
29
  // Start-up Magento stack
30
  require_once $mage_path . '/app/Mage.php';
31
  Mage::app($store_id);
32
 
33
- // Load product, tax helper and generate final price information
34
- $product = Mage::getModel('catalog/product')->load($product_id);
35
- $tax = Mage::helper('tax');
36
- $final_price = $tax->getPrice($product, $product->getFinalPrice(), true);
37
-
38
  // This array is translated into XML when fed back to the cron parent PHP.
39
- $array = array();
40
-
41
- $array['Code'] = $product->getId();
42
- $array['Name'] = htmlspecialchars($product->getName());
43
- $array['Price'] = $final_price;
44
- $array['Description'] = substr($product->getDescription(), 0, 255);
45
- $array['Product_URL'] = $product->getProductUrl();
46
- $array['Image_URL'] = (string)Mage::helper('catalog/image')->init($product, 'image');
47
-
48
- $category_found = false;
49
- $array['Category'] = "";
50
- foreach($product->getCategoryCollection() as $c) {
51
- $children = $c->getData('children_count');
52
- if ($children <= 0) {
53
- $array['Category'] = $c->getName();
54
-
55
- $loaded_categories = Mage::getModel('catalog/category')
56
- ->getCollection()
57
- ->addIdFilter(array($c->getId()))
58
- ->addAttributeToSelect(array('name'), 'inner')->load();
59
-
60
- foreach($loaded_categories as $loaded_category) {
61
- $array['Category'] = $loaded_category->getName();
 
 
 
 
 
 
 
 
 
 
62
  }
63
- $category_found = true;
64
  }
65
- }
66
- if (!$category_found) {
67
- $array['Category'] = Mage::getStoreConfig('fontis_feeds/myshoppingfeed/defaultcategory');
68
- }
69
 
70
- if ($product->isSaleable()) {
71
- $array['InStock'] = 'Y';
72
- } else {
73
- $array['InStock'] = 'N';
74
- }
75
 
76
- $manufacturer_name = $product->getResource()->getAttribute('manufacturer')->getFrontend()->getValue($product);
77
 
78
- if ($manufacturer_name == 'No') {
79
- $array['Brand'] = 'Generic';
80
- } else {
81
- $array['Brand'] = $manufacturer_name;
82
- }
83
 
84
- $linkedAttributes = @unserialize(Mage::getStoreConfig('fontis_feeds/myshoppingfeed/m_to_xml_attributes', $store_id));
85
- if(!empty($linkedAttributes))
86
- {
87
- foreach($linkedAttributes as $la)
88
  {
89
- $magentoAtt = $la['magento'];
90
- $xmlAtt = $la['xmlfeed'];
 
 
91
 
92
- $value = $product->getResource()->getAttribute($magentoAtt)->getFrontend()->getValue($product);
93
 
94
- if ($value != "") {
95
- $array[$xmlAtt] = htmlspecialchars($value);
 
96
  }
97
  }
 
 
98
  }
99
 
100
  // Serialize and print as a string for the cron parent PHP code to grab.
101
- echo serialize($array);
23
  exit;
24
  }
25
  $mage_path = $argv[1];
26
+ $product_ids = $argv[2];
27
  $store_id = $argv[3];
28
 
29
  // Start-up Magento stack
30
  require_once $mage_path . '/app/Mage.php';
31
  Mage::app($store_id);
32
 
 
 
 
 
 
33
  // This array is translated into XML when fed back to the cron parent PHP.
34
+ $products = array();
35
+ foreach(unserialize($product_ids) as $product_id) {
36
+ // Load product, tax helper and generate final price information
37
+ $product = Mage::getModel('catalog/product')->load($product_id);
38
+ $tax = Mage::helper('tax');
39
+ $final_price = $tax->getPrice($product, $product->getFinalPrice(), true);
40
+
41
+ // Array containing product data.
42
+ $array = array();
43
+
44
+ $array['Code'] = $product->getId();
45
+ $array['Name'] = utf8_encode(htmlspecialchars($product->getName()));
46
+ $array['Price'] = $final_price;
47
+ $array['Description'] = utf8_encode(substr(strip_tags($product->getShortDescription()), 0, 255));
48
+ $array['Product_URL'] = utf8_encode($product->getProductUrl());
49
+ $array['Image_URL'] = utf8_encode((string)Mage::helper('catalog/image')->init($product, 'image'));
50
+
51
+ $category_found = false;
52
+ $array['Category'] = "";
53
+ foreach($product->getCategoryCollection() as $c) {
54
+ $children = $c->getData('children_count');
55
+ if ($children <= 0) {
56
+ $array['Category'] = utf8_encode($c->getName());
57
+
58
+ $loaded_categories = Mage::getModel('catalog/category')
59
+ ->getCollection()
60
+ ->addIdFilter(array($c->getId()))
61
+ ->addAttributeToSelect(array('name'), 'inner')->load();
62
+
63
+ foreach($loaded_categories as $loaded_category) {
64
+ $array['Category'] = utf8_encode($loaded_category->getName());
65
+ }
66
+ $category_found = true;
67
  }
 
68
  }
69
+ if (!$category_found) {
70
+ $array['Category'] = utf8_encode(Mage::getStoreConfig('fontis_feeds/myshoppingfeed/defaultcategory'));
71
+ }
 
72
 
73
+ if ($product->isSaleable()) {
74
+ $array['InStock'] = 'Y';
75
+ } else {
76
+ $array['InStock'] = 'N';
77
+ }
78
 
79
+ $manufacturer_name = utf8_encode($product->getResource()->getAttribute('manufacturer')->getFrontend()->getValue($product));
80
 
81
+ if ($manufacturer_name == 'No') {
82
+ $array['Brand'] = 'Generic';
83
+ } else {
84
+ $array['Brand'] = $manufacturer_name;
85
+ }
86
 
87
+ $linkedAttributes = @unserialize(Mage::getStoreConfig('fontis_feeds/myshoppingfeed/m_to_xml_attributes', $store_id));
88
+ if(!empty($linkedAttributes))
 
 
89
  {
90
+ foreach($linkedAttributes as $la)
91
+ {
92
+ $magentoAtt = $la['magento'];
93
+ $xmlAtt = $la['xmlfeed'];
94
 
95
+ $value = $product->getResource()->getAttribute($magentoAtt)->getFrontend()->getValue($product);
96
 
97
+ if ($value != "") {
98
+ $array[$xmlAtt] = utf8_encode(htmlspecialchars($value));
99
+ }
100
  }
101
  }
102
+
103
+ $products[] = $array;
104
  }
105
 
106
  // Serialize and print as a string for the cron parent PHP code to grab.
107
+ echo json_encode($products);
app/code/community/Fontis/Australia/Model/Myshopping/Cron.php CHANGED
@@ -19,38 +19,74 @@
19
  * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
20
  */
21
 
22
- function addProductXmlCallback($args)
 
 
 
23
  {
24
- $product = $args['product'];
25
- $product->setData($args['row']);
26
- addProductXml($product);
 
 
 
27
  }
28
 
29
- function addProductXml($product)
 
 
30
  {
31
- $product_id = $product->getId();
32
- $store_id = Fontis_Australia_Model_MyShopping_Cron::$store->getId();
33
-
34
- $data = exec("php " . Mage::getBaseDir() . "/app/code/community/Fontis/Australia/Model/Myshopping/Child.php " . Mage::getBaseDir() . " " . $product_id . " " . $store_id);
35
- $array = unserialize($data);
36
-
37
- $product_node = Fontis_Australia_Model_Myshopping_Cron::$root_node->addChild('product');
38
-
39
- Mage::log(var_export($array, true));
40
-
41
- foreach($array as $key => $val) {
42
- $product_node->addChild($key, $val);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  }
44
  }
45
 
46
  class Fontis_Australia_Model_MyShopping_Cron
47
  {
 
 
48
  public static $doc;
49
  public static $root_node;
50
  public static $store;
 
 
51
 
52
  protected function _construct()
53
  {
 
54
  }
55
 
56
  protected function getPath()
@@ -69,8 +105,6 @@ class Fontis_Australia_Model_MyShopping_Cron
69
 
70
  public static function update()
71
  {
72
- session_start();
73
-
74
  Mage::log('Fontis/Australia_Model_MyShopping_Cron: entered update function');
75
  if (Mage::getStoreConfig('fontis_feeds/myshoppingfeed/active')) {
76
  $io = new Varien_Io_File();
@@ -81,11 +115,14 @@ class Fontis_Australia_Model_MyShopping_Cron
81
  foreach(Mage::app()->getStores() as $store) {
82
  Mage::log('for each store');
83
  $clean_store_name = str_replace('+', '-', strtolower(urlencode($store->getName())));
 
84
  $products_result = self::getProductsXml($store);
85
 
86
  // Write the entire products xml file:
87
- $io->write($clean_store_name . '-products.xml', $products_result['xml']);
88
- Mage::log('successful write?');
 
 
89
  }
90
 
91
  $io->close();
@@ -110,21 +147,6 @@ class Fontis_Australia_Model_MyShopping_Cron
110
  $products->addStoreFilter();
111
  $products->addAttributeToSelect('*');
112
 
113
- $attributes_select_array = array('name', 'price', 'image', 'status');
114
- $linkedAttributes = @unserialize(Mage::getStoreConfig('fontis_feeds/myshoppingfeed/m_to_xml_attributes', $store->getId()));
115
- if(!empty($linkedAttributes))
116
- {
117
- foreach($linkedAttributes as $la)
118
- {
119
- if (strpos($la['magento'], 'FONTIS') === false) {
120
- $attributes_select_array[] = $la['magento'];
121
- }
122
- }
123
- }
124
-
125
- $products->addAttributeToSelect($attributes_select_array, 'left');
126
- $products->addAttributeToFilter('type_id', 'simple');
127
-
128
  Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($products);
129
  Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($products);
130
 
@@ -136,11 +158,19 @@ class Fontis_Australia_Model_MyShopping_Cron
136
  self::$doc = new SimpleXMLElement('<productset></productset>');
137
  self::$root_node = self::$doc;
138
 
139
- Mage::log('about to walk');
140
- Mage::getSingleton('core/resource_iterator')->walk($products->getSelect(), array('addProductXmlCallback'), array('product' => $product));
141
- Mage::log('walked');
142
-
143
- $result['xml'] = self::$doc->asXml();
 
 
 
 
 
 
 
 
144
  return $result;
145
  }
146
  }
19
  * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
20
  */
21
 
22
+ // Callback used by the Magento resource iterator walk() method. Adds a
23
+ // product ID to a static array and calls addProductXmlMyShopping() to
24
+ // generate XML when the array reaches the batch size.
25
+ function addProductXmlCallbackMyShopping($args)
26
  {
27
+ Fontis_Australia_Model_MyShopping_Cron::$accumulator[] = $args['row']['entity_id'];
28
+
29
+ $length = count(Fontis_Australia_Model_MyShopping_Cron::$accumulator);
30
+ if($length >= Fontis_Australia_Model_MyShopping_Cron::BATCH_SIZE) {
31
+ addProductXmlMyShopping();
32
+ }
33
  }
34
 
35
+ // Runs a subprocesss to create feed XML for the product IDs in the static
36
+ // array, then empties the array.
37
+ function addProductXmlMyShopping()
38
  {
39
+ $length = count(Fontis_Australia_Model_MyShopping_Cron::$accumulator);
40
+ if($length > 0) {
41
+ Mage::log("Processing product IDs " . Fontis_Australia_Model_MyShopping_Cron::$accumulator[0] .
42
+ " to " . Fontis_Australia_Model_MyShopping_Cron::$accumulator[$length - 1]);
43
+ $store_id = Fontis_Australia_Model_MyShopping_Cron::$store->getId();
44
+
45
+ $data = exec("php " . Mage::getBaseDir() . "/app/code/community/Fontis/Australia/Model/Myshopping/Child.php " .
46
+ Mage::getBaseDir() . " '" . serialize(Fontis_Australia_Model_MyShopping_Cron::$accumulator) .
47
+ "' " . $store_id);
48
+ Fontis_Australia_Model_MyShopping_Cron::$accumulator = array();
49
+
50
+ $array = json_decode($data, true);
51
+
52
+ if(is_array($array)) {
53
+ $codes = array();
54
+ foreach($array as $prod) {
55
+ Fontis_Australia_Model_MyShopping_Cron::$debugCount += 1;
56
+ $product_node = Fontis_Australia_Model_Myshopping_Cron::$root_node->addChild('product');
57
+ foreach($prod as $key => $val) {
58
+ if($key == 'Code') {
59
+ $codes[] = $val;
60
+ }
61
+ $product_node->addChild($key, htmlspecialchars($val));
62
+ }
63
+ }
64
+ if(!empty($codes)) {
65
+ Mage::log("Codes: ".implode(",", $codes));
66
+ }
67
+ } else {
68
+ Mage::log("Could not unserialize to array:");
69
+ Mage::log($data);
70
+ Mage::log($array);
71
+ }
72
+
73
+ Mage::log(strlen($data) . " characters returned");
74
  }
75
  }
76
 
77
  class Fontis_Australia_Model_MyShopping_Cron
78
  {
79
+ const BATCH_SIZE = 100;
80
+
81
  public static $doc;
82
  public static $root_node;
83
  public static $store;
84
+ public static $accumulator;
85
+ public static $debugCount = 0;
86
 
87
  protected function _construct()
88
  {
89
+ self::$accumulator = array();
90
  }
91
 
92
  protected function getPath()
105
 
106
  public static function update()
107
  {
 
 
108
  Mage::log('Fontis/Australia_Model_MyShopping_Cron: entered update function');
109
  if (Mage::getStoreConfig('fontis_feeds/myshoppingfeed/active')) {
110
  $io = new Varien_Io_File();
115
  foreach(Mage::app()->getStores() as $store) {
116
  Mage::log('for each store');
117
  $clean_store_name = str_replace('+', '-', strtolower(urlencode($store->getName())));
118
+ Fontis_Australia_Model_MyShopping_Cron::$debugCount = 0;
119
  $products_result = self::getProductsXml($store);
120
 
121
  // Write the entire products xml file:
122
+ $filename = $clean_store_name . '-products.xml';
123
+ $io->write($filename, $products_result['xml']);
124
+ Mage::log("Wrote " . Fontis_Australia_Model_MyShopping_Cron::$debugCount
125
+ . " records to " . self::getPath() . $filename);
126
  }
127
 
128
  $io->close();
147
  $products->addStoreFilter();
148
  $products->addAttributeToSelect('*');
149
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
150
  Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($products);
151
  Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($products);
152
 
158
  self::$doc = new SimpleXMLElement('<productset></productset>');
159
  self::$root_node = self::$doc;
160
 
161
+ Mage::log("About to walk {$products->getSize()} products...");
162
+ Mage::getSingleton('core/resource_iterator')->walk($products->getSelect(), array('addProductXmlCallbackMyShopping'));
163
+ // call XML generation function one last time to process remaining batch
164
+ addProductXmlMyShopping();
165
+ Mage::log('Walked');
166
+
167
+ $dom = new DOMDocument('1.0');
168
+ $dom->preserveWhiteSpace = false;
169
+ $dom->formatOutput = true;
170
+ $dom_sxml = dom_import_simplexml(self::$doc);
171
+ $dom_sxml = $dom->importNode($dom_sxml, true);
172
+ $dom->appendChild($dom_sxml);
173
+ $result['xml'] = $dom->saveXML();
174
  return $result;
175
  }
176
  }
app/code/community/Fontis/Australia/Model/Shopbot/Child.php CHANGED
@@ -23,85 +23,91 @@ if (!isset($argv[1]) or !isset($argv[2]) or !isset($argv[3])) {
23
  exit;
24
  }
25
  $mage_path = $argv[1];
26
- $product_id = $argv[2];
27
  $store_id = $argv[3];
28
 
29
  // Start-up Magento stack
30
  require_once $mage_path . '/app/Mage.php';
31
  Mage::app($store_id);
32
 
33
- // Load product, tax helper and generate final price information
34
- $product = Mage::getModel('catalog/product')->load($product_id);
35
- $tax = Mage::helper('tax');
36
- $final_price = $tax->getPrice($product, $product->getFinalPrice(), true);
37
-
38
  // This array is translated into XML when fed back to the cron parent PHP.
39
- $array = array();
40
-
41
- $array['name'] = htmlspecialchars($product->getName());
42
- $array['price'] = $final_price;
43
- $array['link'] = $product->getProductUrl();
44
-
45
- if ($product->isSaleable()) {
46
- $array['availability'] = 'yes';
47
- } else {
48
- $array['availability'] = 'no';
49
- }
 
 
 
 
 
 
 
 
50
 
51
- $linkedAttributes = @unserialize(Mage::getStoreConfig('fontis_feeds/shopbotfeed/m_to_xml_attributes', $store_id));
52
- if(!empty($linkedAttributes))
53
- {
54
- foreach($linkedAttributes as $la)
55
  {
56
- $magentoAtt = $la['magento'];
57
- $xmlAtt = $la['xmlfeed'];
58
-
59
- if ($magentoAtt == "manufacturer") {
60
- $manufacturer_name = $product->getResource()->
61
- getAttribute('manufacturer')->getFrontend()->getValue($product);
62
-
63
- if ($manufacturer_name != 'No') {
64
- $array['manufacturer'] = $manufacturer_name;
65
- }
66
 
67
- } elseif ($magentoAtt == "FONTIS-image-link") {
68
- $array[$xmlAtt] = (string)Mage::helper('catalog/image')->init($product, 'image');
 
69
 
70
- } elseif ($magentoAtt == "FONTIS-product-id") {
71
- $array[$xmlAtt] = $product->getId();
72
-
73
- } elseif ($magentoAtt == "FONTIS-category") {
74
- $category_found = false;
75
- $array['category_name'] = "";
76
- foreach($product->getCategoryCollection() as $c) {
77
- $children = $c->getData('children_count');
78
- if ($children <= 0) {
79
- $array['category_name'] = $c->getName();
80
-
81
- $loaded_categories = Mage::getModel('catalog/category')
82
- ->getCollection()
83
- ->addIdFilter(array($c->getId()))
84
- ->addAttributeToSelect(array('name'), 'inner')->load();
85
 
86
- foreach($loaded_categories as $loaded_category) {
87
- $array['category_name'] = $loaded_category->getName();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
  }
89
- $category_found = true;
90
  }
91
- }
92
- if (!$category_found) {
93
- $array['category_name'] = Mage::getStoreConfig('fontis_feeds/shopbotfeed/defaultcategory');
94
- }
95
 
96
- } else {
97
- $value = $product->getResource()->getAttribute($magentoAtt)->getFrontend()->getValue($product);
98
 
99
- if ($value != "") {
100
- $array[$xmlAtt] = htmlspecialchars($value);
 
101
  }
102
  }
103
  }
 
 
104
  }
105
 
106
  // Serialize and print as a string for the cron parent PHP code to grab.
107
- echo serialize($array);
23
  exit;
24
  }
25
  $mage_path = $argv[1];
26
+ $product_ids = $argv[2];
27
  $store_id = $argv[3];
28
 
29
  // Start-up Magento stack
30
  require_once $mage_path . '/app/Mage.php';
31
  Mage::app($store_id);
32
 
 
 
 
 
 
33
  // This array is translated into XML when fed back to the cron parent PHP.
34
+ $products = array();
35
+ foreach(unserialize($product_ids) as $product_id) {
36
+ // Load product, tax helper and generate final price information
37
+ $product = Mage::getModel('catalog/product')->load($product_id);
38
+ $tax = Mage::helper('tax');
39
+ $final_price = $tax->getPrice($product, $product->getFinalPrice(), true);
40
+
41
+ // Array containing product data.
42
+ $array = array();
43
+
44
+ $array['name'] = htmlspecialchars($product->getName());
45
+ $array['price'] = $final_price;
46
+ $array['link'] = $product->getProductUrl();
47
+
48
+ if ($product->isSaleable()) {
49
+ $array['availability'] = 'yes';
50
+ } else {
51
+ $array['availability'] = 'no';
52
+ }
53
 
54
+ $linkedAttributes = @unserialize(Mage::getStoreConfig('fontis_feeds/shopbotfeed/m_to_xml_attributes', $store_id));
55
+ if(!empty($linkedAttributes))
 
 
56
  {
57
+ foreach($linkedAttributes as $la)
58
+ {
59
+ $magentoAtt = $la['magento'];
60
+ $xmlAtt = $la['xmlfeed'];
 
 
 
 
 
 
61
 
62
+ if ($magentoAtt == "manufacturer") {
63
+ $manufacturer_name = $product->getResource()->
64
+ getAttribute('manufacturer')->getFrontend()->getValue($product);
65
 
66
+ if ($manufacturer_name != 'No') {
67
+ $array['manufacturer'] = $manufacturer_name;
68
+ }
 
 
 
 
 
 
 
 
 
 
 
 
69
 
70
+ } elseif ($magentoAtt == "FONTIS-image-link") {
71
+ $array[$xmlAtt] = (string)Mage::helper('catalog/image')->init($product, 'image');
72
+
73
+ } elseif ($magentoAtt == "FONTIS-product-id") {
74
+ $array[$xmlAtt] = $product->getId();
75
+
76
+ } elseif ($magentoAtt == "FONTIS-category") {
77
+ $category_found = false;
78
+ $array['category_name'] = "";
79
+ foreach($product->getCategoryCollection() as $c) {
80
+ $children = $c->getData('children_count');
81
+ if ($children <= 0) {
82
+ $array['category_name'] = $c->getName();
83
+
84
+ $loaded_categories = Mage::getModel('catalog/category')
85
+ ->getCollection()
86
+ ->addIdFilter(array($c->getId()))
87
+ ->addAttributeToSelect(array('name'), 'inner')->load();
88
+
89
+ foreach($loaded_categories as $loaded_category) {
90
+ $array['category_name'] = $loaded_category->getName();
91
+ }
92
+ $category_found = true;
93
  }
 
94
  }
95
+ if (!$category_found) {
96
+ $array['category_name'] = Mage::getStoreConfig('fontis_feeds/shopbotfeed/defaultcategory');
97
+ }
 
98
 
99
+ } else {
100
+ $value = $product->getResource()->getAttribute($magentoAtt)->getFrontend()->getValue($product);
101
 
102
+ if ($value != "") {
103
+ $array[$xmlAtt] = htmlspecialchars($value);
104
+ }
105
  }
106
  }
107
  }
108
+
109
+ $products[] = $array;
110
  }
111
 
112
  // Serialize and print as a string for the cron parent PHP code to grab.
113
+ echo json_encode($products);
app/code/community/Fontis/Australia/Model/Shopbot/Cron.php CHANGED
@@ -19,36 +19,75 @@
19
  * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
20
  */
21
 
22
- function addProductXmlCallback($args)
 
 
 
23
  {
24
- $product = $args['product'];
25
- $product->setData($args['row']);
26
- addProductXml($product);
 
 
 
27
  }
28
 
29
- function addProductXml($product)
 
 
30
  {
31
- $product_id = $product->getId();
32
- $store_id = Fontis_Australia_Model_ShopBot_Cron::$store->getId();
33
-
34
- $data = exec("php " . Mage::getBaseDir() . "/app/code/community/Fontis/Australia/Model/Shopbot/Child.php " . Mage::getBaseDir() . " " . $product_id . " " . $store_id);
35
- $array = unserialize($data);
36
-
37
- $product_node = Fontis_Australia_Model_Shopbot_Cron::$root_node->addChild('product');
38
-
39
- foreach($array as $key => $val) {
40
- $product_node->addChild($key, $val);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
  }
42
  }
43
 
 
44
  class Fontis_Australia_Model_ShopBot_Cron
45
  {
 
 
46
  public static $doc;
47
  public static $root_node;
48
  public static $store;
 
 
49
 
50
  protected function _construct()
51
  {
 
52
  }
53
 
54
  protected function getPath()
@@ -67,8 +106,6 @@ class Fontis_Australia_Model_ShopBot_Cron
67
 
68
  public static function update()
69
  {
70
- session_start();
71
-
72
  Mage::log('Fontis/Australia_Model_Shopbot_Cron: entered update function');
73
  if (Mage::getStoreConfig('fontis_feeds/shopbotfeed/active')) {
74
  $io = new Varien_Io_File();
@@ -79,10 +116,14 @@ class Fontis_Australia_Model_ShopBot_Cron
79
  foreach(Mage::app()->getStores() as $store) {
80
  Mage::log('for each store');
81
  $clean_store_name = str_replace('+', '-', strtolower(urlencode($store->getName())));
 
82
  $products_result = self::getProductsXml($store);
83
 
84
  // Write the entire products xml file:
85
- $io->write($clean_store_name . '-products.xml', $products_result['xml']);
 
 
 
86
  }
87
 
88
  $io->close();
@@ -135,10 +176,18 @@ class Fontis_Australia_Model_ShopBot_Cron
135
  self::$root_node = self::$doc->addChild('products');
136
 
137
  Mage::log('about to walk');
138
- Mage::getSingleton('core/resource_iterator')->walk($products->getSelect(), array('addProductXmlCallback'), array('product' => $product));
 
 
139
  Mage::log('walked');
140
-
141
- $result['xml'] = self::$doc->asXml();
 
 
 
 
 
 
142
  return $result;
143
  }
144
  }
19
  * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
20
  */
21
 
22
+ // Callback used by the Magento resource iterator walk() method. Adds a
23
+ // product ID to a static array and calls addProductXmlShopBot() to
24
+ // generate XML when the array reaches the batch size.
25
+ function addProductXmlCallbackShopBot($args)
26
  {
27
+ Fontis_Australia_Model_ShopBot_Cron::$accumulator[] = $args['row']['entity_id'];
28
+
29
+ $length = count(Fontis_Australia_Model_ShopBot_Cron::$accumulator);
30
+ if($length >= Fontis_Australia_Model_ShopBot_Cron::BATCH_SIZE) {
31
+ addProductXmlShopBot();
32
+ }
33
  }
34
 
35
+ // Runs a subprocesss to create feed XML for the product IDs in the static
36
+ // array, then empties the array.
37
+ function addProductXmlShopBot()
38
  {
39
+ $length = count(Fontis_Australia_Model_ShopBot_Cron::$accumulator);
40
+ if($length > 0) {
41
+ Mage::log("Processing product IDs " . Fontis_Australia_Model_ShopBot_Cron::$accumulator[0] .
42
+ " to " . Fontis_Australia_Model_ShopBot_Cron::$accumulator[$length - 1]);
43
+ $store_id = Fontis_Australia_Model_ShopBot_Cron::$store->getId();
44
+
45
+ $data = exec("php " . Mage::getBaseDir() . "/app/code/community/Fontis/Australia/Model/Shopbot/Child.php " .
46
+ Mage::getBaseDir() . " '" . serialize(Fontis_Australia_Model_ShopBot_Cron::$accumulator) .
47
+ "' " . $store_id);
48
+ Fontis_Australia_Model_ShopBot_Cron::$accumulator = array();
49
+
50
+ $array = json_decode($data, true);
51
+
52
+ if(is_array($array)) {
53
+ $codes = array();
54
+ foreach($array as $prod) {
55
+ Fontis_Australia_Model_ShopBot_Cron::$debugCount += 1;
56
+ $product_node = Fontis_Australia_Model_ShopBot_Cron::$root_node->addChild('product');
57
+ foreach($prod as $key => $val) {
58
+ if($key == 'Code') {
59
+ $codes[] = $val;
60
+ }
61
+ $product_node->addChild($key, htmlspecialchars($val));
62
+ }
63
+ }
64
+ if(!empty($codes)) {
65
+ Mage::log("Codes: ".implode(",", $codes));
66
+ }
67
+ } else {
68
+ Mage::log("Could not unserialize to array:");
69
+ Mage::log($data);
70
+ Mage::log($array);
71
+ }
72
+
73
+ Mage::log(strlen($data) . " characters returned");
74
  }
75
  }
76
 
77
+
78
  class Fontis_Australia_Model_ShopBot_Cron
79
  {
80
+ const BATCH_SIZE = 100;
81
+
82
  public static $doc;
83
  public static $root_node;
84
  public static $store;
85
+ public static $accumulator;
86
+ public static $debugCount = 0;
87
 
88
  protected function _construct()
89
  {
90
+ self::$accumulator = array();
91
  }
92
 
93
  protected function getPath()
106
 
107
  public static function update()
108
  {
 
 
109
  Mage::log('Fontis/Australia_Model_Shopbot_Cron: entered update function');
110
  if (Mage::getStoreConfig('fontis_feeds/shopbotfeed/active')) {
111
  $io = new Varien_Io_File();
116
  foreach(Mage::app()->getStores() as $store) {
117
  Mage::log('for each store');
118
  $clean_store_name = str_replace('+', '-', strtolower(urlencode($store->getName())));
119
+ Fontis_Australia_Model_ShopBot_Cron::$debugCount = 0;
120
  $products_result = self::getProductsXml($store);
121
 
122
  // Write the entire products xml file:
123
+ $filename = $clean_store_name . '-products.xml';
124
+ $io->write($filename, $products_result['xml']);
125
+ Mage::log("Wrote " . Fontis_Australia_Model_ShopBot_Cron::$debugCount
126
+ . " records to " . self::getPath() . $filename);
127
  }
128
 
129
  $io->close();
176
  self::$root_node = self::$doc->addChild('products');
177
 
178
  Mage::log('about to walk');
179
+ Mage::getSingleton('core/resource_iterator')->walk($products->getSelect(), array('addProductXmlCallbackShopBot'));
180
+ // call XML generation function one last time to process remaining batch
181
+ addProductXmlShopBot();
182
  Mage::log('walked');
183
+
184
+ $dom = new DOMDocument('1.0');
185
+ $dom->preserveWhiteSpace = false;
186
+ $dom->formatOutput = true;
187
+ $dom_sxml = dom_import_simplexml(self::$doc);
188
+ $dom_sxml = $dom->importNode($dom_sxml, true);
189
+ $dom->appendChild($dom_sxml);
190
+ $result['xml'] = $dom->saveXML();
191
  return $result;
192
  }
193
  }
app/code/community/Fontis/Australia/Model/Shopbot/Cron.php~ DELETED
@@ -1,290 +0,0 @@
1
- <?php
2
- /**
3
- * Fontis Australia Extension
4
- *
5
- * NOTICE OF LICENSE
6
- *
7
- * This source file is subject to the Open Software License (OSL 3.0)
8
- * that is bundled with this package in the file LICENSE.txt.
9
- * It is also available through the world-wide-web at this URL:
10
- * http://opensource.org/licenses/osl-3.0.php
11
- * If you did not receive a copy of the license and are unable to
12
- * obtain it through the world-wide-web, please send an email
13
- * to license@magentocommerce.com and you will be sent a copy immediately.
14
- *
15
- * @category Fontis
16
- * @package Fontis_Australia
17
- * @author Tom Greenaway
18
- * @copyright Copyright (c) 2009 Fontis Pty. Ltd. (http://www.fontis.com.au)
19
- * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
20
- */
21
-
22
- function addProductXmlCallback($args)
23
- {
24
- $product = $args['product'];
25
- $product->setData($args['row']);
26
- addProductXml($product);
27
- }
28
-
29
- function addProductXml($product)
30
- {
31
- $store = Fontis_Australia_Model_ShopBot_Cron::$store;
32
-
33
- Mage::log('walking');
34
-
35
- $product_node = Fontis_Australia_Model_ShopBot_Cron::$root_node
36
- ->addChild('product');
37
-
38
- $name_node = $product_node->addChild('name', $product->getName());
39
-
40
- $price_node = $product_node->addChild('price', $product->getPrice());
41
-
42
- $link_node = $product_node->addChild('link', $product->getProductUrl());
43
-
44
- $availability_node = $product_node->addChild('availability');
45
- if ($product->isSaleable()) {
46
- $availability_node[0] = 'yes';
47
- } else {
48
- $availability_node[0] = 'no';
49
- }
50
-
51
- Mage::log('serialized area');
52
- $linkedAttributes = @unserialize(Mage::getStoreConfig('fontis_feeds/shopbotfeed/m_to_xml_attributes', $store->getId()));
53
- if(!empty($linkedAttributes))
54
- {
55
- foreach($linkedAttributes as $la)
56
- {
57
- $magentoAtt = $la['magento'];
58
- $xmlAtt = $la['xmlfeed'];
59
-
60
- if ($magentoAtt == "FONTIS-image-link") {
61
- $image_node = $product_node->addChild($xmlAtt);
62
- $image_node[0] = (string)Mage::helper('catalog/image')->init($product, 'image');
63
-
64
- } elseif ($magentoAtt == "FONTIS-product-id") {
65
- $id_node = $product_node->addChild($xmlAtt);
66
- $id_node[0] = $product->getId();
67
-
68
- } elseif ($magentoAtt == "FONTIS-category") {
69
- $category_found = false;
70
- $category_node = $product_node->addChild('category_name');
71
- foreach($product->getCategoryCollection() as $c) {
72
- $children = $c->getData('children_count');
73
- if ($children <= 0) {
74
- $category_node[0] = $c->getName();
75
-
76
- $loaded_categories = Mage::getModel('catalog/category')
77
- ->getCollection()
78
- ->addIdFilter(array($c->getId()))
79
- ->addAttributeToSelect(array('name'), 'inner')->load();
80
-
81
- foreach($loaded_categories as $loaded_category) {
82
- $category_node[0] = $loaded_category->getName();
83
- }
84
- $category_found = true;
85
- }
86
- }
87
- if (!$category_found) {
88
- $category_node[0] = Mage::getStoreConfig('fontis_feeds/shopbotfeed/defaultcategory');
89
- }
90
-
91
- } else {
92
- $value = $product->getResource()->getAttribute($magentoAtt)->getFrontend()->getValue($product);
93
-
94
- if ($value != "") {
95
- $extra_node = $product_node->addChild($xmlAtt);
96
- $extra_node[0] = $value;
97
- }
98
- }
99
- }
100
- }
101
- Mage::log('end of serialized area');
102
- }
103
-
104
- class Fontis_Australia_Model_ShopBot_Cron
105
- {
106
- public static $doc;
107
- public static $root_node;
108
- public static $store;
109
-
110
- protected function _construct()
111
- {
112
- session_start();
113
- }
114
-
115
- protected function getPath()
116
- {
117
- $path = "";
118
- $config_path = Mage::getStoreConfig('fontis_feeds/shopbotfeed/output');
119
-
120
- if (substr($config_path, 0, 1) == "/") {
121
- $path = $config_path . '/';
122
- } else {
123
- $path = Mage::getBaseDir() . '/' . $config_path . '/';
124
- }
125
-
126
- return str_replace('//', '/', $path);
127
- }
128
-
129
- public static function update()
130
- {
131
- Mage::log('Fontis/Australia_Model_Shopbot_Cron: entered update function');
132
- if (Mage::getStoreConfig('fontis_feeds/shopbotfeed/active')) {
133
- $io = new Varien_Io_File();
134
- $io->setAllowCreateFolders(true);
135
-
136
- $io->open(array('path' => self::getPath()));
137
-
138
- foreach(Mage::app()->getStores() as $store) {
139
- Mage::log('for each store');
140
- $clean_store_name = str_replace('+', '-', strtolower(urlencode($store->getName())));
141
- $products_result = self::getProductsXml($store);
142
-
143
- // Write the entire products xml file:
144
- $io->write($clean_store_name . '-products.xml', $products_result['xml']);
145
- }
146
-
147
- $io->close();
148
- }
149
- }
150
-
151
- public function nonstatic()
152
- {
153
- self::update();
154
- }
155
-
156
- public function getProductsXml($store)
157
- {
158
- Mage::log('new getproductsxml');
159
- Fontis_Australia_Model_ShopBot_Cron::$store = $store;
160
-
161
- $result = array();
162
-
163
- $product = Mage::getModel('catalog/product');
164
- $products = $product->getCollection();
165
- $products->setStoreId($store);
166
- $products->addStoreFilter();
167
- $products->addAttributeToSelect('*');
168
-
169
- $attributes_select_array = array('name', 'price', 'image', 'status');
170
- $linkedAttributes = @unserialize(Mage::getStoreConfig('fontis_feeds/shopbotfeed/m_to_xml_attributes', $store->getId()));
171
- if(!empty($linkedAttributes))
172
- {
173
- foreach($linkedAttributes as $la)
174
- {
175
- if (strpos($la['magento'], 'FONTIS') === false) {
176
- $attributes_select_array[] = $la['magento'];
177
- }
178
- }
179
- }
180
- Mage::log(var_export($attributes_select_array, true));
181
-
182
- $products->addAttributeToSelect($attributes_select_array, 'left');
183
-
184
- Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($products);
185
- Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($products);
186
-
187
- $storeUrl = $store->getBaseUrl();
188
- $shopName = $store->getName();
189
- $date = date("d-m-Y", Mage::getModel('core/date')->timestamp(time()));
190
- $time = date("h:i:s", Mage::getModel('core/date')->timestamp(time()));
191
-
192
- self::$doc = new SimpleXMLElement('<store url="' . $storeUrl. '" date="'.$date.'" time="'.$time.'" name="' . $shopName . '"></store>');
193
- self::$root_node = self::$doc->addChild('products');
194
-
195
- Mage::log('about to walk');
196
- Mage::getSingleton('core/resource_iterator')->walk($products->getSelect(), array('addProductXmlCallback'), array('product' => $product));
197
- Mage::log('walked');
198
-
199
- $result['xml'] = self::$doc->asXml();
200
- return $result;
201
- }
202
-
203
- public function getProductsXmlOLD($store)
204
- {
205
- $result = array();
206
-
207
- $products = Mage::getModel('catalog/product')->getCollection()
208
- ->setStoreId($store->getId())
209
- ->addAttributeToSelect('*')->addAttributeToFilter('status', 1);
210
-
211
- $products->load()->getItems();
212
-
213
- $storeUrl = $store->getBaseUrl();
214
- $shopName = $store->getName();
215
- $date = date("d-m-Y", Mage::getModel('core/date')->timestamp(time()));
216
- $time = date("h:i:s", Mage::getModel('core/date')->timestamp(time()));
217
-
218
- $doc = new SimpleXMLElement('<store url="' . $storeUrl. '" date="'.$date.'" time="'.$time.'" name="' . $shopName . '"></store>');
219
- $root_node = $doc->addChild('products');
220
-
221
- foreach($products as $product) {
222
- $product_node = $root_node->addChild('product');
223
-
224
- $name_node = $product_node->addChild('name');
225
- $name_node[0] = $product->getName();
226
-
227
- $price_node = $product_node->addChild('price');
228
- $price_node[0] = $product->getPrice();
229
-
230
- $link_node = $product_node->addChild('link');
231
- $link_node[0] = $product->getProductUrl();
232
-
233
- $availability_node = $product_node->addChild('availability');
234
- if ($product->isSaleable()) {
235
- $availability_node[0] = 'yes';
236
- } else {
237
- $availability_node[0] = 'no';
238
- }
239
-
240
- $linkedAttributes = @unserialize(Mage::getStoreConfig('fontis_feeds/shopbotfeed/m_to_xml_attributes', $store->getId()));
241
- if(!empty($linkedAttributes))
242
- {
243
- foreach($linkedAttributes as $la)
244
- {
245
- $magentoAtt = $la['magento'];
246
- $xmlAtt = $la['xmlfeed'];
247
-
248
- if ($magentoAtt == "FONTIS-image-link") {
249
- $image_node = $product_node->addChild($xmlAtt);
250
- $image_node[0] = (string)Mage::helper('catalog/image')->init($product, 'image');
251
-
252
- } elseif ($magentoAtt == "FONTIS-product-id") {
253
- $id_node = $product_node->addChild($xmlAtt);
254
- $id_node[0] = $product->getId();
255
-
256
- } elseif ($magentoAtt == "FONTIS-category") {
257
- $category_found = false;
258
- $category_node = $product_node->addChild($xmlAtt);
259
-
260
- foreach($product->getCategoryCollection() as $c) {
261
- $cat = Mage::getModel('catalog/category')->load($c->getId());
262
-
263
- $children = $cat->getAllChildren(true);
264
-
265
- if (count($children) <= 1) {
266
- $category_node[0] = $cat->getName();
267
- $category_found = true;
268
- }
269
- }
270
-
271
- if (!$category_found) {
272
- $category_node[0] = Mage::getStoreConfig('fontis_feeds/shopbotfeed/defaultcategory');
273
- }
274
-
275
- } else {
276
- $value = $product->getResource()->getAttribute($magentoAtt)->getFrontend()->getValue($product);
277
-
278
- if ($value != "") {
279
- $extra_node = $product_node->addChild($xmlAtt);
280
- $extra_node[0] = $value;
281
- }
282
- }
283
- }
284
- }
285
- }
286
-
287
- $result['xml'] = $doc->asXml();
288
- return $result;
289
- }
290
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
package.xml CHANGED
@@ -1,18 +1,18 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Fontis_Australia</name>
4
- <version>2.0.3</version>
5
  <stability>stable</stability>
6
  <license uri="http://opensource.org/licenses/osl-3.0.php">Open Software License (OSL 3.0)</license>
7
  <channel>community</channel>
8
  <extends/>
9
  <summary>Broad extension that provides functionality for Australian stores.</summary>
10
  <description>This extension is intended to provide most of the functionality needed to run a Magento store in Australia. This includes all essential payment and shipping methods as well as small localisations such as adding the store's ABN, adding Australian states and territories to the region directory and adding in a postcode database.</description>
11
- <notes>Currently active are modules for BPAY, direct deposit, Australia Post, the addition of regions and postcodes, and the addition of ABN and phone number to the general configuration values (although currently not in use).</notes>
12
  <authors><author><name>Chris Norton</name><user>auto-converted</user><email>chris.norton@fontis.com.au</email></author><author><name>Lloyd Hazlett</name><user>auto-converted</user><email>hazzard43@fastmail.fm</email></author><author><name>Fontis</name><user>auto-converted</user><email>magento@fontis.com.au</email></author></authors>
13
- <date>2010-04-07</date>
14
- <time>05:14:28</time>
15
- <contents><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="fontis"><dir name="australia"><dir name="payment"><dir name="bpay"><file name="form.phtml" hash="7245a655eac2513f8cd6c1a825586936"/><file name="info.phtml" hash="d4836cf6f5316b76b56ddefc48b67d94"/></dir><dir name="directdeposit"><file name="form.phtml" hash="0e5272781aa7c4d25c1c243fcf00487e"/><file name="info.phtml" hash="38112ef511c67c91a3f2ad43da7929da"/></dir></dir><dir name="system"><dir name="config"><dir name="form"><dir name="field"><file name="array_dropdown.phtml" hash="bdce71494213de5fe194873b5d0bed56"/></dir></dir></dir></dir></dir></dir></dir></dir></dir></dir><dir name="frontend"><dir name="default"><dir name="default"><dir name="layout"><file name="fontis_australia.xml" hash="d33f99fc5dfc156de09254e95a2c82eb"/></dir><dir name="template"><dir name="fontis"><dir name="australia"><dir name="payment"><dir name="bpay"><file name="form.phtml" hash="3895f9afa025444eb9a1cdc38582069d"/><file name="info.phtml" hash="47d1e0cc3ae676dff49990eba0ac4608"/><file name="success.phtml" hash="115a1710b1f3b0ef3ecf0b957651bb43"/></dir><dir name="directdeposit"><file name="form.phtml" hash="8cf9d09e42ba30206aabf01a3ec38239"/><file name="info.phtml" hash="8bc98b2fd1d1943f17d2831a67c97db3"/><file name="success.phtml" hash="0545f8c3c9d37a2045a20f442991e8d7"/></dir></dir><file name="postcode-checkout.phtml" hash="51867acd43c4f8c982ab1fea103a579f"/><file name="postcode.phtml" hash="b0d7bfa170c7ca3bd4a256f0404d7189"/></dir></dir></dir></dir></dir></dir></target><target name="magecommunity"><dir name="Fontis"><dir name="Australia"><dir name="Block"><dir name="Bpay"><file name="Form.php" hash="958e11d14d7c87054a68d34b60c498d6"/><file name="Info.php" hash="a28f40be3c76637eb43ba80c61031512"/><file name="Info.php.~1~" hash="0261fa159baac6974b936a29ceffa727"/></dir><dir name="Directdeposit"><file name="Form.php" hash="13589d5d85499678bdc62fde04107095"/><file name="Info.php" hash="0f31ac7451127c87813c823423a9057b"/></dir><file name="Autocomplete.php" hash="4f33f809dae969781ead580b13e9bd3a"/><file name="Myshopping.php" hash="1e9b9149a867136f541b765d54ba402b"/><file name="Shopbot.php" hash="fca48ea13a60bdd1b207913f536bce45"/></dir><dir name="controllers"><file name="AjaxController.php" hash="5fb086e3236446b6a6f10f4c78eb3fcb"/></dir><dir name="etc"><file name="config.xml" hash="000d6232e765380bd90a0eecbdd64b21"/><file name="system.xml" hash="bfcebc05a66fb2d2c0b4f13ebae6fc7a"/></dir><dir name="Helper"><file name="Bpay.php" hash="a2565444f18b28e70c8d29f802297057"/><file name="Data.php" hash="e493486d7a5ccd5589d99d08b136b819"/></dir><dir name="Model"><dir name="Config"><file name="CustomerGroupAccess.php" hash="e531a8049b9a877e01c2b806b065dbef"/><file name="CustomerGroups.php" hash="8014e56b1141cb9bbb63f807ec1c87a5"/></dir><dir name="Getprice"><file name="Child.php" hash="806d1d3f4b9508e7a982ebdcb4d9faf7"/><file name="Cron.php" hash="024e036fb8772b085bc7ca48bed7f605"/></dir><dir name="Myshopping"><file name="Child.php" hash="b1cb41cdf36352e9d1d6dec0dbeedc9f"/><file name="Cron.php" hash="92021f539e06231715f4639c98f08d9a"/></dir><dir name="Mysql4"><dir name="Shipping"><dir name="Carrier"><dir name="Eparcel"><file name="Collection.php" hash="87f450c6b318060b83e7d7d0662cdf50"/></dir><file name="Eparcel.php" hash="9614eed4296b17a429db745c289d42cf"/></dir></dir></dir><dir name="Payment"><file name="Bpay.php" hash="b60d9a61b06b100164fff49fc5113f71"/><file name="Directdeposit.php" hash="c80ba74494bfeea040dc2bf942cec5f0"/></dir><dir name="Shipping"><dir name="Carrier"><file name="Australiapost.php" hash="bde64f52effdf89143cb8aacf631ddf9"/><file name="Eparcel.php" hash="b65cd938b27b4666e22b6833ca738226"/></dir><dir name="Config"><file name="Eparcel.php" hash="8c754cdc86316dbee53db68f0e2652bc"/><file name="Eparcelcondition.php" hash="b8cc830ab6e0e397d32bf574f60b0500"/><file name="Weightunits.php" hash="e13ba9de393ae67420f863d4008c3c72"/></dir></dir><dir name="Shopbot"><file name="Child.php" hash="9c87db1130bdcb1333f9412864191c0a"/><file name="Cron.php" hash="a4d5cbdb1a21257fe9977ff6da43f2d6"/><file name="Cron.php~" hash="edaaa2e9c31e3eb32600476b9bdd83c0"/></dir></dir><dir name="sql"><dir name="australia_setup"><file name="mysql4-install-0.7.0.php" hash="f475b13bb5319599c4a852cfb8788f9a"/><file name="mysql4-upgrade-1.2.1-1.2.2.php" hash="9a381c07ec9ee53e2ffaa7ea7da4559d"/><file name="postcodes.txt" hash="21083a0f94e200259c9b4540666b251e"/></dir></dir></dir></dir></target><target name="mageskin"><dir name="frontend"><dir name="default"><dir name="default"><dir name="images"><dir name="fontis"><file name="bpay.png" hash="481c9ee07049203aca13d6d2c2948cf7"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Fontis_Australia.xml" hash="a60b83cf1b1b449a16fe09da16342a4d"/></dir></target></contents>
16
  <compatible/>
17
  <dependencies/>
18
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Fontis_Australia</name>
4
+ <version>2.0.4</version>
5
  <stability>stable</stability>
6
  <license uri="http://opensource.org/licenses/osl-3.0.php">Open Software License (OSL 3.0)</license>
7
  <channel>community</channel>
8
  <extends/>
9
  <summary>Broad extension that provides functionality for Australian stores.</summary>
10
  <description>This extension is intended to provide most of the functionality needed to run a Magento store in Australia. This includes all essential payment and shipping methods as well as small localisations such as adding the store's ABN, adding Australian states and territories to the region directory and adding in a postcode database.</description>
11
+ <notes>Currently active are modules for BPAY, direct deposit, Australia Post, the addition of regions and postcodes, and the addition of ABN and phone number to the general configuration values (although currently not in use). Also supports creating product information feeds for the Shopbot, Getprice and MyShopping services.</notes>
12
  <authors><author><name>Chris Norton</name><user>auto-converted</user><email>chris.norton@fontis.com.au</email></author><author><name>Lloyd Hazlett</name><user>auto-converted</user><email>hazzard43@fastmail.fm</email></author><author><name>Fontis</name><user>auto-converted</user><email>magento@fontis.com.au</email></author></authors>
13
+ <date>2010-04-16</date>
14
+ <time>06:07:28</time>
15
+ <contents><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="fontis"><dir name="australia"><dir name="payment"><dir name="bpay"><file name="form.phtml" hash="7245a655eac2513f8cd6c1a825586936"/><file name="info.phtml" hash="d4836cf6f5316b76b56ddefc48b67d94"/></dir><dir name="directdeposit"><file name="form.phtml" hash="0e5272781aa7c4d25c1c243fcf00487e"/><file name="info.phtml" hash="38112ef511c67c91a3f2ad43da7929da"/></dir></dir><dir name="system"><dir name="config"><dir name="form"><dir name="field"><file name="array_dropdown.phtml" hash="bdce71494213de5fe194873b5d0bed56"/></dir></dir></dir></dir></dir></dir></dir></dir></dir></dir><dir name="frontend"><dir name="default"><dir name="default"><dir name="layout"><file name="fontis_australia.xml" hash="d33f99fc5dfc156de09254e95a2c82eb"/></dir><dir name="template"><dir name="fontis"><dir name="australia"><dir name="payment"><dir name="bpay"><file name="form.phtml" hash="3895f9afa025444eb9a1cdc38582069d"/><file name="info.phtml" hash="47d1e0cc3ae676dff49990eba0ac4608"/><file name="success.phtml" hash="115a1710b1f3b0ef3ecf0b957651bb43"/></dir><dir name="directdeposit"><file name="form.phtml" hash="8cf9d09e42ba30206aabf01a3ec38239"/><file name="info.phtml" hash="8bc98b2fd1d1943f17d2831a67c97db3"/><file name="success.phtml" hash="0545f8c3c9d37a2045a20f442991e8d7"/></dir></dir><file name="postcode-checkout.phtml" hash="51867acd43c4f8c982ab1fea103a579f"/><file name="postcode.phtml" hash="b0d7bfa170c7ca3bd4a256f0404d7189"/></dir></dir></dir></dir></dir></dir></target><target name="magecommunity"><dir name="Fontis"><dir name="Australia"><dir name="Block"><dir name="Bpay"><file name="Form.php" hash="958e11d14d7c87054a68d34b60c498d6"/><file name="Info.php" hash="a28f40be3c76637eb43ba80c61031512"/></dir><dir name="Directdeposit"><file name="Form.php" hash="13589d5d85499678bdc62fde04107095"/><file name="Info.php" hash="0f31ac7451127c87813c823423a9057b"/></dir><file name="Autocomplete.php" hash="4f33f809dae969781ead580b13e9bd3a"/><file name="Myshopping.php" hash="1e9b9149a867136f541b765d54ba402b"/><file name="Shopbot.php" hash="fca48ea13a60bdd1b207913f536bce45"/></dir><dir name="controllers"><file name="AjaxController.php" hash="5fb086e3236446b6a6f10f4c78eb3fcb"/></dir><dir name="etc"><file name="config.xml" hash="000d6232e765380bd90a0eecbdd64b21"/><file name="system.xml" hash="bfcebc05a66fb2d2c0b4f13ebae6fc7a"/></dir><dir name="Helper"><file name="Bpay.php" hash="a2565444f18b28e70c8d29f802297057"/><file name="Data.php" hash="e493486d7a5ccd5589d99d08b136b819"/></dir><dir name="Model"><dir name="Config"><file name="CustomerGroupAccess.php" hash="e531a8049b9a877e01c2b806b065dbef"/><file name="CustomerGroups.php" hash="8014e56b1141cb9bbb63f807ec1c87a5"/></dir><dir name="Getprice"><file name="Child.php" hash="8d2a0464526986a20a8fb6d66f5c393f"/><file name="Cron.php" hash="17cd541d978413c0626ea11b14cc7bc8"/></dir><dir name="Myshopping"><file name="Child.php" hash="ba5f6c81fe010ca629bea5de7e0a1a94"/><file name="Cron.php" hash="a7a7f5301cbc5d3768eb202c1148d540"/></dir><dir name="Mysql4"><dir name="Shipping"><dir name="Carrier"><dir name="Eparcel"><file name="Collection.php" hash="87f450c6b318060b83e7d7d0662cdf50"/></dir><file name="Eparcel.php" hash="9614eed4296b17a429db745c289d42cf"/></dir></dir></dir><dir name="Payment"><file name="Bpay.php" hash="b60d9a61b06b100164fff49fc5113f71"/><file name="Directdeposit.php" hash="c80ba74494bfeea040dc2bf942cec5f0"/></dir><dir name="Shipping"><dir name="Carrier"><file name="Australiapost.php" hash="bde64f52effdf89143cb8aacf631ddf9"/><file name="Eparcel.php" hash="b65cd938b27b4666e22b6833ca738226"/></dir><dir name="Config"><file name="Eparcel.php" hash="8c754cdc86316dbee53db68f0e2652bc"/><file name="Eparcelcondition.php" hash="b8cc830ab6e0e397d32bf574f60b0500"/><file name="Weightunits.php" hash="e13ba9de393ae67420f863d4008c3c72"/></dir></dir><dir name="Shopbot"><file name="Child.php" hash="0b5fd4a11a35d29abc50c9a243849bd4"/><file name="Cron.php" hash="385a356a0b8f30dba623e4b2f804e79c"/></dir></dir><dir name="sql"><dir name="australia_setup"><file name="mysql4-install-0.7.0.php" hash="f475b13bb5319599c4a852cfb8788f9a"/><file name="mysql4-upgrade-1.2.1-1.2.2.php" hash="9a381c07ec9ee53e2ffaa7ea7da4559d"/><file name="postcodes.txt" hash="21083a0f94e200259c9b4540666b251e"/></dir></dir></dir></dir></target><target name="mageskin"><dir name="frontend"><dir name="default"><dir name="default"><dir name="images"><dir name="fontis"><file name="bpay.png" hash="481c9ee07049203aca13d6d2c2948cf7"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Fontis_Australia.xml" hash="a60b83cf1b1b449a16fe09da16342a4d"/></dir></target></contents>
16
  <compatible/>
17
  <dependencies/>
18
  </package>