Facebook_Ads_Toolbox - Version 2.1.9

Version Notes

- Add product category into feed import.
- Add support for the "google product category" attribute.

Download this release

Release Info

Developer Jordan Rogers-Smith
Extension Facebook_Ads_Toolbox
Version 2.1.9
Comparing to
See all releases


Code changes from version 2.1.8 to 2.1.9

app/code/community/Facebook/AdsToolbox/Model/FacebookProductFeed.php CHANGED
@@ -25,6 +25,7 @@ class FacebookProductFeed {
25
  const ATTR_PRICE = 'price';
26
  const ATTR_GOOGLE_PRODUCT_CATEGORY = 'google_product_category';
27
  const ATTR_SHORT_DESCRIPTION = 'short_description';
 
28
 
29
  const PATH_FACEBOOK_ADSTOOLBOX_FEED_GENERATION_ENABLED =
30
  'facebook_adstoolbox/feed/generation/enabled';
@@ -114,7 +115,7 @@ class FacebookProductFeed {
114
  $attr_value = substr($attr_value, 0, 5000);
115
  }
116
  // description can't be all uppercase
117
- $attr_value = $this->uppercaseFirstOnlyIfAllCaps($attr_value);
118
  return $escapefn ? $this->$escapefn($attr_value) : $attr_value;
119
  }
120
  break;
@@ -138,6 +139,16 @@ class FacebookProductFeed {
138
  return $escapefn ? $this->$escapefn($attr_value) : $attr_value;
139
  }
140
  break;
 
 
 
 
 
 
 
 
 
 
141
  }
142
  return '';
143
  }
@@ -206,7 +217,7 @@ class FacebookProductFeed {
206
  $stock->getIsInStock() ? 'in stock' : 'out of stock');
207
 
208
  $price = Mage::getModel('directory/currency')->format(
209
- $this->getUpdatedPriceForConfigurableProduct($product),
210
  array('display'=>Zend_Currency::NO_SYMBOL),
211
  false);
212
  if ($this->conversion_needed) {
@@ -214,11 +225,20 @@ class FacebookProductFeed {
214
  }
215
  $items[self::ATTR_PRICE] = $this->buildProductAttr('price',
216
  sprintf('%s %s',
217
- $price,
218
  Mage::app()->getStore()->getDefaultCurrencyCode()));
219
 
220
  $items[self::ATTR_SHORT_DESCRIPTION] = $this->buildProductAttr(self::ATTR_SHORT_DESCRIPTION,
221
  $product->getShortDescription());
 
 
 
 
 
 
 
 
 
222
  return $items;
223
  }
224
 
@@ -405,13 +425,13 @@ class FacebookProductFeed {
405
  return self::fileIsStale($file_path);
406
  }
407
 
408
- private function uppercaseFirstOnlyIfAllCaps($string) {
409
  // if contains lowercase or non-western characters, don't update string
410
  if (!preg_match('/[a-z]/', $string) && !preg_match('/[^\\p{Common}\\p{Latin}]/u', $string)) {
411
  $latin_string = preg_replace('/[^\\p{Latin}]/u', '', $string);
412
  if ($latin_string !== '' &&
413
  mb_strtoupper($latin_string, 'utf-8') === $latin_string) {
414
- return ucwords(strtolower($string));
415
  }
416
  }
417
  return $string;
@@ -466,20 +486,99 @@ class FacebookProductFeed {
466
  return $image_url;
467
  }
468
 
469
- private function getUpdatedPriceForConfigurableProduct($product) {
470
- if ($product->getTypeId() === 'configurable') {
471
- if ($product->getFinalPrice() === 0) {
472
- $configurable = Mage::getModel('catalog/product_type_configurable')
473
- ->setProduct($product);
474
- $simpleCollection = $configurable->getUsedProductCollection()
475
- ->addAttributeToSelect('price')->addFilterByRequiredOptions();
476
- foreach ($simpleCollection as $simpleProduct) {
477
- if ($simpleProduct->getPrice() > 0) {
478
- return $simpleProduct->getPrice();
479
- }
 
 
 
 
 
 
 
 
 
 
 
480
  }
481
  }
482
  }
483
  return $product->getFinalPrice();
484
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
485
  }
25
  const ATTR_PRICE = 'price';
26
  const ATTR_GOOGLE_PRODUCT_CATEGORY = 'google_product_category';
27
  const ATTR_SHORT_DESCRIPTION = 'short_description';
28
+ const ATTR_PRODUCT_TYPE = 'product_type';
29
 
30
  const PATH_FACEBOOK_ADSTOOLBOX_FEED_GENERATION_ENABLED =
31
  'facebook_adstoolbox/feed/generation/enabled';
115
  $attr_value = substr($attr_value, 0, 5000);
116
  }
