rich_snippets - Version 1.2.0

Version Notes

+ Breadcrumbs markup
+ Markup for aggregate product rating and each product review

Download this release

Release Info

Developer MagPleasure Ltd.
Extension rich_snippets
Version 1.2.0
Comparing to
See all releases


Code changes from version 1.1.1 to 1.2.0

app/code/local/Magpleasure/Richsnippets/Block/Catalog/Product/View.php CHANGED
@@ -42,6 +42,12 @@ class Magpleasure_Richsnippets_Block_Catalog_Product_View extends Mage_Catalog_B
42
  return $html;
43
  }
44
 
 
 
 
 
 
 
45
  protected function _insertRichSnippets($html)
46
  {
47
  $markup = $this->getLayout()->getBlock('mp.richsnippets')->toHtml();
42
  return $html;
43
  }
44
 
45
+ /**
46
+ * Insert product schema.org markup
47
+ *
48
+ * @param $html
49
+ * @return mixed
50
+ */
51
  protected function _insertRichSnippets($html)
52
  {
53
  $markup = $this->getLayout()->getBlock('mp.richsnippets')->toHtml();
app/code/local/Magpleasure/Richsnippets/Block/Catalog/Product/View/Markup.php CHANGED
@@ -90,4 +90,34 @@ class Magpleasure_Richsnippets_Block_Catalog_Product_View_Markup extends Mage_Ca
90
  return $summaryData->getId() ? $summaryData->getReviewsCount() : 0;
91
  }
92
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93
  }
90
  return $summaryData->getId() ? $summaryData->getReviewsCount() : 0;
91
  }
92
  }
93
+
94
+ /**
95
+ * Get all product reviews
96
+ *
97
+ * @return Mage_Review_Model_Resource_Review_Collection
98
+ */
99
+ public function getReviews()
100
+ {
101
+ $reviews = Mage::getModel('review/review')->getCollection()
102
+ ->addStoreFilter(Mage::app()->getStore()->getId())
103
+ ->addStatusFilter(Mage_Review_Model_Review::STATUS_APPROVED)
104
+ ->addEntityFilter('product', $this->getProduct()->getId())
105
+ ->setDateOrder();
106
+ return $reviews;
107
+ }
108
+
109
+ /**
110
+ * Get average review rating
111
+ *
112
+ * @param $review
113
+ * @return float|int
114
+ */
115
+ public function getReviewRating($review)
116
+ {
117
+ $votes = array();
118
+ foreach ($review->getRatingVotes() as $vote) {
119
+ array_push($votes, $vote->getPercent());
120
+ }
121
+ return count($votes) ? array_sum($votes) / count($votes) : 0;
122
+ }
123
  }
