File indexing completed on 2024-12-22 05:33:32
0001 <?php 0002 0003 /** 0004 * ocs-webserver 0005 * 0006 * Copyright 2016 by pling GmbH. 0007 * 0008 * This file is part of ocs-webserver. 0009 * 0010 * This program is free software: you can redistribute it and/or modify 0011 * it under the terms of the GNU Affero General Public License as 0012 * published by the Free Software Foundation, either version 3 of the 0013 * License, or (at your option) any later version. 0014 * 0015 * This program is distributed in the hope that it will be useful, 0016 * but WITHOUT ANY WARRANTY; without even the implied warranty of 0017 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0018 * GNU Affero General Public License for more details. 0019 * 0020 * You should have received a copy of the GNU Affero General Public License 0021 * along with this program. If not, see <http://www.gnu.org/licenses/>. 0022 **/ 0023 class ExploreController extends Local_Controller_Action_DomainSwitch 0024 { 0025 const DEFAULT_ORDER = 'latest'; 0026 const TAG_ISORIGINAL = 'original-product'; 0027 0028 /** @var string */ 0029 protected $_browserTitlePrepend; 0030 0031 public function init() 0032 { 0033 parent::init(); 0034 $this->_auth = Zend_Auth::getInstance(); 0035 } 0036 0037 public function categoriesAction() 0038 { 0039 // Filter-Parameter 0040 $inputFilterParams['category'] = (int)$this->getParam('cat', null); 0041 $inputFilterParams['filter'] = (int)$this->getParam('fil', null); 0042 $inputFilterParams['order'] = preg_replace('/[^-a-zA-Z0-9_]/', '', $this->getParam('ord', self::DEFAULT_ORDER)); 0043 $inputFilterParams['selected'] = (int)$this->getParam('sel', $inputFilterParams['category']); 0044 0045 $modelCategories = new Default_Model_DbTable_ProjectCategory(); 0046 $children = $modelCategories->fetchImmediateChildren($inputFilterParams['selected']); 0047 $selChild = $modelCategories->fetchElement($inputFilterParams['filter']); 0048 0049 $response = $this->generateResponseMsg($children, $inputFilterParams, $selChild); 0050 $this->_helper->json($response); 0051 } 0052 0053 private function generateResponseMsg($children, $inputParams, $selChild) 0054 { 0055 $result = array(); 0056 0057 if (count($children) == 0) { 0058 return $result; 0059 } 0060 0061 $helperBuildExploreUrl = new Default_View_Helper_BuildExploreUrl(); 0062 foreach ($children as $child) { 0063 $nodeSelectedState = ($inputParams['filter'] == $child['project_category_id']) ? true : false; 0064 if (1 == ($child['rgt'] - $child['lft'])) { 0065 $result[] = array( 0066 'title' => $child['title'], 0067 'key' => $child['project_category_id'], 0068 'href' => $helperBuildExploreUrl->buildExploreUrl($inputParams['category'], $child['project_category_id'], 0069 $inputParams['order']), 0070 'target' => '_top', 0071 'selected' => $nodeSelectedState 0072 ); 0073 } else { 0074 $nodeHasChildren = (1 == ($child['rgt'] - $child['lft'])) ? false : true; 0075 $nodeIsSelectedSubCat = (($selChild['lft'] > $child['lft']) AND ($selChild['rgt'] < $child['rgt'])) ? true : false; 0076 $nodeExpandedState = false; 0077 $nodeChildren = null; 0078 if ($nodeHasChildren AND $nodeIsSelectedSubCat) { 0079 $nodeExpandedState = true; 0080 $modelCategories = new Default_Model_DbTable_ProjectCategory(); 0081 $immChildren = $modelCategories->fetchImmediateChildren($child['project_category_id']); 0082 $nodeChildren = $this->generateResponseMsg($immChildren, $inputParams, $selChild); 0083 } 0084 $result[] = array( 0085 'title' => $child['title'], 0086 'key' => $child['project_category_id'], 0087 'folder' => true, 0088 'lazy' => true, 0089 'selected' => $nodeSelectedState, 0090 'expanded' => $nodeExpandedState, 0091 'href' => $helperBuildExploreUrl->buildExploreUrl($inputParams['category'], $child['project_category_id'], 0092 $inputParams['order']), 0093 'target' => '_top', 0094 'children' => $nodeChildren 0095 ); 0096 } 0097 } 0098 0099 return $result; 0100 } 0101 0102 /** 0103 * @throws Zend_Cache_Exception 0104 * @throws Zend_Db_Select_Exception 0105 * @throws Zend_Exception 0106 * @throws Zend_Loader_PluginLoader_Exception 0107 * @throws Zend_Paginator_Exception 0108 */ 0109 public function indexAction() 0110 { 0111 0112 0113 0114 // Filter-Parameter 0115 /*$inputFilterOriginal = $this->getParam('filteroriginal', $this->getFilterOriginalFromCookie()); 0116 $this->storeFilterOriginalInCookie($inputFilterOriginal); 0117 $this->view->inputFilterOriginal = $inputFilterOriginal; 0118 */ 0119 0120 $isShowOnlyFavs = (int)$this->getParam('fav', 0); 0121 0122 0123 $inputCatId = (int)$this->getParam('cat', null); 0124 if ($inputCatId) { 0125 // $this->view->isFilterCat = true; 0126 // $this->view->filterCat = $inputCatId; 0127 $this->view->catabout = $this->getCategoryAbout($inputCatId); 0128 0129 $helperFetchCategory = new Default_View_Helper_CatTitle(); 0130 $catTitle = $helperFetchCategory->catTitle($inputCatId); 0131 0132 //$this->view->headTitle($catTitle . ' - ' . $_SERVER['HTTP_HOST'], 'SET'); 0133 $this->view->headTitle($catTitle . ' - ' . $this->getHeadTitle(), 'SET'); 0134 } 0135 0136 $this->view->cat_id = $inputCatId; 0137 $this->view->showAddProduct = 1; 0138 0139 $storeCatIds = Zend_Registry::isRegistered('store_category_list') ? Zend_Registry::get('store_category_list') : null; 0140 0141 $filter = array(); 0142 $filter['category'] = $inputCatId ? $inputCatId : $storeCatIds; 0143 $filter['order'] = preg_replace('/[^-a-zA-Z0-9_]/', '', $this->getParam('ord', self::DEFAULT_ORDER)); 0144 // removed filter original 20191007 0145 //$filter['original'] = $inputFilterOriginal == 1 ? self::TAG_ISORIGINAL : null; 0146 0147 0148 if($isShowOnlyFavs == 1) { 0149 if($this->_authMember->member_id) 0150 { 0151 $filter['favorite'] = $this->_authMember->member_id; 0152 $this->view->authMember = $this->_authMember; 0153 }else{ 0154 $this->redirect('/browse'); 0155 } 0156 }else 0157 { 0158 $isShowOnlyFavs = 0; 0159 } 0160 0161 0162 0163 $filter['tag'] = Zend_Registry::isRegistered('config_store_tags') ? Zend_Registry::get('config_store_tags') : null; 0164 if (APPLICATION_ENV == "development") { 0165 Zend_Registry::get('logger')->debug(__METHOD__ . ' - ' . json_encode($filter)); 0166 } 0167 0168 $tagFilter = Zend_Registry::isRegistered('config_store_tags') ? Zend_Registry::get('config_store_tags') : null; 0169 0170 0171 $tagGroupFilter = Zend_Registry::isRegistered('config_store_taggroups') ? Zend_Registry::get('config_store_taggroups') : null; 0172 if(!empty($tagGroupFilter)) { 0173 $filterArray = array(); 0174 foreach ($tagGroupFilter as $tagGroupId) { 0175 $inputFilter = $this->getFilterTagFromCookie($tagGroupId); 0176 $filterArray[$tagGroupId] = $inputFilter; 0177 if(!empty($inputFilter)) { 0178 $filter['tag'][] = $inputFilter; 0179 } 0180 } 0181 $this->view->tag_group_filter = $filterArray; 0182 } 0183 0184 $storeConfig = Zend_Registry::isRegistered('store_config') ? Zend_Registry::get('store_config') : null; 0185 0186 $page = (int)$this->getParam('page', 1); 0187 0188 $index = null; 0189 $browseListType = null; 0190 0191 //Old: index as Param 0192 $index = $this->getParam('index'); 0193 0194 if($index) { 0195 switch ($index) { 0196 case 2: 0197 $browseListType = 'picture'; 0198 break; 0199 case 3: 0200 $browseListType = 'picture'; 0201 break; 0202 case 4: 0203 $browseListType = 'phone-pictures'; 0204 break; 0205 case 8: 0206 $browseListType = 'apps'; 0207 break; 0208 case 9: 0209 $browseListType = 'icons'; 0210 break; 0211 } 0212 } 0213 0214 if($storeConfig->browse_list_type) { 0215 $listTypeTable = new Default_Model_DbTable_BrowseListType(); 0216 $listType = $listTypeTable->findBrowseListType($storeConfig->browse_list_type); 0217 if(isset($listType)) { 0218 $browseListType = $listType['name']; 0219 $index = 2; 0220 } 0221 } 0222 0223 //Browse List config in Category set? 0224 if(!$index) { 0225 //Now the list type is in backend categories set 0226 $tableCat = new Default_Model_DbTable_ProjectCategory(); 0227 $cat = $tableCat->findCategory($this->view->cat_id); 0228 if(isset($cat) && isset($cat['browse_list_type'])) { 0229 $indexListType = $cat['browse_list_type']; 0230 $listTypeTable = new Default_Model_DbTable_BrowseListType(); 0231 $listType = $listTypeTable->findBrowseListType($indexListType); 0232 if(isset($listType)) { 0233 $browseListType = $listType['name']; 0234 $index = 2; 0235 } 0236 } 0237 } 0238 0239 // my favourite list filter & list layout 0240 if($isShowOnlyFavs == 1) { 0241 $index=7; 0242 $browseListType = 'myfav'; 0243 } 0244 0245 0246 0247 if($index) 0248 { 0249 // only switch view via index=2 parameter 0250 $pageLimit = 50; 0251 if($index==7) $pageLimit = 10; 0252 $requestedElements = $this->fetchRequestedElements($filter, $pageLimit, ($page - 1) * $pageLimit); 0253 $this->view->productsJson = Zend_Json::encode($requestedElements['elements']); 0254 $this->view->filtersJson = Zend_Json::encode($filter); 0255 $this->view->cat_idJson = Zend_Json::encode($inputCatId); 0256 $modelInfo = new Default_Model_Info(); 0257 $topprods = $modelInfo->getMostDownloaded(100, $inputCatId, $tagFilter); 0258 $this->view->topprodsJson = Zend_Json::encode($topprods); 0259 $comments = $modelInfo->getLatestComments(5, $inputCatId, $tagFilter); 0260 $this->view->commentsJson = Zend_Json::encode($comments); 0261 $modelCategory = new Default_Model_ProjectCategory(); 0262 $this->view->categoriesJson = Zend_Json::encode($modelCategory->fetchTreeForView()); 0263 $this->view->browseListType = $browseListType; 0264 0265 $this->view->pageLimit = $pageLimit; 0266 0267 $this->_helper->viewRenderer('index-react'.$index); 0268 0269 } 0270 else if ($storeConfig->layout_explore && $storeConfig->isRenderReact()) { 0271 $pageLimit = 50; 0272 $requestedElements = $this->fetchRequestedElements($filter, $pageLimit, ($page - 1) * $pageLimit); 0273 $this->view->productsJson = Zend_Json::encode($requestedElements['elements']); 0274 $this->view->filtersJson = Zend_Json::encode($filter); 0275 $this->view->cat_idJson = Zend_Json::encode($inputCatId); 0276 $modelInfo = new Default_Model_Info(); 0277 $topprods = $modelInfo->getMostDownloaded(100, $inputCatId, $tagFilter); 0278 $this->view->topprodsJson = Zend_Json::encode($topprods); 0279 $comments = $modelInfo->getLatestComments(5, $inputCatId, $tagFilter); 0280 $this->view->commentsJson = Zend_Json::encode($comments); 0281 $modelCategory = new Default_Model_ProjectCategory(); 0282 $this->view->categoriesJson = Zend_Json::encode($modelCategory->fetchTreeForView()); 0283 $this->_helper->viewRenderer('index-react'); 0284 $this->view->pageLimit = $pageLimit; 0285 0286 } else { 0287 $pageLimit = 10; 0288 $requestedElements = $this->fetchRequestedElements($filter, $pageLimit, ($page - 1) * $pageLimit); 0289 $this->view->pageLimit = $pageLimit; 0290 0291 } 0292 if($storeConfig) { 0293 $this->view->storeabout = $this->getStoreAbout($storeConfig->store_id); 0294 } 0295 0296 $paginator = Local_Paginator::factory($requestedElements['elements']); 0297 $paginator->setItemCountPerPage($pageLimit); 0298 $paginator->setCurrentPageNumber($page); 0299 $paginator->setTotalItemCount($requestedElements['total_count']); 0300 0301 $this->view->products = $paginator; 0302 $this->view->totalcount = $requestedElements['total_count']; 0303 $this->view->filters = $filter; 0304 $this->view->page = $page; 0305 $this->view->package_type = Zend_Registry::isRegistered('config_store_tags') ? Zend_Registry::get('config_store_tags') : null; 0306 $this->view->tags = $tagFilter; 0307 } 0308 0309 0310 0311 /** 0312 * @param $inputCatId 0313 * 0314 * @return string|null 0315 * @throws Zend_Exception 0316 */ 0317 protected function getCategoryAbout($inputCatId) 0318 { 0319 $config = Zend_Registry::get('config'); 0320 $static_config = $config->settings->static; 0321 0322 $include_path_cat = $static_config->include_path . 'category_about/' . $inputCatId . '.phtml'; 0323 if (file_exists($include_path_cat)) { 0324 return $include_path_cat; 0325 } 0326 0327 return null; 0328 } 0329 0330 0331 0332 /** 0333 * @param array $inputFilterParams 0334 * @param int $limit 0335 * @param int $offset 0336 * 0337 * @return array 0338 * @throws Zend_Cache_Exception 0339 * @throws Zend_Db_Select_Exception 0340 * @throws Zend_Exception 0341 */ 0342 private function fetchRequestedElements($inputFilterParams, $limit = null, $offset = null) 0343 { 0344 $modelProject = new Default_Model_Project(); 0345 $requestedElements = $modelProject->fetchProjectsByFilter($inputFilterParams, $limit, $offset); 0346 0347 return $requestedElements; 0348 } 0349 0350 /** 0351 * @throws Zend_Exception 0352 * @throws Zend_Paginator_Exception 0353 */ 0354 public function searchAction() 0355 { 0356 ini_set('memory_limit', '3072M'); 0357 0358 $allDomainCatIds = Zend_Registry::isRegistered('store_category_list') ? Zend_Registry::get('store_category_list') : null; 0359 if (count($allDomainCatIds) == 0) { 0360 $allDomainCatIds = null; 0361 } 0362 0363 if (isset($allDomainCatIds)) { 0364 $this->view->categories = $allDomainCatIds; 0365 } else { 0366 $modelCategories = new Default_Model_DbTable_ProjectCategory(); 0367 $this->view->categories = $modelCategories->fetchMainCatIdsOrdered(); 0368 } 0369 0370 // Filter-Parameter 0371 $filterInput = new Zend_Filter_Input(array('*' => 'StringTrim', 'projectSearchText' => 'StripTags', 'page' => 'digits'), array( 0372 'projectSearchText' => array( 0373 new Zend_Validate_StringLength(array('min' => 3, 'max' => 100)), 0374 'presence' => 'required' 0375 ), 0376 'page' => 'digits' 0377 ), $this->getAllParams()); 0378 0379 if ($filterInput->hasInvalid()) { 0380 $this->_helper->viewRenderer('searchError'); 0381 $this->view->messages = $filterInput->getMessages(); 0382 0383 return; 0384 } 0385 0386 $inputFilterParams['projectSearchText'] = $filterInput->getUnescaped('projectSearchText'); 0387 $page = (int)$filterInput->getEscaped('page'); 0388 0389 $config = Zend_Registry::get('config'); 0390 Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding('utf-8'); 0391 Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive()); 0392 0393 $dataPath = $config->settings->search->path; 0394 $dataPath .= $this->getNameForStoreClient() . DIRECTORY_SEPARATOR; 0395 $index = Zend_Search_Lucene::open($dataPath); 0396 try { 0397 $hits = $index->find($inputFilterParams['projectSearchText'] . '*'); 0398 } catch (Zend_Search_Lucene_Exception $e) { 0399 Zend_Registry::get('logger')->err(__METHOD__ . ' - ' . $e->getMessage() . PHP_EOL . $e->getTraceAsString()); 0400 $hits = array(); 0401 } 0402 0403 if (count($hits) == 0) { 0404 $this->_helper->viewRenderer('searchError'); 0405 $this->view->inputFilter = $inputFilterParams; 0406 $this->view->searchText = $inputFilterParams['projectSearchText']; 0407 0408 return; 0409 } 0410 0411 $results = $this->copyToArray($hits); 0412 $paginator = Zend_Paginator::factory($results); 0413 $paginator->setDefaultItemCountPerPage(10); 0414 $paginator->setCurrentPageNumber($page); 0415 0416 $this->view->hitsCount = count($hits); 0417 $this->view->hits = $paginator; 0418 $this->view->page = $page; 0419 $this->view->inputFilter = $inputFilterParams; 0420 $this->view->searchText = $inputFilterParams['projectSearchText']; 0421 } 0422 0423 /** 0424 * @param array $hits 0425 * 0426 * @return array 0427 */ 0428 protected function copyToArray($hits) 0429 { 0430 $returnArray = array(); 0431 /** @var $hit Zend_Search_Lucene_Search_QueryHit */ 0432 foreach ($hits as $hit) { 0433 $returnArray[] = $hit->getDocument(); 0434 } 0435 0436 return $returnArray; 0437 } 0438 0439 protected function _initResponseHeader() 0440 { 0441 $duration = 1800; // in seconds 0442 $expires = gmdate("D, d M Y H:i:s", time() + $duration) . " GMT"; 0443 0444 $this->getResponse() 0445 ->setHeader('X-FRAME-OPTIONS', 'ALLOWALL', true) 0446 // ->setHeader('Last-Modified', $modifiedTime, true) 0447 ->setHeader('Expires', $expires, true)->setHeader('Pragma', 'no-cache', true) 0448 ->setHeader('Cache-Control', 'private, no-cache, must-revalidate', true) 0449 ; 0450 } 0451 0452 /** 0453 * @param Zend_Config $static_config 0454 * @return string|null 0455 */ 0456 protected function getStoreAbout($storeId) 0457 { 0458 $config = Zend_Registry::get('config'); 0459 $static_config = $config->settings->static; 0460 0461 $include_path_cat = $static_config->include_path . 'store_about/' . $storeId . '.phtml'; 0462 if (file_exists($include_path_cat)) { 0463 return $include_path_cat; 0464 } 0465 0466 return null; 0467 } 0468 0469 /** 0470 * @param array $elements 0471 * 0472 * @return array with additional info's 0473 * @deprecated 0474 */ 0475 private function fetchAdditionalData($elements) 0476 { 0477 $modelProject = new Default_Model_Project(); 0478 $requestedElements = Array(); 0479 0480 foreach ($elements as $project) { 0481 $info = $modelProject->fetchProductInfo($project['project_id']); 0482 $requestedElements[] = $info; 0483 } 0484 0485 return $requestedElements; 0486 } 0487 0488 protected function setLayout() 0489 { 0490 $layoutName = 'flat_ui_template'; 0491 $storeConfig = Zend_Registry::isRegistered('store_config') ? Zend_Registry::get('store_config') : null; 0492 if($storeConfig && $storeConfig->layout_explore) 0493 { 0494 $this->_helper->layout()->setLayout($storeConfig->layout_explore); 0495 }else{ 0496 $this->_helper->layout()->setLayout($layoutName); 0497 } 0498 } 0499 0500 /* private function storeFilterOriginalInCookie($inputFilterOriginal) 0501 { 0502 $storedInCookie = $this->getFilterOriginalFromCookie(); 0503 0504 if (isset($inputFilterOriginal) AND ($inputFilterOriginal != $storedInCookie)) { 0505 $config = Zend_Registry::get('config'); 0506 $cookieName = $config->settings->session->filter_browse_original; 0507 $remember_me_seconds = $config->settings->session->remember_me->cookie_lifetime; 0508 $cookieExpire = time() + $remember_me_seconds; 0509 setcookie($cookieName, $inputFilterOriginal, $cookieExpire, '/'); 0510 } 0511 } 0512 0513 private function getFilterOriginalFromCookie() 0514 { 0515 $config = Zend_Registry::get('config'); 0516 $cookieName = $config->settings->session->filter_browse_original; 0517 0518 $storedInCookie = isset($_COOKIE[$cookieName]) ? $_COOKIE[$cookieName] : NULL; 0519 0520 return $storedInCookie; 0521 }*/ 0522 0523 0524 private function storeFilterTagInCookie($group, $tag) 0525 { 0526 $storedInCookie = $this->getFilterTagFromCookie($group); 0527 0528 if (isset($tag) AND ($tag != $storedInCookie)) { 0529 $config = Zend_Registry::get('config'); 0530 $cookieName = $config->settings->session->filter_browse_original.$group; 0531 $remember_me_seconds = $config->settings->session->remember_me->cookie_lifetime; 0532 $cookieExpire = time() + $remember_me_seconds; 0533 setcookie($cookieName, $tag, $cookieExpire, '/'); 0534 } 0535 } 0536 0537 private function getFilterTagFromCookie($group) 0538 { 0539 $config = Zend_Registry::get('config'); 0540 $cookieName = $config->settings->session->filter_browse_original.$group; 0541 0542 $storedInCookie = isset($_COOKIE[$cookieName]) ? $_COOKIE[$cookieName] : NULL; 0543 0544 return $storedInCookie; 0545 } 0546 0547 0548 public function savetaggroupfilterAction() 0549 { 0550 // Filter-Parameter 0551 $tagGroupId = (int)$this->getParam('group_id', null); 0552 $tagId = (int)$this->getParam('tag_id', null); 0553 0554 $this->storeFilterTagInCookie($tagGroupId, $tagId); 0555 0556 $response = array(); 0557 $response['Result'] = 'OK'; 0558 $this->_helper->json($response); 0559 } 0560 0561 }