117
  // description can't be all uppercase
118
+ $attr_value = $this->lowercaseIfAllCaps($attr_value);
119
  return $escapefn ? $this->$escapefn($attr_value) : $attr_value;
120
  }
121
  break;
139
  return $escapefn ? $this->$escapefn($attr_value) : $attr_value;
140
  }
141
  break;
142
+ case self::ATTR_PRODUCT_TYPE:
143
+ // product_type max size: 750
144
+ if ((bool)$attr_value) {
145
+ $attr_value = trim($this->htmlDecode($attr_value));
146
+ if (strlen($attr_value) > 750) {
147
+ $attr_value = substr($attr_value, strlen($attr_value) - 750, 750);
148
+ }
149
+ return $escapefn ? $this->$escapefn($attr_value) : $attr_value;
150
+ }
151
+ break;
152
  }
153
  return '';
154
  }
217
  $stock->getIsInStock() ? 'in stock' : 'out of stock');
218
 
219
  $price = Mage::getModel('directory/currency')->format(
220
+ $this->getProductPrice($product),
221
  array('display'=>Zend_Currency::NO_SYMBOL),
222
  false);
223
  if ($this->conversion_needed) {
225
  }
226
  $items[self::ATTR_PRICE] = $this->buildProductAttr('price',
227
  sprintf('%s %s',
228
+ $this->stripCurrencySymbol($price),
229
  Mage::app()->getStore()->getDefaultCurrencyCode()));
230
 
231
  $items[self::ATTR_SHORT_DESCRIPTION] = $this->buildProductAttr(self::ATTR_SHORT_DESCRIPTION,
232
  $product->getShortDescription());
233
+
234
+ $items[self::ATTR_PRODUCT_TYPE] =
235
+ $this->buildProductAttr(self::ATTR_PRODUCT_TYPE,
236
+ $this->getCategoryPath($product));
237
+
238
+ $items[self::ATTR_GOOGLE_PRODUCT_CATEGORY] =
239
+ $this->buildProductAttr(self::ATTR_GOOGLE_PRODUCT_CATEGORY,
240
+ $product->getData('google_product_category'));
241
+
242
  return $items;
243
  }
244
 
425
  return self::fileIsStale($file_path);
426
  }
427
 
428
+ private function lowercaseIfAllCaps($string) {
429
  // if contains lowercase or non-western characters, don't update string
430
  if (!preg_match('/[a-z]/', $string) && !preg_match('/[^\\p{Common}\\p{Latin}]/u', $string)) {
431
  $latin_string = preg_replace('/[^\\p{Latin}]/u', '', $string);
432
  if ($latin_string !== '' &&
433
  mb_strtoupper($latin_string, 'utf-8') === $latin_string) {
434
+ return strtolower($string);
435
  }
436
  }
437
  return $string;
486
  return $image_url;
487
  }
488
 
489
+ private function getProductPrice($product) {
490
+ switch ($product->getTypeId()) {
491
+ case 'configurable':
492
+ return $this->getConfigurableProductPrice($product);
493
+ case 'grouped':
494
+ return $this->getGroupedProductPrice($product);
495
+ case 'bundle':
496
+ return $this->getBundleProductPrice($product);
497
+ default:
498
+ return $product->getFinalPrice();
499
+ }
500
+ }
501
+
502
+ private function getConfigurableProductPrice($product) {
503
+ if ($product->getFinalPrice() === 0) {
504
+ $configurable = Mage::getModel('catalog/product_type_configurable')
505
+ ->setProduct($product);
506
+ $simple_collection = $configurable->getUsedProductCollection()
507
+ ->addAttributeToSelect('price')->addFilterByRequiredOptions();
508
+ foreach ($simple_collection as $simple_product) {
509
+ if ($simple_product->getPrice() > 0) {
510
+ return $simple_product->getPrice();
511
  }
512
  }
513
  }
514
  return $product->getFinalPrice();
515
  }