app/code/local/Magpleasure/Richsnippets/Block/Page/Html/Breadcrumbs.php ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Magpleasure Ltd.
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the EULA
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://www.magpleasure.com/LICENSE.txt
12
+ *
13
+ * @category Magpleasure
14
+ * @package Magpleasure_Richsnippets
15
+ * @copyright Copyright (c) 2014-2015 Magpleasure Ltd. (http://www.magpleasure.com)
16
+ * @license http://www.magpleasure.com/LICENSE.txt
17
+ */
18
+ class Magpleasure_Richsnippets_Block_Page_Html_Breadcrumbs extends Mage_Page_Block_Html_Breadcrumbs
19
+ {
20
+ /**
21
+ * Helper
22
+ *
23
+ * @return Magpleasure_Richsnippets_Helper_Data
24
+ */
25
+ protected function _helper()
26
+ {
27
+ return Mage::helper('richsnippets');
28
+ }
29
+
30
+ /**
31
+ * Render block HTML
32
+ *
33
+ * @return string
34
+ */
35
+ protected function _toHtml()
36
+ {
37
+ $html = parent::_toHtml();
38
+ $html = $this->_addMarkup($html);
39
+ return $html;
40
+ }
41
+
42
+ /**
43
+ * Add markup for breadcrumbs
44
+ *
45
+ * @param $html
46
+ * @return mixed
47
+ */
48
+ protected function _addMarkup($html)
49
+ {
50
+ $type = $this->_helper()->getConfigValue('general', 'breadcrumbs');
51
+ if (Magpleasure_Richsnippets_Model_System_Config_Source_Breadcrumbs::NONE == $type) {
52
+ return $html;
53
+ }
54
+
55
+ if (Magpleasure_Richsnippets_Model_System_Config_Source_Breadcrumbs::DATA_VOCABULARY == $type) {
56
+ $html = preg_replace('/(<li.*?)>[\s]*?(<a.*?\/a>)/', '$1 itemscope itemtype="http://data-vocabulary.org/Breadcrumb">$2', $html);
57
+ $html = preg_replace('/(<a.*?)>/', '$1 itemprop="url">', $html);
58
+ $html = preg_replace('/(<a.*?>)([\s\S]*?)(<\/a>)/', '$1$2$3 <meta itemprop="title" content="$2">', $html);
59
+ } else if (Magpleasure_Richsnippets_Model_System_Config_Source_Breadcrumbs::SCHEMA == $type) {
60
+ $html = preg_replace('/(<ul.*?)>/', '$1 itemscope itemtype="http://schema.org/BreadcrumbList">', $html);
61
+ $html = preg_replace('/(<li.*?)>[\s]*?(<a.*?\/a>)/', '$1 itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">$2', $html);
62
+ $html = preg_replace('/(<a.*?)>/', '$1 itemprop="item">', $html);
63
+ $html = preg_replace('/(<a.*?>)([\s\S]*?)(<\/a>)/', '$1$2$3 <meta itemprop="name" content="$2">', $html);
64
+
65
+ $html = preg_replace_callback('/(<a.*?>[\s\S]*?<\/a>)/', function ($matches) {
66
+ static $position = 0;
67
+ return $matches[0] . '<meta itemprop="position" content="' . ++$position . '">';
68
+ }, $html);
69
+ }
70
+
71
+ return $html;
72
+ }
73
+ }
app/code/local/Magpleasure/Richsnippets/Helper/Data.php CHANGED
@@ -1,82 +1,82 @@
1
- <?php
2
-
3
- /**
4
- * Magpleasure Ltd.
5
- *
6
- * NOTICE OF LICENSE
7
- *
8
- * This source file is subject to the EULA
9
- * that is bundled with this package in the file LICENSE.txt.
10
- * It is also available through the world-wide-web at this URL:
11
- * http://www.magpleasure.com/LICENSE.txt
12
- *
13
- * @category Magpleasure
14
- * @package Magpleasure_Richsnippets
15
- * @copyright Copyright (c) 2014-2015 Magpleasure Ltd. (http://www.magpleasure.com)
16
- * @license http://www.magpleasure.com/LICENSE.txt
17
- */
18
- class Magpleasure_Richsnippets_Helper_Data extends Mage_Core_Helper_Abstract
19
- {
20
- /**
21
- * Value from config path 'richsnippets/group/field'
22
- *
23
- * @param $group
24
- * @param $field
25
- * @return mixed
26
- */
27
- public function getConfigValue($group, $field)
28
- {
29
- return Mage::getStoreConfig('richsnippets' . DS . $group . DS . $field);
30
- }
31
-
32
- /**
33
- * Calculate default configurable price for bundle product
34
- *
35
- * @param $product
36
- * @return int
37
- */
38
- public function getConfiguredPrice($product)
39
- {
40
- if (Mage_Catalog_Model_Product_Type::TYPE_BUNDLE != $product->getTypeId()) {
41
- return 0;
42
- }
43
- $priceModel = $product->getPriceModel();
44
- $bundleBlock = Mage::getSingleton('core/layout')->createBlock('bundle/catalog_product_view_type_bundle');
45
- $options = $bundleBlock->setProduct($product)->getOptions();
46
- $price = 0;
47
- /** @var Mage_Bundle_Model_Option $option */
48
- foreach ($options as $option) {
49
- $selection = $option->getDefaultSelection();
50
- if (null === $selection) {
51
- continue;
52
- }
53
- $price += $priceModel->getSelectionPreFinalPrice($product, $selection, $selection->getSelectionQty());
54
- }
55
- return $price;
56
- }
57
-
58
- /**
59
- * Calculate default price for grouped product
60
- *
61
- * @param $groupedProduct
62
- * @param bool $incTax
63
- * @return int
64
- */
65
- public function getGroupedProductPrice($groupedProduct, $incTax = true)
66
- {
67
- $productIds = $groupedProduct->getTypeInstance()->getChildrenIds($groupedProduct->getId());
68
- $price = 0;
69
- foreach ($productIds as $ids) {
70
- foreach ($ids as $id) {
71
- $product = Mage::getModel('catalog/product')->load($id);
72
- if ($incTax) {
73
- $price += Mage::helper('tax')->getPrice($product, $product->getPriceModel()->getFinalPrice(null, $product, true), true);
74
- } else {
75
- $price += $product->getPriceModel()->getFinalPrice(null, $product, true);
76
- }
77
- }
78
- }
79
- return $price;
80
- }
81
- }
82
 
1
+ <?php
2
+
3
+ /**
4
+ * Magpleasure Ltd.
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the EULA
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://www.magpleasure.com/LICENSE.txt
12
+ *
13
+ * @category Magpleasure
14
+ * @package Magpleasure_Richsnippets
15
+ * @copyright Copyright (c) 2014-2015 Magpleasure Ltd. (http://www.magpleasure.com)
16
+ * @license http://www.magpleasure.com/LICENSE.txt
17
+ */
18
+ class Magpleasure_Richsnippets_Helper_Data extends Mage_Core_Helper_Abstract
19
+ {
20
+ /**
21
+ * Value from config path 'richsnippets/group/field'
22
+ *
23
+ * @param $group
24
+ * @param $field
25
+ * @return mixed
26
+ */
27
+ public function getConfigValue($group, $field)
28
+ {
29
+ return Mage::getStoreConfig('richsnippets' . DS . $group . DS . $field);
30
+ }
31
+
32
+ /**
33
+ * Calculate default configurable price for bundle product
34
+ *
35
+ * @param $product
36
+ * @return int
37
+ */
38
+ public function getConfiguredPrice($product)
39
+ {
40
+ if (Mage_Catalog_Model_Product_Type::TYPE_BUNDLE != $product->getTypeId()) {
41
+ return 0;
42
+ }
43
+ $priceModel = $product->getPriceModel();
44
+ $bundleBlock = Mage::getSingleton('core/layout')->createBlock('bundle/catalog_product_view_type_bundle');
45
+ $options = $bundleBlock->setProduct($product)->getOptions();
46
+ $price = 0;
47
+ /** @var Mage_Bundle_Model_Option $option */
48
+ foreach ($options as $option) {
49
+ $selection = $option->getDefaultSelection();
50
+ if (null === $selection) {
51
+ continue;
52
+ }
53
+ $price += $priceModel->getSelectionPreFinalPrice($product, $selection, $selection->getSelectionQty());
54
+ }
55
+ return $price;
56
+ }
57
+
58
+ /**
59
+ * Calculate default price for grouped product
60
+ *
61
+ * @param $groupedProduct
62
+ * @param bool $incTax
63
+ * @return int
64
+ */
65
+ public function getGroupedProductPrice($groupedProduct, $incTax = true)
66
+ {
67
+ $productIds = $groupedProduct->getTypeInstance()->getChildrenIds($groupedProduct->getId());
68
+ $price = 0;
69
+ foreach ($productIds as $ids) {
70
+ foreach ($ids as $id) {
71
+ $product = Mage::getModel('catalog/product')->load($id);
72
+ if ($incTax) {
73
+ $price += Mage::helper('tax')->getPrice($product, $product->getPriceModel()->getFinalPrice(null, $product, true), true);
74
+ } else {
75
+ $price += $product->getPriceModel()->getFinalPrice(null, $product, true);
76
+ }
77
+ }
78
+ }
79
+ return $price;
80
+ }
81
+ }
82
 
app/code/local/Magpleasure/Richsnippets/Model/Observer.php CHANGED
@@ -17,12 +17,32 @@
17
  */
18
  class Magpleasure_Richsnippets_Model_Observer extends Mage_Core_Block_Abstract
19
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  public function productPageBeforeLoad()
21
  {
22
- if (Mage::helper('core')->isModuleOutputEnabled('Magpleasure_Richsnippets')) {
 
 
23
  $node = Mage::getConfig()->getNode('global/blocks/catalog/rewrite');
24
  $richNode = Mage::getConfig()->getNode('global/blocks/catalog/richrewrite/product_view');
25
  $node->appendChild($richNode);
 
 
 
 
26
  }
27
  }
28
  }
