Version Notes
View release notes at https://github.com/vovayatsyuk/magento-alsoviewed/releases/tag/1.3.0
- Security fix to _isAllowed method (strtolower)
- Removed non-working "Save" button from relations page
- Search crawlers and bots are no longer affects product relations
- Added ability to ignore specific IP addresses
- Added ability to create new and manage existing relations from backend `Product Edit` page
Download this release
Release Info
| Developer | Vova Yatsyuk |
| Extension | alsoviewed |
| Version | 1.3.0 |
| Comparing to | |
| See all releases | |
Code changes from version 1.2.0 to 1.3.0
- app/code/community/Yavva/Alsoviewed/Block/Adminhtml/Catalog/Product/Edit/Tab/Relations.php +220 -0
- app/code/community/Yavva/Alsoviewed/Block/Adminhtml/Relations.php +0 -7
- app/code/community/Yavva/Alsoviewed/Helper/Data.php +38 -0
- app/code/community/Yavva/Alsoviewed/Model/Observer.php +69 -0
- app/code/community/Yavva/Alsoviewed/Model/Resource/Relation.php +30 -0
- app/code/community/Yavva/Alsoviewed/controllers/Adminhtml/Alsoviewed/LogController.php +2 -1
- app/code/community/Yavva/Alsoviewed/controllers/Adminhtml/Alsoviewed/ProductController.php +24 -0
- app/code/community/Yavva/Alsoviewed/controllers/Adminhtml/Alsoviewed/RelationsController.php +4 -3
- app/code/community/Yavva/Alsoviewed/etc/config.xml +25 -1
- app/code/community/Yavva/Alsoviewed/etc/system.xml +45 -0
- app/design/adminhtml/base/default/layout/yavva/alsoviewed.xml +38 -0
- app/design/frontend/base/default/layout/yavva/alsoviewed.xml +0 -33
- app/locale/en_US/Yavva_Alsoviewed.csv +5 -0
- package.xml +23 -27
- skin/frontend/base/default/yavva/alsoviewed/.DS_Store +0 -0
app/code/community/Yavva/Alsoviewed/Block/Adminhtml/Catalog/Product/Edit/Tab/Relations.php
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
|
| 3 |
+
class Yavva_Alsoviewed_Block_Adminhtml_Catalog_Product_Edit_Tab_Relations extends Mage_Adminhtml_Block_Widget_Grid
|
| 4 |
+
implements Mage_Adminhtml_Block_Widget_Tab_Interface
|
| 5 |
+
{
|
| 6 |
+
public function __construct()
|
| 7 |
+
{
|
| 8 |
+
parent::__construct();
|
| 9 |
+
$this->setId('alsoviewed_product_grid');
|
| 10 |
+
$this->setDefaultSort('weight');
|
| 11 |
+
$this->setSkipGenerateContent(true);
|
| 12 |
+
$this->setUseAjax(true);
|
| 13 |
+
if ($this->_getProduct()->getId()) {
|
| 14 |
+
$this->setDefaultFilter(array('in_products' => 1));
|
| 15 |
+
}
|
| 16 |
+
|
| 17 |
+
$this->setAdditionalJavaScript("
|
| 18 |
+
// added click on selectbox support
|
| 19 |
+
serializerController.prototype.rowClick = serializerController.prototype.rowClick.wrap(function(o, grid, event) {
|
| 20 |
+
var tagName = Event.element(event).tagName
|
| 21 |
+
isSelect = (tagName == 'SELECT' || tagName == 'OPTION');
|
| 22 |
+
|
| 23 |
+
if (!isSelect) {
|
| 24 |
+
o(grid, event);
|
| 25 |
+
}
|
| 26 |
+
});
|
| 27 |
+
");
|
| 28 |
+
}
|
| 29 |
+
|
| 30 |
+
protected function _addColumnFilterToCollection($column)
|
| 31 |
+
{
|
| 32 |
+
if ($column->getId() == 'in_products') {
|
| 33 |
+
$value = $column->getFilter()->getValue();
|
| 34 |
+
if ($value == 1) {
|
| 35 |
+
$this->getCollection()->addFieldToFilter('alsoviewed_relation', array('notnull' => true));
|
| 36 |
+
} elseif ($value == 0) {
|
| 37 |
+
$this->getCollection()->addFieldToFilter('alsoviewed_relation', array('null' => true));
|
| 38 |
+
}
|
| 39 |
+
} else {
|
| 40 |
+
parent::_addColumnFilterToCollection($column);
|
| 41 |
+
}
|
| 42 |
+
|
| 43 |
+
return $this;
|
| 44 |
+
}
|
| 45 |
+
|
| 46 |
+
protected function _prepareCollection()
|
| 47 |
+
{
|
| 48 |
+
$collection = Mage::getResourceModel('catalog/product_collection');
|
| 49 |
+
$collection->addAttributeToSelect('*');
|
| 50 |
+
$collection->joinTable(
|
| 51 |
+
array('alsoviewed' => 'alsoviewed/relation'),
|
| 52 |
+
'related_product_id=entity_id',
|
| 53 |
+
array(
|
| 54 |
+
'alsoviewed_relation' => 'relation_id',
|
| 55 |
+
'alsoviewed_weight' => 'weight',
|
| 56 |
+
'alsoviewed_position' => 'position',
|
| 57 |
+
'alsoviewed_status' => 'status'
|
| 58 |
+
),
|
| 59 |
+
array(
|
| 60 |
+
'product_id' => $this->_getProduct()->getId()
|
| 61 |
+
),
|
| 62 |
+
'left'
|
| 63 |
+
);
|
| 64 |
+
|
| 65 |
+
if ($this->getIsReadonly() === true) {
|
| 66 |
+
$collection->addFieldToFilter('entity_id', array('in' => $this->_getSelectedProducts()));
|
| 67 |
+
}
|
| 68 |
+
$this->setCollection($collection);
|
| 69 |
+
return parent::_prepareCollection();
|
| 70 |
+
}
|
| 71 |
+
|
| 72 |
+
protected function _prepareColumns()
|
| 73 |
+
{
|
| 74 |
+
$this->addColumn('in_products', array(
|
| 75 |
+
'header_css_class' => 'a-center',
|
| 76 |
+
'type' => 'checkbox',
|
| 77 |
+
'name' => 'in_products',
|
| 78 |
+
'values' => $this->_getSelectedProducts(),
|
| 79 |
+
'align' => 'center',
|
| 80 |
+
'index' => 'entity_id'
|
| 81 |
+
));
|
| 82 |
+
|
| 83 |
+
$this->addColumn('entity_id', array(
|
| 84 |
+
'header' => Mage::helper('catalog')->__('ID'),
|
| 85 |
+
'sortable' => true,
|
| 86 |
+
'width' => '60px',
|
| 87 |
+
'index' => 'entity_id'
|
| 88 |
+
));
|
| 89 |
+
$this->addColumn('name', array(
|
| 90 |
+
'header' => Mage::helper('catalog')->__('Name'),
|
| 91 |
+
'index' => 'name'
|
| 92 |
+
));
|
| 93 |
+
$this->addColumn('sku', array(
|
| 94 |
+
'header' => Mage::helper('catalog')->__('SKU'),
|
| 95 |
+
'width' => '80px',
|
| 96 |
+
'index' => 'sku'
|
| 97 |
+
));
|
| 98 |
+
$this->addColumn('price', array(
|
| 99 |
+
'header' => Mage::helper('catalog')->__('Price'),
|
| 100 |
+
'type' => 'currency',
|
| 101 |
+
'currency_code' => (string) Mage::getStoreConfig(Mage_Directory_Model_Currency::XML_PATH_CURRENCY_BASE),
|
| 102 |
+
'index' => 'price'
|
| 103 |
+
));
|
| 104 |
+
|
| 105 |
+
$this->addColumn('weight', array(
|
| 106 |
+
'header' => Mage::helper('sales')->__('Weight'),
|
| 107 |
+
'name' => 'weight',
|
| 108 |
+
'type' => 'number',
|
| 109 |
+
'validate_class' => 'validate-number',
|
| 110 |
+
'index' => 'alsoviewed_weight',
|
| 111 |
+
'width' => '1',
|
| 112 |
+
'editable' => true,
|
| 113 |
+
'edit_only' => !$this->_getProduct()->getId()
|
| 114 |
+
));
|
| 115 |
+
|
| 116 |
+
$this->addColumn('position', array(
|
| 117 |
+
'header' => Mage::helper('catalog')->__('Position'),
|
| 118 |
+
'name' => 'position',
|
| 119 |
+
'type' => 'number',
|
| 120 |
+
'validate_class' => 'validate-number',
|
| 121 |
+
'index' => 'alsoviewed_position',
|
| 122 |
+
'width' => '1',
|
| 123 |
+
'editable' => true,
|
| 124 |
+
'edit_only' => !$this->_getProduct()->getId()
|
| 125 |
+
));
|
| 126 |
+
|
| 127 |
+
$this->addColumn('status', array(
|
| 128 |
+
'header' => Mage::helper('catalog')->__('Status'),
|
| 129 |
+
'name' => 'status',
|
| 130 |
+
'type' => 'select',
|
| 131 |
+
'options' => array(
|
| 132 |
+
1 => Mage::helper('catalog')->__('Enabled'),
|
| 133 |
+
0 => Mage::helper('catalog')->__('Disabled')
|
| 134 |
+
),
|
| 135 |
+
'index' => 'alsoviewed_status',
|
| 136 |
+
'width' => '1',
|
| 137 |
+
'editable' => true,
|
| 138 |
+
'edit_only' => !$this->_getProduct()->getId()
|
| 139 |
+
));
|
| 140 |
+
|
| 141 |
+
return parent::_prepareColumns();
|
| 142 |
+
}
|
| 143 |
+
|
| 144 |
+
/**
|
| 145 |
+
* @return Mage_Catalog_Model_Product
|
| 146 |
+
*/
|
| 147 |
+
protected function _getProduct()
|
| 148 |
+
{
|
| 149 |
+
return Mage::registry('current_product');
|
| 150 |
+
}
|
| 151 |
+
|
| 152 |
+
public function getGridUrl()
|
| 153 |
+
{
|
| 154 |
+
return $this->getUrl('adminhtml/alsoviewed_product/relationsgrid', array('_current'=>true));
|
| 155 |
+
}
|
| 156 |
+
|
| 157 |
+
public function getTabUrl()
|
| 158 |
+
{
|
| 159 |
+
return $this->getUrl('adminhtml/alsoviewed_product/relations', array('_current'=>true));
|
| 160 |
+
}
|
| 161 |
+
|
| 162 |
+
/**
|
| 163 |
+
* Retrieve selected alsoviewed products
|
| 164 |
+
*
|
| 165 |
+
* @return array
|
| 166 |
+
*/
|
| 167 |
+
protected function _getSelectedProducts()
|
| 168 |
+
{
|
| 169 |
+
$products = $this->getProductsAlsoviewed();
|
| 170 |
+
if (!is_array($products)) {
|
| 171 |
+
$products = array_keys($this->getSelectedAlsoviewedProducts());
|
| 172 |
+
}
|
| 173 |
+
return $products;
|
| 174 |
+
}
|
| 175 |
+
|
| 176 |
+
/**
|
| 177 |
+
* Retrieve alsoviewed products
|
| 178 |
+
*
|
| 179 |
+
* @return array
|
| 180 |
+
*/
|
| 181 |
+
public function getSelectedAlsoviewedProducts()
|
| 182 |
+
{
|
| 183 |
+
$relations = Mage::getResourceModel('alsoviewed/relation_collection')
|
| 184 |
+
->addFieldToFilter('product_id', $this->_getProduct()->getId());
|
| 185 |
+
$products = array();
|
| 186 |
+
foreach ($relations as $relation) {
|
| 187 |
+
$products[$relation->getRelatedProductId()] = array(
|
| 188 |
+
'weight' => $relation->getWeight(),
|
| 189 |
+
'position' => $relation->getPosition(),
|
| 190 |
+
'status' => $relation->getStatus()
|
| 191 |
+
);
|
| 192 |
+
}
|
| 193 |
+
return $products;
|
| 194 |
+
}
|
| 195 |
+
|
| 196 |
+
public function getTabClass()
|
| 197 |
+
{
|
| 198 |
+
return 'ajax';
|
| 199 |
+
}
|
| 200 |
+
|
| 201 |
+
public function getTabLabel()
|
| 202 |
+
{
|
| 203 |
+
return Mage::helper('alsoviewed')->__('Also Viewed Products');
|
| 204 |
+
}
|
| 205 |
+
|
| 206 |
+
public function getTabTitle()
|
| 207 |
+
{
|
| 208 |
+
return Mage::helper('alsoviewed')->__('Also Viewed Products');
|
| 209 |
+
}
|
| 210 |
+
|
| 211 |
+
public function canShowTab()
|
| 212 |
+
{
|
| 213 |
+
return true;
|
| 214 |
+
}
|
| 215 |
+
|
| 216 |
+
public function isHidden()
|
| 217 |
+
{
|
| 218 |
+
return false;
|
| 219 |
+
}
|
| 220 |
+
}
|
app/code/community/Yavva/Alsoviewed/Block/Adminhtml/Relations.php
CHANGED
|
@@ -11,13 +11,6 @@ class Yavva_Alsoviewed_Block_Adminhtml_Relations extends Mage_Adminhtml_Block_Wi
|
|
| 11 |
parent::__construct();
|
| 12 |
|
| 13 |
$this->_removeButton('add');
|
| 14 |
-
|
| 15 |
-
if ($this->_isAllowedAction('save')) {
|
| 16 |
-
$this->_addButton('save', array(
|
| 17 |
-
'label' => Mage::helper('alsoviewed')->__('Save'),
|
| 18 |
-
'onclick' => 'setLocation(\'' . $this->getUrl('*/*/saveMultiple') .'\')'
|
| 19 |
-
));
|
| 20 |
-
}
|
| 21 |
}
|
| 22 |
|
| 23 |
/**
|
| 11 |
parent::__construct();
|
| 12 |
|
| 13 |
$this->_removeButton('add');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 14 |
}
|
| 15 |
|
| 16 |
/**
|
app/code/community/Yavva/Alsoviewed/Helper/Data.php
CHANGED
|
@@ -2,5 +2,43 @@
|
|
| 2 |
|
| 3 |
class Yavva_Alsoviewed_Helper_Data extends Mage_Core_Helper_Abstract
|
| 4 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 6 |
}
|
| 2 |
|
| 3 |
class Yavva_Alsoviewed_Helper_Data extends Mage_Core_Helper_Abstract
|
| 4 |
{
|
| 5 |
+
public function isIpAddressIgnored($ip = null)
|
| 6 |
+
{
|
| 7 |
+
if (!Mage::getStoreConfig('alsoviewed/log/ignore_ip_address')) {
|
| 8 |
+
return false;
|
| 9 |
+
}
|
| 10 |
+
if (!$ignoredIps = Mage::getStoreConfig('alsoviewed/log/ignored_ip_address')) {
|
| 11 |
+
return false;
|
| 12 |
+
}
|
| 13 |
|
| 14 |
+
if (null === $ip) {
|
| 15 |
+
$ip = Mage::helper('core/http')->getRemoteAddr();
|
| 16 |
+
if (!$ip) {
|
| 17 |
+
return false;
|
| 18 |
+
}
|
| 19 |
+
}
|
| 20 |
+
|
| 21 |
+
$ignoredIps = explode(',', $ignoredIps);
|
| 22 |
+
return in_array($ip, $ignoredIps);
|
| 23 |
+
}
|
| 24 |
+
|
| 25 |
+
public function isUserAgentIgnored($userAgent = null)
|
| 26 |
+
{
|
| 27 |
+
if (!Mage::getStoreConfig('alsoviewed/log/ignore_user_agent')) {
|
| 28 |
+
return false;
|
| 29 |
+
}
|
| 30 |
+
if (!$ignoredUserArgents = Mage::getStoreConfig('alsoviewed/log/ignored_user_agent')) {
|
| 31 |
+
return false;
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
if (null === $userAgent) {
|
| 35 |
+
$userAgent = Mage::helper('core/http')->getHttpUserAgent();
|
| 36 |
+
if (!$userAgent) {
|
| 37 |
+
return false;
|
| 38 |
+
}
|
| 39 |
+
}
|
| 40 |
+
|
| 41 |
+
$regexp = '/' . trim($ignoredUserArgents, '/') . '/';
|
| 42 |
+
return @preg_match($regexp, $userAgent);
|
| 43 |
+
}
|
| 44 |
}
|
app/code/community/Yavva/Alsoviewed/Model/Observer.php
CHANGED
|
@@ -14,6 +14,11 @@ class Yavva_Alsoviewed_Model_Observer
|
|
| 14 |
*/
|
| 15 |
public function catalogProductView(Varien_Event_Observer $observer)
|
| 16 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
$session = $this->_getSession();
|
| 18 |
$productId = $observer->getControllerAction()->getRequest()->getParam('id');
|
| 19 |
$viewedIds = $session->getViewedProductIds();
|
|
@@ -52,4 +57,68 @@ class Yavva_Alsoviewed_Model_Observer
|
|
| 52 |
}
|
| 53 |
}
|
| 54 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 55 |
}
|
| 14 |
*/
|
| 15 |
public function catalogProductView(Varien_Event_Observer $observer)
|
| 16 |
{
|
| 17 |
+
$helper = Mage::helper('alsoviewed');
|
| 18 |
+
if ($helper->isIpAddressIgnored() || $helper->isUserAgentIgnored()) {
|
| 19 |
+
return;
|
| 20 |
+
}
|
| 21 |
+
|
| 22 |
$session = $this->_getSession();
|
| 23 |
$productId = $observer->getControllerAction()->getRequest()->getParam('id');
|
| 24 |
$viewedIds = $session->getViewedProductIds();
|
| 57 |
}
|
| 58 |
}
|
| 59 |
}
|
| 60 |
+
|
| 61 |
+
public function prepareProductSave($observer)
|
| 62 |
+
{
|
| 63 |
+
$request = $observer->getEvent()->getRequest();
|
| 64 |
+
$product = $observer->getEvent()->getProduct();
|
| 65 |
+
|
| 66 |
+
if ($alsoviewed = $request->getPost('alsoviewed')) {
|
| 67 |
+
$relations = Mage::helper('adminhtml/js')->decodeGridSerializedInput($alsoviewed['relations']);
|
| 68 |
+
foreach ($relations as $key => $relation) {
|
| 69 |
+
if (!is_numeric($relation['weight'])) {
|
| 70 |
+
$relations[$key]['weight'] = 1;
|
| 71 |
+
}
|
| 72 |
+
if (!is_numeric($relation['position'])) {
|
| 73 |
+
$relations[$key]['position'] = 50;
|
| 74 |
+
}
|
| 75 |
+
}
|
| 76 |
+
$product->setAlsoviewedData($relations);
|
| 77 |
+
}
|
| 78 |
+
}
|
| 79 |
+
|
| 80 |
+
public function catalogProductSaveAfter($observer)
|
| 81 |
+
{
|
| 82 |
+
$product = $observer->getEvent()->getProduct();
|
| 83 |
+
$relations = $product->getAlsoviewedData();
|
| 84 |
+
if (!is_array($relations)) {
|
| 85 |
+
return;
|
| 86 |
+
}
|
| 87 |
+
|
| 88 |
+
$collection = Mage::getResourceModel('alsoviewed/relation_collection')
|
| 89 |
+
->addFieldToFilter('product_id', $product->getId());
|
| 90 |
+
|
| 91 |
+
if (!$relations && !$collection->getSize()) {
|
| 92 |
+
return;
|
| 93 |
+
}
|
| 94 |
+
|
| 95 |
+
$model = Mage::getResourceModel('alsoviewed/relation');
|
| 96 |
+
|
| 97 |
+
// remove relations
|
| 98 |
+
if (!$relations) {
|
| 99 |
+
$relationsToRemove = $collection->getAllIds();
|
| 100 |
+
} else {
|
| 101 |
+
$relationsToRemove = array();
|
| 102 |
+
$relatedProductIds = array_keys($relations);
|
| 103 |
+
foreach ($collection as $relation) {
|
| 104 |
+
if (!in_array($relation->getRelatedProductId(), $relatedProductIds)) {
|
| 105 |
+
$relationsToRemove[] = $relation->getId();
|
| 106 |
+
}
|
| 107 |
+
}
|
| 108 |
+
}
|
| 109 |
+
if ($relationsToRemove) {
|
| 110 |
+
$model->deleteMultiple($relationsToRemove);
|
| 111 |
+
}
|
| 112 |
+
|
| 113 |
+
if (!$relations) {
|
| 114 |
+
return;
|
| 115 |
+
}
|
| 116 |
+
|
| 117 |
+
// update relations
|
| 118 |
+
foreach ($relations as $relatedProductId => $values) {
|
| 119 |
+
$relations[$relatedProductId]['product_id'] = $product->getId();
|
| 120 |
+
$relations[$relatedProductId]['related_product_id'] = $relatedProductId;
|
| 121 |
+
}
|
| 122 |
+
$model->saveRelations($relations, true);
|
| 123 |
+
}
|
| 124 |
}
|
app/code/community/Yavva/Alsoviewed/Model/Resource/Relation.php
CHANGED
|
@@ -43,6 +43,36 @@ class Yavva_Alsoviewed_Model_Resource_Relation extends Mage_Core_Model_Resource_
|
|
| 43 |
));
|
| 44 |
}
|
| 45 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
/**
|
| 47 |
* Update multiple relations at once
|
| 48 |
*
|
| 43 |
));
|
| 44 |
}
|
| 45 |
|
| 46 |
+
/**
|
| 47 |
+
* Insert new and update existing relations according to $relationsData
|
| 48 |
+
* Unlike updateRelations, this method does not respect previous value
|
| 49 |
+
* of the weight column of the duplicate relation.
|
| 50 |
+
*
|
| 51 |
+
* @param array $relationsData
|
| 52 |
+
* @param boolean $bidirectional
|
| 53 |
+
* @return int Number of affected rows
|
| 54 |
+
*/
|
| 55 |
+
public function saveRelations($relationsData, $bidirectional = true)
|
| 56 |
+
{
|
| 57 |
+
$data = $relationsData;
|
| 58 |
+
|
| 59 |
+
if ($bidirectional) {
|
| 60 |
+
foreach ($relationsData as $relation) {
|
| 61 |
+
$_tmp = $relation;
|
| 62 |
+
$_tmp['product_id'] = $relation['related_product_id'];
|
| 63 |
+
$_tmp['related_product_id'] = $relation['product_id'];
|
| 64 |
+
$data[] = $_tmp;
|
| 65 |
+
}
|
| 66 |
+
}
|
| 67 |
+
|
| 68 |
+
$adapter = $this->_getWriteAdapter();
|
| 69 |
+
return $adapter->insertOnDuplicate($this->getMainTable(), $data, array(
|
| 70 |
+
'weight' => new Zend_Db_Expr('VALUES(weight)'),
|
| 71 |
+
'position' => new Zend_Db_Expr('VALUES(position)'),
|
| 72 |
+
'status' => new Zend_Db_Expr('VALUES(status)')
|
| 73 |
+
));
|
| 74 |
+
}
|
| 75 |
+
|
| 76 |
/**
|
| 77 |
* Update multiple relations at once
|
| 78 |
*
|
app/code/community/Yavva/Alsoviewed/controllers/Adminhtml/Alsoviewed/LogController.php
CHANGED
|
@@ -49,7 +49,8 @@ class Yavva_Alsoviewed_Adminhtml_Alsoviewed_LogController extends Mage_Adminhtml
|
|
| 49 |
*/
|
| 50 |
protected function _isAllowed()
|
| 51 |
{
|
| 52 |
-
|
|
|
|
| 53 |
case 'process':
|
| 54 |
return Mage::getSingleton('admin/session')->isAllowed('yavva/alsoviewed/alsoviewed_log/process');
|
| 55 |
break;
|
| 49 |
*/
|
| 50 |
protected function _isAllowed()
|
| 51 |
{
|
| 52 |
+
$action = strtolower($this->getRequest()->getActionName());
|
| 53 |
+
switch ($action) {
|
| 54 |
case 'process':
|
| 55 |
return Mage::getSingleton('admin/session')->isAllowed('yavva/alsoviewed/alsoviewed_log/process');
|
| 56 |
break;
|
app/code/community/Yavva/Alsoviewed/controllers/Adminhtml/Alsoviewed/ProductController.php
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
|
| 3 |
+
require_once 'Mage/Adminhtml/controllers/Catalog/ProductController.php';
|
| 4 |
+
|
| 5 |
+
class Yavva_Alsoviewed_Adminhtml_Alsoviewed_ProductController extends Mage_Adminhtml_Catalog_ProductController
|
| 6 |
+
{
|
| 7 |
+
public function relationsAction()
|
| 8 |
+
{
|
| 9 |
+
$this->_initProduct();
|
| 10 |
+
$this->loadLayout();
|
| 11 |
+
$this->getLayout()->getBlock('catalog.product.edit.tab.alsoviewed')
|
| 12 |
+
->setProductsAlsoviewed($this->getRequest()->getPost('products_alsoviewed', null));
|
| 13 |
+
$this->renderLayout();
|
| 14 |
+
}
|
| 15 |
+
|
| 16 |
+
public function relationsGridAction()
|
| 17 |
+
{
|
| 18 |
+
$this->_initProduct();
|
| 19 |
+
$this->loadLayout();
|
| 20 |
+
$this->getLayout()->getBlock('catalog.product.edit.tab.alsoviewed')
|
| 21 |
+
->setProductsAlsoviewed($this->getRequest()->getPost('products_alsoviewed', null));
|
| 22 |
+
$this->renderLayout();
|
| 23 |
+
}
|
| 24 |
+
}
|
app/code/community/Yavva/Alsoviewed/controllers/Adminhtml/Alsoviewed/RelationsController.php
CHANGED
|
@@ -168,13 +168,14 @@ class Yavva_Alsoviewed_Adminhtml_Alsoviewed_RelationsController extends Mage_Adm
|
|
| 168 |
*/
|
| 169 |
protected function _isAllowed()
|
| 170 |
{
|
| 171 |
-
|
|
|
|
| 172 |
case 'delete':
|
| 173 |
-
case '
|
| 174 |
return Mage::getSingleton('admin/session')->isAllowed('yavva/alsoviewed/alsoviewed_relations/delete');
|
| 175 |
break;
|
| 176 |
case 'save':
|
| 177 |
-
case '
|
| 178 |
return Mage::getSingleton('admin/session')->isAllowed('yavva/alsoviewed/alsoviewed_relations/save');
|
| 179 |
break;
|
| 180 |
default:
|
| 168 |
*/
|
| 169 |
protected function _isAllowed()
|
| 170 |
{
|
| 171 |
+
$action = strtolower($this->getRequest()->getActionName());
|
| 172 |
+
switch ($action) {
|
| 173 |
case 'delete':
|
| 174 |
+
case 'massdelete':
|
| 175 |
return Mage::getSingleton('admin/session')->isAllowed('yavva/alsoviewed/alsoviewed_relations/delete');
|
| 176 |
break;
|
| 177 |
case 'save':
|
| 178 |
+
case 'massstatus':
|
| 179 |
return Mage::getSingleton('admin/session')->isAllowed('yavva/alsoviewed/alsoviewed_relations/save');
|
| 180 |
break;
|
| 181 |
default:
|
app/code/community/Yavva/Alsoviewed/etc/config.xml
CHANGED
|
@@ -2,7 +2,7 @@
|
|
| 2 |
<config>
|
| 3 |
<modules>
|
| 4 |
<Yavva_Alsoviewed>
|
| 5 |
-
<version>1.
|
| 6 |
</Yavva_Alsoviewed>
|
| 7 |
</modules>
|
| 8 |
|
|
@@ -101,6 +101,24 @@
|
|
| 101 |
</alsoviewed>
|
| 102 |
</updates>
|
| 103 |
</layout>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 104 |
</adminhtml>
|
| 105 |
|
| 106 |
<crontab>
|
|
@@ -148,6 +166,12 @@
|
|
| 148 |
<perfomance>
|
| 149 |
<chunk_size>500</chunk_size>
|
| 150 |
</perfomance>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 151 |
</alsoviewed>
|
| 152 |
</default>
|
| 153 |
</config>
|
| 2 |
<config>
|
| 3 |
<modules>
|
| 4 |
<Yavva_Alsoviewed>
|
| 5 |
+
<version>1.3.0</version>
|
| 6 |
</Yavva_Alsoviewed>
|
| 7 |
</modules>
|
| 8 |
|
| 101 |
</alsoviewed>
|
| 102 |
</updates>
|
| 103 |
</layout>
|
| 104 |
+
<events>
|
| 105 |
+
<catalog_product_prepare_save>
|
| 106 |
+
<observers>
|
| 107 |
+
<alsoviewed>
|
| 108 |
+
<class>alsoviewed/observer</class>
|
| 109 |
+
<method>prepareProductSave</method>
|
| 110 |
+
</alsoviewed>
|
| 111 |
+
</observers>
|
| 112 |
+
</catalog_product_prepare_save>
|
| 113 |
+
<catalog_product_save_after>
|
| 114 |
+
<observers>
|
| 115 |
+
<alsoviewed>
|
| 116 |
+
<class>alsoviewed/observer</class>
|
| 117 |
+
<method>catalogProductSaveAfter</method>
|
| 118 |
+
</alsoviewed>
|
| 119 |
+
</observers>
|
| 120 |
+
</catalog_product_save_after>
|
| 121 |
+
</events>
|
| 122 |
</adminhtml>
|
| 123 |
|
| 124 |
<crontab>
|
| 166 |
<perfomance>
|
| 167 |
<chunk_size>500</chunk_size>
|
| 168 |
</perfomance>
|
| 169 |
+
<log>
|
| 170 |
+
<ignore_user_agent>1</ignore_user_agent>
|
| 171 |
+
<ignored_user_agent><![CDATA[008|Applebot|bingbot|facebookexternalhit|FlipboardProxy|googlebot|Googlebot|MetaURI|msnbot|redditbot|slurp|tm_crawler|TweetmemeBot|Twitterbot|Yandex]]></ignored_user_agent>
|
| 172 |
+
<ignore_ip_address>0</ignore_ip_address>
|
| 173 |
+
<ignored_ip_address></ignored_ip_address>
|
| 174 |
+
</log>
|
| 175 |
</alsoviewed>
|
| 176 |
</default>
|
| 177 |
</config>
|
app/code/community/Yavva/Alsoviewed/etc/system.xml
CHANGED
|
@@ -244,6 +244,51 @@
|
|
| 244 |
</chunk_size>
|
| 245 |
</fields>
|
| 246 |
</perfomance>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 247 |
</groups>
|
| 248 |
</alsoviewed>
|
| 249 |
</sections>
|
| 244 |
</chunk_size>
|
| 245 |
</fields>
|
| 246 |
</perfomance>
|
| 247 |
+
<log>
|
| 248 |
+
<label>Log Settings</label>
|
| 249 |
+
<sort_order>50</sort_order>
|
| 250 |
+
<show_in_default>1</show_in_default>
|
| 251 |
+
<show_in_website>0</show_in_website>
|
| 252 |
+
<show_in_store>0</show_in_store>
|
| 253 |
+
<fields>
|
| 254 |
+
<ignore_user_agent>
|
| 255 |
+
<label>Ignore crawlers</label>
|
| 256 |
+
<frontend_type>select</frontend_type>
|
| 257 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
| 258 |
+
<sort_order>10</sort_order>
|
| 259 |
+
<show_in_default>1</show_in_default>
|
| 260 |
+
</ignore_user_agent>
|
| 261 |
+
<ignored_user_agent>
|
| 262 |
+
<label>Crawler's user agent regex</label>
|
| 263 |
+
<frontend_type>text</frontend_type>
|
| 264 |
+
<sort_order>11</sort_order>
|
| 265 |
+
<depends>
|
| 266 |
+
<ignore_user_agent>
|
| 267 |
+
<value>1</value>
|
| 268 |
+
</ignore_user_agent>
|
| 269 |
+
</depends>
|
| 270 |
+
<show_in_default>1</show_in_default>
|
| 271 |
+
</ignored_user_agent>
|
| 272 |
+
<ignore_ip_address>
|
| 273 |
+
<label>Ignore specific ip addresses</label>
|
| 274 |
+
<frontend_type>select</frontend_type>
|
| 275 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
| 276 |
+
<sort_order>20</sort_order>
|
| 277 |
+
<show_in_default>1</show_in_default>
|
| 278 |
+
</ignore_ip_address>
|
| 279 |
+
<ignored_ip_address>
|
| 280 |
+
<label>Ip addresses (comma separated)</label>
|
| 281 |
+
<frontend_type>text</frontend_type>
|
| 282 |
+
<sort_order>21</sort_order>
|
| 283 |
+
<depends>
|
| 284 |
+
<ignore_ip_address>
|
| 285 |
+
<value>1</value>
|
| 286 |
+
</ignore_ip_address>
|
| 287 |
+
</depends>
|
| 288 |
+
<show_in_default>1</show_in_default>
|
| 289 |
+
</ignored_ip_address>
|
| 290 |
+
</fields>
|
| 291 |
+
</log>
|
| 292 |
</groups>
|
| 293 |
</alsoviewed>
|
| 294 |
</sections>
|
app/design/adminhtml/base/default/layout/yavva/alsoviewed.xml
CHANGED
|
@@ -21,4 +21,42 @@
|
|
| 21 |
<block type="alsoviewed/adminhtml_log" name="alsoviewed_log"/>
|
| 22 |
</reference>
|
| 23 |
</adminhtml_alsoviewed_log_index>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
</layout>
|
| 21 |
<block type="alsoviewed/adminhtml_log" name="alsoviewed_log"/>
|
| 22 |
</reference>
|
| 23 |
</adminhtml_alsoviewed_log_index>
|
| 24 |
+
|
| 25 |
+
<!-- Product edit page integration -->
|
| 26 |
+
<adminhtml_catalog_product_edit>
|
| 27 |
+
<reference name="product_tabs">
|
| 28 |
+
<action method="addTabAfter">
|
| 29 |
+
<name>alsoviewed</name>
|
| 30 |
+
<block>alsoviewed/adminhtml_catalog_product_edit_tab_relations</block>
|
| 31 |
+
<after>crosssell</after>
|
| 32 |
+
</action>
|
| 33 |
+
</reference>
|
| 34 |
+
</adminhtml_catalog_product_edit>
|
| 35 |
+
|
| 36 |
+
<adminhtml_alsoviewed_product_relations>
|
| 37 |
+
<block type="core/text_list" name="root" output="toHtml">
|
| 38 |
+
<block type="alsoviewed/adminhtml_catalog_product_edit_tab_relations" name="catalog.product.edit.tab.alsoviewed"/>
|
| 39 |
+
<block type="adminhtml/widget_grid_serializer" name="related_grid_serializer">
|
| 40 |
+
<reference name="related_grid_serializer">
|
| 41 |
+
<action method="initSerializerBlock">
|
| 42 |
+
<grid_block_name>catalog.product.edit.tab.alsoviewed</grid_block_name>
|
| 43 |
+
<data_callback>getSelectedAlsoviewedProducts</data_callback>
|
| 44 |
+
<hidden_input_name>alsoviewed[relations]</hidden_input_name>
|
| 45 |
+
<reload_param_name>products_alsoviewed</reload_param_name>
|
| 46 |
+
</action>
|
| 47 |
+
<action method="addColumnInputName">
|
| 48 |
+
<input_name>weight</input_name>
|
| 49 |
+
<input_name>position</input_name>
|
| 50 |
+
<input_name>status</input_name>
|
| 51 |
+
</action>
|
| 52 |
+
</reference>
|
| 53 |
+
</block>
|
| 54 |
+
</block>
|
| 55 |
+
</adminhtml_alsoviewed_product_relations>
|
| 56 |
+
|
| 57 |
+
<adminhtml_alsoviewed_product_relationsgrid>
|
| 58 |
+
<block type="core/text_list" name="root" output="toHtml">
|
| 59 |
+
<block type="alsoviewed/adminhtml_catalog_product_edit_tab_relations" name="catalog.product.edit.tab.alsoviewed"/>
|
| 60 |
+
</block>
|
| 61 |
+
</adminhtml_alsoviewed_product_relationsgrid>
|
| 62 |
</layout>
|
app/design/frontend/base/default/layout/yavva/alsoviewed.xml
CHANGED
|
@@ -38,37 +38,4 @@
|
|
| 38 |
</block>
|
| 39 |
</reference>
|
| 40 |
</catalog_product_view>
|
| 41 |
-
|
| 42 |
-
<!-- Move to the RWD tabs -->
|
| 43 |
-
<!-- Copy and uncomment the code to your theme local.xml -->
|
| 44 |
-
<!--
|
| 45 |
-
<catalog_product_view>
|
| 46 |
-
<reference name="product.info.additional">
|
| 47 |
-
<action method="unsetChild"><name>alsoviewed.content.wrapper</name></action>
|
| 48 |
-
</reference>
|
| 49 |
-
<reference name="product.info">
|
| 50 |
-
<action method="append"><name>alsoviewed.content.wrapper</name></action>
|
| 51 |
-
</reference>
|
| 52 |
-
<reference name="alsoviewed.content.wrapper">
|
| 53 |
-
<action method="addToParentGroup"><group>detailed_info</group></action>
|
| 54 |
-
<action method="setTitle" translate="value"><value>People who viewed this product also viewed</value></action>
|
| 55 |
-
</reference>
|
| 56 |
-
</catalog_product_view>
|
| 57 |
-
-->
|
| 58 |
-
|
| 59 |
-
<!-- Move to the Argento tabs -->
|
| 60 |
-
<!-- Copy and uncomment the code to your theme custom.xml -->
|
| 61 |
-
<!--
|
| 62 |
-
<catalog_product_view>
|
| 63 |
-
<reference name="product.info.additional">
|
| 64 |
-
<action method="unsetChild"><name>alsoviewed.content.wrapper</name></action>
|
| 65 |
-
</reference>
|
| 66 |
-
<reference name="product.info.tabs">
|
| 67 |
-
<action method="addTab" translate="title" module="alsoviewed" ifconfig="alsoviewed/content/enabled">
|
| 68 |
-
<alias>alsoviewed.content.wrapper</alias>
|
| 69 |
-
<title><![CDATA[You may also like]]></title>
|
| 70 |
-
</action>
|
| 71 |
-
</reference>
|
| 72 |
-
</catalog_product_view>
|
| 73 |
-
-->
|
| 74 |
</layout>
|
| 38 |
</block>
|
| 39 |
</reference>
|
| 40 |
</catalog_product_view>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 41 |
</layout>
|
app/locale/en_US/Yavva_Alsoviewed.csv
CHANGED
|
@@ -33,3 +33,8 @@
|
|
| 33 |
"Perfomance","Perfomance"
|
| 34 |
"Relations count to process per one query","Relations count to process per one query"
|
| 35 |
"You may need to decrease this value, if you found the ""Got a packet bigger than 'max_allowed_packet' bytes"" error in log","You may need to decrease this value, if you found the ""Got a packet bigger than 'max_allowed_packet' bytes"" error in log"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
"Perfomance","Perfomance"
|
| 34 |
"Relations count to process per one query","Relations count to process per one query"
|
| 35 |
"You may need to decrease this value, if you found the ""Got a packet bigger than 'max_allowed_packet' bytes"" error in log","You may need to decrease this value, if you found the ""Got a packet bigger than 'max_allowed_packet' bytes"" error in log"
|
| 36 |
+
"Log Settings","Log Settings"
|
| 37 |
+
"Ignore crawlers","Ignore crawlers"
|
| 38 |
+
"Crawler's user agent regex","Crawler's user agent regex"
|
| 39 |
+
"Ignore specific ip addresses","Ignore specific ip addresses"
|
| 40 |
+
"Ip addresses (comma separated)","Ip addresses (comma separated)"
|
package.xml
CHANGED
|
@@ -1,15 +1,15 @@
|
|
| 1 |
<?xml version="1.0"?>
|
| 2 |
<package>
|
| 3 |
<name>alsoviewed</name>
|
| 4 |
-
<version>1.
|
| 5 |
<stability>stable</stability>
|
| 6 |
<license>GPL</license>
|
| 7 |
<channel>community</channel>
|
| 8 |
<extends/>
|
| 9 |
-
<summary>
|
| 10 |
<description>Magento module that displays products, viewed by visitors, who viewed this
|
| 11 |
product. It can also show recommendations based on viewed, compared and shopping
|
| 12 |
-
cart products
|
| 13 |

|
| 14 |
#### How it works?
|
| 15 |
Every time the client is looking at some product, module update relations between
|
|
@@ -21,43 +21,39 @@ Yes, store administrator can manually change the relation sort order or even
|
|
| 21 |
disable the relation to hide it from the frontend.
|
| 22 |

|
| 23 |
#### Configuration
|
| 24 |
-
|
| 25 |
-
|
| 26 |

|
|
|
|
| 27 |
- Product additional information
|
| 28 |
-
- Left column
|
| 29 |
-
- Right column
|
| 30 |

|
| 31 |
-
|
| 32 |
-
|
| 33 |
-

|
| 34 |
-
> If you wish to show recommendations based on customer history (viewed, compared),
|
| 35 |
-
> use the [widget](#widget) instead.
|
| 36 |

|
| 37 |
#### Widget
|
| 38 |
-
|
| 39 |
-
Widget provides ability to recommend products by additional activities:
|
| 40 |

|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |

|
| 45 |
#### The main features
|
| 46 |
- 100% free and open source
|
| 47 |
- High perfomance
|
| 48 |
- Simple and clean design
|
| 49 |
- Responsive css
|
| 50 |
-

|
| 51 |
-
> Module functionality relies on cron. Make sure you configure it properly.
|
| 52 |
</description>
|
| 53 |
-
<notes
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
|
|
|
|
|
|
|
|
|
| 57 |
<authors><author><name>Vova Yatsyuk</name><user>VovaYatsyuk</user><email>vova.yatsyuk@gmail.com</email></author></authors>
|
| 58 |
-
<date>2015-
|
| 59 |
-
<time>
|
| 60 |
-
<contents><target name="magecommunity"><dir name="Yavva"><dir name="Alsoviewed"><dir name="Block"><dir name="Adminhtml"><dir name="Log"><file name="Grid.php" hash="6661435fdb8e525775adf990a90d11c4"/></dir><file name="Log.php" hash="cb3cca5ff29b80044e7943d376dc5993"/><dir name="Relations"><dir name="Edit"><file name="Form.php" hash="0ad20532cb04c4c850fe1398598e6588"/></dir><file name="Edit.php" hash="1afce837cf4bd29beb1cc8f38d4065b6"/><file name="Grid.php" hash="e10da78030dbfb1ecbb32f6df82ddfa1"/></dir><file name="Relations.php" hash="
|
| 61 |
<compatible/>
|
| 62 |
-
<dependencies><required><php><min>5.1.0</min><max>
|
| 63 |
</package>
|
| 1 |
<?xml version="1.0"?>
|
| 2 |
<package>
|
| 3 |
<name>alsoviewed</name>
|
| 4 |
+
<version>1.3.0</version>
|
| 5 |
<stability>stable</stability>
|
| 6 |
<license>GPL</license>
|
| 7 |
<channel>community</channel>
|
| 8 |
<extends/>
|
| 9 |
+
<summary>Products recommendation module, that shows products viewed by customers who viewed this product.</summary>
|
| 10 |
<description>Magento module that displays products, viewed by visitors, who viewed this
|
| 11 |
product. It can also show recommendations based on viewed, compared and shopping
|
| 12 |
+
cart products.
|
| 13 |

|
| 14 |
#### How it works?
|
| 15 |
Every time the client is looking at some product, module update relations between
|
| 21 |
disable the relation to hide it from the frontend.
|
| 22 |

|
| 23 |
#### Configuration
|
| 24 |
+
Module configuration provides ability to show Also Viewed Products in
|
| 25 |
+
one of the following containers:
|
| 26 |

|
| 27 |
+
- Left or Right column
|
| 28 |
- Product additional information
|
|
|
|
|
|
|
| 29 |

|
| 30 |
+
Each of the sections has options that allows to configure title, list mode,
|
| 31 |
+
products count, columns count (in case of grid mode) and image dimensions.
|
|
|
|
|
|
|
|
|
|
| 32 |

|
| 33 |
#### Widget
|
| 34 |
+
Widget provides ability to recommend products on any page by additional activities:
|
|
|
|
| 35 |

|
| 36 |
+
- Recently Viewed Products
|
| 37 |
+
- Recently Compared Products
|
| 38 |
+
- Shopping Cart products
|
| 39 |

|
| 40 |
#### The main features
|
| 41 |
- 100% free and open source
|
| 42 |
- High perfomance
|
| 43 |
- Simple and clean design
|
| 44 |
- Responsive css
|
|
|
|
|
|
|
| 45 |
</description>
|
| 46 |
+
<notes>View release notes at https://github.com/vovayatsyuk/magento-alsoviewed/releases/tag/1.3.0
|
| 47 |
+

|
| 48 |
+
- Security fix to _isAllowed method (strtolower)
|
| 49 |
+
- Removed non-working "Save" button from relations page
|
| 50 |
+
- Search crawlers and bots are no longer affects product relations
|
| 51 |
+
- Added ability to ignore specific IP addresses
|
| 52 |
+
- Added ability to create new and manage existing relations from backend `Product Edit` page</notes>
|
| 53 |
<authors><author><name>Vova Yatsyuk</name><user>VovaYatsyuk</user><email>vova.yatsyuk@gmail.com</email></author></authors>
|
| 54 |
+
<date>2015-08-13</date>
|
| 55 |
+
<time>20:06:45</time>
|
| 56 |
+
<contents><target name="magecommunity"><dir name="Yavva"><dir name="Alsoviewed"><dir name="Block"><dir name="Adminhtml"><dir name="Catalog"><dir name="Product"><dir name="Edit"><dir name="Tab"><file name="Relations.php" hash="cc7fa402cb6e41f0d445e13a35c28c05"/></dir></dir></dir></dir><dir name="Log"><file name="Grid.php" hash="6661435fdb8e525775adf990a90d11c4"/></dir><file name="Log.php" hash="cb3cca5ff29b80044e7943d376dc5993"/><dir name="Relations"><dir name="Edit"><file name="Form.php" hash="0ad20532cb04c4c850fe1398598e6588"/></dir><file name="Edit.php" hash="1afce837cf4bd29beb1cc8f38d4065b6"/><file name="Grid.php" hash="e10da78030dbfb1ecbb32f6df82ddfa1"/></dir><file name="Relations.php" hash="5a8504dde3a69da03151bd75c0a59120"/></dir><file name="Products.php" hash="68240b69f626dd3c6283d1144d18e214"/><dir name="Widget"><file name="Products.php" hash="4fad1d2e4c32ed756c3b5fc988edd5a2"/></dir></dir><dir name="Helper"><file name="Data.php" hash="4712c5c02e1873ffbb21a18d4b6084bc"/></dir><dir name="Model"><file name="Basis.php" hash="ff0ba6ceadd3b99d5ac4825ae109a6b0"/><file name="Observer.php" hash="d4a7929679224d67fa18c2054c93a847"/><file name="Relation.php" hash="506d2fa53e2e342030bdfb976a2f0e00"/><dir name="Resource"><dir name="Collection"><file name="Abstract.php" hash="6d996d6b7643f1b3cc3c0db3d5440011"/></dir><dir name="Log"><file name="Collection.php" hash="790509f4a4e74cc007adae600c0d8a1b"/></dir><file name="Log.php" hash="d79d4a97ba3303dfa3e042ec34c2e0e3"/><dir name="Relation"><file name="Collection.php" hash="be05b1351c8703f1157b6f552612ffa8"/></dir><file name="Relation.php" hash="f25eeeb7330853418226ca65baa47846"/></dir><file name="Session.php" hash="9ba3b43dec9458cc13cb6c6e7efbef05"/><dir name="System"><dir name="Config"><dir name="Source"><file name="ListMode.php" hash="d3480dc016dc0ff9e2e23ab210cf9756"/></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Alsoviewed"><file name="LogController.php" hash="34ae25cc085adf4875be235feb4d9d63"/><file name="ProductController.php" hash="39c67faecdc13547714a63237487d831"/><file name="RelationsController.php" hash="6ba4c0a8b073c0dbf604932250d0e054"/></dir></dir></dir><dir name="etc"><file name="adminhtml.xml" hash="ff26af98f8e1eef8d902eca84da6d3aa"/><file name="config.xml" hash="848be336a98730fca7503720c4e7725f"/><file name="system.xml" hash="ed3e157796335dbcf9e6cc96f57ada25"/><file name="widget.xml" hash="7d8c523d78cc46b203f440cc9be9a356"/></dir><dir name="sql"><dir name="yavva_alsoviewed_setup"><file name="install-1.0.0.php" hash="8ed81d46895731990b7c2066bfcc353d"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="base"><dir name="default"><dir name="layout"><dir name="yavva"><file name="alsoviewed.xml" hash="cdc76c11b4dd573f4d891042714e92cf"/></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><dir name="yavva"><file name="alsoviewed.xml" hash="df953c9808d2e6ca186f36bc8ca4aac4"/></dir></dir><dir name="template"><dir name="yavva"><dir name="alsoviewed"><file name="products.phtml" hash="d55af4e92a7fbe929c10b81a804ddffe"/><dir name="wrapper"><file name="block.phtml" hash="ec9cb02d52f4ea8756a24438d26def64"/><file name="collateral.phtml" hash="0354a4c8f3466edc2d3bb5fb0a0b75f7"/></dir></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Yavva_Alsoviewed.xml" hash="4eedb69f4c1fc39a1e4170694a19c3f8"/></dir></target><target name="magelocale"><dir name="en_US"><file name="Yavva_Alsoviewed.csv" hash="abdd5870a9969bf9eb6ee89019b5ebb7"/></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="yavva"><dir name="alsoviewed"><dir name="css"><file name="alsoviewed.css" hash="2eea21636a6bf099f2387c4f992b4c31"/></dir></dir></dir></dir></dir></dir></target></contents>
|
| 57 |
<compatible/>
|
| 58 |
+
<dependencies><required><php><min>5.1.0</min><max>7.0.0</max></php></required></dependencies>
|
| 59 |
</package>
|
skin/frontend/base/default/yavva/alsoviewed/.DS_Store
DELETED
|
Binary file
|