516
+
517
+ private function getBundleProductPrice($product) {
518
+ $configurable = Mage::getModel('bundle/product_type')
519
+ ->setProduct($product);
520
+
521
+ $collection = $configurable
522
+ ->getSelectionsCollection(
523
+ $configurable->getOptionsIds($product),
524
+ $product)
525
+ ->addAttributeToSelect('price')
526
+ ->addFilterByRequiredOptions();
527
+
528
+ $pm = $product->getPriceModel();
529
+
530
+ $option_prices = array();
531
+ $required_groups = $configurable
532
+ ->getProductsToPurchaseByReqGroups($product);
533
+ foreach ($required_groups as $group) {
534
+ $min_price = INF;
535
+ $bundle_quantity = 1;
536
+ $selection_quantity = 1;
537
+ foreach ($group as $item) {
538
+ $item_price = $pm->getSelectionFinalTotalPrice($product, $item,
539
+ $bundle_quantity, $selection_quantity);
540
+ $min_price = min($min_price, $item_price);
541
+ }
542
+ $option_prices[] = $min_price;
543
+ }
544
+
545
+ return $product->getFinalPrice() + array_sum($option_prices);
546
+ }
547
+
548
+ private function getGroupedProductPrice($product) {
549
+ $assoc_products = $product->getTypeInstance(true)
550
+ ->getAssociatedProductCollection($product)
551
+ ->addAttributeToSelect('price');
552
+
553
+ $min_price = INF;
554
+ foreach ($assoc_products as $assoc_product) {
555
+ $min_price = min($min_price, $assoc_product->getPrice());
556
+ }
557
+ return $min_price;
558
+ }
559
+
560
+ private function stripCurrencySymbol($price) {
561
+ if (!isset($this->currency_strip_needed)) {
562
+ $this->currency_strip_needed = !preg_match('/^[0-9,.]*$/', $price);
563
+ }
564
+ if ($this->currency_strip_needed) {
565
+ return preg_replace('/[^0-9,.]/', '', $price);
566
+ } else {
567
+ return $price;
568
+ }
569
+ }
570
+
571
+ private function getCategoryPath($product) {
572
+ $category_string = "";
573
+ $category = $product->getCategoryCollection()
574
+ ->addAttributeToSelect('name')
575
+ ->getFirstItem();
576
+ while ($category->getName() && $category->getName() != 'Default Category') {
577
+ $category_string = ($category_string) ?
578
+ $category->getName()." > ".$category_string :
579
+ $category->getName();
580
+ $category = $category->getParentCategory();
581
+ }
582
+ return $category_string;
583
+ }
584
  }