17
  */
18
  class Magpleasure_Richsnippets_Model_Observer extends Mage_Core_Block_Abstract
19
  {
20
+ /**
21
+ * Helper
22
+ *
23
+ * @return Magpleasure_Richsnippets_Helper_Data
24
+ */
25
+ protected function _helper()
26
+ {
27
+ return Mage::helper('richsnippets');
28
+ }
29
+
30
+ /**
31
+ * Catalog product view predispatch action
32
+ *
33
+ */
34
  public function productPageBeforeLoad()
35
  {
36
+ if (Mage::helper('core')->isModuleOutputEnabled('Magpleasure_Richsnippets') &&
37
+ $this->_helper()->getConfigValue('general', 'enabled')
38
+ ) {
39
  $node = Mage::getConfig()->getNode('global/blocks/catalog/rewrite');
40
  $richNode = Mage::getConfig()->getNode('global/blocks/catalog/richrewrite/product_view');
41
  $node->appendChild($richNode);
42
+
43
+ $breadcrumbsNode = Mage::getConfig()->getNode('global/blocks/page/rewrite');
44
+ $richBreadcrumsNode = Mage::getConfig()->getNode('global/blocks/page/richrewrite/html_breadcrumbs');
45
+ $breadcrumbsNode->appendChild($richBreadcrumsNode);
46
  }
47
  }
48
  }
app/code/local/Magpleasure/Richsnippets/Model/System/Config/Source/Breadcrumbs.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Magpleasure Ltd.
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the EULA
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://www.magpleasure.com/LICENSE.txt
12
+ *
13
+ * @category Magpleasure
14
+ * @package Magpleasure_Richsnippets
15
+ * @copyright Copyright (c) 2014-2015 Magpleasure Ltd. (http://www.magpleasure.com)
16
+ * @license http://www.magpleasure.com/LICENSE.txt
17
+ */
18
+ class Magpleasure_Richsnippets_Model_System_Config_Source_Breadcrumbs
19
+ {
20
+ const NONE = 0;
21
+ const DATA_VOCABULARY = 1;
22
+ const SCHEMA = 2;
23
+
24
+ /**
25
+ * Helper
26
+ *
27
+ * @return Magpleasure_Richsnippets_Helper_Data
28
+ */
29
+ protected function _helper()
30
+ {
31
+ return Mage::helper('richsnippets');
32
+ }
33
+
34
+ /**
35
+ * Get options in 'key-value' format
36
+ *
37
+ * @return array
38
+ */
39
+ public function toOptionArray()
40
+ {
41
+ return array(
42
+ self::NONE => $this->_helper()->__("Don't Add"),
43
+ self::DATA_VOCABULARY => $this->_helper()->__('Based on data-vocabulary.org'),
44
+ self::SCHEMA => $this->_helper()->__('Based on schema.org')
45
+ );
46
+ }
47
+ }
app/code/local/Magpleasure/Richsnippets/etc/config.xml CHANGED
@@ -1,164 +1,171 @@
1
- <?xml version="1.0"?>
2
- <!--
3
- /**
4
- * Magpleasure Ltd.
5
- *
6
- * NOTICE OF LICENSE
7
- *
8
- * This source file is subject to the EULA
9
- * that is bundled with this package in the file LICENSE.txt.
10
- * It is also available through the world-wide-web at this URL:
11
- * http://www.magpleasure.com/LICENSE.txt
12
- *
13
- * @category Magpleasure
14
- * @package Magpleasure_Richsnippets
15
- * @copyright Copyright (c) 2014-2015 Magpleasure Ltd. (http://www.magpleasure.com)
16
- * @license http://www.magpleasure.com/LICENSE.txt
17
- */
18
- -->
19
- <config>
20
- <modules>
21
- <Magpleasure_Richsnippets>
22
- <version>1.1.1</version>
23
- </Magpleasure_Richsnippets>
24
- </modules>
25
- <frontend>
26
- <routers>
27
- <richsnippets>
28
- <use>standard</use>
29
- <args>
30
- <module>Magpleasure_Richsnippets</module>
31
- <frontName>richsnippets</frontName>
32
- </args>
33
- </richsnippets>
34
- </routers>
35
- <layout>
36
- <updates>
37
- <richsnippets>
38
- <file>richsnippets.xml</file>
39
- </richsnippets>
40
- </updates>
41
- </layout>
42
- <translate>
43
- <modules>
44
- <Magpleasure_Richsnippets>
45
- <files>
46
- <default>Magpleasure_Richsnippets.csv</default>
47
- </files>
48
- </Magpleasure_Richsnippets>
49
- </modules>
50
- </translate>
51
- <events>
52
- <controller_action_predispatch_catalog_product_view>
53
- <observers>
54
- <mp_richsnippets_product_view_predispatch>
55
- <type>singleton</type>
56
- <class>richsnippets/observer</class>
57
- <method>productPageBeforeLoad</method>
58
- </mp_richsnippets_product_view_predispatch>
59
- </observers>
60
- </controller_action_predispatch_catalog_product_view>
61
- </events>
62
- </frontend>
63
- <global>
64
- <models>
65
- <richsnippets>
66
- <class>Magpleasure_Richsnippets_Model</class>
67
- </richsnippets>
68
- </models>
69
- <helpers>
70
- <richsnippets>
71
- <class>Magpleasure_Richsnippets_Helper</class>
72
- </richsnippets>
73
- </helpers>
74
- <blocks>
75
- <richsnippets>
76
- <class>Magpleasure_Richsnippets_Block</class>
77
- </richsnippets>
78
- <catalog>
79
- <rewrite></rewrite>
80
- <richrewrite>
81
- <product_view>Magpleasure_Richsnippets_Block_Catalog_Product_View</product_view>
82
- </richrewrite>
83
- </catalog>
84
- </blocks>
85
- <resources>
86
- <richsnippets_setup>
87
- <setup>
88
- <module>Magpleasure_Ajaxreviews</module>
89
- </setup>
90
- <connection>
91
- <use>core_setup</use>
92
- </connection>
93
- </richsnippets_setup>
94
- <richsnippets_write>
95
- <connection>
96
- <use>core_write</use>
97
- </connection>
98
- </richsnippets_write>
99
- <richsnippets_read>
100
- <connection>
101
- <use>core_read</use>
102
- </connection>
103
- </richsnippets_read>
104
- </resources>
105
- </global>
106
- <admin>
107
- <routers>
108
- <richsnippets_admin>
109
- <use>admin</use>
110
- <args>
111
- <module>Magpleasure_Richsnippets</module>
112
- <frontName>richsnippets_admin</frontName>
113
- </args>
114
- </richsnippets_admin>
115
- </routers>
116
- </admin>
117
- <adminhtml>
118
- <acl>
119
- <resources>
120
- <all>
121
- <title>Allow Everything</title>
122
- </all>
123
- <admin>
124
- <children>
125
- <system>
126
- <children>
127
- <config>
128
- <children>
129
- <richsnippets>
130
- <title>Magpleasure - Rich Snippets</title>
131
- </richsnippets>
132
- </children>
133
- </config>
134
- </children>
135
- </system>
136
- </children>
137
- </admin>
138
- </resources>
139
- </acl>
140
- <layout>
141
- <updates>
142
- <richsnippets>
143
- <file>richsnippets.xml</file>
144
- </richsnippets>
145
- </updates>
146
- </layout>
147
- <translate>
148
- <modules>
149
- <Magpleasure_Richsnippets>
150
- <files>
151
- <default>Magpleasure_Richsnippets.csv</default>
152
- </files>
153
- </Magpleasure_Richsnippets>
154
- </modules>
155
- </translate>
156
- </adminhtml>
157
- <default>
158
- <richsnippets>
159
- <general>
160
- <enabled>1</enabled>
161
- </general>
162
- </richsnippets>
163
- </default>
 
 
 
 
 
 
 
164
  </config>
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * Magpleasure Ltd.
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the EULA
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://www.magpleasure.com/LICENSE.txt
12
+ *
13
+ * @category Magpleasure
14
+ * @package Magpleasure_Richsnippets
15
+ * @copyright Copyright (c) 2014-2015 Magpleasure Ltd. (http://www.magpleasure.com)
16
+ * @license http://www.magpleasure.com/LICENSE.txt
17
+ */
18
+ -->
19
+ <config>
20
+ <modules>
21
+ <Magpleasure_Richsnippets>
22
+ <version>1.2</version>
23
+ </Magpleasure_Richsnippets>
24
+ </modules>
25
+ <frontend>
26
+ <routers>
27
+ <richsnippets>
28
+ <use>standard</use>
29
+ <args>
30
+ <module>Magpleasure_Richsnippets</module>
31
+ <frontName>richsnippets</frontName>
32
+ </args>
33
+ </richsnippets>
34
+ </routers>
35
+ <layout>
36
+ <updates>
37
+ <richsnippets>
38
+ <file>richsnippets.xml</file>
39
+ </richsnippets>
40
+ </updates>
41
+ </layout>
42
+ <translate>
43
+ <modules>
44
+ <Magpleasure_Richsnippets>
45
+ <files>
46
+ <default>Magpleasure_Richsnippets.csv</default>
47
+ </files>
48
+ </Magpleasure_Richsnippets>
49
+ </modules>
50
+ </translate>
51
+ <events>
52
+ <controller_action_predispatch_catalog_product_view>
53
+ <observers>
54
+ <mp_richsnippets_product_view_predispatch>
55
+ <type>singleton</type>
56
+ <class>richsnippets/observer</class>
57
+ <method>productPageBeforeLoad</method>
58
+ </mp_richsnippets_product_view_predispatch>
59
+ </observers>
60
+ </controller_action_predispatch_catalog_product_view>
61
+ </events>
62
+ </frontend>
63
+ <global>
64
+ <models>
65
+ <richsnippets>
66
+ <class>Magpleasure_Richsnippets_Model</class>
67
+ </richsnippets>
68
+ </models>
69
+ <helpers>
70
+ <richsnippets>
71
+ <class>Magpleasure_Richsnippets_Helper</class>
72
+ </richsnippets>
73
+ </helpers>
74
+ <blocks>
75
+ <richsnippets>
76
+ <class>Magpleasure_Richsnippets_Block</class>
77
+ </richsnippets>
78
+ <catalog>
79
+ <rewrite></rewrite>
80
+ <richrewrite>
81
+ <product_view>Magpleasure_Richsnippets_Block_Catalog_Product_View</product_view>
82
+ </richrewrite>
83
+ </catalog>
84
+ <page>
85
+ <rewrite></rewrite>
86
+ <richrewrite>
87
+ <html_breadcrumbs>Magpleasure_Richsnippets_Block_Page_Html_Breadcrumbs</html_breadcrumbs>
88
+ </richrewrite>
89
+ </page>
90
+ </blocks>
91
+ <resources>
92
+ <richsnippets_setup>
93
+ <setup>
94
+ <module>Magpleasure_Ajaxreviews</module>
95
+ </setup>
96
+ <connection>
97
+ <use>core_setup</use>
98
+ </connection>
99
+ </richsnippets_setup>
100
+ <richsnippets_write>
101
+ <connection>
102
+ <use>core_write</use>
103
+ </connection>
104
+ </richsnippets_write>
105
+ <richsnippets_read>
106
+ <connection>
107
+ <use>core_read</use>
108
+ </connection>
109
+ </richsnippets_read>
110
+ </resources>
111
+ </global>
112
+ <admin>
113
+ <routers>
114
+ <richsnippets_admin>
115
+ <use>admin</use>
116
+ <args>
117
+ <module>Magpleasure_Richsnippets</module>
118
+ <frontName>richsnippets_admin</frontName>
119
+ </args>
120
+ </richsnippets_admin>
121
+ </routers>
122
+ </admin>
123
+ <adminhtml>
124
+ <acl>
125
+ <resources>
126
+ <all>
127
+ <title>Allow Everything</title>
128
+ </all>
129
+ <admin>
130
+ <children>
131
+ <system>
132
+ <children>
133
+ <config>
134
+ <children>
135
+ <richsnippets>
136
+ <title>Magpleasure - Rich Snippets</title>
137
+ </richsnippets>
138
+ </children>
139
+ </config>
140
+ </children>
141
+ </system>
142
+ </children>
143
+ </admin>
144
+ </resources>
145
+ </acl>
146
+ <layout>
147
+ <updates>
148
+ <richsnippets>
149
+ <file>richsnippets.xml</file>
150
+ </richsnippets>
151
+ </updates>
152
+ </layout>
153
+ <translate>
154
+ <modules>
155
+ <Magpleasure_Richsnippets>
156
+ <files>
157
+ <default>Magpleasure_Richsnippets.csv</default>
158
+ </files>
159
+ </Magpleasure_Richsnippets>
160
+ </modules>
161
+ </translate>
162
+ </adminhtml>
163
+ <default>
164
+ <richsnippets>
165
+ <general>
166
+ <enabled>1</enabled>
167
+ <breadcrumbs>1</breadcrumbs>
168
+ </general>
169
+ </richsnippets>
170
+ </default>
171
  </config>
app/code/local/Magpleasure/Richsnippets/etc/system.xml CHANGED
@@ -49,6 +49,21 @@
49
  <show_in_website>1</show_in_website>
50
  <show_in_store>1</show_in_store>
51
  </enabled>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  </fields>
53
  </general>
54
  </groups>
49
  <show_in_website>1</show_in_website>
50
  <show_in_store>1</show_in_store>
51
  </enabled>
52
+ <breadcrumbs translate="label">
53
+ <label>Breadcrumbs Markup</label>
54
+ <frontend_type>select</frontend_type>
55
+ <source_model>richsnippets/system_config_source_breadcrumbs</source_model>
56
+ <sort_order>20</sort_order>
57
+ <show_in_default>1</show_in_default>
58
+ <show_in_website>1</show_in_website>
59
+ <show_in_store>1</show_in_store>
60
+ <depends>
61
+ <enabled>1</enabled>
62
+ </depends>
63
+ <comment><![CDATA[Google doesn't support the markup for breadcrumbs based on <a href="http://schema.org" target="_blank">schema.org</a> yet.<br>
64
+ As soon as it starts supporting this markup, it will be more preferred for use.<br>
65
+ Before choosing the "Based on schema.org" option, make sure that Google <a href="https://developers.google.com/structured-data/breadcrumbs" target="_blank">already supports</a> this markup.]]></comment>
66
+ </breadcrumbs>
67
  </fields>
68
  </general>
69
  </groups>
app/design/frontend/base/default/layout/richsnippets.xml CHANGED
@@ -1,28 +1,28 @@
1
- <?xml version="1.0" ?>
2
- <!--
3
- /**
4
- * Magpleasure Ltd.
5
- *
6
- * NOTICE OF LICENSE
7
- *
8
- * This source file is subject to the EULA
9
- * that is bundled with this package in the file LICENSE.txt.
10
- * It is also available through the world-wide-web at this URL:
11
- * http://www.magpleasure.com/LICENSE.txt
12
- *
13
- * @category Magpleasure
14
- * @package Magpleasure_Richsnippets
15
- * @copyright Copyright (c) 2014-2015 Magpleasure Ltd. (http://www.magpleasure.com)
16
- * @license http://www.magpleasure.com/LICENSE.txt
17
- */
18
- -->
19
- <layout version="0.1.0">
20
- <catalog_product_view>
21
- <reference name="product.info">
22
- <block type="richsnippets/catalog_product_view_markup"
23
- template="richsnippets/catalog/product/view/markup.phtml"
24
- name="mp.richsnippets"/>
25
- </reference>
26
- </catalog_product_view>
27
- </layout>
28
 
1
+ <?xml version="1.0" ?>
2
+ <!--
3
+ /**
4
+ * Magpleasure Ltd.
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the EULA
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://www.magpleasure.com/LICENSE.txt
12
+ *
13
+ * @category Magpleasure
14
+ * @package Magpleasure_Richsnippets
15
+ * @copyright Copyright (c) 2014-2015 Magpleasure Ltd. (http://www.magpleasure.com)
16
+ * @license http://www.magpleasure.com/LICENSE.txt
17
+ */
18
+ -->
19
+ <layout version="0.1.0">
20
+ <catalog_product_view>
21
+ <reference name="product.info">
22
+ <block type="richsnippets/catalog_product_view_markup"
23
+ template="richsnippets/catalog/product/view/markup.phtml"
24
+ name="mp.richsnippets"/>
25
+ </reference>
26
+ </catalog_product_view>
27
+ </layout>
28
 
app/design/frontend/base/default/template/richsnippets/catalog/product/view/markup.phtml CHANGED
@@ -20,90 +20,74 @@
20
 
21
  ?>
22
  <?php if ($this->_helper()->getConfigValue('general', 'enabled')): ?>
23
- <?php $_product = $this->getProduct() ?>
24
- <div style="display:none !important">
25
- <?php $_image = Mage::helper('catalog/image')->init($_product, 'small_image')->resize(125, 125); ?>
26
- <meta itemprop="image" content="<?php echo $_image; ?>">
27
- <meta itemprop="name" content="<?php echo $this->escapeHtml($_product->getName()); ?>">
28
- <meta itemprop="description" content="<?php echo $this->escapeHtml($_product->getDescription()); ?>">
29
- <meta itemprop="productID" content="<?php echo $_product->getSku(); ?>">
30
- </div>
31
- <div style="display:none !important"
32
- itemscope
33
- itemprop="offers"
34
- itemtype="http://schema.org/Offer">
35
-
36
- <?php if (Mage_Catalog_Model_Product_Type::TYPE_GROUPED == $_product->getTypeId()): ?>
37
- <meta itemprop="price"
38
- content="<?php echo $this->_helper()->getGroupedProductPrice($_product); ?>">
39
- <?php $_available =
40
- $_product->isAvailable() &&
41
- count($_product->getTypeInstance()->getAssociatedProducts()) > 0
42
- ; ?>
43
- <meta itemprop="availability"
44
- content="<?php echo $_available ? 'http://schema.org/InStock' : 'http://schema.org/OutOfStock'; ?>">
45
- <?php else: ?>
46
- <?php if (Mage_Catalog_Model_Product_Type::TYPE_BUNDLE == $_product->getTypeId()): ?>
47
- <?php $_priceModel = Mage::getModel('bundle/product_price'); ?>
48
- <?php $_configuredPrice = $this->_helper()->getConfiguredPrice($_product); ?>
49
- <?php $_minPrice =
50
- method_exists($_priceModel, 'getTotalPrices') ?
51
  $_priceModel->getTotalPrices($_product, 'min', 1) :
52
- $_priceModel->getPrices($_product, 'min')
53
- ; ?>
54
- <meta
55
- itemprop="price"
56
- content="<?php echo round($_configuredPrice ? $_configuredPrice : $_minPrice, 2); ?>">
57
-
58
- <div style="display:none!important" itemscope itemprop="priceSpecification" itemtype="http://schema.org/PriceSpecification">
59
- <meta
60
- itemprop="priceCurrency"
61
- content="<?php echo Mage::app()->getStore()->getCurrentCurrencyCode(); ?>">
62
- <meta
63
- itemprop="minPrice"
64
- content="<?php echo round($_minPrice, 2); ?>">
65
-
66
- <?php $_maxPrice =
67
- method_exists($_priceModel, 'getTotalPrices') ?
68
  $_priceModel->getTotalPrices($_product, 'max', 1) :
69
- $_priceModel->getPrices($_product, 'max')
70
- ; ?>
71
- <meta
72
- itemprop="maxPrice"
73
- content="<?php echo round($_maxPrice, 2); ?>">
74
- </div>
75
- <?php elseif (
76
- method_exists(new Mage(), 'getEdition') &&
77
- Mage::EDITION_ENTERPRISE == Mage::getEdition() &&
78
- Enterprise_GiftCard_Model_Catalog_Product_Type_Giftcard::TYPE_GIFTCARD == $_product->getTypeId()
79
- ): ?>
80
- <meta
81
- itemprop="price"
82
- content="<?php echo round($_product->getPriceModel()->getMinAmount($_product), 2); ?>">
83
- <?php else: ?>
84
- <meta
85
- itemprop="price"
86
- content="<?php echo round($_product->getPriceModel()->getFinalPrice(null, $_product), 2); ?>">
87
  <?php endif; ?>
88
- <meta
89
- itemprop="availability"
90
- content="<?php echo $_product->isAvailable() ?
91
- 'http://schema.org/InStock' :
92
- 'http://schema.org/OutOfStock'; ?>">
93
- <?php endif; ?>
94
- <meta itemprop="priceCurrency"
95
- content="<?php echo Mage::app()->getStore()->getCurrentCurrencyCode(); ?>">
96
- </div>
97
- <?php if (!Mage::helper('core')->isModuleEnabled('Magpleasure_Ajaxreviews')): ?>
98
- <div style="display: none !important"
99
- itemscope
100
- itemprop="aggregateRating"
101
- itemtype="http://schema.org/AggregateRating">
102
- <meta itemprop="worstRating" content="0">
103
- <meta itemprop="bestRating" content="5">
104
- <meta itemprop="ratingValue" content="<?php echo round($this->getAverageRating() * 5 / 100); ?>">
105
  <meta itemprop="ratingCount" content="<?php echo $this->getReviewsCount(); ?>">
106
- <meta itemprop="reviewCount" content="<?php echo $this->getReviewsCount(); ?>">
107
  </div>
108
- <?php endif; ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
109
  <?php endif; ?>
20
 
21
  ?>
22
  <?php if ($this->_helper()->getConfigValue('general', 'enabled')): ?>
23
+ <?php $_product = $this->getProduct() ?>
24
+ <div style="display:none !important">
25
+ <?php $_image = Mage::helper('catalog/image')->init($_product, 'small_image')->resize(125, 125); ?>
26
+ <meta itemprop="image" content="<?php echo $_image; ?>">
27
+ <meta itemprop="name" content="<?php echo $this->escapeHtml($_product->getName()); ?>">
28
+ <meta itemprop="description" content="<?php echo $this->escapeHtml($_product->getDescription()); ?>">
29
+ <meta itemprop="productID" content="<?php echo $_product->getSku(); ?>">
30
+ </div>
31
+ <div style="display:none !important" itemscope itemprop="offers" itemtype="http://schema.org/Offer">
32
+ <?php if (Mage_Catalog_Model_Product_Type::TYPE_GROUPED == $_product->getTypeId()): ?>
33
+ <meta itemprop="price" content="<?php echo $this->_helper()->getGroupedProductPrice($_product); ?>">
34
+ <?php $_available = $_product->isAvailable() && count($_product->getTypeInstance()->getAssociatedProducts()) > 0; ?>
35
+ <meta itemprop="availability"
36
+ content="<?php echo $_available ? 'http://schema.org/InStock' : 'http://schema.org/OutOfStock'; ?>">
37
+ <?php else: ?>
38
+ <?php if (Mage_Catalog_Model_Product_Type::TYPE_BUNDLE == $_product->getTypeId()): ?>
39
+ <?php $_priceModel = Mage::getModel('bundle/product_price'); ?>
40
+ <?php $_configuredPrice = $this->_helper()->getConfiguredPrice($_product); ?>
41
+ <?php $_minPrice = method_exists($_priceModel, 'getTotalPrices') ?
 
 
 
 
 
 
 
 
 
42
  $_priceModel->getTotalPrices($_product, 'min', 1) :
43
+ $_priceModel->getPrices($_product, 'min'); ?>
44
+ <meta itemprop="price"
45
+ content="<?php echo round($_configuredPrice ? $_configuredPrice : $_minPrice, 2); ?>">
46
+ <div style="display:none!important" itemscope itemprop="priceSpecification"
47
+ itemtype="http://schema.org/PriceSpecification">
48
+ <meta itemprop="priceCurrency"
49
+ content="<?php echo Mage::app()->getStore()->getCurrentCurrencyCode(); ?>">
50
+ <meta itemprop="minPrice" content="<?php echo round($_minPrice, 2); ?>">
51
+ <?php $_maxPrice = method_exists($_priceModel, 'getTotalPrices') ?
 
 
 
 
 
 
 
52
  $_priceModel->getTotalPrices($_product, 'max', 1) :
53
+ $_priceModel->getPrices($_product, 'max'); ?>
54
+ <meta itemprop="maxPrice" content="<?php echo round($_maxPrice, 2); ?>">
55
+ </div>
56
+ <?php elseif (
57
+ method_exists(new Mage(), 'getEdition') &&
58
+ Mage::EDITION_ENTERPRISE == Mage::getEdition() &&
59
+ Enterprise_GiftCard_Model_Catalog_Product_Type_Giftcard::TYPE_GIFTCARD == $_product->getTypeId()
60
+ ): ?>
61
+ <meta itemprop="price"
62
+ content="<?php echo round($_product->getPriceModel()->getMinAmount($_product), 2); ?>">
63
+ <?php else: ?>
64
+ <meta itemprop="price"
65
+ content="<?php echo round($_product->getPriceModel()->getFinalPrice(null, $_product), 2); ?>">
66
+ <?php endif; ?>
67
+ <meta itemprop="availability"
68
+ content="<?php echo $_product->isAvailable() ? 'http://schema.org/InStock' : 'http://schema.org/OutOfStock'; ?>">
 
 
69
  <?php endif; ?>
70
+ <meta itemprop="priceCurrency"
71
+ content="<?php echo Mage::app()->getStore()->getCurrentCurrencyCode(); ?>">
72
+ </div>
73
+ <div style="display: none !important" itemscope itemprop="aggregateRating" itemtype="http://schema.org/AggregateRating">
74
+ <meta itemprop="ratingValue" content="<?php echo round($this->getAverageRating() * 5 / 100, 1); ?>">
 
 
 
 
 
 
 
 
 
 
 
 
75
  <meta itemprop="ratingCount" content="<?php echo $this->getReviewsCount(); ?>">
 
76
  </div>
77
+ <div style="display: none !important">
78
+ <?php foreach ($this->getReviews()->addRateVotes() as $_review): ?>
79
+ <?php if ($_rating = $this->getReviewRating($_review)): ?>
80
+ <div itemscope itemprop="review" itemtype="http://schema.org/Review">
81
+ <meta itemprop="about" content="<?php echo $this->getProduct()->getName(); ?>">
82
+ <meta itemprop="description" content="<?php echo $this->escapeHtml($_review->getTitle()) ?>">
83
+ <meta itemprop="reviewBody" content="<?php echo $this->escapeHtml($_review->getDetail()); ?>">
84
+ <meta itemprop="author" content="<?php echo $this->escapeHtml($_review->getNickname()); ?>">
85
+ <meta itemprop="datePublished" content="<?php echo date('Y-m-d', strtotime($_review->getCreatedAt())) ?>">
86
+ <div style="display: none !important" itemscope itemprop="reviewRating" itemtype="http://schema.org/Rating">
87
+ <meta itemprop="ratingValue" content="<?php echo round($_rating * 5 / 100, 1); ?>">
88
+ </div>
89
+ </div>
90
+ <?php endif; ?>
91
+ <?php endforeach ?>
92
+ </div>
93
  <?php endif; ?>
app/etc/modules/Magpleasure_Richsnippets.xml CHANGED
@@ -1,26 +1,26 @@
1
- <?xml version="1.0"?>
2
- <!--
3
- /**
4
- * Magpleasure Ltd.
5
- *
6
- * NOTICE OF LICENSE
7
- *
8
- * This source file is subject to the EULA
9
- * that is bundled with this package in the file LICENSE.txt.
10
- * It is also available through the world-wide-web at this URL:
11
- * http://www.magpleasure.com/LICENSE.txt
12
- *
13
- * @category Magpleasure
14
- * @package Magpleasure_Richsnippets
15
- * @copyright Copyright (c) 2014-2015 Magpleasure Ltd. (http://www.magpleasure.com)
16
- * @license http://www.magpleasure.com/LICENSE.txt
17
- */
18
- -->
19
- <config>
20
- <modules>
21
- <Magpleasure_Richsnippets>
22
- <active>true</active>
23
- <codePool>local</codePool>
24
- </Magpleasure_Richsnippets>
25
- </modules>
26
  </config>
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * Magpleasure Ltd.
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the EULA
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://www.magpleasure.com/LICENSE.txt
12
+ *
13
+ * @category Magpleasure
14
+ * @package Magpleasure_Richsnippets
15
+ * @copyright Copyright (c) 2014-2015 Magpleasure Ltd. (http://www.magpleasure.com)
16
+ * @license http://www.magpleasure.com/LICENSE.txt
17
+ */
18
+ -->
19
+ <config>
20
+ <modules>
21
+ <Magpleasure_Richsnippets>
22
+ <active>true</active>
23
+ <codePool>local</codePool>
24
+ </Magpleasure_Richsnippets>
25
+ </modules>
26
  </config>
app/locale/en_US/Magpleasure_Richsnippets.csv CHANGED
@@ -1,4 +1,4 @@
1
- "Enabled","Enabled"
2
- "General Settings","General Settings"
3
- "MagPleasure Extensions","MagPleasure Extensions"
4
- "Rich Snippets","Rich Snippets"
1
+ "Enabled","Enabled"
2
+ "General Settings","General Settings"
3
+ "MagPleasure Extensions","MagPleasure Extensions"
4
+ "Rich Snippets","Rich Snippets"
package.xml CHANGED
@@ -1,20 +1,20 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>rich_snippets</name>
4
- <version>1.1.1</version>
5
  <stability>stable</stability>
6
  <license uri="http://opensource.org/licenses/OSL-3.0">OSL-3.0</license>
7
  <channel>community</channel>
8
  <extends/>
9
- <summary>Rich Snippets will allow you to integrate the information about product price, description, availability, currency etc. into search results.</summary>
10
- <description>The extension is very easy-to use as there is only one option in the backend. You don't need to do markups for Google by yourself: the extension will do it automatically.&#xD;
11
- Without Rich Snippets, the AJAX Reviews extension will not display product rating in Google search results.</description>
12
- <notes>* Worst rating isn't defined in markup.&#xD;
13
  </notes>
14
  <authors><author><name>MagPleasure Ltd.</name><user>Magpleasure</user><email>support@magpleasure.com</email></author></authors>
15
- <date>2015-04-14</date>
16
- <time>08:22:00</time>
17
- <contents><target name="magelocal"><dir name="Magpleasure"><dir name="Richsnippets"><dir><dir name="Block"><dir name="Catalog"><dir name="Product"><dir name="View"><file name="Markup.php" hash="2b279af4b23074ec88c0ec2bbafd1b8d"/></dir><file name="View.php" hash="d06b18f25cb36eb63afa162fdf00ae95"/></dir></dir></dir><dir name="Helper"><file name="Data.php" hash="d019b836cb3f8ee5e3a0b85ab1edc508"/></dir><dir name="Model"><file name="Observer.php" hash="d7dc1c56a095088374ef9db6235d7bcb"/></dir><dir name="etc"><file name="config.xml" hash="70eb5db433bb63887c2cf2d90df5b42b"/><file name="system.xml" hash="465494e974bf92706e64f25a4df99ec5"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="richsnippets.xml" hash="91d53350518069c549a10942b26ba627"/></dir><dir name="template"><dir name="richsnippets"><dir><dir name="catalog"><dir name="product"><dir name="view"><file name="markup.phtml" hash="d157f8898d73cfff270af06fc839fab5"/></dir></dir></dir></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Magpleasure_Richsnippets.xml" hash="dc5195d4636c51fe9081c44f3a29bb39"/></dir></target><target name="magelocale"><dir name="en_US"><file name="Magpleasure_Richsnippets.csv" hash="c356d86fd9d1db251c8df93d5fd27ebc"/></dir></target></contents>
18
  <compatible/>
19
  <dependencies><required><php><min>5.2.0</min><max>6.0.0</max></php><package><name></name><channel>connect.magentocommerce.com/core</channel><min></min><max></max></package></required></dependencies>
20
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>rich_snippets</name>
4
+ <version>1.2.0</version>
5
  <stability>stable</stability>
6
  <license uri="http://opensource.org/licenses/OSL-3.0">OSL-3.0</license>
7
  <channel>community</channel>
8
  <extends/>
9
+ <summary>Display rich snippets in Google search results to expand product description and increase conversion rate.</summary>
10
+ <description>The extension is very easy-to use as there is only two options in the backend. You don't need to create markups for Google by yourself: the extension will make them and breadcrumbs automatically.</description>
11
+ <notes> + Breadcrumbs markup&#xD;
12
+ + Markup for aggregate product rating and each product review&#xD;
13
  </notes>
14
  <authors><author><name>MagPleasure Ltd.</name><user>Magpleasure</user><email>support@magpleasure.com</email></author></authors>
15
+ <date>2015-07-02</date>
16
+ <time>14:16:43</time>
17
+ <contents><target name="magelocal"><dir name="Magpleasure"><dir name="Richsnippets"><dir><dir name="Block"><dir name="Catalog"><dir name="Product"><dir name="View"><file name="Markup.php" hash="16e2d498ce537abd230637e24db387b0"/></dir><file name="View.php" hash="5499b89d294c9a7b9566360c6f9d4dae"/></dir></dir><dir name="Page"><dir name="Html"><file name="Breadcrumbs.php" hash="88c090195a08e64f5d2eb7bbb3684ca6"/></dir></dir></dir><dir name="Helper"><file name="Data.php" hash="0d0393d3fda0d4454267f761cee97838"/></dir><dir name="Model"><file name="Observer.php" hash="9baaff9e362b178ae5d2d93bccc6e008"/><dir name="System"><dir name="Config"><dir name="Source"><file name="Breadcrumbs.php" hash="06b1e35032442a98ace94449c20cd52e"/></dir></dir></dir></dir><dir name="etc"><file name="config.xml" hash="456e5e4b08716472993afa9f4d5fab0b"/><file name="system.xml" hash="c6a8f67bbc7bdda3c9620128eb768865"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="richsnippets.xml" hash="ecc7cee99e160a78343234c771aa236a"/></dir><dir name="template"><dir name="richsnippets"><dir><dir name="catalog"><dir name="product"><dir name="view"><file name="markup.phtml" hash="96658813b9a66815eb6f2904e58f352a"/></dir></dir></dir></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Magpleasure_Richsnippets.xml" hash="78027bb5afff660ebcebe13df2391faa"/></dir></target><target name="magelocale"><dir name="en_US"><file name="Magpleasure_Richsnippets.csv" hash="c9177f76dbd5825e4ce1f4050282cd9b"/></dir></target></contents>
18
  <compatible/>
19
  <dependencies><required><php><min>5.2.0</min><max>6.0.0</max></php><package><name></name><channel>connect.magentocommerce.com/core</channel><min></min><max></max></package></required></dependencies>
20
  </package>