app/code/community/Facebook/AdsToolbox/Model/FacebookProductFeedTSV.php CHANGED
@@ -19,7 +19,7 @@ class FacebookProductFeedTSV extends FacebookProductFeed {
19
  // full row should be
20
  // id\ttitle\tdescription\tgoogle_product_category\tproduct_type\tlink\timage_link\tbrand\tcondition\tavailability\tprice\tsale_price\tsale_price_effective_date\tgtin\tbrand\tmpn\titem_group_id\tgender\tage_group\tcolor\tsize\tshipping\tshipping_weight\tcustom_label_0
21
  // ref: https://developers.facebook.com/docs/marketing-api/dynamic-product-ads/product-catalog
22
- const TSV_HEADER = "id\ttitle\tdescription\tlink\timage_link\tbrand\tcondition\tavailability\tprice\tshort_description";
23
 
24
  protected function tsvescape($t) {
25
  // replace newlines as TSV does not allow multi-line value
19
  // full row should be
20
  // id\ttitle\tdescription\tgoogle_product_category\tproduct_type\tlink\timage_link\tbrand\tcondition\tavailability\tprice\tsale_price\tsale_price_effective_date\tgtin\tbrand\tmpn\titem_group_id\tgender\tage_group\tcolor\tsize\tshipping\tshipping_weight\tcustom_label_0
21
  // ref: https://developers.facebook.com/docs/marketing-api/dynamic-product-ads/product-catalog
22
+ const TSV_HEADER = "id\ttitle\tdescription\tlink\timage_link\tbrand\tcondition\tavailability\tprice\tshort_description\tproduct_type\tgoogle_product_category";
23
 
24
  protected function tsvescape($t) {
25
  // replace newlines as TSV does not allow multi-line value
app/code/community/Facebook/AdsToolbox/etc/config.xml CHANGED
@@ -2,7 +2,7 @@
2
  <config>
3
  <modules>
4
  <Facebook_AdsToolbox>
5
- <version>2.1.8</version>
6
  </Facebook_AdsToolbox>
7
  </modules>
8
  <global>
2
  <config>
3
  <modules>
4
  <Facebook_AdsToolbox>
5
+ <version>2.1.9</version>
6
  </Facebook_AdsToolbox>
7
  </modules>
8
  <global>
js/Facebook/AdsToolbox/Adminhtml/dia.js CHANGED
@@ -219,7 +219,6 @@ var DiaFlowContainer = React.createClass({
219
  openPopup: function openPopup() {
220
  if (!this.state.diaSettingId && window.facebookAdsToolboxConfig.feed.totalVisibleProducts < 10000) {
221
  new Ajax.Request(window.facebookAdsToolboxAjax.generateFeedNow, {
222
- method: 'post',
223
  parameters: {useCache : true},
224
  onSuccess: function onSuccess() {}
225
  });
@@ -240,7 +239,6 @@ var DiaFlowContainer = React.createClass({
240
  },
241
  launchDiaWizard: function launchDiaWizard() {
242
  this.diaConfig = { 'clientSetup': window.facebookAdsToolboxConfig };
243
- this.diaConfig.feedPrepared = window.facebookAdsToolboxConfig.feedPrepared;
244
  this.openPopup();
245
  },
246
  closeModal: function closeModal() {
219
  openPopup: function openPopup() {
220
  if (!this.state.diaSettingId && window.facebookAdsToolboxConfig.feed.totalVisibleProducts < 10000) {
221
  new Ajax.Request(window.facebookAdsToolboxAjax.generateFeedNow, {
 
222
  parameters: {useCache : true},
223
  onSuccess: function onSuccess() {}
224
  });
239
  },
240
  launchDiaWizard: function launchDiaWizard() {
241
  this.diaConfig = { 'clientSetup': window.facebookAdsToolboxConfig };
 
242
  this.openPopup();
243
  },
244
  closeModal: function closeModal() {
package.xml CHANGED
@@ -1,7 +1,7 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Facebook_Ads_Toolbox</name>
4
- <version>2.1.8</version>
5
  <stability>stable</stability>
6
  <license uri="https://raw.githubusercontent.com/fbsamples/audience-network-support/master/LICENSE">Facebook License</license>
7
  <channel>community</channel>
@@ -59,12 +59,12 @@ _Installation Instructions_&#xD;
59
  &#xD;
60
  Additional FAQ&#xD;
61
  https://www.facebook.com/help/532749253576163</description>
62
- <notes>- Fix prices for grouped and bundled products.&#xD;
63
- - Fix product urls for some stores.</notes>
64
  <authors><author><name>Jordan Rogers-Smith</name><user>jordanrs</user><email>jordanrs@fb.com</email></author><author><name>Yu Li</name><user>liyuhk</user><email>liyuhk@fb.com</email></author><author><name>Dmitri Dranishnikov</name><user>dmitrid</user><email>dmitrid@fb.com</email></author></authors>
65
- <date>2016-10-14</date>
66
- <time>21:45:09</time>
67
- <contents><target name="magecommunity"><dir name="Facebook"><dir name="AdsToolbox"><dir><dir name="Block"><file name="AddToCart.php" hash="0bb7985b9079b8e70585aea350dc1524"/><dir name="Adminhtml"><file name="Diaindex.php" hash="f601096b3033fde99dbcfdc463572ec1"/><file name="Feedindex.php" hash="f08548f1c321e70fb4bebdf5fa6acc37"/><file name="Pixelindex.php" hash="ed25472f13e9dd8ec7e8c7f3378a198b"/></dir><file name="Head.php" hash="eb5ee970cfb6873b9def860232089460"/><file name="InitiateCheckout.php" hash="c47ed5209bed0ae4dbad120be1ba13b3"/><file name="Purchase.php" hash="0c65646369b87e6c818da4f3fdc0e155"/><file name="Search.php" hash="d8acaa72da8ca3df2146949276a3714d"/><file name="ViewCategory.php" hash="36e19e8ff10acbc862420ac8dc39fd05"/><file name="ViewContent.php" hash="38ced65dd84888045e3ef9f189124d0a"/><file name="common.php" hash="ed0e2a1dc8c84138dc6c728b2d428054"/></dir><dir name="Helper"><file name="Data.php" hash="09da04dbb30d6de8b7a873f0447456ba"/></dir><dir name="Model"><file name="FacebookProductFeed.php" hash="4f3d0b4db388baa29ffe8b1135137f7f"/><file name="FacebookProductFeedSamples.php" hash="b79a1a2f4c857e2ed7b4971c3395406f"/><file name="FacebookProductFeedTSV.php" hash="acc22ecb0ba66117337a7250e1b2a940"/><file name="FacebookProductFeedXML.php" hash="f62f7630ffd1f34b5a062855da62865f"/><file name="Observer.php" hash="6ba9ee34820ad5b86480fba72a540310"/></dir><dir name="controllers"><dir name="Adminhtml"><file name="FbfeedController.php" hash="a55045c8ad914584490d36f1410b0051"/><file name="FbfeedlogController.php" hash="34938878c691842a71f4f788c0b5cfee"/><file name="FbmainController.php" hash="b952bf87ca7b49a2b1fb256025e39331"/><file name="FbpixelController.php" hash="f00c250878671e6e4957239ddd952476"/><file name="FbregenController.php" hash="1837e42c7e6d4d9c77bb386732d08e28"/></dir><file name="DebugController.php" hash="cf3aa8f25e7c4301de9f5f908fca40e5"/><file name="ProductfeedController.php" hash="c9aedcb0b2d7d3ee66272fea143e8fd2"/></dir><dir name="etc"><file name="adminhtml.xml" hash="be7e9a1dfc20ca73654c8e4ac557e4c9"/><file name="config.xml" hash="1a3f267970cc631a7f671018465d4f83"/></dir><dir name="lib"><file name="fb.php" hash="cf26fcc94496b05fbaed083154a42dbf"/></dir></dir><file name="LICENSE" hash="4e3837b373e2371aeb3317bc8d245ad6"/><file name="PATENTS" hash="7eb20d51ce76c08c2e6c939674e75c93"/></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="facebookadstoolbox.xml" hash="cd8d60f293f5d1b5925efe01c7e48af7"/></dir><dir name="template"><dir name="facebookadstoolbox"><file name="addtocart.phtml" hash="cffaf57c6b633e1c5641783f08769726"/><file name="head.phtml" hash="217c676e9f1893f17073904a62796016"/><file name="initiate_checkout.phtml" hash="0f57840eef0477538b211d63d6c6d3b5"/><file name="purchase.phtml" hash="278c3819865a6a8ef3c03cb1189e4a4c"/><file name="search.phtml" hash="a67005ea51ae63b225cb598cf9152014"/><file name="viewcategory.phtml" hash="c56f37ab17654b53ace6180903900cf3"/><file name="viewcontent.phtml" hash="ebf7844a601511d85135cfaf623a9bc1"/></dir></dir></dir></dir></dir><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="facebookadstoolbox.xml" hash="5974bb612e16c7b7eff07ef06eddebda"/></dir><dir name="template"><dir name="facebookadstoolbox"><file name="dia_index.phtml" hash="839af71b1454571a41243e24cecc84ec"/><file name="feed_index.phtml" hash="157e56ef40e56378bcd07284162fb439"/><file name="pixel_index.phtml" hash="0b8e1171703bfb27ce5c768c6e79dc81"/></dir></dir></dir></dir></dir></target><target name="mageweb"><dir name="js"><dir name="Facebook"><dir name="AdsToolbox"><dir><dir name="Adminhtml"><file name="dia.js" hash="eee4506b93da5703034f2b9f405d82b3"/><file name="feed.js" hash="134fbbb334e0d2422b77435dc105ebf5"/><dir name="lib"><file name="react-dom.min.js" hash="80dd76fff4872e658666dec43913360c"/><file name="react.min.js" hash="c3207f7bf39699d4279ba404ea55f163"/></dir><file name="pixel.js" hash="916afd85272d48e3b34c8f2a9f4db38a"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Facebook_AdsToolbox.xml" hash="164bc795b6911c5b0a6ca357a56f38cc"/></dir></target><target name="mageskin"><dir name="adminhtml"><dir name="base"><dir name="default"><dir name="Facebook"><dir name="AdsToolbox"><dir><dir name="css"><dir name="Adminhtml"><file name="dia.css" hash="201b2a78305d44d6eeebbf67231e7767"/><file name="feed.css" hash="2763caa9c8f3b9b21f85a59915d39157"/><file name="pixel.css" hash="8b143487fcc4a902c0e44de8e2af6eef"/></dir></dir><dir name="images"><dir name="Adminhtml"><file name="buttonbg.png" hash="09adbacda0d592a215277230c48df285"/><file name="fbicons.png" hash="8f1b559a279a3785f1b2492a79f518d8"/></dir></dir></dir></dir></dir></dir></dir></dir></target></contents>
68
  <compatible/>
69
  <dependencies><required><php><min>5.3.0</min><max>8.0.0</max></php></required></dependencies>
70
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Facebook_Ads_Toolbox</name>
4
+ <version>2.1.9</version>
5
  <stability>stable</stability>
6
  <license uri="https://raw.githubusercontent.com/fbsamples/audience-network-support/master/LICENSE">Facebook License</license>
7
  <channel>community</channel>
59
  &#xD;
60
  Additional FAQ&#xD;
61
  https://www.facebook.com/help/532749253576163</description>
62
+ <notes>- Add product category into feed import.&#xD;
63
+ - Add support for the "google product category" attribute.</notes>
64
  <authors><author><name>Jordan Rogers-Smith</name><user>jordanrs</user><email>jordanrs@fb.com</email></author><author><name>Yu Li</name><user>liyuhk</user><email>liyuhk@fb.com</email></author><author><name>Dmitri Dranishnikov</name><user>dmitrid</user><email>dmitrid@fb.com</email></author></authors>
65
+ <date>2016-10-21</date>
66
+ <time>02:25:08</time>
67
+ <contents><target name="magecommunity"><dir name="Facebook"><dir name="AdsToolbox"><dir><dir name="Block"><file name="AddToCart.php" hash="0bb7985b9079b8e70585aea350dc1524"/><dir name="Adminhtml"><file name="Diaindex.php" hash="f601096b3033fde99dbcfdc463572ec1"/><file name="Feedindex.php" hash="f08548f1c321e70fb4bebdf5fa6acc37"/><file name="Pixelindex.php" hash="ed25472f13e9dd8ec7e8c7f3378a198b"/></dir><file name="Head.php" hash="eb5ee970cfb6873b9def860232089460"/><file name="InitiateCheckout.php" hash="c47ed5209bed0ae4dbad120be1ba13b3"/><file name="Purchase.php" hash="0c65646369b87e6c818da4f3fdc0e155"/><file name="Search.php" hash="d8acaa72da8ca3df2146949276a3714d"/><file name="ViewCategory.php" hash="36e19e8ff10acbc862420ac8dc39fd05"/><file name="ViewContent.php" hash="38ced65dd84888045e3ef9f189124d0a"/><file name="common.php" hash="ed0e2a1dc8c84138dc6c728b2d428054"/></dir><dir name="Helper"><file name="Data.php" hash="09da04dbb30d6de8b7a873f0447456ba"/></dir><dir name="Model"><file name="FacebookProductFeed.php" hash="a06afb4375ff1f9fe6dcefa34d1d952d"/><file name="FacebookProductFeedSamples.php" hash="b79a1a2f4c857e2ed7b4971c3395406f"/><file name="FacebookProductFeedTSV.php" hash="74b0e3801fa807bfc48e8814c7c0d6c4"/><file name="FacebookProductFeedXML.php" hash="f62f7630ffd1f34b5a062855da62865f"/><file name="Observer.php" hash="6ba9ee34820ad5b86480fba72a540310"/></dir><dir name="controllers"><dir name="Adminhtml"><file name="FbfeedController.php" hash="a55045c8ad914584490d36f1410b0051"/><file name="FbfeedlogController.php" hash="34938878c691842a71f4f788c0b5cfee"/><file name="FbmainController.php" hash="b952bf87ca7b49a2b1fb256025e39331"/><file name="FbpixelController.php" hash="f00c250878671e6e4957239ddd952476"/><file name="FbregenController.php" hash="1837e42c7e6d4d9c77bb386732d08e28"/></dir><file name="DebugController.php" hash="cf3aa8f25e7c4301de9f5f908fca40e5"/><file name="ProductfeedController.php" hash="c9aedcb0b2d7d3ee66272fea143e8fd2"/></dir><dir name="etc"><file name="adminhtml.xml" hash="be7e9a1dfc20ca73654c8e4ac557e4c9"/><file name="config.xml" hash="6b5f3d958cee4ac57f6ac4378dfc12fc"/></dir><dir name="lib"><file name="fb.php" hash="cf26fcc94496b05fbaed083154a42dbf"/></dir></dir><file name="LICENSE" hash="4e3837b373e2371aeb3317bc8d245ad6"/><file name="PATENTS" hash="7eb20d51ce76c08c2e6c939674e75c93"/></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="facebookadstoolbox.xml" hash="cd8d60f293f5d1b5925efe01c7e48af7"/></dir><dir name="template"><dir name="facebookadstoolbox"><file name="addtocart.phtml" hash="cffaf57c6b633e1c5641783f08769726"/><file name="head.phtml" hash="217c676e9f1893f17073904a62796016"/><file name="initiate_checkout.phtml" hash="0f57840eef0477538b211d63d6c6d3b5"/><file name="purchase.phtml" hash="278c3819865a6a8ef3c03cb1189e4a4c"/><file name="search.phtml" hash="a67005ea51ae63b225cb598cf9152014"/><file name="viewcategory.phtml" hash="c56f37ab17654b53ace6180903900cf3"/><file name="viewcontent.phtml" hash="ebf7844a601511d85135cfaf623a9bc1"/></dir></dir></dir></dir></dir><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="facebookadstoolbox.xml" hash="5974bb612e16c7b7eff07ef06eddebda"/></dir><dir name="template"><dir name="facebookadstoolbox"><file name="dia_index.phtml" hash="839af71b1454571a41243e24cecc84ec"/><file name="feed_index.phtml" hash="157e56ef40e56378bcd07284162fb439"/><file name="pixel_index.phtml" hash="0b8e1171703bfb27ce5c768c6e79dc81"/></dir></dir></dir></dir></dir></target><target name="mageweb"><dir name="js"><dir name="Facebook"><dir name="AdsToolbox"><dir><dir name="Adminhtml"><file name="dia.js" hash="323e73e09b3636ed378463ca288ddca0"/><file name="feed.js" hash="134fbbb334e0d2422b77435dc105ebf5"/><dir name="lib"><file name="react-dom.min.js" hash="80dd76fff4872e658666dec43913360c"/><file name="react.min.js" hash="c3207f7bf39699d4279ba404ea55f163"/></dir><file name="pixel.js" hash="916afd85272d48e3b34c8f2a9f4db38a"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Facebook_AdsToolbox.xml" hash="164bc795b6911c5b0a6ca357a56f38cc"/></dir></target><target name="mageskin"><dir name="adminhtml"><dir name="base"><dir name="default"><dir name="Facebook"><dir name="AdsToolbox"><dir><dir name="css"><dir name="Adminhtml"><file name="dia.css" hash="201b2a78305d44d6eeebbf67231e7767"/><file name="feed.css" hash="2763caa9c8f3b9b21f85a59915d39157"/><file name="pixel.css" hash="8b143487fcc4a902c0e44de8e2af6eef"/></dir></dir><dir name="images"><dir name="Adminhtml"><file name="buttonbg.png" hash="09adbacda0d592a215277230c48df285"/><file name="fbicons.png" hash="8f1b559a279a3785f1b2492a79f518d8"/></dir></dir></dir></dir></dir></dir></dir></dir></target></contents>
68
  <compatible/>
69
  <dependencies><required><php><min>5.3.0</min><max>8.0.0</max></php></required></dependencies>
70
  </package>