diff --git a/patches/2.0.0/media/zoo/applications/jbuniversal/framework/helpers/jbimport.php b/patches/2.0.0/media/zoo/applications/jbuniversal/framework/helpers/jbimport.php index cdd0c31..8fb15b4 100644 --- a/patches/2.0.0/media/zoo/applications/jbuniversal/framework/helpers/jbimport.php +++ b/patches/2.0.0/media/zoo/applications/jbuniversal/framework/helpers/jbimport.php @@ -1,562 +1,562 @@ - - */ - -// no direct access -defined('_JEXEC') or die('Restricted access'); - - -/** - * Class JBImportHelper - */ -class JBImportHelper extends AppHelper -{ - const STEP_SIZE = 20; - - const LOSE_NONE = 0; - const LOSE_DISABLE = 1; - const LOSE_REMOVE = 2; - - const KEY_NONE = 0; - const KEY_ID = 1; - const KEY_NAME = 2; - const KEY_ALIAS = 3; - const KEY_SKU = 4; - - const OPTIONS_NO = 0; - const OPTIONS_YES = 1; - - /** - * @var JSONData - */ - protected $_data = null; - - /** - * @param App $app - */ - public function __construct($app) - { - parent::__construct($app); - - // make sure the line endings are recognized irrespective of the OS - $this->app->jbenv->maxPerfomance(); - ini_set('auto_detect_line_endings', true); - } - - /** - * Get info for pre import step - * @param string $file - * @param array $options - * @return array - */ - public function getInfo($file, $options) - { - $options = $this->app->data->create($options); - - $info = array(); - - // get applications - $applist = JBModelApp::model()->getList(); - if (!empty($applist)) { - $info['applist'] = array(); - foreach ($applist as $app) { - $info['applist'][$app->id] = $app->name; - } - - reset($applist); - $application = current($applist); - - $info['app'] = current($applist); - } - - // get types - $info['types'] = array(); - foreach ($info['app']->getTypes() as $type) { - $info['types'][$type->id] = array(); - - foreach ($type->getElements() as $element) { - // filter elements - $info['types'][$type->id][$element->getElementType()][] = $element; - } - - } - - $info['item_count'] = 0; - $info['columns'] = array(); - - // get params - $separator = $options->get('separator', ',') ? $options->get('separator', ',') : ','; - $enclosure = $options->get('enclosure', '"') ? $options->get('enclosure', '"') : '"'; - $containsHeaders = (int)$options->get('header', 1); - - // get column names and row count - $rowCount = 0; - if (($handle = fopen($file, "r")) !== false) { - - while (($data = fgetcsv($handle, 0, $separator, $enclosure)) !== false) { - - if ($rowCount == 0) { - if ($containsHeaders) { - $info['columns'] = $data; - } else { - $info['columns'] = array_fill(0, count($data), ''); - } - } - - $rowCount++; - } - fclose($handle); - } - - $info['count'] = $containsHeaders ? $rowCount - 1 : $rowCount; - - return $info; - } - - /** - * @param $info - * @return array - */ - public function itemsControls($info) - { - $html = array(); - $htmlHelper = $this->app->html; - - $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_APP') . ' -')); - $options += $info['applist']; - $html['apps'] = $htmlHelper->_('select.genericlist', $options, 'appid'); - - $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_TYPE') . ' -')); - $html['types'] = $htmlHelper->_('zoo.typelist', $info['app'], $options, 'typeid', null, 'value', 'text'); - - $html['fields_types'] = array(); - foreach ($info['types'] as $typeid => $element_types) { - $html['fields_types'][$typeid] = $this->_createItemsControl($typeid, $element_types); - } - - // lose control - $loseOptions = array( - $htmlHelper->_('select.option', self::LOSE_NONE, JText::_('JBZOO_IMPORT_LOSE_NONE')), - $htmlHelper->_('select.option', self::LOSE_DISABLE, JText::_('JBZOO_IMPORT_LOSE_DISABLE')), - $htmlHelper->_('select.option', self::LOSE_REMOVE, JText::_('JBZOO_IMPORT_LOSE_REMOVE')), - ); - $html['lose'] = $htmlHelper->_('select.genericlist', $loseOptions, 'lose'); - - // what field is key - $keyOptions = array( - $htmlHelper->_('select.option', self::KEY_NONE, JText::_('JBZOO_IMPORT_KEY_NONE')), - $htmlHelper->_('select.option', self::KEY_ID, JText::_('JBZOO_IMPORT_KEY_ID')), - $htmlHelper->_('select.option', self::KEY_NAME, JText::_('JBZOO_IMPORT_KEY_NAME')), - $htmlHelper->_('select.option', self::KEY_ALIAS, JText::_('JBZOO_IMPORT_KEY_ALIAS')), - $htmlHelper->_('select.option', self::KEY_SKU, JText::_('JBZOO_IMPORT_KEY_SKU')), - ); - $html['key'] = $htmlHelper->_('select.genericlist', $keyOptions, 'key'); - - // check options config - $checkOptions = array( - $htmlHelper->_('select.option', self::OPTIONS_NO, JText::_('JBZOO_IMPORT_CHECK_OPTION_NO')), - $htmlHelper->_('select.option', self::OPTIONS_YES, JText::_('JBZOO_IMPORT_CHECK_OPTION_YES')), - ); - $html['checkOptions'] = $htmlHelper->_('select.genericlist', $checkOptions, 'checkOptions'); - - return $html; - } - - /** - * @param $info - * @return array - */ - public function categoriesControls($info) - { - $html = array(); - $htmlHelper = $this->app->html; - - $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_APP') . ' -')); - $options += $info['applist']; - $html['apps'] = $htmlHelper->_('select.genericlist', $options, 'appid'); - - $html['fields_types'] = $this->_createCategoriesControl('categoryFileds'); - - // lose control - $loseOptions = array( - $htmlHelper->_('select.option', self::LOSE_NONE, JText::_('JBZOO_IMPORT_LOSE_NONE')), - $htmlHelper->_('select.option', self::LOSE_DISABLE, JText::_('JBZOO_IMPORT_LOSE_DISABLE')), - $htmlHelper->_('select.option', self::LOSE_REMOVE, JText::_('JBZOO_IMPORT_LOSE_REMOVE')), - ); - $html['lose'] = $htmlHelper->_('select.genericlist', $loseOptions, 'lose'); - - // what field is key - $keyOptions = array( - $htmlHelper->_('select.option', self::KEY_NONE, JText::_('JBZOO_IMPORT_KEY_NONE')), - $htmlHelper->_('select.option', self::KEY_ID, JText::_('JBZOO_IMPORT_KEY_ID')), - $htmlHelper->_('select.option', self::KEY_NAME, JText::_('JBZOO_IMPORT_KEY_NAME')), - $htmlHelper->_('select.option', self::KEY_ALIAS, JText::_('JBZOO_IMPORT_KEY_ALIAS')), - ); - $html['key'] = $htmlHelper->_('select.genericlist', $keyOptions, 'key'); - - return $html; - } - - /** - * Create fields control for item - * @param $typeid - * @param $elementTypes - */ - protected function _createItemsControl($typeid, $elementTypes) - { - $htmlHelper = $this->app->html; - - $fields = $this->app->jbcsvmapper->getItemFields($elementTypes); - $options = array($htmlHelper->_('select.option', '', ' ** ')); - - foreach ($fields as $groupKey => $group) { - - $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . strtoupper($groupKey))); - - foreach ($group as $fieldKey => $field) { - $options[] = $htmlHelper->_('select.option', $fieldKey, $field); - } - - $options[] = $htmlHelper->_('select.option', ''); - } - - return $htmlHelper->_( - 'select.genericlist', - $options, - 'assign[' . $typeid . '][__name_placeholder__]', - 'class="type-select type-select-' . $typeid . '"' - ); - } - - /** - * Create fields control for category - */ - protected function _createCategoriesControl() - { - $htmlHelper = $this->app->html; - - $fields = $this->app->jbcsvmapper->getCategoryFields(); - $options = array($htmlHelper->_('select.option', '', ' ** ')); - - foreach ($fields as $groupKey => $group) { - - $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . strtoupper($groupKey))); - - foreach ($group as $fieldKey => $field) { - $options[] = $htmlHelper->_('select.option', $fieldKey, $field); - } - - $options[] = $htmlHelper->_('select.option', ''); - } - - return $htmlHelper->_('select.genericlist', $options, 'assign[]', 'class="type-select"'); - } - - /** - * @return string - */ - public function getTmpFilename() - { - $tmp = $this->app->path->path('tmp:'); - return JPath::clean($tmp . '/' . uniqid('jbimport_') . '.csv'); - } - - /** - * Get import data from session - * @return JSONData - */ - protected function _initSessionData() - { - $data = $this->app->jbsession->getGroup('import'); - $this->_data = $this->app->data->create($data); - - return $this->_data; - } - - /** - * Get last line in CSV file - * @param int $step - * @return int - */ - protected function _getLastLine($step = 0) - { - $lastLine = self::STEP_SIZE * $step; - if ((int)$this->_data->header) { - $lastLine++; - } - - return $lastLine; - } - - /** - * Get lines from CSV file for current step - * @param string $file - * @param int $lastLine - * @return array - */ - protected function _getCSVLines($file, $lastLine) - { - return $this->app->jbcsv->getLinesfromFile($file, $this->_data, $lastLine, self::STEP_SIZE); - } - - /** - * Process one Item row - * @param array $row - * @param int $lineKey - * @return int - */ - protected function _processItemRow($row, $lineKey) - { - // create item - $item = $this->_getItemByKey($row, $lineKey); - - $positions = array(); - - // bind import data from CSV - foreach ($this->_data->assign as $colKey => $itemField) { - - $itemField = JString::trim($itemField); - if (!empty($itemField)) { - - $value = isset($row[$colKey]) ? $row[$colKey] : null; - - $fieldInfo = $this->app->jbcsvmapper->itemFieldToMeta($itemField); - - $positionKey = implode('__', $fieldInfo); - if (!isset($positions[$positionKey])) { - $positions[$positionKey] = 0; - } - $positions[$positionKey]++; - - $cellElem = $this->app->jbcsvcell->createItem($fieldInfo['name'], $item, $fieldInfo['group'], $fieldInfo); - $cellElem->fromCSV($value, $positions[$positionKey]); - } - } - - $id = $item->id; - - // save all changes - $item->getParams()->set('jbzoo.no_index', 0); - $this->app->table->item->save($item); - - // clean memory - unset($item); - - return $id; - } - - /** - * Process one Category row - * @param array $row - * @param int $lineKey - * @return int - */ - protected function _processCategoryRow($row, $lineKey) - { - // create item - $category = $this->_getCategoryByKey($row, $lineKey); - - // bind import data from CSV - foreach ($this->_data->assign as $colKey => $itemField) { - - $itemField = JString::trim($itemField); - if (!empty($itemField)) { - - $value = isset($row[$colKey]) ? $row[$colKey] : null; - - $fieldInfo = $this->app->jbcsvmapper->categoryFieldToMeta($itemField); - $positionKey = implode('__', $fieldInfo); - - $cellElem = $this->app->jbcsvcell->createCategory($fieldInfo['name'], $category, $fieldInfo['group'], $fieldInfo); - $cellElem->fromCSV($value); - } - } - - $id = $category->id; - - // save all changes - $this->app->table->category->save($category); - - // clean memory - unset($category); - - return $id; - } - - /** - * Get key field value - * @param array $row - * @param string $lineKey - * @return Item - */ - protected function _getItemByKey($row, $lineKey = null) - { - $item = null; - - if ($this->_data->key != self::KEY_NONE) { - foreach ($this->_data->assign as $csvKey => $fieldName) { - - if ($this->_data->key == self::KEY_ID && $fieldName == 'id') { - $item = JBModelItem::model()->getById(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_NAME && $fieldName == 'name') { - $item = JBModelItem::model()->getByName(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_ALIAS && $fieldName == 'alias') { - $item = JBModelItem::model()->getByAlias(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_SKU && $fieldName == 'sku') { - $item = JBModelItem::model()->getBySku(JString::trim($row[$csvKey]), $this->_data->appid); - break; - } - } - } - - if (!$item) { - $item = JBModelItem::model()->createEmpty($this->_data->appid, $this->_data->typeid, $lineKey); - } - - return $item; - } - - /** - * Get key field value - * @param array $row - * @param string $lineKey - * @return Item - */ - protected function _getCategoryByKey($row, $lineKey = null) - { - $category = null; - - if ($this->_data->key != self::KEY_NONE) { - foreach ($this->_data->assign as $csvKey => $fieldName) { - - if ($this->_data->key == self::KEY_ID && $fieldName == 'id') { - $category = JBModelCategory::model()->getById(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_NAME && $fieldName == 'name') { - $category = JBModelCategory::model()->getByName(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_ALIAS && $fieldName == 'alias') { - $category = JBModelCategory::model()->getByAlias(JString::trim($row[$csvKey]), $this->_data->appid); - break; - } - } - } - - if (!$category) { - $category = JBModelCategory::model()->createEmpty($this->_data->appid, $lineKey); - } - - return $category; - } - - /** - * One step precess for items - * @param int $step - * @return array - */ - public function itemsProcess($step = 0) - { - $this->_initSessionData(); - - $lastLine = $this->_getLastLine($step); - $lines = $this->_getCSVLines($this->_data->file, $lastLine, $step); - - $lineKey = 0; - $addedIds = ($step == 0) ? array() : $this->app->jbsession->get('ids', 'import-ids'); - - if (!empty($lines)) { - foreach ($lines as $key => $row) { - $lineKey = $lastLine + $key; - $addedIds[] = $this->_processItemRow($row, $lineKey); - } - } - - $this->app->jbsession->set('ids', $addedIds, 'import-ids'); - - return array('progress' => round(($lineKey / $this->_data->count) * 100, 2)); - } - - /** - * One step precess for categories - * @param int $step - * @return array - */ - public function categoriesProcess($step = 0) - { - $this->_initSessionData(); - - $lastLine = $this->_getLastLine($step); - $lines = $this->_getCSVLines($this->_data->file, $lastLine, $step); - - $lineKey = 0; - $addedIds = ($step == 0) ? array() : $this->app->jbsession->get('ids', 'import-ids'); - - if (!empty($lines)) { - foreach ($lines as $key => $row) { - $lineKey = $lastLine + $key; - $addedIds[] = $this->_processCategoryRow($row, $lineKey); - } - } - - $this->app->jbsession->set('ids', $addedIds, 'import-ids'); - - return array('progress' => round(($lineKey / $this->_data->count) * 100, 2)); - } - - /** - * Call after all items loaded - */ - public function itemsPostProcess() - { - $addedIds = $this->app->jbsession->get('ids', 'import-ids'); - $this->_initSessionData(); - - if ($this->_data->lose == self::LOSE_DISABLE) { - JBModelItem::model()->disableAll($this->_data->appid, $this->_data->typeid, $addedIds); - - } else if ($this->_data->lose == self::LOSE_REMOVE) { - JBModelItem::model()->removeAll($this->_data->appid, $this->_data->typeid, $addedIds); - } - - $this->app->jbsession->clearGroup('import-ids'); - } - - /** - * Call after all items loaded - */ - public function categoriesPostProcess() - { - $addedIds = $this->app->jbsession->get('ids', 'import-ids'); - $this->_initSessionData(); - - if ($this->_data->lose == self::LOSE_DISABLE) { - JBModelCategory::model()->disableAll($this->_data->appid, $addedIds); - - } else if ($this->_data->lose == self::LOSE_REMOVE) { - JBModelCategory::model()->removeAll($this->_data->appid, $addedIds); - } - - $this->app->jbsession->clearGroup('import-ids'); - } - - -} + + */ + +// no direct access +defined('_JEXEC') or die('Restricted access'); + + +/** + * Class JBImportHelper + */ +class JBImportHelper extends AppHelper +{ + const STEP_SIZE = 20; + + const LOSE_NONE = 0; + const LOSE_DISABLE = 1; + const LOSE_REMOVE = 2; + + const KEY_NONE = 0; + const KEY_ID = 1; + const KEY_NAME = 2; + const KEY_ALIAS = 3; + const KEY_SKU = 4; + + const OPTIONS_NO = 0; + const OPTIONS_YES = 1; + + /** + * @var JSONData + */ + protected $_data = null; + + /** + * @param App $app + */ + public function __construct($app) + { + parent::__construct($app); + + // make sure the line endings are recognized irrespective of the OS + $this->app->jbenv->maxPerfomance(); + ini_set('auto_detect_line_endings', true); + } + + /** + * Get info for pre import step + * @param string $file + * @param array $options + * @return array + */ + public function getInfo($file, $options) + { + $options = $this->app->data->create($options); + + $info = array(); + + // get applications + $applist = JBModelApp::model()->getList(); + if (!empty($applist)) { + $info['applist'] = array(); + foreach ($applist as $app) { + $info['applist'][$app->id] = $app->name; + } + + reset($applist); + $application = current($applist); + + $info['app'] = current($applist); + } + + // get types + $info['types'] = array(); + foreach ($info['app']->getTypes() as $type) { + $info['types'][$type->id] = array(); + + foreach ($type->getElements() as $element) { + // filter elements + $info['types'][$type->id][$element->getElementType()][] = $element; + } + + } + + $info['item_count'] = 0; + $info['columns'] = array(); + + // get params + $separator = $options->get('separator', ',') ? $options->get('separator', ',') : ','; + $enclosure = $options->get('enclosure', '"') ? $options->get('enclosure', '"') : '"'; + $containsHeaders = (int)$options->get('header', 1); + + // get column names and row count + $rowCount = 0; + if (($handle = fopen($file, "r")) !== false) { + + while (($data = fgetcsv($handle, 0, $separator, $enclosure)) !== false) { + + if ($rowCount == 0) { + if ($containsHeaders) { + $info['columns'] = $data; + } else { + $info['columns'] = array_fill(0, count($data), ''); + } + } + + $rowCount++; + } + fclose($handle); + } + + $info['count'] = $containsHeaders ? $rowCount - 1 : $rowCount; + + return $info; + } + + /** + * @param $info + * @return array + */ + public function itemsControls($info) + { + $html = array(); + $htmlHelper = $this->app->html; + + $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_APP') . ' -')); + $options += $info['applist']; + $html['apps'] = $htmlHelper->_('select.genericlist', $options, 'appid'); + + $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_TYPE') . ' -')); + $html['types'] = $htmlHelper->_('zoo.typelist', $info['app'], $options, 'typeid', null, 'value', 'text'); + + $html['fields_types'] = array(); + foreach ($info['types'] as $typeid => $element_types) { + $html['fields_types'][$typeid] = $this->_createItemsControl($typeid, $element_types); + } + + // lose control + $loseOptions = array( + $htmlHelper->_('select.option', self::LOSE_NONE, JText::_('JBZOO_IMPORT_LOSE_NONE')), + $htmlHelper->_('select.option', self::LOSE_DISABLE, JText::_('JBZOO_IMPORT_LOSE_DISABLE')), + $htmlHelper->_('select.option', self::LOSE_REMOVE, JText::_('JBZOO_IMPORT_LOSE_REMOVE')), + ); + $html['lose'] = $htmlHelper->_('select.genericlist', $loseOptions, 'lose'); + + // what field is key + $keyOptions = array( + $htmlHelper->_('select.option', self::KEY_NONE, JText::_('JBZOO_IMPORT_KEY_NONE')), + $htmlHelper->_('select.option', self::KEY_ID, JText::_('JBZOO_IMPORT_KEY_ID')), + $htmlHelper->_('select.option', self::KEY_NAME, JText::_('JBZOO_IMPORT_KEY_NAME')), + $htmlHelper->_('select.option', self::KEY_ALIAS, JText::_('JBZOO_IMPORT_KEY_ALIAS')), + $htmlHelper->_('select.option', self::KEY_SKU, JText::_('JBZOO_IMPORT_KEY_SKU')), + ); + $html['key'] = $htmlHelper->_('select.genericlist', $keyOptions, 'key'); + + // check options config + $checkOptions = array( + $htmlHelper->_('select.option', self::OPTIONS_NO, JText::_('JBZOO_IMPORT_CHECK_OPTION_NO')), + $htmlHelper->_('select.option', self::OPTIONS_YES, JText::_('JBZOO_IMPORT_CHECK_OPTION_YES')), + ); + $html['checkOptions'] = $htmlHelper->_('select.genericlist', $checkOptions, 'checkOptions'); + + return $html; + } + + /** + * @param $info + * @return array + */ + public function categoriesControls($info) + { + $html = array(); + $htmlHelper = $this->app->html; + + $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_APP') . ' -')); + $options += $info['applist']; + $html['apps'] = $htmlHelper->_('select.genericlist', $options, 'appid'); + + $html['fields_types'] = $this->_createCategoriesControl('categoryFileds'); + + // lose control + $loseOptions = array( + $htmlHelper->_('select.option', self::LOSE_NONE, JText::_('JBZOO_IMPORT_LOSE_NONE')), + $htmlHelper->_('select.option', self::LOSE_DISABLE, JText::_('JBZOO_IMPORT_LOSE_DISABLE')), + $htmlHelper->_('select.option', self::LOSE_REMOVE, JText::_('JBZOO_IMPORT_LOSE_REMOVE')), + ); + $html['lose'] = $htmlHelper->_('select.genericlist', $loseOptions, 'lose'); + + // what field is key + $keyOptions = array( + $htmlHelper->_('select.option', self::KEY_NONE, JText::_('JBZOO_IMPORT_KEY_NONE')), + $htmlHelper->_('select.option', self::KEY_ID, JText::_('JBZOO_IMPORT_KEY_ID')), + $htmlHelper->_('select.option', self::KEY_NAME, JText::_('JBZOO_IMPORT_KEY_NAME')), + $htmlHelper->_('select.option', self::KEY_ALIAS, JText::_('JBZOO_IMPORT_KEY_ALIAS')), + ); + $html['key'] = $htmlHelper->_('select.genericlist', $keyOptions, 'key'); + + return $html; + } + + /** + * Create fields control for item + * @param $typeid + * @param $elementTypes + */ + protected function _createItemsControl($typeid, $elementTypes) + { + $htmlHelper = $this->app->html; + + $fields = $this->app->jbcsvmapper->getItemFields($elementTypes); + $options = array($htmlHelper->_('select.option', '', ' ** ')); + + foreach ($fields as $groupKey => $group) { + + $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . strtoupper($groupKey))); + + foreach ($group as $fieldKey => $field) { + $options[] = $htmlHelper->_('select.option', $fieldKey, $field); + } + + $options[] = $htmlHelper->_('select.option', ''); + } + + return $htmlHelper->_( + 'select.genericlist', + $options, + 'assign[' . $typeid . '][__name_placeholder__]', + 'class="type-select type-select-' . $typeid . '"' + ); + } + + /** + * Create fields control for category + */ + protected function _createCategoriesControl() + { + $htmlHelper = $this->app->html; + + $fields = $this->app->jbcsvmapper->getCategoryFields(); + $options = array($htmlHelper->_('select.option', '', ' ** ')); + + foreach ($fields as $groupKey => $group) { + + $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . strtoupper($groupKey))); + + foreach ($group as $fieldKey => $field) { + $options[] = $htmlHelper->_('select.option', $fieldKey, $field); + } + + $options[] = $htmlHelper->_('select.option', ''); + } + + return $htmlHelper->_('select.genericlist', $options, 'assign[]', 'class="type-select"'); + } + + /** + * @return string + */ + public function getTmpFilename() + { + $tmp = $this->app->path->path('tmp:'); + return JPath::clean($tmp . '/' . uniqid('jbimport_') . '.csv'); + } + + /** + * Get import data from session + * @return JSONData + */ + protected function _initSessionData() + { + $data = $this->app->jbsession->getGroup('import'); + $this->_data = $this->app->data->create($data); + + return $this->_data; + } + + /** + * Get last line in CSV file + * @param int $step + * @return int + */ + protected function _getLastLine($step = 0) + { + $lastLine = self::STEP_SIZE * $step; + if ((int)$this->_data->header) { + $lastLine++; + } + + return $lastLine; + } + + /** + * Get lines from CSV file for current step + * @param string $file + * @param int $lastLine + * @return array + */ + protected function _getCSVLines($file, $lastLine) + { + return $this->app->jbcsv->getLinesfromFile($file, $this->_data, $lastLine, self::STEP_SIZE); + } + + /** + * Process one Item row + * @param array $row + * @param int $lineKey + * @return int + */ + protected function _processItemRow($row, $lineKey) + { + // create item + $item = $this->_getItemByKey($row, $lineKey); + + $positions = array(); + + // bind import data from CSV + foreach ($this->_data->assign as $colKey => $itemField) { + + $itemField = JString::trim($itemField); + if (!empty($itemField)) { + + $value = isset($row[$colKey]) ? $row[$colKey] : null; + + $fieldInfo = $this->app->jbcsvmapper->itemFieldToMeta($itemField); + + $positionKey = implode('__', $fieldInfo); + if (!isset($positions[$positionKey])) { + $positions[$positionKey] = 0; + } + $positions[$positionKey]++; + + $cellElem = $this->app->jbcsvcell->createItem($fieldInfo['name'], $item, $fieldInfo['group'], $fieldInfo); + $cellElem->fromCSV($value, $positions[$positionKey]); + } + } + + $id = $item->id; + + // save all changes + $item->getParams()->set('jbzoo.no_index', 0); + $this->app->table->item->save($item); + + // clean memory + unset($item); + + return $id; + } + + /** + * Process one Category row + * @param array $row + * @param int $lineKey + * @return int + */ + protected function _processCategoryRow($row, $lineKey) + { + // create item + $category = $this->_getCategoryByKey($row, $lineKey); + + // bind import data from CSV + foreach ($this->_data->assign as $colKey => $itemField) { + + $itemField = JString::trim($itemField); + if (!empty($itemField)) { + + $value = isset($row[$colKey]) ? $row[$colKey] : null; + + $fieldInfo = $this->app->jbcsvmapper->categoryFieldToMeta($itemField); + $positionKey = implode('__', $fieldInfo); + + $cellElem = $this->app->jbcsvcell->createCategory($fieldInfo['name'], $category, $fieldInfo['group'], $fieldInfo); + $cellElem->fromCSV($value); + } + } + + $id = $category->id; + + // save all changes + $this->app->table->category->save($category); + + // clean memory + unset($category); + + return $id; + } + + /** + * Get key field value + * @param array $row + * @param string $lineKey + * @return Item + */ + protected function _getItemByKey($row, $lineKey = null) + { + $item = null; + + if ($this->_data->key != self::KEY_NONE) { + foreach ($this->_data->assign as $csvKey => $fieldName) { + + if ($this->_data->key == self::KEY_ID && $fieldName == 'id') { + $item = JBModelItem::model()->getById(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_NAME && $fieldName == 'name') { + $item = JBModelItem::model()->getByName(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_ALIAS && $fieldName == 'alias') { + $item = JBModelItem::model()->getByAlias(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_SKU && $fieldName == 'sku') { + $item = JBModelItem::model()->getBySku(JString::trim($row[$csvKey]), $this->_data->appid); + break; + } + } + } + + if (!$item) { + $item = JBModelItem::model()->createEmpty($this->_data->appid, $this->_data->typeid, $lineKey); + } + + return $item; + } + + /** + * Get key field value + * @param array $row + * @param string $lineKey + * @return Item + */ + protected function _getCategoryByKey($row, $lineKey = null) + { + $category = null; + + if ($this->_data->key != self::KEY_NONE) { + foreach ($this->_data->assign as $csvKey => $fieldName) { + + if ($this->_data->key == self::KEY_ID && $fieldName == 'id') { + $category = JBModelCategory::model()->getById(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_NAME && $fieldName == 'name') { + $category = JBModelCategory::model()->getByName(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_ALIAS && $fieldName == 'alias') { + $category = JBModelCategory::model()->getByAlias(JString::trim($row[$csvKey]), $this->_data->appid); + break; + } + } + } + + if (!$category) { + $category = JBModelCategory::model()->createEmpty($this->_data->appid, $lineKey); + } + + return $category; + } + + /** + * One step precess for items + * @param int $step + * @return array + */ + public function itemsProcess($step = 0) + { + $this->_initSessionData(); + + $lastLine = $this->_getLastLine($step); + $lines = $this->_getCSVLines($this->_data->file, $lastLine, $step); + + $lineKey = 0; + $addedIds = ($step == 0) ? array() : $this->app->jbsession->get('ids', 'import-ids'); + + if (!empty($lines)) { + foreach ($lines as $key => $row) { + $lineKey = $lastLine + $key; + $addedIds[] = $this->_processItemRow($row, $lineKey); + } + } + + $this->app->jbsession->set('ids', $addedIds, 'import-ids'); + + return array('progress' => round(($lineKey / $this->_data->count) * 100, 2)); + } + + /** + * One step precess for categories + * @param int $step + * @return array + */ + public function categoriesProcess($step = 0) + { + $this->_initSessionData(); + + $lastLine = $this->_getLastLine($step); + $lines = $this->_getCSVLines($this->_data->file, $lastLine, $step); + + $lineKey = 0; + $addedIds = ($step == 0) ? array() : $this->app->jbsession->get('ids', 'import-ids'); + + if (!empty($lines)) { + foreach ($lines as $key => $row) { + $lineKey = $lastLine + $key; + $addedIds[] = $this->_processCategoryRow($row, $lineKey); + } + } + + $this->app->jbsession->set('ids', $addedIds, 'import-ids'); + + return array('progress' => round(($lineKey / $this->_data->count) * 100, 2)); + } + + /** + * Call after all items loaded + */ + public function itemsPostProcess() + { + $addedIds = $this->app->jbsession->get('ids', 'import-ids'); + $this->_initSessionData(); + + if ($this->_data->lose == self::LOSE_DISABLE) { + JBModelItem::model()->disableAll($this->_data->appid, $this->_data->typeid, $addedIds); + + } else if ($this->_data->lose == self::LOSE_REMOVE) { + JBModelItem::model()->removeAll($this->_data->appid, $this->_data->typeid, $addedIds); + } + + $this->app->jbsession->clearGroup('import-ids'); + } + + /** + * Call after all items loaded + */ + public function categoriesPostProcess() + { + $addedIds = $this->app->jbsession->get('ids', 'import-ids'); + $this->_initSessionData(); + + if ($this->_data->lose == self::LOSE_DISABLE) { + JBModelCategory::model()->disableAll($this->_data->appid, $addedIds); + + } else if ($this->_data->lose == self::LOSE_REMOVE) { + JBModelCategory::model()->removeAll($this->_data->appid, $addedIds); + } + + $this->app->jbsession->clearGroup('import-ids'); + } + + +} diff --git a/patches/2.0.0/media/zoo/applications/jbuniversal/framework/jbzoo.php b/patches/2.0.0/media/zoo/applications/jbuniversal/framework/jbzoo.php index df5d0fa..00eb113 100644 --- a/patches/2.0.0/media/zoo/applications/jbuniversal/framework/jbzoo.php +++ b/patches/2.0.0/media/zoo/applications/jbuniversal/framework/jbzoo.php @@ -1 +1,374 @@ - */ // no direct access defined('_JEXEC') or die('Restricted access'); !defined('JBZOO_APP_GROUP') && define('JBZOO_APP_GROUP', 'jbuniversal'); !defined('DIRECTORY_SEPERATOR') && define('DIRECTORY_SEPERATOR', '/'); !defined('DS') && define('DS', DIRECTORY_SEPARATOR); /** * Class JBZoo */ class JBZoo { /** * @var Application */ public $app = null; /** * App group name * @var string */ private $_group = JBZOO_APP_GROUP; /** * Init JBZoo application * @static * @return JBZoo */ public static function init() { static $jbzoo; if (!isset($jbzoo)) { $jbzoo = new self(); } return $jbzoo; } /** * Initialization JBZoo App */ private function __construct() { $this->app = App::getInstance('zoo'); $this->_initPaths(); $this->_initConfig(); $this->_initModels(); $this->_initLanguages(); $this->_initFilterElements(); $this->_initEvents(); $this->_initAssets(); } /** * Add directory path */ private function _initPaths() { $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); $this->_addPath('jbapp:framework', 'jbzoo'); $this->_addPath('jbapp:assets', 'jbassets'); $this->_addPath('jbassets:zoo', 'assets'); $this->_addPath('jbapp:config', 'jbconfig'); $this->_addPath('jbzoo:elements', 'jbelements'); $this->_addPath('jbapp:types', 'jbtypes'); $this->_addPath('jbzoo:helpers', 'helpers'); $this->_addPath('jbzoo:helpers-std', 'helpers'); $this->_addPath('jbzoo:render', 'renderer'); $this->_addPath('jbzoo:controllers/views', 'jbviews'); $this->_addPath('jbapp:config', 'jbxml'); $this->_addPath('jbapp:joomla/elements', 'fields'); $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); $this->_addPath('jbapp:templates', 'jbtmpl'); if ($this->app->jbenv->isSite()) { $this->_addPath('jbzoo:controllers', 'controllers'); } $this->app->jbdebug->mark('init::paths'); } /** * Include models classes */ private function _initModels() { // defines define('ZOO_TABLE_JBZOO_INDEX', '#__zoo_jbzoo_index'); define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); // query builder $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/classes'; require $path . '/database/JBDatabaseQuery.php'; require $path . '/database/JBDatabaseQueryElement.php'; // models $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/models'; require $path . '/jbmodel.php'; require $path . '/jbmodel.element.php'; require $path . '/jbmodel.autocomplete.php'; require $path . '/jbmodel.element.country.php'; require $path . '/jbmodel.element.itemdate.php'; require $path . '/jbmodel.element.itemauthor.php'; require $path . '/jbmodel.element.itemcategory.php'; require $path . '/jbmodel.element.itemcreated.php'; require $path . '/jbmodel.element.itemfrontpage.php'; require $path . '/jbmodel.element.itemmodified.php'; require $path . '/jbmodel.element.itemname.php'; require $path . '/jbmodel.element.itempublish_down.php'; require $path . '/jbmodel.element.itempublish_up.php'; require $path . '/jbmodel.element.itemtag.php'; require $path . '/jbmodel.element.jbimage.php'; require $path . '/jbmodel.element.jbselectcascade.php'; require $path . '/jbmodel.element.range.php'; require $path . '/jbmodel.element.rating.php'; require $path . '/jbmodel.element.jbpriceadvance.php'; require $path . '/jbmodel.favorite.php'; require $path . '/jbmodel.filter.php'; require $path . '/jbmodel.item.php'; require $path . '/jbmodel.app.php'; require $path . '/jbmodel.category.php'; require $path . '/jbmodel.order.php'; require $path . '/jbmodel.related.php'; require $path . '/jbmodel.searchindex.php'; require $path . '/jbmodel.values.php'; require $path . '/jbmodel.sku.php'; } /** * Load lang files */ private function _initLanguages() { $lang = JFactory::getLanguage(); $lang->load('com_zoo'); $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); $lang->load('com_zoo', JPATH_ADMINISTRATOR); } /** * Load others libraries */ private function _initFilterElements() { jimport('joomla.html.parameter.element'); $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/render/filter'; require $path . '/element.php'; require $path . '/element.author.php'; require $path . '/element.author.checkbox.php'; require $path . '/element.author.radio.php'; require $path . '/element.author.select.php'; require $path . '/element.author.select.chosen.php'; require $path . '/element.author.text.php'; require $path . '/element.category.php'; require $path . '/element.category.chosen.php'; require $path . '/element.checkbox.php'; require $path . '/element.country.php'; require $path . '/element.country.checkbox.php'; require $path . '/element.country.radio.php'; require $path . '/element.country.select.php'; require $path . '/element.country.select.chosen.php'; require $path . '/element.date.php'; require $path . '/element.date.range.php'; require $path . '/element.frontpage.php'; require $path . '/element.frontpage.jqueryui.php'; require $path . '/element.hidden.php'; require $path . '/element.imageexists.php'; require $path . '/element.imageexists.jqueryui.php'; require $path . '/element.jbselectcascade.php'; require $path . '/element.jqueryui.php'; require $path . '/element.name.php'; require $path . '/element.name.checkbox.php'; require $path . '/element.name.radio.php'; require $path . '/element.name.select.php'; require $path . '/element.name.select.chosen.php'; require $path . '/element.radio.php'; require $path . '/element.rating.php'; require $path . '/element.rating.ranges.php'; require $path . '/element.rating.slider.php'; require $path . '/element.select.php'; require $path . '/element.select.chosen.php'; require $path . '/element.slider.php'; require $path . '/element.tag.php'; require $path . '/element.tag.checkbox.php'; require $path . '/element.tag.radio.php'; require $path . '/element.tag.select.php'; require $path . '/element.tag.select.chosen.php'; require $path . '/element.text.php'; require $path . '/element.text.range.php'; } /** * Register and connect events */ private function _initEvents() { $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/events'; require $path . '/jbevent.php'; require $path . '/jbevent.application.php'; require $path . '/jbevent.basket.php'; require $path . '/jbevent.category.php'; require $path . '/jbevent.comment.php'; require $path . '/jbevent.element.php'; require $path . '/jbevent.item.php'; require $path . '/jbevent.jbzoo.php'; require $path . '/jbevent.layout.php'; require $path . '/jbevent.submission.php'; require $path . '/jbevent.tag.php'; require $path . '/jbevent.type.php'; require $path . '/jbevent.payment.php'; $event = $this->app->event; $dispatcher = $event->dispatcher; $event->register('JBEventApplication'); $dispatcher->connect('application:init', array('JBEventApplication', 'init')); $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); $event->register('JBEventCategory'); $dispatcher->connect('category:init', array('JBEventCategory', 'init')); $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); $event->register('JBEventItem'); $dispatcher->connect('item:init', array('JBEventItem', 'init')); $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); $event->register('JBEventComment'); $dispatcher->connect('comment:init', array('JBEventComment', 'init')); $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); $event->register('JBEventSubmission'); $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); $event->register('JBEventElement'); $dispatcher->connect('element:download', array('JBEventElement', 'download')); $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); $event->register('JBEventLayout'); $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); $event->register('JBEventTag'); $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); $event->register('JBEventType'); $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); $dispatcher->connect('type:copied', array('JBEventType', 'copied')); $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); $event->register('JBEventJBZoo'); $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); $event->register('JBEventBasket'); $dispatcher->connect('basket:beforesave', array('JBEventBasket', 'beforeSave')); $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); $event->register('JBEventPayment'); $dispatcher->connect('payment:callback', array('JBEventPayment', 'callback')); } /** * Init assets for admin path */ private function _initAssets() { if (!$this->app->jbenv->isSite()) { $this->app->jbassets->admin(); } } /** * Init config file */ private function _initConfig() { if ($configFile = $this->app->path->path('jbapp:config/config.php')) { require $configFile; } } /** * Get group name * @return string */ private function _getGroup() { return $this->_group; } /** * Register new path in system * @param string $path * @param string $pathName * @return mixed */ private function _addPath($path, $pathName) { if ($fullPath = $this->app->path->path($path)) { return $this->app->path->register($fullPath, $pathName); } return null; } /** * Get domain name * @param bool $isAny * @return string */ static function getDomain($isAny = false) { $domain = ''; if (function_exists('apache_request_headers')) { $headers = apache_request_headers(); $domain = isset($headers['Host']) ? $headers['Host'] : ''; } if ($isAny && !$domain) { $domain = $_SERVER['HTTP_HOST']; } $domain = preg_replace('#^www\.#', '', $domain); list($domain) = explode(':', $domain); return $domain; } } \ No newline at end of file + + */ + +// no direct access +defined('_JEXEC') or die('Restricted access'); + + +!defined('JBZOO_APP_GROUP') && define('JBZOO_APP_GROUP', 'jbuniversal'); +!defined('DIRECTORY_SEPERATOR') && define('DIRECTORY_SEPERATOR', '/'); +!defined('DS') && define('DS', DIRECTORY_SEPARATOR); + +/** + * Class JBZoo + */ +class JBZoo +{ + /** + * @var Application + */ + public $app = null; + + /** + * App group name + * @var string + */ + private $_group = JBZOO_APP_GROUP; + + /** + * Init JBZoo application + * @static + * @return JBZoo + */ + public static function init() + { + static $jbzoo; + + if (!isset($jbzoo)) { + $jbzoo = new self(); + } + + return $jbzoo; + } + + /** + * Initialization JBZoo App + */ + private function __construct() + { + $this->app = App::getInstance('zoo'); + + $this->_initPaths(); + $this->_initConfig(); + $this->_initModels(); + $this->_initLanguages(); + $this->_initFilterElements(); + $this->_initEvents(); + $this->_initAssets(); + } + + /** + * Add directory path + */ + private function _initPaths() + { + $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); + $this->_addPath('jbapp:framework', 'jbzoo'); + $this->_addPath('jbapp:assets', 'jbassets'); + $this->_addPath('jbassets:zoo', 'assets'); + $this->_addPath('jbapp:config', 'jbconfig'); + $this->_addPath('jbzoo:elements', 'jbelements'); + $this->_addPath('jbapp:types', 'jbtypes'); + $this->_addPath('jbzoo:helpers', 'helpers'); + $this->_addPath('jbzoo:helpers-std', 'helpers'); + $this->_addPath('jbzoo:render', 'renderer'); + $this->_addPath('jbzoo:controllers/views', 'jbviews'); + $this->_addPath('jbapp:config', 'jbxml'); + $this->_addPath('jbapp:joomla/elements', 'fields'); + $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); + $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); + $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); + $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); + $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); + $this->_addPath('jbapp:templates', 'jbtmpl'); + + if ($this->app->jbenv->isSite()) { + $this->_addPath('jbzoo:controllers', 'controllers'); + } + + $this->app->jbdebug->mark('init::paths'); + } + + /** + * Include models classes + */ + private function _initModels() + { + // defines + define('ZOO_TABLE_JBZOO_INDEX', '#__zoo_jbzoo_index'); + define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); + define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); + + // query builder + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/classes'; + require $path . '/database/JBDatabaseQuery.php'; + require $path . '/database/JBDatabaseQueryElement.php'; + + // models + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/models'; + require $path . '/jbmodel.php'; + require $path . '/jbmodel.element.php'; + require $path . '/jbmodel.autocomplete.php'; + require $path . '/jbmodel.element.country.php'; + require $path . '/jbmodel.element.itemdate.php'; + require $path . '/jbmodel.element.itemauthor.php'; + require $path . '/jbmodel.element.itemcategory.php'; + require $path . '/jbmodel.element.itemcreated.php'; + require $path . '/jbmodel.element.itemfrontpage.php'; + require $path . '/jbmodel.element.itemmodified.php'; + require $path . '/jbmodel.element.itemname.php'; + require $path . '/jbmodel.element.itempublish_down.php'; + require $path . '/jbmodel.element.itempublish_up.php'; + require $path . '/jbmodel.element.itemtag.php'; + require $path . '/jbmodel.element.jbimage.php'; + require $path . '/jbmodel.element.jbselectcascade.php'; + require $path . '/jbmodel.element.range.php'; + require $path . '/jbmodel.element.rating.php'; + require $path . '/jbmodel.element.jbpriceadvance.php'; + require $path . '/jbmodel.favorite.php'; + require $path . '/jbmodel.filter.php'; + require $path . '/jbmodel.item.php'; + require $path . '/jbmodel.app.php'; + require $path . '/jbmodel.category.php'; + require $path . '/jbmodel.order.php'; + require $path . '/jbmodel.related.php'; + require $path . '/jbmodel.searchindex.php'; + require $path . '/jbmodel.values.php'; + require $path . '/jbmodel.sku.php'; + } + + /** + * Load lang files + */ + private function _initLanguages() + { + $lang = JFactory::getLanguage(); + $lang->load('com_zoo'); + $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); + $lang->load('com_zoo', JPATH_ADMINISTRATOR); + } + + /** + * Load others libraries + */ + private function _initFilterElements() + { + jimport('joomla.html.parameter.element'); + + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/render/filter'; + require $path . '/element.php'; + require $path . '/element.author.php'; + require $path . '/element.author.checkbox.php'; + require $path . '/element.author.radio.php'; + require $path . '/element.author.select.php'; + require $path . '/element.author.select.chosen.php'; + require $path . '/element.author.text.php'; + require $path . '/element.category.php'; + require $path . '/element.category.chosen.php'; + require $path . '/element.checkbox.php'; + require $path . '/element.country.php'; + require $path . '/element.country.checkbox.php'; + require $path . '/element.country.radio.php'; + require $path . '/element.country.select.php'; + require $path . '/element.country.select.chosen.php'; + require $path . '/element.date.php'; + require $path . '/element.date.range.php'; + require $path . '/element.frontpage.php'; + require $path . '/element.frontpage.jqueryui.php'; + require $path . '/element.hidden.php'; + require $path . '/element.imageexists.php'; + require $path . '/element.imageexists.jqueryui.php'; + require $path . '/element.jbselectcascade.php'; + require $path . '/element.jqueryui.php'; + require $path . '/element.name.php'; + require $path . '/element.name.checkbox.php'; + require $path . '/element.name.radio.php'; + require $path . '/element.name.select.php'; + require $path . '/element.name.select.chosen.php'; + require $path . '/element.radio.php'; + require $path . '/element.rating.php'; + require $path . '/element.rating.ranges.php'; + require $path . '/element.rating.slider.php'; + require $path . '/element.select.php'; + require $path . '/element.select.chosen.php'; + require $path . '/element.slider.php'; + require $path . '/element.tag.php'; + require $path . '/element.tag.checkbox.php'; + require $path . '/element.tag.radio.php'; + require $path . '/element.tag.select.php'; + require $path . '/element.tag.select.chosen.php'; + require $path . '/element.text.php'; + require $path . '/element.text.range.php'; + } + + /** + * Register and connect events + */ + private function _initEvents() + { + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/events'; + require $path . '/jbevent.php'; + require $path . '/jbevent.application.php'; + require $path . '/jbevent.basket.php'; + require $path . '/jbevent.category.php'; + require $path . '/jbevent.comment.php'; + require $path . '/jbevent.element.php'; + require $path . '/jbevent.item.php'; + require $path . '/jbevent.jbzoo.php'; + require $path . '/jbevent.layout.php'; + require $path . '/jbevent.submission.php'; + require $path . '/jbevent.tag.php'; + require $path . '/jbevent.type.php'; + require $path . '/jbevent.payment.php'; + + $event = $this->app->event; + $dispatcher = $event->dispatcher; + + $event->register('JBEventApplication'); + $dispatcher->connect('application:init', array('JBEventApplication', 'init')); + $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); + $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); + + $event->register('JBEventCategory'); + $dispatcher->connect('category:init', array('JBEventCategory', 'init')); + $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); + $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); + $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); + + $event->register('JBEventItem'); + $dispatcher->connect('item:init', array('JBEventItem', 'init')); + $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); + $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); + $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); + $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); + $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); + + $event->register('JBEventComment'); + $dispatcher->connect('comment:init', array('JBEventComment', 'init')); + $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); + $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); + $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); + + $event->register('JBEventSubmission'); + $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); + $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); + $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); + $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); + + $event->register('JBEventElement'); + $dispatcher->connect('element:download', array('JBEventElement', 'download')); + $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); + $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); + $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); + $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); + $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); + $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); + $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); + $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); + $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); + + $event->register('JBEventLayout'); + $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); + + $event->register('JBEventTag'); + $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); + $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); + + $event->register('JBEventType'); + $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); + $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); + $dispatcher->connect('type:copied', array('JBEventType', 'copied')); + $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); + $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); + + $event->register('JBEventJBZoo'); + $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); + $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); + + $event->register('JBEventBasket'); + $dispatcher->connect('basket:beforesave', array('JBEventBasket', 'beforeSave')); + $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); + + $event->register('JBEventPayment'); + $dispatcher->connect('payment:callback', array('JBEventPayment', 'callback')); + } + + /** + * Init assets for admin path + */ + private function _initAssets() + { + if (!$this->app->jbenv->isSite()) { + $this->app->jbassets->admin(); + } + } + + /** + * Init config file + */ + private function _initConfig() + { + if ($configFile = $this->app->path->path('jbapp:config/config.php')) { + require $configFile; + } + } + + /** + * Get group name + * @return string + */ + private function _getGroup() + { + return $this->_group; + } + + /** + * Register new path in system + * @param string $path + * @param string $pathName + * @return mixed + */ + private function _addPath($path, $pathName) + { + if ($fullPath = $this->app->path->path($path)) { + return $this->app->path->register($fullPath, $pathName); + } + + return null; + } + + /** + * Get domain name + * @param bool $isAny + * @return string + */ + static function getDomain($isAny = false) + { + $domain = ''; + if (function_exists('apache_request_headers')) { + $headers = apache_request_headers(); + $domain = isset($headers['Host']) ? $headers['Host'] : ''; + } + + if ($isAny && !$domain) { + $domain = $_SERVER['HTTP_HOST']; + } + + $domain = preg_replace('#^www\.#', '', $domain); + list($domain) = explode(':', $domain); + + return $domain; + } +} diff --git a/patches/2.0.2/media/zoo/applications/jbuniversal/framework/helpers/jbimport.php b/patches/2.0.2/media/zoo/applications/jbuniversal/framework/helpers/jbimport.php index cdd0c31..8fb15b4 100644 --- a/patches/2.0.2/media/zoo/applications/jbuniversal/framework/helpers/jbimport.php +++ b/patches/2.0.2/media/zoo/applications/jbuniversal/framework/helpers/jbimport.php @@ -1,562 +1,562 @@ - - */ - -// no direct access -defined('_JEXEC') or die('Restricted access'); - - -/** - * Class JBImportHelper - */ -class JBImportHelper extends AppHelper -{ - const STEP_SIZE = 20; - - const LOSE_NONE = 0; - const LOSE_DISABLE = 1; - const LOSE_REMOVE = 2; - - const KEY_NONE = 0; - const KEY_ID = 1; - const KEY_NAME = 2; - const KEY_ALIAS = 3; - const KEY_SKU = 4; - - const OPTIONS_NO = 0; - const OPTIONS_YES = 1; - - /** - * @var JSONData - */ - protected $_data = null; - - /** - * @param App $app - */ - public function __construct($app) - { - parent::__construct($app); - - // make sure the line endings are recognized irrespective of the OS - $this->app->jbenv->maxPerfomance(); - ini_set('auto_detect_line_endings', true); - } - - /** - * Get info for pre import step - * @param string $file - * @param array $options - * @return array - */ - public function getInfo($file, $options) - { - $options = $this->app->data->create($options); - - $info = array(); - - // get applications - $applist = JBModelApp::model()->getList(); - if (!empty($applist)) { - $info['applist'] = array(); - foreach ($applist as $app) { - $info['applist'][$app->id] = $app->name; - } - - reset($applist); - $application = current($applist); - - $info['app'] = current($applist); - } - - // get types - $info['types'] = array(); - foreach ($info['app']->getTypes() as $type) { - $info['types'][$type->id] = array(); - - foreach ($type->getElements() as $element) { - // filter elements - $info['types'][$type->id][$element->getElementType()][] = $element; - } - - } - - $info['item_count'] = 0; - $info['columns'] = array(); - - // get params - $separator = $options->get('separator', ',') ? $options->get('separator', ',') : ','; - $enclosure = $options->get('enclosure', '"') ? $options->get('enclosure', '"') : '"'; - $containsHeaders = (int)$options->get('header', 1); - - // get column names and row count - $rowCount = 0; - if (($handle = fopen($file, "r")) !== false) { - - while (($data = fgetcsv($handle, 0, $separator, $enclosure)) !== false) { - - if ($rowCount == 0) { - if ($containsHeaders) { - $info['columns'] = $data; - } else { - $info['columns'] = array_fill(0, count($data), ''); - } - } - - $rowCount++; - } - fclose($handle); - } - - $info['count'] = $containsHeaders ? $rowCount - 1 : $rowCount; - - return $info; - } - - /** - * @param $info - * @return array - */ - public function itemsControls($info) - { - $html = array(); - $htmlHelper = $this->app->html; - - $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_APP') . ' -')); - $options += $info['applist']; - $html['apps'] = $htmlHelper->_('select.genericlist', $options, 'appid'); - - $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_TYPE') . ' -')); - $html['types'] = $htmlHelper->_('zoo.typelist', $info['app'], $options, 'typeid', null, 'value', 'text'); - - $html['fields_types'] = array(); - foreach ($info['types'] as $typeid => $element_types) { - $html['fields_types'][$typeid] = $this->_createItemsControl($typeid, $element_types); - } - - // lose control - $loseOptions = array( - $htmlHelper->_('select.option', self::LOSE_NONE, JText::_('JBZOO_IMPORT_LOSE_NONE')), - $htmlHelper->_('select.option', self::LOSE_DISABLE, JText::_('JBZOO_IMPORT_LOSE_DISABLE')), - $htmlHelper->_('select.option', self::LOSE_REMOVE, JText::_('JBZOO_IMPORT_LOSE_REMOVE')), - ); - $html['lose'] = $htmlHelper->_('select.genericlist', $loseOptions, 'lose'); - - // what field is key - $keyOptions = array( - $htmlHelper->_('select.option', self::KEY_NONE, JText::_('JBZOO_IMPORT_KEY_NONE')), - $htmlHelper->_('select.option', self::KEY_ID, JText::_('JBZOO_IMPORT_KEY_ID')), - $htmlHelper->_('select.option', self::KEY_NAME, JText::_('JBZOO_IMPORT_KEY_NAME')), - $htmlHelper->_('select.option', self::KEY_ALIAS, JText::_('JBZOO_IMPORT_KEY_ALIAS')), - $htmlHelper->_('select.option', self::KEY_SKU, JText::_('JBZOO_IMPORT_KEY_SKU')), - ); - $html['key'] = $htmlHelper->_('select.genericlist', $keyOptions, 'key'); - - // check options config - $checkOptions = array( - $htmlHelper->_('select.option', self::OPTIONS_NO, JText::_('JBZOO_IMPORT_CHECK_OPTION_NO')), - $htmlHelper->_('select.option', self::OPTIONS_YES, JText::_('JBZOO_IMPORT_CHECK_OPTION_YES')), - ); - $html['checkOptions'] = $htmlHelper->_('select.genericlist', $checkOptions, 'checkOptions'); - - return $html; - } - - /** - * @param $info - * @return array - */ - public function categoriesControls($info) - { - $html = array(); - $htmlHelper = $this->app->html; - - $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_APP') . ' -')); - $options += $info['applist']; - $html['apps'] = $htmlHelper->_('select.genericlist', $options, 'appid'); - - $html['fields_types'] = $this->_createCategoriesControl('categoryFileds'); - - // lose control - $loseOptions = array( - $htmlHelper->_('select.option', self::LOSE_NONE, JText::_('JBZOO_IMPORT_LOSE_NONE')), - $htmlHelper->_('select.option', self::LOSE_DISABLE, JText::_('JBZOO_IMPORT_LOSE_DISABLE')), - $htmlHelper->_('select.option', self::LOSE_REMOVE, JText::_('JBZOO_IMPORT_LOSE_REMOVE')), - ); - $html['lose'] = $htmlHelper->_('select.genericlist', $loseOptions, 'lose'); - - // what field is key - $keyOptions = array( - $htmlHelper->_('select.option', self::KEY_NONE, JText::_('JBZOO_IMPORT_KEY_NONE')), - $htmlHelper->_('select.option', self::KEY_ID, JText::_('JBZOO_IMPORT_KEY_ID')), - $htmlHelper->_('select.option', self::KEY_NAME, JText::_('JBZOO_IMPORT_KEY_NAME')), - $htmlHelper->_('select.option', self::KEY_ALIAS, JText::_('JBZOO_IMPORT_KEY_ALIAS')), - ); - $html['key'] = $htmlHelper->_('select.genericlist', $keyOptions, 'key'); - - return $html; - } - - /** - * Create fields control for item - * @param $typeid - * @param $elementTypes - */ - protected function _createItemsControl($typeid, $elementTypes) - { - $htmlHelper = $this->app->html; - - $fields = $this->app->jbcsvmapper->getItemFields($elementTypes); - $options = array($htmlHelper->_('select.option', '', ' ** ')); - - foreach ($fields as $groupKey => $group) { - - $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . strtoupper($groupKey))); - - foreach ($group as $fieldKey => $field) { - $options[] = $htmlHelper->_('select.option', $fieldKey, $field); - } - - $options[] = $htmlHelper->_('select.option', ''); - } - - return $htmlHelper->_( - 'select.genericlist', - $options, - 'assign[' . $typeid . '][__name_placeholder__]', - 'class="type-select type-select-' . $typeid . '"' - ); - } - - /** - * Create fields control for category - */ - protected function _createCategoriesControl() - { - $htmlHelper = $this->app->html; - - $fields = $this->app->jbcsvmapper->getCategoryFields(); - $options = array($htmlHelper->_('select.option', '', ' ** ')); - - foreach ($fields as $groupKey => $group) { - - $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . strtoupper($groupKey))); - - foreach ($group as $fieldKey => $field) { - $options[] = $htmlHelper->_('select.option', $fieldKey, $field); - } - - $options[] = $htmlHelper->_('select.option', ''); - } - - return $htmlHelper->_('select.genericlist', $options, 'assign[]', 'class="type-select"'); - } - - /** - * @return string - */ - public function getTmpFilename() - { - $tmp = $this->app->path->path('tmp:'); - return JPath::clean($tmp . '/' . uniqid('jbimport_') . '.csv'); - } - - /** - * Get import data from session - * @return JSONData - */ - protected function _initSessionData() - { - $data = $this->app->jbsession->getGroup('import'); - $this->_data = $this->app->data->create($data); - - return $this->_data; - } - - /** - * Get last line in CSV file - * @param int $step - * @return int - */ - protected function _getLastLine($step = 0) - { - $lastLine = self::STEP_SIZE * $step; - if ((int)$this->_data->header) { - $lastLine++; - } - - return $lastLine; - } - - /** - * Get lines from CSV file for current step - * @param string $file - * @param int $lastLine - * @return array - */ - protected function _getCSVLines($file, $lastLine) - { - return $this->app->jbcsv->getLinesfromFile($file, $this->_data, $lastLine, self::STEP_SIZE); - } - - /** - * Process one Item row - * @param array $row - * @param int $lineKey - * @return int - */ - protected function _processItemRow($row, $lineKey) - { - // create item - $item = $this->_getItemByKey($row, $lineKey); - - $positions = array(); - - // bind import data from CSV - foreach ($this->_data->assign as $colKey => $itemField) { - - $itemField = JString::trim($itemField); - if (!empty($itemField)) { - - $value = isset($row[$colKey]) ? $row[$colKey] : null; - - $fieldInfo = $this->app->jbcsvmapper->itemFieldToMeta($itemField); - - $positionKey = implode('__', $fieldInfo); - if (!isset($positions[$positionKey])) { - $positions[$positionKey] = 0; - } - $positions[$positionKey]++; - - $cellElem = $this->app->jbcsvcell->createItem($fieldInfo['name'], $item, $fieldInfo['group'], $fieldInfo); - $cellElem->fromCSV($value, $positions[$positionKey]); - } - } - - $id = $item->id; - - // save all changes - $item->getParams()->set('jbzoo.no_index', 0); - $this->app->table->item->save($item); - - // clean memory - unset($item); - - return $id; - } - - /** - * Process one Category row - * @param array $row - * @param int $lineKey - * @return int - */ - protected function _processCategoryRow($row, $lineKey) - { - // create item - $category = $this->_getCategoryByKey($row, $lineKey); - - // bind import data from CSV - foreach ($this->_data->assign as $colKey => $itemField) { - - $itemField = JString::trim($itemField); - if (!empty($itemField)) { - - $value = isset($row[$colKey]) ? $row[$colKey] : null; - - $fieldInfo = $this->app->jbcsvmapper->categoryFieldToMeta($itemField); - $positionKey = implode('__', $fieldInfo); - - $cellElem = $this->app->jbcsvcell->createCategory($fieldInfo['name'], $category, $fieldInfo['group'], $fieldInfo); - $cellElem->fromCSV($value); - } - } - - $id = $category->id; - - // save all changes - $this->app->table->category->save($category); - - // clean memory - unset($category); - - return $id; - } - - /** - * Get key field value - * @param array $row - * @param string $lineKey - * @return Item - */ - protected function _getItemByKey($row, $lineKey = null) - { - $item = null; - - if ($this->_data->key != self::KEY_NONE) { - foreach ($this->_data->assign as $csvKey => $fieldName) { - - if ($this->_data->key == self::KEY_ID && $fieldName == 'id') { - $item = JBModelItem::model()->getById(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_NAME && $fieldName == 'name') { - $item = JBModelItem::model()->getByName(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_ALIAS && $fieldName == 'alias') { - $item = JBModelItem::model()->getByAlias(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_SKU && $fieldName == 'sku') { - $item = JBModelItem::model()->getBySku(JString::trim($row[$csvKey]), $this->_data->appid); - break; - } - } - } - - if (!$item) { - $item = JBModelItem::model()->createEmpty($this->_data->appid, $this->_data->typeid, $lineKey); - } - - return $item; - } - - /** - * Get key field value - * @param array $row - * @param string $lineKey - * @return Item - */ - protected function _getCategoryByKey($row, $lineKey = null) - { - $category = null; - - if ($this->_data->key != self::KEY_NONE) { - foreach ($this->_data->assign as $csvKey => $fieldName) { - - if ($this->_data->key == self::KEY_ID && $fieldName == 'id') { - $category = JBModelCategory::model()->getById(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_NAME && $fieldName == 'name') { - $category = JBModelCategory::model()->getByName(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_ALIAS && $fieldName == 'alias') { - $category = JBModelCategory::model()->getByAlias(JString::trim($row[$csvKey]), $this->_data->appid); - break; - } - } - } - - if (!$category) { - $category = JBModelCategory::model()->createEmpty($this->_data->appid, $lineKey); - } - - return $category; - } - - /** - * One step precess for items - * @param int $step - * @return array - */ - public function itemsProcess($step = 0) - { - $this->_initSessionData(); - - $lastLine = $this->_getLastLine($step); - $lines = $this->_getCSVLines($this->_data->file, $lastLine, $step); - - $lineKey = 0; - $addedIds = ($step == 0) ? array() : $this->app->jbsession->get('ids', 'import-ids'); - - if (!empty($lines)) { - foreach ($lines as $key => $row) { - $lineKey = $lastLine + $key; - $addedIds[] = $this->_processItemRow($row, $lineKey); - } - } - - $this->app->jbsession->set('ids', $addedIds, 'import-ids'); - - return array('progress' => round(($lineKey / $this->_data->count) * 100, 2)); - } - - /** - * One step precess for categories - * @param int $step - * @return array - */ - public function categoriesProcess($step = 0) - { - $this->_initSessionData(); - - $lastLine = $this->_getLastLine($step); - $lines = $this->_getCSVLines($this->_data->file, $lastLine, $step); - - $lineKey = 0; - $addedIds = ($step == 0) ? array() : $this->app->jbsession->get('ids', 'import-ids'); - - if (!empty($lines)) { - foreach ($lines as $key => $row) { - $lineKey = $lastLine + $key; - $addedIds[] = $this->_processCategoryRow($row, $lineKey); - } - } - - $this->app->jbsession->set('ids', $addedIds, 'import-ids'); - - return array('progress' => round(($lineKey / $this->_data->count) * 100, 2)); - } - - /** - * Call after all items loaded - */ - public function itemsPostProcess() - { - $addedIds = $this->app->jbsession->get('ids', 'import-ids'); - $this->_initSessionData(); - - if ($this->_data->lose == self::LOSE_DISABLE) { - JBModelItem::model()->disableAll($this->_data->appid, $this->_data->typeid, $addedIds); - - } else if ($this->_data->lose == self::LOSE_REMOVE) { - JBModelItem::model()->removeAll($this->_data->appid, $this->_data->typeid, $addedIds); - } - - $this->app->jbsession->clearGroup('import-ids'); - } - - /** - * Call after all items loaded - */ - public function categoriesPostProcess() - { - $addedIds = $this->app->jbsession->get('ids', 'import-ids'); - $this->_initSessionData(); - - if ($this->_data->lose == self::LOSE_DISABLE) { - JBModelCategory::model()->disableAll($this->_data->appid, $addedIds); - - } else if ($this->_data->lose == self::LOSE_REMOVE) { - JBModelCategory::model()->removeAll($this->_data->appid, $addedIds); - } - - $this->app->jbsession->clearGroup('import-ids'); - } - - -} + + */ + +// no direct access +defined('_JEXEC') or die('Restricted access'); + + +/** + * Class JBImportHelper + */ +class JBImportHelper extends AppHelper +{ + const STEP_SIZE = 20; + + const LOSE_NONE = 0; + const LOSE_DISABLE = 1; + const LOSE_REMOVE = 2; + + const KEY_NONE = 0; + const KEY_ID = 1; + const KEY_NAME = 2; + const KEY_ALIAS = 3; + const KEY_SKU = 4; + + const OPTIONS_NO = 0; + const OPTIONS_YES = 1; + + /** + * @var JSONData + */ + protected $_data = null; + + /** + * @param App $app + */ + public function __construct($app) + { + parent::__construct($app); + + // make sure the line endings are recognized irrespective of the OS + $this->app->jbenv->maxPerfomance(); + ini_set('auto_detect_line_endings', true); + } + + /** + * Get info for pre import step + * @param string $file + * @param array $options + * @return array + */ + public function getInfo($file, $options) + { + $options = $this->app->data->create($options); + + $info = array(); + + // get applications + $applist = JBModelApp::model()->getList(); + if (!empty($applist)) { + $info['applist'] = array(); + foreach ($applist as $app) { + $info['applist'][$app->id] = $app->name; + } + + reset($applist); + $application = current($applist); + + $info['app'] = current($applist); + } + + // get types + $info['types'] = array(); + foreach ($info['app']->getTypes() as $type) { + $info['types'][$type->id] = array(); + + foreach ($type->getElements() as $element) { + // filter elements + $info['types'][$type->id][$element->getElementType()][] = $element; + } + + } + + $info['item_count'] = 0; + $info['columns'] = array(); + + // get params + $separator = $options->get('separator', ',') ? $options->get('separator', ',') : ','; + $enclosure = $options->get('enclosure', '"') ? $options->get('enclosure', '"') : '"'; + $containsHeaders = (int)$options->get('header', 1); + + // get column names and row count + $rowCount = 0; + if (($handle = fopen($file, "r")) !== false) { + + while (($data = fgetcsv($handle, 0, $separator, $enclosure)) !== false) { + + if ($rowCount == 0) { + if ($containsHeaders) { + $info['columns'] = $data; + } else { + $info['columns'] = array_fill(0, count($data), ''); + } + } + + $rowCount++; + } + fclose($handle); + } + + $info['count'] = $containsHeaders ? $rowCount - 1 : $rowCount; + + return $info; + } + + /** + * @param $info + * @return array + */ + public function itemsControls($info) + { + $html = array(); + $htmlHelper = $this->app->html; + + $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_APP') . ' -')); + $options += $info['applist']; + $html['apps'] = $htmlHelper->_('select.genericlist', $options, 'appid'); + + $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_TYPE') . ' -')); + $html['types'] = $htmlHelper->_('zoo.typelist', $info['app'], $options, 'typeid', null, 'value', 'text'); + + $html['fields_types'] = array(); + foreach ($info['types'] as $typeid => $element_types) { + $html['fields_types'][$typeid] = $this->_createItemsControl($typeid, $element_types); + } + + // lose control + $loseOptions = array( + $htmlHelper->_('select.option', self::LOSE_NONE, JText::_('JBZOO_IMPORT_LOSE_NONE')), + $htmlHelper->_('select.option', self::LOSE_DISABLE, JText::_('JBZOO_IMPORT_LOSE_DISABLE')), + $htmlHelper->_('select.option', self::LOSE_REMOVE, JText::_('JBZOO_IMPORT_LOSE_REMOVE')), + ); + $html['lose'] = $htmlHelper->_('select.genericlist', $loseOptions, 'lose'); + + // what field is key + $keyOptions = array( + $htmlHelper->_('select.option', self::KEY_NONE, JText::_('JBZOO_IMPORT_KEY_NONE')), + $htmlHelper->_('select.option', self::KEY_ID, JText::_('JBZOO_IMPORT_KEY_ID')), + $htmlHelper->_('select.option', self::KEY_NAME, JText::_('JBZOO_IMPORT_KEY_NAME')), + $htmlHelper->_('select.option', self::KEY_ALIAS, JText::_('JBZOO_IMPORT_KEY_ALIAS')), + $htmlHelper->_('select.option', self::KEY_SKU, JText::_('JBZOO_IMPORT_KEY_SKU')), + ); + $html['key'] = $htmlHelper->_('select.genericlist', $keyOptions, 'key'); + + // check options config + $checkOptions = array( + $htmlHelper->_('select.option', self::OPTIONS_NO, JText::_('JBZOO_IMPORT_CHECK_OPTION_NO')), + $htmlHelper->_('select.option', self::OPTIONS_YES, JText::_('JBZOO_IMPORT_CHECK_OPTION_YES')), + ); + $html['checkOptions'] = $htmlHelper->_('select.genericlist', $checkOptions, 'checkOptions'); + + return $html; + } + + /** + * @param $info + * @return array + */ + public function categoriesControls($info) + { + $html = array(); + $htmlHelper = $this->app->html; + + $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_APP') . ' -')); + $options += $info['applist']; + $html['apps'] = $htmlHelper->_('select.genericlist', $options, 'appid'); + + $html['fields_types'] = $this->_createCategoriesControl('categoryFileds'); + + // lose control + $loseOptions = array( + $htmlHelper->_('select.option', self::LOSE_NONE, JText::_('JBZOO_IMPORT_LOSE_NONE')), + $htmlHelper->_('select.option', self::LOSE_DISABLE, JText::_('JBZOO_IMPORT_LOSE_DISABLE')), + $htmlHelper->_('select.option', self::LOSE_REMOVE, JText::_('JBZOO_IMPORT_LOSE_REMOVE')), + ); + $html['lose'] = $htmlHelper->_('select.genericlist', $loseOptions, 'lose'); + + // what field is key + $keyOptions = array( + $htmlHelper->_('select.option', self::KEY_NONE, JText::_('JBZOO_IMPORT_KEY_NONE')), + $htmlHelper->_('select.option', self::KEY_ID, JText::_('JBZOO_IMPORT_KEY_ID')), + $htmlHelper->_('select.option', self::KEY_NAME, JText::_('JBZOO_IMPORT_KEY_NAME')), + $htmlHelper->_('select.option', self::KEY_ALIAS, JText::_('JBZOO_IMPORT_KEY_ALIAS')), + ); + $html['key'] = $htmlHelper->_('select.genericlist', $keyOptions, 'key'); + + return $html; + } + + /** + * Create fields control for item + * @param $typeid + * @param $elementTypes + */ + protected function _createItemsControl($typeid, $elementTypes) + { + $htmlHelper = $this->app->html; + + $fields = $this->app->jbcsvmapper->getItemFields($elementTypes); + $options = array($htmlHelper->_('select.option', '', ' ** ')); + + foreach ($fields as $groupKey => $group) { + + $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . strtoupper($groupKey))); + + foreach ($group as $fieldKey => $field) { + $options[] = $htmlHelper->_('select.option', $fieldKey, $field); + } + + $options[] = $htmlHelper->_('select.option', ''); + } + + return $htmlHelper->_( + 'select.genericlist', + $options, + 'assign[' . $typeid . '][__name_placeholder__]', + 'class="type-select type-select-' . $typeid . '"' + ); + } + + /** + * Create fields control for category + */ + protected function _createCategoriesControl() + { + $htmlHelper = $this->app->html; + + $fields = $this->app->jbcsvmapper->getCategoryFields(); + $options = array($htmlHelper->_('select.option', '', ' ** ')); + + foreach ($fields as $groupKey => $group) { + + $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . strtoupper($groupKey))); + + foreach ($group as $fieldKey => $field) { + $options[] = $htmlHelper->_('select.option', $fieldKey, $field); + } + + $options[] = $htmlHelper->_('select.option', ''); + } + + return $htmlHelper->_('select.genericlist', $options, 'assign[]', 'class="type-select"'); + } + + /** + * @return string + */ + public function getTmpFilename() + { + $tmp = $this->app->path->path('tmp:'); + return JPath::clean($tmp . '/' . uniqid('jbimport_') . '.csv'); + } + + /** + * Get import data from session + * @return JSONData + */ + protected function _initSessionData() + { + $data = $this->app->jbsession->getGroup('import'); + $this->_data = $this->app->data->create($data); + + return $this->_data; + } + + /** + * Get last line in CSV file + * @param int $step + * @return int + */ + protected function _getLastLine($step = 0) + { + $lastLine = self::STEP_SIZE * $step; + if ((int)$this->_data->header) { + $lastLine++; + } + + return $lastLine; + } + + /** + * Get lines from CSV file for current step + * @param string $file + * @param int $lastLine + * @return array + */ + protected function _getCSVLines($file, $lastLine) + { + return $this->app->jbcsv->getLinesfromFile($file, $this->_data, $lastLine, self::STEP_SIZE); + } + + /** + * Process one Item row + * @param array $row + * @param int $lineKey + * @return int + */ + protected function _processItemRow($row, $lineKey) + { + // create item + $item = $this->_getItemByKey($row, $lineKey); + + $positions = array(); + + // bind import data from CSV + foreach ($this->_data->assign as $colKey => $itemField) { + + $itemField = JString::trim($itemField); + if (!empty($itemField)) { + + $value = isset($row[$colKey]) ? $row[$colKey] : null; + + $fieldInfo = $this->app->jbcsvmapper->itemFieldToMeta($itemField); + + $positionKey = implode('__', $fieldInfo); + if (!isset($positions[$positionKey])) { + $positions[$positionKey] = 0; + } + $positions[$positionKey]++; + + $cellElem = $this->app->jbcsvcell->createItem($fieldInfo['name'], $item, $fieldInfo['group'], $fieldInfo); + $cellElem->fromCSV($value, $positions[$positionKey]); + } + } + + $id = $item->id; + + // save all changes + $item->getParams()->set('jbzoo.no_index', 0); + $this->app->table->item->save($item); + + // clean memory + unset($item); + + return $id; + } + + /** + * Process one Category row + * @param array $row + * @param int $lineKey + * @return int + */ + protected function _processCategoryRow($row, $lineKey) + { + // create item + $category = $this->_getCategoryByKey($row, $lineKey); + + // bind import data from CSV + foreach ($this->_data->assign as $colKey => $itemField) { + + $itemField = JString::trim($itemField); + if (!empty($itemField)) { + + $value = isset($row[$colKey]) ? $row[$colKey] : null; + + $fieldInfo = $this->app->jbcsvmapper->categoryFieldToMeta($itemField); + $positionKey = implode('__', $fieldInfo); + + $cellElem = $this->app->jbcsvcell->createCategory($fieldInfo['name'], $category, $fieldInfo['group'], $fieldInfo); + $cellElem->fromCSV($value); + } + } + + $id = $category->id; + + // save all changes + $this->app->table->category->save($category); + + // clean memory + unset($category); + + return $id; + } + + /** + * Get key field value + * @param array $row + * @param string $lineKey + * @return Item + */ + protected function _getItemByKey($row, $lineKey = null) + { + $item = null; + + if ($this->_data->key != self::KEY_NONE) { + foreach ($this->_data->assign as $csvKey => $fieldName) { + + if ($this->_data->key == self::KEY_ID && $fieldName == 'id') { + $item = JBModelItem::model()->getById(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_NAME && $fieldName == 'name') { + $item = JBModelItem::model()->getByName(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_ALIAS && $fieldName == 'alias') { + $item = JBModelItem::model()->getByAlias(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_SKU && $fieldName == 'sku') { + $item = JBModelItem::model()->getBySku(JString::trim($row[$csvKey]), $this->_data->appid); + break; + } + } + } + + if (!$item) { + $item = JBModelItem::model()->createEmpty($this->_data->appid, $this->_data->typeid, $lineKey); + } + + return $item; + } + + /** + * Get key field value + * @param array $row + * @param string $lineKey + * @return Item + */ + protected function _getCategoryByKey($row, $lineKey = null) + { + $category = null; + + if ($this->_data->key != self::KEY_NONE) { + foreach ($this->_data->assign as $csvKey => $fieldName) { + + if ($this->_data->key == self::KEY_ID && $fieldName == 'id') { + $category = JBModelCategory::model()->getById(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_NAME && $fieldName == 'name') { + $category = JBModelCategory::model()->getByName(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_ALIAS && $fieldName == 'alias') { + $category = JBModelCategory::model()->getByAlias(JString::trim($row[$csvKey]), $this->_data->appid); + break; + } + } + } + + if (!$category) { + $category = JBModelCategory::model()->createEmpty($this->_data->appid, $lineKey); + } + + return $category; + } + + /** + * One step precess for items + * @param int $step + * @return array + */ + public function itemsProcess($step = 0) + { + $this->_initSessionData(); + + $lastLine = $this->_getLastLine($step); + $lines = $this->_getCSVLines($this->_data->file, $lastLine, $step); + + $lineKey = 0; + $addedIds = ($step == 0) ? array() : $this->app->jbsession->get('ids', 'import-ids'); + + if (!empty($lines)) { + foreach ($lines as $key => $row) { + $lineKey = $lastLine + $key; + $addedIds[] = $this->_processItemRow($row, $lineKey); + } + } + + $this->app->jbsession->set('ids', $addedIds, 'import-ids'); + + return array('progress' => round(($lineKey / $this->_data->count) * 100, 2)); + } + + /** + * One step precess for categories + * @param int $step + * @return array + */ + public function categoriesProcess($step = 0) + { + $this->_initSessionData(); + + $lastLine = $this->_getLastLine($step); + $lines = $this->_getCSVLines($this->_data->file, $lastLine, $step); + + $lineKey = 0; + $addedIds = ($step == 0) ? array() : $this->app->jbsession->get('ids', 'import-ids'); + + if (!empty($lines)) { + foreach ($lines as $key => $row) { + $lineKey = $lastLine + $key; + $addedIds[] = $this->_processCategoryRow($row, $lineKey); + } + } + + $this->app->jbsession->set('ids', $addedIds, 'import-ids'); + + return array('progress' => round(($lineKey / $this->_data->count) * 100, 2)); + } + + /** + * Call after all items loaded + */ + public function itemsPostProcess() + { + $addedIds = $this->app->jbsession->get('ids', 'import-ids'); + $this->_initSessionData(); + + if ($this->_data->lose == self::LOSE_DISABLE) { + JBModelItem::model()->disableAll($this->_data->appid, $this->_data->typeid, $addedIds); + + } else if ($this->_data->lose == self::LOSE_REMOVE) { + JBModelItem::model()->removeAll($this->_data->appid, $this->_data->typeid, $addedIds); + } + + $this->app->jbsession->clearGroup('import-ids'); + } + + /** + * Call after all items loaded + */ + public function categoriesPostProcess() + { + $addedIds = $this->app->jbsession->get('ids', 'import-ids'); + $this->_initSessionData(); + + if ($this->_data->lose == self::LOSE_DISABLE) { + JBModelCategory::model()->disableAll($this->_data->appid, $addedIds); + + } else if ($this->_data->lose == self::LOSE_REMOVE) { + JBModelCategory::model()->removeAll($this->_data->appid, $addedIds); + } + + $this->app->jbsession->clearGroup('import-ids'); + } + + +} diff --git a/patches/2.0.2/media/zoo/applications/jbuniversal/framework/jbzoo.php b/patches/2.0.2/media/zoo/applications/jbuniversal/framework/jbzoo.php index df5d0fa..00eb113 100644 --- a/patches/2.0.2/media/zoo/applications/jbuniversal/framework/jbzoo.php +++ b/patches/2.0.2/media/zoo/applications/jbuniversal/framework/jbzoo.php @@ -1 +1,374 @@ - */ // no direct access defined('_JEXEC') or die('Restricted access'); !defined('JBZOO_APP_GROUP') && define('JBZOO_APP_GROUP', 'jbuniversal'); !defined('DIRECTORY_SEPERATOR') && define('DIRECTORY_SEPERATOR', '/'); !defined('DS') && define('DS', DIRECTORY_SEPARATOR); /** * Class JBZoo */ class JBZoo { /** * @var Application */ public $app = null; /** * App group name * @var string */ private $_group = JBZOO_APP_GROUP; /** * Init JBZoo application * @static * @return JBZoo */ public static function init() { static $jbzoo; if (!isset($jbzoo)) { $jbzoo = new self(); } return $jbzoo; } /** * Initialization JBZoo App */ private function __construct() { $this->app = App::getInstance('zoo'); $this->_initPaths(); $this->_initConfig(); $this->_initModels(); $this->_initLanguages(); $this->_initFilterElements(); $this->_initEvents(); $this->_initAssets(); } /** * Add directory path */ private function _initPaths() { $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); $this->_addPath('jbapp:framework', 'jbzoo'); $this->_addPath('jbapp:assets', 'jbassets'); $this->_addPath('jbassets:zoo', 'assets'); $this->_addPath('jbapp:config', 'jbconfig'); $this->_addPath('jbzoo:elements', 'jbelements'); $this->_addPath('jbapp:types', 'jbtypes'); $this->_addPath('jbzoo:helpers', 'helpers'); $this->_addPath('jbzoo:helpers-std', 'helpers'); $this->_addPath('jbzoo:render', 'renderer'); $this->_addPath('jbzoo:controllers/views', 'jbviews'); $this->_addPath('jbapp:config', 'jbxml'); $this->_addPath('jbapp:joomla/elements', 'fields'); $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); $this->_addPath('jbapp:templates', 'jbtmpl'); if ($this->app->jbenv->isSite()) { $this->_addPath('jbzoo:controllers', 'controllers'); } $this->app->jbdebug->mark('init::paths'); } /** * Include models classes */ private function _initModels() { // defines define('ZOO_TABLE_JBZOO_INDEX', '#__zoo_jbzoo_index'); define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); // query builder $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/classes'; require $path . '/database/JBDatabaseQuery.php'; require $path . '/database/JBDatabaseQueryElement.php'; // models $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/models'; require $path . '/jbmodel.php'; require $path . '/jbmodel.element.php'; require $path . '/jbmodel.autocomplete.php'; require $path . '/jbmodel.element.country.php'; require $path . '/jbmodel.element.itemdate.php'; require $path . '/jbmodel.element.itemauthor.php'; require $path . '/jbmodel.element.itemcategory.php'; require $path . '/jbmodel.element.itemcreated.php'; require $path . '/jbmodel.element.itemfrontpage.php'; require $path . '/jbmodel.element.itemmodified.php'; require $path . '/jbmodel.element.itemname.php'; require $path . '/jbmodel.element.itempublish_down.php'; require $path . '/jbmodel.element.itempublish_up.php'; require $path . '/jbmodel.element.itemtag.php'; require $path . '/jbmodel.element.jbimage.php'; require $path . '/jbmodel.element.jbselectcascade.php'; require $path . '/jbmodel.element.range.php'; require $path . '/jbmodel.element.rating.php'; require $path . '/jbmodel.element.jbpriceadvance.php'; require $path . '/jbmodel.favorite.php'; require $path . '/jbmodel.filter.php'; require $path . '/jbmodel.item.php'; require $path . '/jbmodel.app.php'; require $path . '/jbmodel.category.php'; require $path . '/jbmodel.order.php'; require $path . '/jbmodel.related.php'; require $path . '/jbmodel.searchindex.php'; require $path . '/jbmodel.values.php'; require $path . '/jbmodel.sku.php'; } /** * Load lang files */ private function _initLanguages() { $lang = JFactory::getLanguage(); $lang->load('com_zoo'); $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); $lang->load('com_zoo', JPATH_ADMINISTRATOR); } /** * Load others libraries */ private function _initFilterElements() { jimport('joomla.html.parameter.element'); $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/render/filter'; require $path . '/element.php'; require $path . '/element.author.php'; require $path . '/element.author.checkbox.php'; require $path . '/element.author.radio.php'; require $path . '/element.author.select.php'; require $path . '/element.author.select.chosen.php'; require $path . '/element.author.text.php'; require $path . '/element.category.php'; require $path . '/element.category.chosen.php'; require $path . '/element.checkbox.php'; require $path . '/element.country.php'; require $path . '/element.country.checkbox.php'; require $path . '/element.country.radio.php'; require $path . '/element.country.select.php'; require $path . '/element.country.select.chosen.php'; require $path . '/element.date.php'; require $path . '/element.date.range.php'; require $path . '/element.frontpage.php'; require $path . '/element.frontpage.jqueryui.php'; require $path . '/element.hidden.php'; require $path . '/element.imageexists.php'; require $path . '/element.imageexists.jqueryui.php'; require $path . '/element.jbselectcascade.php'; require $path . '/element.jqueryui.php'; require $path . '/element.name.php'; require $path . '/element.name.checkbox.php'; require $path . '/element.name.radio.php'; require $path . '/element.name.select.php'; require $path . '/element.name.select.chosen.php'; require $path . '/element.radio.php'; require $path . '/element.rating.php'; require $path . '/element.rating.ranges.php'; require $path . '/element.rating.slider.php'; require $path . '/element.select.php'; require $path . '/element.select.chosen.php'; require $path . '/element.slider.php'; require $path . '/element.tag.php'; require $path . '/element.tag.checkbox.php'; require $path . '/element.tag.radio.php'; require $path . '/element.tag.select.php'; require $path . '/element.tag.select.chosen.php'; require $path . '/element.text.php'; require $path . '/element.text.range.php'; } /** * Register and connect events */ private function _initEvents() { $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/events'; require $path . '/jbevent.php'; require $path . '/jbevent.application.php'; require $path . '/jbevent.basket.php'; require $path . '/jbevent.category.php'; require $path . '/jbevent.comment.php'; require $path . '/jbevent.element.php'; require $path . '/jbevent.item.php'; require $path . '/jbevent.jbzoo.php'; require $path . '/jbevent.layout.php'; require $path . '/jbevent.submission.php'; require $path . '/jbevent.tag.php'; require $path . '/jbevent.type.php'; require $path . '/jbevent.payment.php'; $event = $this->app->event; $dispatcher = $event->dispatcher; $event->register('JBEventApplication'); $dispatcher->connect('application:init', array('JBEventApplication', 'init')); $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); $event->register('JBEventCategory'); $dispatcher->connect('category:init', array('JBEventCategory', 'init')); $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); $event->register('JBEventItem'); $dispatcher->connect('item:init', array('JBEventItem', 'init')); $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); $event->register('JBEventComment'); $dispatcher->connect('comment:init', array('JBEventComment', 'init')); $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); $event->register('JBEventSubmission'); $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); $event->register('JBEventElement'); $dispatcher->connect('element:download', array('JBEventElement', 'download')); $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); $event->register('JBEventLayout'); $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); $event->register('JBEventTag'); $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); $event->register('JBEventType'); $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); $dispatcher->connect('type:copied', array('JBEventType', 'copied')); $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); $event->register('JBEventJBZoo'); $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); $event->register('JBEventBasket'); $dispatcher->connect('basket:beforesave', array('JBEventBasket', 'beforeSave')); $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); $event->register('JBEventPayment'); $dispatcher->connect('payment:callback', array('JBEventPayment', 'callback')); } /** * Init assets for admin path */ private function _initAssets() { if (!$this->app->jbenv->isSite()) { $this->app->jbassets->admin(); } } /** * Init config file */ private function _initConfig() { if ($configFile = $this->app->path->path('jbapp:config/config.php')) { require $configFile; } } /** * Get group name * @return string */ private function _getGroup() { return $this->_group; } /** * Register new path in system * @param string $path * @param string $pathName * @return mixed */ private function _addPath($path, $pathName) { if ($fullPath = $this->app->path->path($path)) { return $this->app->path->register($fullPath, $pathName); } return null; } /** * Get domain name * @param bool $isAny * @return string */ static function getDomain($isAny = false) { $domain = ''; if (function_exists('apache_request_headers')) { $headers = apache_request_headers(); $domain = isset($headers['Host']) ? $headers['Host'] : ''; } if ($isAny && !$domain) { $domain = $_SERVER['HTTP_HOST']; } $domain = preg_replace('#^www\.#', '', $domain); list($domain) = explode(':', $domain); return $domain; } } \ No newline at end of file + + */ + +// no direct access +defined('_JEXEC') or die('Restricted access'); + + +!defined('JBZOO_APP_GROUP') && define('JBZOO_APP_GROUP', 'jbuniversal'); +!defined('DIRECTORY_SEPERATOR') && define('DIRECTORY_SEPERATOR', '/'); +!defined('DS') && define('DS', DIRECTORY_SEPARATOR); + +/** + * Class JBZoo + */ +class JBZoo +{ + /** + * @var Application + */ + public $app = null; + + /** + * App group name + * @var string + */ + private $_group = JBZOO_APP_GROUP; + + /** + * Init JBZoo application + * @static + * @return JBZoo + */ + public static function init() + { + static $jbzoo; + + if (!isset($jbzoo)) { + $jbzoo = new self(); + } + + return $jbzoo; + } + + /** + * Initialization JBZoo App + */ + private function __construct() + { + $this->app = App::getInstance('zoo'); + + $this->_initPaths(); + $this->_initConfig(); + $this->_initModels(); + $this->_initLanguages(); + $this->_initFilterElements(); + $this->_initEvents(); + $this->_initAssets(); + } + + /** + * Add directory path + */ + private function _initPaths() + { + $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); + $this->_addPath('jbapp:framework', 'jbzoo'); + $this->_addPath('jbapp:assets', 'jbassets'); + $this->_addPath('jbassets:zoo', 'assets'); + $this->_addPath('jbapp:config', 'jbconfig'); + $this->_addPath('jbzoo:elements', 'jbelements'); + $this->_addPath('jbapp:types', 'jbtypes'); + $this->_addPath('jbzoo:helpers', 'helpers'); + $this->_addPath('jbzoo:helpers-std', 'helpers'); + $this->_addPath('jbzoo:render', 'renderer'); + $this->_addPath('jbzoo:controllers/views', 'jbviews'); + $this->_addPath('jbapp:config', 'jbxml'); + $this->_addPath('jbapp:joomla/elements', 'fields'); + $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); + $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); + $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); + $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); + $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); + $this->_addPath('jbapp:templates', 'jbtmpl'); + + if ($this->app->jbenv->isSite()) { + $this->_addPath('jbzoo:controllers', 'controllers'); + } + + $this->app->jbdebug->mark('init::paths'); + } + + /** + * Include models classes + */ + private function _initModels() + { + // defines + define('ZOO_TABLE_JBZOO_INDEX', '#__zoo_jbzoo_index'); + define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); + define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); + + // query builder + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/classes'; + require $path . '/database/JBDatabaseQuery.php'; + require $path . '/database/JBDatabaseQueryElement.php'; + + // models + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/models'; + require $path . '/jbmodel.php'; + require $path . '/jbmodel.element.php'; + require $path . '/jbmodel.autocomplete.php'; + require $path . '/jbmodel.element.country.php'; + require $path . '/jbmodel.element.itemdate.php'; + require $path . '/jbmodel.element.itemauthor.php'; + require $path . '/jbmodel.element.itemcategory.php'; + require $path . '/jbmodel.element.itemcreated.php'; + require $path . '/jbmodel.element.itemfrontpage.php'; + require $path . '/jbmodel.element.itemmodified.php'; + require $path . '/jbmodel.element.itemname.php'; + require $path . '/jbmodel.element.itempublish_down.php'; + require $path . '/jbmodel.element.itempublish_up.php'; + require $path . '/jbmodel.element.itemtag.php'; + require $path . '/jbmodel.element.jbimage.php'; + require $path . '/jbmodel.element.jbselectcascade.php'; + require $path . '/jbmodel.element.range.php'; + require $path . '/jbmodel.element.rating.php'; + require $path . '/jbmodel.element.jbpriceadvance.php'; + require $path . '/jbmodel.favorite.php'; + require $path . '/jbmodel.filter.php'; + require $path . '/jbmodel.item.php'; + require $path . '/jbmodel.app.php'; + require $path . '/jbmodel.category.php'; + require $path . '/jbmodel.order.php'; + require $path . '/jbmodel.related.php'; + require $path . '/jbmodel.searchindex.php'; + require $path . '/jbmodel.values.php'; + require $path . '/jbmodel.sku.php'; + } + + /** + * Load lang files + */ + private function _initLanguages() + { + $lang = JFactory::getLanguage(); + $lang->load('com_zoo'); + $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); + $lang->load('com_zoo', JPATH_ADMINISTRATOR); + } + + /** + * Load others libraries + */ + private function _initFilterElements() + { + jimport('joomla.html.parameter.element'); + + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/render/filter'; + require $path . '/element.php'; + require $path . '/element.author.php'; + require $path . '/element.author.checkbox.php'; + require $path . '/element.author.radio.php'; + require $path . '/element.author.select.php'; + require $path . '/element.author.select.chosen.php'; + require $path . '/element.author.text.php'; + require $path . '/element.category.php'; + require $path . '/element.category.chosen.php'; + require $path . '/element.checkbox.php'; + require $path . '/element.country.php'; + require $path . '/element.country.checkbox.php'; + require $path . '/element.country.radio.php'; + require $path . '/element.country.select.php'; + require $path . '/element.country.select.chosen.php'; + require $path . '/element.date.php'; + require $path . '/element.date.range.php'; + require $path . '/element.frontpage.php'; + require $path . '/element.frontpage.jqueryui.php'; + require $path . '/element.hidden.php'; + require $path . '/element.imageexists.php'; + require $path . '/element.imageexists.jqueryui.php'; + require $path . '/element.jbselectcascade.php'; + require $path . '/element.jqueryui.php'; + require $path . '/element.name.php'; + require $path . '/element.name.checkbox.php'; + require $path . '/element.name.radio.php'; + require $path . '/element.name.select.php'; + require $path . '/element.name.select.chosen.php'; + require $path . '/element.radio.php'; + require $path . '/element.rating.php'; + require $path . '/element.rating.ranges.php'; + require $path . '/element.rating.slider.php'; + require $path . '/element.select.php'; + require $path . '/element.select.chosen.php'; + require $path . '/element.slider.php'; + require $path . '/element.tag.php'; + require $path . '/element.tag.checkbox.php'; + require $path . '/element.tag.radio.php'; + require $path . '/element.tag.select.php'; + require $path . '/element.tag.select.chosen.php'; + require $path . '/element.text.php'; + require $path . '/element.text.range.php'; + } + + /** + * Register and connect events + */ + private function _initEvents() + { + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/events'; + require $path . '/jbevent.php'; + require $path . '/jbevent.application.php'; + require $path . '/jbevent.basket.php'; + require $path . '/jbevent.category.php'; + require $path . '/jbevent.comment.php'; + require $path . '/jbevent.element.php'; + require $path . '/jbevent.item.php'; + require $path . '/jbevent.jbzoo.php'; + require $path . '/jbevent.layout.php'; + require $path . '/jbevent.submission.php'; + require $path . '/jbevent.tag.php'; + require $path . '/jbevent.type.php'; + require $path . '/jbevent.payment.php'; + + $event = $this->app->event; + $dispatcher = $event->dispatcher; + + $event->register('JBEventApplication'); + $dispatcher->connect('application:init', array('JBEventApplication', 'init')); + $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); + $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); + + $event->register('JBEventCategory'); + $dispatcher->connect('category:init', array('JBEventCategory', 'init')); + $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); + $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); + $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); + + $event->register('JBEventItem'); + $dispatcher->connect('item:init', array('JBEventItem', 'init')); + $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); + $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); + $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); + $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); + $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); + + $event->register('JBEventComment'); + $dispatcher->connect('comment:init', array('JBEventComment', 'init')); + $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); + $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); + $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); + + $event->register('JBEventSubmission'); + $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); + $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); + $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); + $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); + + $event->register('JBEventElement'); + $dispatcher->connect('element:download', array('JBEventElement', 'download')); + $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); + $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); + $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); + $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); + $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); + $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); + $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); + $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); + $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); + + $event->register('JBEventLayout'); + $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); + + $event->register('JBEventTag'); + $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); + $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); + + $event->register('JBEventType'); + $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); + $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); + $dispatcher->connect('type:copied', array('JBEventType', 'copied')); + $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); + $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); + + $event->register('JBEventJBZoo'); + $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); + $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); + + $event->register('JBEventBasket'); + $dispatcher->connect('basket:beforesave', array('JBEventBasket', 'beforeSave')); + $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); + + $event->register('JBEventPayment'); + $dispatcher->connect('payment:callback', array('JBEventPayment', 'callback')); + } + + /** + * Init assets for admin path + */ + private function _initAssets() + { + if (!$this->app->jbenv->isSite()) { + $this->app->jbassets->admin(); + } + } + + /** + * Init config file + */ + private function _initConfig() + { + if ($configFile = $this->app->path->path('jbapp:config/config.php')) { + require $configFile; + } + } + + /** + * Get group name + * @return string + */ + private function _getGroup() + { + return $this->_group; + } + + /** + * Register new path in system + * @param string $path + * @param string $pathName + * @return mixed + */ + private function _addPath($path, $pathName) + { + if ($fullPath = $this->app->path->path($path)) { + return $this->app->path->register($fullPath, $pathName); + } + + return null; + } + + /** + * Get domain name + * @param bool $isAny + * @return string + */ + static function getDomain($isAny = false) + { + $domain = ''; + if (function_exists('apache_request_headers')) { + $headers = apache_request_headers(); + $domain = isset($headers['Host']) ? $headers['Host'] : ''; + } + + if ($isAny && !$domain) { + $domain = $_SERVER['HTTP_HOST']; + } + + $domain = preg_replace('#^www\.#', '', $domain); + list($domain) = explode(':', $domain); + + return $domain; + } +} diff --git a/patches/2.1.0/media/zoo/applications/jbuniversal/framework/helpers/jbimport.php b/patches/2.1.0/media/zoo/applications/jbuniversal/framework/helpers/jbimport.php index 05655a6..080058c 100644 --- a/patches/2.1.0/media/zoo/applications/jbuniversal/framework/helpers/jbimport.php +++ b/patches/2.1.0/media/zoo/applications/jbuniversal/framework/helpers/jbimport.php @@ -1,567 +1,567 @@ - - */ - -// no direct access -defined('_JEXEC') or die('Restricted access'); - - -/** - * Class JBImportHelper - */ -class JBImportHelper extends AppHelper -{ - const STEP_SIZE = 50; - - const LOSE_NONE = 0; - const LOSE_DISABLE = 1; - const LOSE_REMOVE = 2; - - const KEY_NONE = 0; - const KEY_ID = 1; - const KEY_NAME = 2; - const KEY_ALIAS = 3; - const KEY_SKU = 4; - - const OPTIONS_NO = 0; - const OPTIONS_YES = 1; - - /** - * @var JSONData - */ - protected $_data = null; - - /** - * @param App $app - */ - public function __construct($app) - { - parent::__construct($app); - - // make sure the line endings are recognized irrespective of the OS - $this->app->jbenv->maxPerformance(); - ini_set('auto_detect_line_endings', true); - } - - /** - * Get info for pre import step - * @param string $file - * @param array $options - * @return array - */ - public function getInfo($file, $options) - { - $options = $this->app->data->create($options); - - $info = array(); - - // get applications - $applist = JBModelApp::model()->getList(); - if (!empty($applist)) { - $info['applist'] = array(); - foreach ($applist as $app) { - $info['applist'][$app->id] = $app->name; - } - - reset($applist); - $application = current($applist); - - $info['app'] = current($applist); - } - - // get types - $info['types'] = array(); - foreach ($info['app']->getTypes() as $type) { - $info['types'][$type->id] = array(); - - foreach ($type->getElements() as $element) { - // filter elements - $info['types'][$type->id][$element->getElementType()][] = $element; - } - - } - - $info['item_count'] = 0; - $info['columns'] = array(); - - // get params - $separator = $options->get('separator', ',') ? $options->get('separator', ',') : ','; - $enclosure = $options->get('enclosure', '"') ? $options->get('enclosure', '"') : '"'; - $containsHeaders = (int)$options->get('header', 1); - - // get column names and row count - $rowCount = 0; - if (($handle = fopen($file, "r")) !== false) { - - while (($data = fgetcsv($handle, 0, $separator, $enclosure)) !== false) { - - if ($rowCount == 0) { - if ($containsHeaders) { - $info['columns'] = $data; - } else { - $info['columns'] = array_fill(0, count($data), ''); - } - } - - $rowCount++; - } - fclose($handle); - } - - $info['count'] = $containsHeaders ? $rowCount - 1 : $rowCount; - - return $info; - } - - /** - * @param $info - * @return array - */ - public function itemsControls($info) - { - $html = array(); - $htmlHelper = $this->app->html; - - $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_APP') . ' -')); - $options += $info['applist']; - $html['apps'] = $htmlHelper->_('select.genericlist', $options, 'appid'); - - $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_TYPE') . ' -')); - $html['types'] = $htmlHelper->_('zoo.typelist', $info['app'], $options, 'typeid', null, 'value', 'text'); - - $html['fields_types'] = array(); - foreach ($info['types'] as $typeid => $element_types) { - $html['fields_types'][$typeid] = $this->_createItemsControl($typeid, $element_types); - } - - // lose control - $loseOptions = array( - $htmlHelper->_('select.option', self::LOSE_NONE, JText::_('JBZOO_IMPORT_LOSE_NONE')), - $htmlHelper->_('select.option', self::LOSE_DISABLE, JText::_('JBZOO_IMPORT_LOSE_DISABLE')), - $htmlHelper->_('select.option', self::LOSE_REMOVE, JText::_('JBZOO_IMPORT_LOSE_REMOVE')), - ); - $html['lose'] = $htmlHelper->_('select.genericlist', $loseOptions, 'lose'); - - // what field is key - $keyOptions = array( - $htmlHelper->_('select.option', self::KEY_NONE, JText::_('JBZOO_IMPORT_KEY_NONE')), - $htmlHelper->_('select.option', self::KEY_ID, JText::_('JBZOO_IMPORT_KEY_ID')), - $htmlHelper->_('select.option', self::KEY_NAME, JText::_('JBZOO_IMPORT_KEY_NAME')), - $htmlHelper->_('select.option', self::KEY_ALIAS, JText::_('JBZOO_IMPORT_KEY_ALIAS')), - $htmlHelper->_('select.option', self::KEY_SKU, JText::_('JBZOO_IMPORT_KEY_SKU')), - ); - $html['key'] = $htmlHelper->_('select.genericlist', $keyOptions, 'key'); - - // check options config - $checkOptions = array( - $htmlHelper->_('select.option', self::OPTIONS_NO, JText::_('JBZOO_IMPORT_CHECK_OPTION_NO')), - $htmlHelper->_('select.option', self::OPTIONS_YES, JText::_('JBZOO_IMPORT_CHECK_OPTION_YES')), - ); - - $html['checkOptions'] = $htmlHelper->_('select.genericlist', $checkOptions, 'checkOptions'); - - return $html; - } - - /** - * @param $info - * @return array - */ - public function categoriesControls($info) - { - $html = array(); - $htmlHelper = $this->app->html; - - $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_APP') . ' -')); - $options += $info['applist']; - $html['apps'] = $htmlHelper->_('select.genericlist', $options, 'appid'); - - $html['fields_types'] = $this->_createCategoriesControl('categoryFileds'); - - // lose control - $loseOptions = array( - $htmlHelper->_('select.option', self::LOSE_NONE, JText::_('JBZOO_IMPORT_LOSE_NONE')), - $htmlHelper->_('select.option', self::LOSE_DISABLE, JText::_('JBZOO_IMPORT_LOSE_DISABLE')), - $htmlHelper->_('select.option', self::LOSE_REMOVE, JText::_('JBZOO_IMPORT_LOSE_REMOVE')), - ); - $html['lose'] = $htmlHelper->_('select.genericlist', $loseOptions, 'lose'); - - // what field is key - $keyOptions = array( - $htmlHelper->_('select.option', self::KEY_NONE, JText::_('JBZOO_IMPORT_KEY_NONE')), - $htmlHelper->_('select.option', self::KEY_ID, JText::_('JBZOO_IMPORT_KEY_ID')), - $htmlHelper->_('select.option', self::KEY_NAME, JText::_('JBZOO_IMPORT_KEY_NAME')), - $htmlHelper->_('select.option', self::KEY_ALIAS, JText::_('JBZOO_IMPORT_KEY_ALIAS')), - ); - $html['key'] = $htmlHelper->_('select.genericlist', $keyOptions, 'key'); - - return $html; - } - - /** - * Create fields control for item - * @param $typeid - * @param $elementTypes - */ - protected function _createItemsControl($typeid, $elementTypes) - { - $htmlHelper = $this->app->html; - - $fields = $this->app->jbcsvmapper->getItemFields($elementTypes); - $options = array($htmlHelper->_('select.option', '', ' ** ')); - - foreach ($fields as $groupKey => $group) { - - if (strpos($groupKey, '__') === false) { - $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . $groupKey)); - } else { - list($groupName, $name) = explode('__', $groupKey); - $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . $groupName) . ' - ' . $name); - } - - foreach ($group as $fieldKey => $field) { - $options[] = $htmlHelper->_('select.option', $fieldKey, $field); - } - - $options[] = $htmlHelper->_('select.option', ''); - } - - return $htmlHelper->_( - 'select.genericlist', - $options, - 'assign[' . $typeid . '][__name_placeholder__]', - 'class="type-select type-select-' . $typeid . '"' - ); - } - - /** - * Create fields control for category - */ - protected function _createCategoriesControl() - { - $htmlHelper = $this->app->html; - - $fields = $this->app->jbcsvmapper->getCategoryFields(); - $options = array($htmlHelper->_('select.option', '', ' ** ')); - - foreach ($fields as $groupKey => $group) { - - $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . strtoupper($groupKey))); - - foreach ($group as $fieldKey => $field) { - $options[] = $htmlHelper->_('select.option', $fieldKey, $field); - } - - $options[] = $htmlHelper->_('select.option', ''); - } - - return $htmlHelper->_('select.genericlist', $options, 'assign[]', 'class="type-select"'); - } - - /** - * @return string - */ - public function getTmpFilename() - { - return $this->app->jbpath->sysPath('tmp', '/' . uniqid('jbimport_') . '.csv'); - } - - /** - * Get import data from session - * @return JSONData - */ - protected function _initSessionData() - { - $data = $this->app->jbsession->getGroup('import'); - $this->_data = $this->app->data->create($data); - - return $this->_data; - } - - /** - * Get last line in CSV file - * @param int $step - * @return int - */ - protected function _getLastLine($step = 0) - { - $lastLine = self::STEP_SIZE * $step; - if ((int)$this->_data->header) { - $lastLine++; - } - - return $lastLine; - } - - /** - * Get lines from CSV file for current step - * @param string $file - * @param int $lastLine - * @return array - */ - protected function _getCSVLines($file, $lastLine) - { - return $this->app->jbcsv->getLinesfromFile($file, $this->_data, $lastLine, self::STEP_SIZE); - } - - /** - * Process one Item row - * @param array $row - * @param int $lineKey - * @return int - */ - protected function _processItemRow($row, $lineKey) - { - // create item - $item = $this->_getItemByKey($row, $lineKey); - - $positions = array(); - - // bind import data from CSV - foreach ($this->_data->assign as $colKey => $itemField) { - - $itemField = JString::trim($itemField); - if (!empty($itemField)) { - - $value = isset($row[$colKey]) ? $row[$colKey] : null; - - $fieldInfo = $this->app->jbcsvmapper->itemFieldToMeta($itemField); - - $positionKey = implode('__', $fieldInfo); - if (!isset($positions[$positionKey])) { - $positions[$positionKey] = 0; - } - $positions[$positionKey]++; - - $cellElem = $this->app->jbcsvcell->createItem($fieldInfo['name'], $item, $fieldInfo['group'], $fieldInfo); - $cellElem->fromCSV($value, $positions[$positionKey]); - } - } - - $id = $item->id; - - // save all changes - $item->getParams()->set('jbzoo.no_index', 0); - $this->app->table->item->save($item); - - // clean memory - unset($item); - - return $id; - } - - /** - * Process one Category row - * @param array $row - * @param int $lineKey - * @return int - */ - protected function _processCategoryRow($row, $lineKey) - { - // create item - $category = $this->_getCategoryByKey($row, $lineKey); - - // bind import data from CSV - foreach ($this->_data->assign as $colKey => $itemField) { - - $itemField = JString::trim($itemField); - if (!empty($itemField)) { - - $value = isset($row[$colKey]) ? $row[$colKey] : null; - - $fieldInfo = $this->app->jbcsvmapper->categoryFieldToMeta($itemField); - $positionKey = implode('__', $fieldInfo); - - $cellElem = $this->app->jbcsvcell->createCategory($fieldInfo['name'], $category, $fieldInfo['group'], $fieldInfo); - $cellElem->fromCSV($value); - } - } - - $id = $category->id; - - // save all changes - $this->app->table->category->save($category); - - // clean memory - unset($category); - - return $id; - } - - /** - * Get key field value - * @param array $row - * @param string $lineKey - * @return Item - */ - protected function _getItemByKey($row, $lineKey = null) - { - $item = null; - - if ($this->_data->key != self::KEY_NONE) { - foreach ($this->_data->assign as $csvKey => $fieldName) { - - if ($this->_data->key == self::KEY_ID && $fieldName == 'id') { - $item = JBModelItem::model()->getById(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_NAME && $fieldName == 'name') { - $item = JBModelItem::model()->getByName(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_ALIAS && $fieldName == 'alias') { - $item = JBModelItem::model()->getByAlias(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_SKU && strpos('price_sku__', $fieldName) == 0) { - $item = JBModelItem::model()->getBySku(JString::trim($row[$csvKey]), $this->_data->appid); - break; - } - } - } - - if (!$item) { - $item = JBModelItem::model()->createEmpty($this->_data->appid, $this->_data->typeid, $lineKey); - } - - return $item; - } - - /** - * Get key field value - * @param array $row - * @param string $lineKey - * @return Item - */ - protected function _getCategoryByKey($row, $lineKey = null) - { - $category = null; - - if ($this->_data->key != self::KEY_NONE) { - foreach ($this->_data->assign as $csvKey => $fieldName) { - - if ($this->_data->key == self::KEY_ID && $fieldName == 'id') { - $category = JBModelCategory::model()->getById(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_NAME && $fieldName == 'name') { - $category = JBModelCategory::model()->getByName(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_ALIAS && $fieldName == 'alias') { - $category = JBModelCategory::model()->getByAlias(JString::trim($row[$csvKey]), $this->_data->appid); - break; - } - } - } - - if (!$category) { - $category = JBModelCategory::model()->createEmpty($this->_data->appid, $lineKey); - } - - return $category; - } - - /** - * One step precess for items - * @param int $step - * @return array - */ - public function itemsProcess($step = 0) - { - $this->_initSessionData(); - - $lastLine = $this->_getLastLine($step); - $lines = $this->_getCSVLines($this->_data->file, $lastLine, $step); - - $lineKey = 0; - $addedIds = ($step == 0) ? array() : $this->app->jbsession->get('ids', 'import-ids'); - - if (!empty($lines)) { - foreach ($lines as $key => $row) { - $lineKey = $lastLine + $key; - $addedIds[] = $this->_processItemRow($row, $lineKey); - } - } - - $this->app->jbsession->set('ids', $addedIds, 'import-ids'); - - return array('progress' => round(($lineKey / $this->_data->count) * 100, 2)); - } - - /** - * One step precess for categories - * @param int $step - * @return array - */ - public function categoriesProcess($step = 0) - { - $this->_initSessionData(); - - $lastLine = $this->_getLastLine($step); - $lines = $this->_getCSVLines($this->_data->file, $lastLine, $step); - - $lineKey = 0; - $addedIds = ($step == 0) ? array() : $this->app->jbsession->get('ids', 'import-ids'); - - if (!empty($lines)) { - foreach ($lines as $key => $row) { - $lineKey = $lastLine + $key; - $addedIds[] = $this->_processCategoryRow($row, $lineKey); - } - } - - $this->app->jbsession->set('ids', $addedIds, 'import-ids'); - - return array('progress' => round(($lineKey / $this->_data->count) * 100, 2)); - } - - /** - * Call after all items loaded - */ - public function itemsPostProcess() - { - $addedIds = $this->app->jbsession->get('ids', 'import-ids'); - $this->_initSessionData(); - - if ($this->_data->lose == self::LOSE_DISABLE) { - JBModelItem::model()->disableAll($this->_data->appid, $this->_data->typeid, $addedIds); - - } else if ($this->_data->lose == self::LOSE_REMOVE) { - JBModelItem::model()->removeAll($this->_data->appid, $this->_data->typeid, $addedIds); - } - - $this->app->jbsession->clearGroup('import-ids'); - } - - /** - * Call after all items loaded - */ - public function categoriesPostProcess() - { - $addedIds = $this->app->jbsession->get('ids', 'import-ids'); - $this->_initSessionData(); - - if ($this->_data->lose == self::LOSE_DISABLE) { - JBModelCategory::model()->disableAll($this->_data->appid, $addedIds); - - } else if ($this->_data->lose == self::LOSE_REMOVE) { - JBModelCategory::model()->removeAll($this->_data->appid, $addedIds); - } - - $this->app->jbsession->clearGroup('import-ids'); - } - - -} + + */ + +// no direct access +defined('_JEXEC') or die('Restricted access'); + + +/** + * Class JBImportHelper + */ +class JBImportHelper extends AppHelper +{ + const STEP_SIZE = 50; + + const LOSE_NONE = 0; + const LOSE_DISABLE = 1; + const LOSE_REMOVE = 2; + + const KEY_NONE = 0; + const KEY_ID = 1; + const KEY_NAME = 2; + const KEY_ALIAS = 3; + const KEY_SKU = 4; + + const OPTIONS_NO = 0; + const OPTIONS_YES = 1; + + /** + * @var JSONData + */ + protected $_data = null; + + /** + * @param App $app + */ + public function __construct($app) + { + parent::__construct($app); + + // make sure the line endings are recognized irrespective of the OS + $this->app->jbenv->maxPerformance(); + ini_set('auto_detect_line_endings', true); + } + + /** + * Get info for pre import step + * @param string $file + * @param array $options + * @return array + */ + public function getInfo($file, $options) + { + $options = $this->app->data->create($options); + + $info = array(); + + // get applications + $applist = JBModelApp::model()->getList(); + if (!empty($applist)) { + $info['applist'] = array(); + foreach ($applist as $app) { + $info['applist'][$app->id] = $app->name; + } + + reset($applist); + $application = current($applist); + + $info['app'] = current($applist); + } + + // get types + $info['types'] = array(); + foreach ($info['app']->getTypes() as $type) { + $info['types'][$type->id] = array(); + + foreach ($type->getElements() as $element) { + // filter elements + $info['types'][$type->id][$element->getElementType()][] = $element; + } + + } + + $info['item_count'] = 0; + $info['columns'] = array(); + + // get params + $separator = $options->get('separator', ',') ? $options->get('separator', ',') : ','; + $enclosure = $options->get('enclosure', '"') ? $options->get('enclosure', '"') : '"'; + $containsHeaders = (int)$options->get('header', 1); + + // get column names and row count + $rowCount = 0; + if (($handle = fopen($file, "r")) !== false) { + + while (($data = fgetcsv($handle, 0, $separator, $enclosure)) !== false) { + + if ($rowCount == 0) { + if ($containsHeaders) { + $info['columns'] = $data; + } else { + $info['columns'] = array_fill(0, count($data), ''); + } + } + + $rowCount++; + } + fclose($handle); + } + + $info['count'] = $containsHeaders ? $rowCount - 1 : $rowCount; + + return $info; + } + + /** + * @param $info + * @return array + */ + public function itemsControls($info) + { + $html = array(); + $htmlHelper = $this->app->html; + + $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_APP') . ' -')); + $options += $info['applist']; + $html['apps'] = $htmlHelper->_('select.genericlist', $options, 'appid'); + + $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_TYPE') . ' -')); + $html['types'] = $htmlHelper->_('zoo.typelist', $info['app'], $options, 'typeid', null, 'value', 'text'); + + $html['fields_types'] = array(); + foreach ($info['types'] as $typeid => $element_types) { + $html['fields_types'][$typeid] = $this->_createItemsControl($typeid, $element_types); + } + + // lose control + $loseOptions = array( + $htmlHelper->_('select.option', self::LOSE_NONE, JText::_('JBZOO_IMPORT_LOSE_NONE')), + $htmlHelper->_('select.option', self::LOSE_DISABLE, JText::_('JBZOO_IMPORT_LOSE_DISABLE')), + $htmlHelper->_('select.option', self::LOSE_REMOVE, JText::_('JBZOO_IMPORT_LOSE_REMOVE')), + ); + $html['lose'] = $htmlHelper->_('select.genericlist', $loseOptions, 'lose'); + + // what field is key + $keyOptions = array( + $htmlHelper->_('select.option', self::KEY_NONE, JText::_('JBZOO_IMPORT_KEY_NONE')), + $htmlHelper->_('select.option', self::KEY_ID, JText::_('JBZOO_IMPORT_KEY_ID')), + $htmlHelper->_('select.option', self::KEY_NAME, JText::_('JBZOO_IMPORT_KEY_NAME')), + $htmlHelper->_('select.option', self::KEY_ALIAS, JText::_('JBZOO_IMPORT_KEY_ALIAS')), + $htmlHelper->_('select.option', self::KEY_SKU, JText::_('JBZOO_IMPORT_KEY_SKU')), + ); + $html['key'] = $htmlHelper->_('select.genericlist', $keyOptions, 'key'); + + // check options config + $checkOptions = array( + $htmlHelper->_('select.option', self::OPTIONS_NO, JText::_('JBZOO_IMPORT_CHECK_OPTION_NO')), + $htmlHelper->_('select.option', self::OPTIONS_YES, JText::_('JBZOO_IMPORT_CHECK_OPTION_YES')), + ); + + $html['checkOptions'] = $htmlHelper->_('select.genericlist', $checkOptions, 'checkOptions'); + + return $html; + } + + /** + * @param $info + * @return array + */ + public function categoriesControls($info) + { + $html = array(); + $htmlHelper = $this->app->html; + + $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_APP') . ' -')); + $options += $info['applist']; + $html['apps'] = $htmlHelper->_('select.genericlist', $options, 'appid'); + + $html['fields_types'] = $this->_createCategoriesControl('categoryFileds'); + + // lose control + $loseOptions = array( + $htmlHelper->_('select.option', self::LOSE_NONE, JText::_('JBZOO_IMPORT_LOSE_NONE')), + $htmlHelper->_('select.option', self::LOSE_DISABLE, JText::_('JBZOO_IMPORT_LOSE_DISABLE')), + $htmlHelper->_('select.option', self::LOSE_REMOVE, JText::_('JBZOO_IMPORT_LOSE_REMOVE')), + ); + $html['lose'] = $htmlHelper->_('select.genericlist', $loseOptions, 'lose'); + + // what field is key + $keyOptions = array( + $htmlHelper->_('select.option', self::KEY_NONE, JText::_('JBZOO_IMPORT_KEY_NONE')), + $htmlHelper->_('select.option', self::KEY_ID, JText::_('JBZOO_IMPORT_KEY_ID')), + $htmlHelper->_('select.option', self::KEY_NAME, JText::_('JBZOO_IMPORT_KEY_NAME')), + $htmlHelper->_('select.option', self::KEY_ALIAS, JText::_('JBZOO_IMPORT_KEY_ALIAS')), + ); + $html['key'] = $htmlHelper->_('select.genericlist', $keyOptions, 'key'); + + return $html; + } + + /** + * Create fields control for item + * @param $typeid + * @param $elementTypes + */ + protected function _createItemsControl($typeid, $elementTypes) + { + $htmlHelper = $this->app->html; + + $fields = $this->app->jbcsvmapper->getItemFields($elementTypes); + $options = array($htmlHelper->_('select.option', '', ' ** ')); + + foreach ($fields as $groupKey => $group) { + + if (strpos($groupKey, '__') === false) { + $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . $groupKey)); + } else { + list($groupName, $name) = explode('__', $groupKey); + $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . $groupName) . ' - ' . $name); + } + + foreach ($group as $fieldKey => $field) { + $options[] = $htmlHelper->_('select.option', $fieldKey, $field); + } + + $options[] = $htmlHelper->_('select.option', ''); + } + + return $htmlHelper->_( + 'select.genericlist', + $options, + 'assign[' . $typeid . '][__name_placeholder__]', + 'class="type-select type-select-' . $typeid . '"' + ); + } + + /** + * Create fields control for category + */ + protected function _createCategoriesControl() + { + $htmlHelper = $this->app->html; + + $fields = $this->app->jbcsvmapper->getCategoryFields(); + $options = array($htmlHelper->_('select.option', '', ' ** ')); + + foreach ($fields as $groupKey => $group) { + + $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . strtoupper($groupKey))); + + foreach ($group as $fieldKey => $field) { + $options[] = $htmlHelper->_('select.option', $fieldKey, $field); + } + + $options[] = $htmlHelper->_('select.option', ''); + } + + return $htmlHelper->_('select.genericlist', $options, 'assign[]', 'class="type-select"'); + } + + /** + * @return string + */ + public function getTmpFilename() + { + return $this->app->jbpath->sysPath('tmp', '/' . uniqid('jbimport_') . '.csv'); + } + + /** + * Get import data from session + * @return JSONData + */ + protected function _initSessionData() + { + $data = $this->app->jbsession->getGroup('import'); + $this->_data = $this->app->data->create($data); + + return $this->_data; + } + + /** + * Get last line in CSV file + * @param int $step + * @return int + */ + protected function _getLastLine($step = 0) + { + $lastLine = self::STEP_SIZE * $step; + if ((int)$this->_data->header) { + $lastLine++; + } + + return $lastLine; + } + + /** + * Get lines from CSV file for current step + * @param string $file + * @param int $lastLine + * @return array + */ + protected function _getCSVLines($file, $lastLine) + { + return $this->app->jbcsv->getLinesfromFile($file, $this->_data, $lastLine, self::STEP_SIZE); + } + + /** + * Process one Item row + * @param array $row + * @param int $lineKey + * @return int + */ + protected function _processItemRow($row, $lineKey) + { + // create item + $item = $this->_getItemByKey($row, $lineKey); + + $positions = array(); + + // bind import data from CSV + foreach ($this->_data->assign as $colKey => $itemField) { + + $itemField = JString::trim($itemField); + if (!empty($itemField)) { + + $value = isset($row[$colKey]) ? $row[$colKey] : null; + + $fieldInfo = $this->app->jbcsvmapper->itemFieldToMeta($itemField); + + $positionKey = implode('__', $fieldInfo); + if (!isset($positions[$positionKey])) { + $positions[$positionKey] = 0; + } + $positions[$positionKey]++; + + $cellElem = $this->app->jbcsvcell->createItem($fieldInfo['name'], $item, $fieldInfo['group'], $fieldInfo); + $cellElem->fromCSV($value, $positions[$positionKey]); + } + } + + $id = $item->id; + + // save all changes + $item->getParams()->set('jbzoo.no_index', 0); + $this->app->table->item->save($item); + + // clean memory + unset($item); + + return $id; + } + + /** + * Process one Category row + * @param array $row + * @param int $lineKey + * @return int + */ + protected function _processCategoryRow($row, $lineKey) + { + // create item + $category = $this->_getCategoryByKey($row, $lineKey); + + // bind import data from CSV + foreach ($this->_data->assign as $colKey => $itemField) { + + $itemField = JString::trim($itemField); + if (!empty($itemField)) { + + $value = isset($row[$colKey]) ? $row[$colKey] : null; + + $fieldInfo = $this->app->jbcsvmapper->categoryFieldToMeta($itemField); + $positionKey = implode('__', $fieldInfo); + + $cellElem = $this->app->jbcsvcell->createCategory($fieldInfo['name'], $category, $fieldInfo['group'], $fieldInfo); + $cellElem->fromCSV($value); + } + } + + $id = $category->id; + + // save all changes + $this->app->table->category->save($category); + + // clean memory + unset($category); + + return $id; + } + + /** + * Get key field value + * @param array $row + * @param string $lineKey + * @return Item + */ + protected function _getItemByKey($row, $lineKey = null) + { + $item = null; + + if ($this->_data->key != self::KEY_NONE) { + foreach ($this->_data->assign as $csvKey => $fieldName) { + + if ($this->_data->key == self::KEY_ID && $fieldName == 'id') { + $item = JBModelItem::model()->getById(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_NAME && $fieldName == 'name') { + $item = JBModelItem::model()->getByName(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_ALIAS && $fieldName == 'alias') { + $item = JBModelItem::model()->getByAlias(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_SKU && strpos('price_sku__', $fieldName) == 0) { + $item = JBModelItem::model()->getBySku(JString::trim($row[$csvKey]), $this->_data->appid); + break; + } + } + } + + if (!$item) { + $item = JBModelItem::model()->createEmpty($this->_data->appid, $this->_data->typeid, $lineKey); + } + + return $item; + } + + /** + * Get key field value + * @param array $row + * @param string $lineKey + * @return Item + */ + protected function _getCategoryByKey($row, $lineKey = null) + { + $category = null; + + if ($this->_data->key != self::KEY_NONE) { + foreach ($this->_data->assign as $csvKey => $fieldName) { + + if ($this->_data->key == self::KEY_ID && $fieldName == 'id') { + $category = JBModelCategory::model()->getById(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_NAME && $fieldName == 'name') { + $category = JBModelCategory::model()->getByName(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_ALIAS && $fieldName == 'alias') { + $category = JBModelCategory::model()->getByAlias(JString::trim($row[$csvKey]), $this->_data->appid); + break; + } + } + } + + if (!$category) { + $category = JBModelCategory::model()->createEmpty($this->_data->appid, $lineKey); + } + + return $category; + } + + /** + * One step precess for items + * @param int $step + * @return array + */ + public function itemsProcess($step = 0) + { + $this->_initSessionData(); + + $lastLine = $this->_getLastLine($step); + $lines = $this->_getCSVLines($this->_data->file, $lastLine, $step); + + $lineKey = 0; + $addedIds = ($step == 0) ? array() : $this->app->jbsession->get('ids', 'import-ids'); + + if (!empty($lines)) { + foreach ($lines as $key => $row) { + $lineKey = $lastLine + $key; + $addedIds[] = $this->_processItemRow($row, $lineKey); + } + } + + $this->app->jbsession->set('ids', $addedIds, 'import-ids'); + + return array('progress' => round(($lineKey / $this->_data->count) * 100, 2)); + } + + /** + * One step precess for categories + * @param int $step + * @return array + */ + public function categoriesProcess($step = 0) + { + $this->_initSessionData(); + + $lastLine = $this->_getLastLine($step); + $lines = $this->_getCSVLines($this->_data->file, $lastLine, $step); + + $lineKey = 0; + $addedIds = ($step == 0) ? array() : $this->app->jbsession->get('ids', 'import-ids'); + + if (!empty($lines)) { + foreach ($lines as $key => $row) { + $lineKey = $lastLine + $key; + $addedIds[] = $this->_processCategoryRow($row, $lineKey); + } + } + + $this->app->jbsession->set('ids', $addedIds, 'import-ids'); + + return array('progress' => round(($lineKey / $this->_data->count) * 100, 2)); + } + + /** + * Call after all items loaded + */ + public function itemsPostProcess() + { + $addedIds = $this->app->jbsession->get('ids', 'import-ids'); + $this->_initSessionData(); + + if ($this->_data->lose == self::LOSE_DISABLE) { + JBModelItem::model()->disableAll($this->_data->appid, $this->_data->typeid, $addedIds); + + } else if ($this->_data->lose == self::LOSE_REMOVE) { + JBModelItem::model()->removeAll($this->_data->appid, $this->_data->typeid, $addedIds); + } + + $this->app->jbsession->clearGroup('import-ids'); + } + + /** + * Call after all items loaded + */ + public function categoriesPostProcess() + { + $addedIds = $this->app->jbsession->get('ids', 'import-ids'); + $this->_initSessionData(); + + if ($this->_data->lose == self::LOSE_DISABLE) { + JBModelCategory::model()->disableAll($this->_data->appid, $addedIds); + + } else if ($this->_data->lose == self::LOSE_REMOVE) { + JBModelCategory::model()->removeAll($this->_data->appid, $addedIds); + } + + $this->app->jbsession->clearGroup('import-ids'); + } + + +} diff --git a/patches/2.1.0/media/zoo/applications/jbuniversal/framework/jbzoo.php b/patches/2.1.0/media/zoo/applications/jbuniversal/framework/jbzoo.php index 9ef5756..3fe7595 100644 --- a/patches/2.1.0/media/zoo/applications/jbuniversal/framework/jbzoo.php +++ b/patches/2.1.0/media/zoo/applications/jbuniversal/framework/jbzoo.php @@ -1 +1,617 @@ - */ // no direct access defined('_JEXEC') or die('Restricted access'); !defined('JBZOO_APP_GROUP') && define('JBZOO_APP_GROUP', 'jbuniversal'); !defined('DIRECTORY_SEPERATOR') && define('DIRECTORY_SEPERATOR', '/'); !defined('DS') && define('DS', DIRECTORY_SEPARATOR); /** * Class JBZoo */ class JBZoo { /** * @var Application */ public $app = null; /** * App group name * @var string */ private $_group = JBZOO_APP_GROUP; /** * Init JBZoo application * @static * @return JBZoo */ public static function init() { static $jbzoo; if (!isset($jbzoo)) { $jbzoo = new self(); } return $jbzoo; } /** * Initialization JBZoo App */ private function __construct() { $this->app = App::getInstance('zoo'); $this->_initPaths(); $this->_initConfig(); $this->_initModels(); $this->_initLanguages(); $this->_initFilterElements(); $this->_initEvents(); $this->_initAssets(); } /** * Add directory path */ private function _initPaths() { $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); $this->_addPath('jbapp:framework', 'jbzoo'); $this->_addPath('jbapp:assets', 'jbassets'); $this->_addPath('jbassets:zoo', 'assets'); $this->_addPath('jbapp:config', 'jbconfig'); $this->_addPath('jbzoo:elements', 'jbelements'); $this->_addPath('jbapp:types', 'jbtypes'); $this->_addPath('jbzoo:helpers', 'helpers'); $this->_addPath('jbzoo:helpers-std', 'helpers'); $this->_addPath('jbzoo:classes-std', 'classes'); $this->_addPath('jbzoo:render', 'renderer'); $this->_addPath('jbzoo:views', 'jbviews'); $this->_addPath('jbapp:config', 'jbxml'); $this->_addPath('jbviews:', 'partials'); $this->_addPath('jbapp:joomla/elements', 'fields'); $this->_addPath('jbapp:templates', 'jbtmpl'); $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); if ($this->app->jbenv->isSite()) { $this->_addPath('jbzoo:controllers', 'controllers'); } require $this->app->path->path('jbzoo:controllers/base.php'); JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); } /** * Include models classes */ private function _initModels() { // defines define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); // query builder $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/classes'; require $path . '/database/JBDatabaseQuery.php'; require $path . '/database/JBDatabaseQueryElement.php'; // models $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/models'; require $path . '/jbmodel.php'; require $path . '/jbmodel.element.php'; require $path . '/jbmodel.autocomplete.php'; require $path . '/jbmodel.element.country.php'; require $path . '/jbmodel.element.itemdate.php'; require $path . '/jbmodel.element.itemauthor.php'; require $path . '/jbmodel.element.itemcategory.php'; require $path . '/jbmodel.element.itemcreated.php'; require $path . '/jbmodel.element.itemfrontpage.php'; require $path . '/jbmodel.element.itemmodified.php'; require $path . '/jbmodel.element.itemname.php'; require $path . '/jbmodel.element.itempublish_down.php'; require $path . '/jbmodel.element.itempublish_up.php'; require $path . '/jbmodel.element.itemtag.php'; require $path . '/jbmodel.element.jbimage.php'; require $path . '/jbmodel.element.jbselectcascade.php'; require $path . '/jbmodel.element.range.php'; require $path . '/jbmodel.element.rating.php'; require $path . '/jbmodel.element.jbpriceadvance.php'; require $path . '/jbmodel.favorite.php'; require $path . '/jbmodel.filter.php'; require $path . '/jbmodel.item.php'; require $path . '/jbmodel.app.php'; require $path . '/jbmodel.category.php'; require $path . '/jbmodel.order.php'; require $path . '/jbmodel.related.php'; require $path . '/jbmodel.searchindex.php'; require $path . '/jbmodel.values.php'; require $path . '/jbmodel.sku.php'; } /** * Load lang files */ private function _initLanguages() { $lang = JFactory::getLanguage(); $lang->load('com_zoo'); $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); $lang->load('com_zoo', JPATH_ADMINISTRATOR); } /** * Load others libraries */ private function _initFilterElements() { jimport('joomla.html.parameter.element'); $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/render/filter'; require $path . '/element.php'; require $path . '/element.author.php'; require $path . '/element.author.checkbox.php'; require $path . '/element.author.radio.php'; require $path . '/element.author.select.php'; require $path . '/element.author.select.chosen.php'; require $path . '/element.author.text.php'; require $path . '/element.category.php'; require $path . '/element.category.chosen.php'; require $path . '/element.checkbox.php'; require $path . '/element.country.php'; require $path . '/element.country.checkbox.php'; require $path . '/element.country.radio.php'; require $path . '/element.country.select.php'; require $path . '/element.country.select.chosen.php'; require $path . '/element.date.php'; require $path . '/element.date.range.php'; require $path . '/element.frontpage.php'; require $path . '/element.frontpage.jqueryui.php'; require $path . '/element.hidden.php'; require $path . '/element.imageexists.php'; require $path . '/element.imageexists.jqueryui.php'; require $path . '/element.jbselectcascade.php'; require $path . '/element.jqueryui.php'; require $path . '/element.name.php'; require $path . '/element.name.checkbox.php'; require $path . '/element.name.radio.php'; require $path . '/element.name.select.php'; require $path . '/element.name.select.chosen.php'; require $path . '/element.radio.php'; require $path . '/element.rating.php'; require $path . '/element.rating.ranges.php'; require $path . '/element.rating.slider.php'; require $path . '/element.select.php'; require $path . '/element.select.chosen.php'; require $path . '/element.slider.php'; require $path . '/element.tag.php'; require $path . '/element.tag.checkbox.php'; require $path . '/element.tag.radio.php'; require $path . '/element.tag.select.php'; require $path . '/element.tag.select.chosen.php'; require $path . '/element.text.php'; require $path . '/element.text.range.php'; } /** * Register and connect events */ private function _initEvents() { $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/events'; require $path . '/jbevent.php'; require $path . '/jbevent.application.php'; require $path . '/jbevent.basket.php'; require $path . '/jbevent.category.php'; require $path . '/jbevent.comment.php'; require $path . '/jbevent.element.php'; require $path . '/jbevent.item.php'; require $path . '/jbevent.jbzoo.php'; require $path . '/jbevent.layout.php'; require $path . '/jbevent.submission.php'; require $path . '/jbevent.tag.php'; require $path . '/jbevent.type.php'; require $path . '/jbevent.payment.php'; $event = $this->app->event; $dispatcher = $event->dispatcher; $event->register('JBEventApplication'); $dispatcher->connect('application:init', ['JBEventApplication', 'init']); $dispatcher->connect('application:saved', ['JBEventApplication', 'saved']); $dispatcher->connect('application:deleted', ['JBEventApplication', 'deleted']); $dispatcher->connect('application:addmenuitems', ['JBEventApplication', 'addmenuitems']); $dispatcher->connect('application:installed', ['JBEventApplication', 'installed']); $dispatcher->connect('application:configparams', ['JBEventApplication', 'configparams']); $dispatcher->connect('application:sefbuildroute', ['JBEventApplication', 'sefbuildroute']); $dispatcher->connect('application:sefparseroute', ['JBEventApplication', 'sefparseroute']); $dispatcher->connect('application:sh404sef', ['JBEventApplication', 'sh404sef']); $event->register('JBEventCategory'); $dispatcher->connect('category:init', ['JBEventCategory', 'init']); $dispatcher->connect('category:saved', ['JBEventCategory', 'saved']); $dispatcher->connect('category:deleted', ['JBEventCategory', 'deleted']); $dispatcher->connect('category:stateChanged', ['JBEventCategory', 'stateChanged']); $event->register('JBEventItem'); $dispatcher->connect('item:init', ['JBEventItem', 'init']); $dispatcher->connect('item:saved', ['JBEventItem', 'saved']); $dispatcher->connect('item:deleted', ['JBEventItem', 'deleted']); $dispatcher->connect('item:stateChanged', ['JBEventItem', 'stateChanged']); $dispatcher->connect('item:beforedisplay', ['JBEventItem', 'beforeDisplay']); $dispatcher->connect('item:afterdisplay', ['JBEventItem', 'afterDisplay']); $dispatcher->connect('item:orderquery', ['JBEventItem', 'orderQuery']); $dispatcher->connect('item:beforeSaveCategoryRelations', ['JBEventItem', 'beforeSaveCategoryRelations']); $event->register('JBEventComment'); $dispatcher->connect('comment:init', ['JBEventComment', 'init']); $dispatcher->connect('comment:saved', ['JBEventComment', 'saved']); $dispatcher->connect('comment:deleted', ['JBEventComment', 'deleted']); $dispatcher->connect('comment:stateChanged', ['JBEventComment', 'stateChanged']); $event->register('JBEventSubmission'); $dispatcher->connect('submission:init', ['JBEventSubmission', 'init']); $dispatcher->connect('submission:saved', ['JBEventSubmission', 'saved']); $dispatcher->connect('submission:deleted', ['JBEventSubmission', 'deleted']); $dispatcher->connect('submission:beforesave', ['JBEventSubmission', 'beforeSave']); $event->register('JBEventElement'); $dispatcher->connect('element:download', ['JBEventElement', 'download']); $dispatcher->connect('element:configform', ['JBEventElement', 'configForm']); $dispatcher->connect('element:configparams', ['JBEventElement', 'configParams']); $dispatcher->connect('element:configxml', ['JBEventElement', 'configXML']); $dispatcher->connect('element:afterdisplay', ['JBEventElement', 'afterDisplay']); $dispatcher->connect('element:beforedisplay', ['JBEventElement', 'beforeDisplay']); $dispatcher->connect('element:aftersubmissiondisplay', ['JBEventElement', 'afterSubmissionDisplay']); $dispatcher->connect('element:beforesubmissiondisplay', ['JBEventElement', 'beforeSubmissionDisplay']); $dispatcher->connect('element:beforeedit', ['JBEventElement', 'beforeEdit']); $dispatcher->connect('element:afteredit', ['JBEventElement', 'afterEdit']); $event->register('JBEventLayout'); $dispatcher->connect('layout:init', ['JBEventLayout', 'init']); $event->register('JBEventTag'); $dispatcher->connect('tag:saved', ['JBEventTag', 'saved']); $dispatcher->connect('tag:deleted', ['JBEventTag', 'deleted']); $event->register('JBEventType'); $dispatcher->connect('type:beforesave', ['JBEventType', 'beforesave']); $dispatcher->connect('type:aftersave', ['JBEventType', 'aftersave']); $dispatcher->connect('type:copied', ['JBEventType', 'copied']); $dispatcher->connect('type:deleted', ['JBEventType', 'deleted']); $dispatcher->connect('type:editdisplay', ['JBEventType', 'editDisplay']); $dispatcher->connect('type:coreconfig', ['JBEventType', 'coreconfig']); $dispatcher->connect('type:assignelements', ['JBEventType', 'assignelements']); $event->register('JBEventJBZoo'); $dispatcher->connect('jbzoo:beforeInit', ['JBEventJBZoo', 'beforeInit']); $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); $event->register('JBEventBasket'); $dispatcher->connect('basket:beforesave', ['JBEventBasket', 'beforeSave']); $dispatcher->connect('basket:saved', ['JBEventBasket', 'saved']); $event->register('JBEventPayment'); $dispatcher->connect('payment:callback', ['JBEventPayment', 'callback']); } /** * Init assets for admin path */ private function _initAssets() { if (!$this->app->jbenv->isSite()) { $this->app->jbassets->admin(); $this->_initAdminMenu(); } } /** * Init Admin menu */ private function _initAdminMenu() { if (defined('JBZOO_CONFIG_ADMINMENU') && !JBZOO_CONFIG_ADMINMENU) { return false; } $appList = JBModelApp::model()->getSimpleList(); $findJBZooApp = false; foreach ($appList as $app) { if ($app->application_group == JBZOO_APP_GROUP) { $findJBZooApp = true; break; } } if (!$findJBZooApp) { return false; } $router = $this->app->jbrouter; $cache = JFactory::getCache('jbzooadmin', 'output', 'file'); $cache->setCaching(1); $cache->setLifeTime(900); $menuItems = $cache->get('jbadminitems'); if ($menuItems === false) { $menuItems = []; $appPath = $this->app->path->path('jbapp:'); $appIcon = $this->app->jbimage->resize($appPath . '/application.png', 16, 16); if (!empty($appList)) { foreach ($appList as $app) { if ($iconPath = $this->app->path->path('jbassets:app_icons/' . $app->alias . '.png')) { $appIcon = $this->app->jbimage->resize($iconPath, 16, 16); } $menuItems['app-' . $app->alias] = [ 'name' => $app->name, 'url' => $router->admin(['changeapp' => $app->id, 'controller' => 'item']), 'icon' => $appIcon->url, 'children' => [ 'items' => [ 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), 'url' => $router->admin([ 'changeapp' => $app->id, 'controller' => 'item', 'task' => '' ]) ], 'categories' => [ 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), 'url' => $router->admin(['changeapp' => $app->id, 'controller' => 'category', 'task' => '' ]) ], 'frontpage' => [ 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), 'url' => $router->admin(['changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '' ]) ], 'comments' => [ 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), 'url' => $router->admin(['changeapp' => $app->id, 'controller' => 'comment', 'task' => '' ]) ], 'sep-1' => 'divider', 'config' => [ 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), 'url' => $router->admin(['changeapp' => $app->id, 'controller' => 'configuration', 'task' => '' ]) ], ] ]; } } $menuItems['item-config'] = [ 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), 'url' => $this->app->jbrouter->admin(['task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager' ]), ]; $types = $this->app->jbtype->getSimpleList(); if (!empty($types)) { $children = []; foreach ($types as $alias => $type) { $children['type-' . $alias] = [ 'name' => $type, 'url' => $router->admin([ 'controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => ['0' => $alias] ]) ]; } $menuItems['item-config']['children'] = $children; } $menuItems['sep-1'] = 'divider'; $menuItems['jbzoo-admin'] = [ 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), 'url' => $router->admin(['controller' => 'jbindex', 'task' => 'index']), 'children' => [ 'performance' => [ 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), 'url' => $router->admin(['controller' => 'jbtools', 'task' => 'index']), ], 'systemreport' => [ 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), 'url' => $router->admin(['controller' => 'jbconfig', 'task' => 'index']), ], ], ]; $menuItems['jbzoo-import'] = [ 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), 'url' => $router->admin(['controller' => 'jbimport', 'task' => 'index']), 'children' => [ 'items' => [ 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), 'url' => $router->admin(['controller' => 'jbimport', 'task' => 'items']), ], 'categories' => [ 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), 'url' => $router->admin(['controller' => 'jbimport', 'task' => 'categories']), ], 'stdandart' => [ 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDART'), 'url' => $router->admin(['controller' => 'jbimport', 'task' => 'standart']), ], ], ]; $menuItems['jbzoo-export'] = [ 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'index']), 'children' => [ 'items' => [ 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'items']), ], 'categories' => [ 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'categories']), ], 'types' => [ 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'types']), ], 'yandexyml' => [ 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'yandexyml']), ], 'stdandart' => [ 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDART'), 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'standart']), ], 'zoobackup' => [ 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'zoobackup']), ], ], ]; $menuItems['sep-2'] = 'divider'; $menuItems['jbzoo-info'] = [ 'name' => JText::_('JBZOO_ADMINMENU_INFO'), 'url' => $router->admin(['controller' => 'jbinfo', 'task' => 'index']), 'children' => [ 'performance' => [ 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), 'url' => $router->admin(['controller' => 'jbinfo', 'task' => 'performance']), ], 'systemreport' => [ 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), 'url' => $router->admin(['controller' => 'jbinfo', 'task' => 'systemreport']), ], 'server' => array( 'name' => 'Get Last JBZoo', 'url' => 'https://github.com/JBZoo/JBZoo', 'target' => '_blank', ), ] ]; $menuItems['jbzoo-support'] = [ 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), 'url' => 'http://forum.jbzoo.com/', 'target' => '_blank', ]; // save to cache $cache->store($menuItems, 'jbadminitems'); } $this->app->jbassets->addVar('JBAdminItems', [ 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), 'items' => $menuItems, ]); } /** * Init config file */ private function _initConfig() { if ($configFile = $this->app->path->path('jbapp:config/config.php')) { require $configFile; } } /** * Get group name * @return string */ private function _getGroup() { return $this->_group; } /** * Register new path in system * @param string $path * @param string $pathName * @return mixed */ private function _addPath($path, $pathName) { if ($fullPath = $this->app->path->path($path)) { return $this->app->path->register($fullPath, $pathName); } return null; } /** * Get domain name * @param bool $isAny * @return string */ static function getDomain($isAny = false) { $domain = ''; if (function_exists('apache_request_headers')) { $headers = apache_request_headers(); $domain = isset($headers['Host']) ? $headers['Host'] : ''; } if ($isAny && !$domain) { $domain = $_SERVER['HTTP_HOST']; } $domain = preg_replace('#^www\.#', '', $domain); list($domain) = explode(':', $domain); return $domain; } /** * Get hash * @param $string * @return string */ static public function getHash($string) { return ''; } } \ No newline at end of file + + */ + +// no direct access +defined('_JEXEC') or die('Restricted access'); + + +!defined('JBZOO_APP_GROUP') && define('JBZOO_APP_GROUP', 'jbuniversal'); +!defined('DIRECTORY_SEPERATOR') && define('DIRECTORY_SEPERATOR', '/'); +!defined('DS') && define('DS', DIRECTORY_SEPARATOR); + +/** + * Class JBZoo + */ +class JBZoo +{ + /** + * @var Application + */ + public $app = null; + + /** + * App group name + * @var string + */ + private $_group = JBZOO_APP_GROUP; + + /** + * Init JBZoo application + * @static + * @return JBZoo + */ + public static function init() + { + static $jbzoo; + + if (!isset($jbzoo)) { + $jbzoo = new self(); + } + + return $jbzoo; + } + + /** + * Initialization JBZoo App + */ + private function __construct() + { + $this->app = App::getInstance('zoo'); + + $this->_initPaths(); + $this->_initConfig(); + $this->_initModels(); + $this->_initLanguages(); + $this->_initFilterElements(); + $this->_initEvents(); + $this->_initAssets(); + } + + /** + * Add directory path + */ + private function _initPaths() + { + $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); + $this->_addPath('jbapp:framework', 'jbzoo'); + $this->_addPath('jbapp:assets', 'jbassets'); + $this->_addPath('jbassets:zoo', 'assets'); + $this->_addPath('jbapp:config', 'jbconfig'); + $this->_addPath('jbzoo:elements', 'jbelements'); + $this->_addPath('jbapp:types', 'jbtypes'); + $this->_addPath('jbzoo:helpers', 'helpers'); + $this->_addPath('jbzoo:helpers-std', 'helpers'); + $this->_addPath('jbzoo:classes-std', 'classes'); + $this->_addPath('jbzoo:render', 'renderer'); + $this->_addPath('jbzoo:views', 'jbviews'); + $this->_addPath('jbapp:config', 'jbxml'); + $this->_addPath('jbviews:', 'partials'); + $this->_addPath('jbapp:joomla/elements', 'fields'); + $this->_addPath('jbapp:templates', 'jbtmpl'); + $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); + $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); + $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); + $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); + $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); + + if ($this->app->jbenv->isSite()) { + $this->_addPath('jbzoo:controllers', 'controllers'); + } + + require $this->app->path->path('jbzoo:controllers/base.php'); + + JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); + } + + /** + * Include models classes + */ + private function _initModels() + { + // defines + define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); + define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); + + // query builder + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/classes'; + require $path . '/database/JBDatabaseQuery.php'; + require $path . '/database/JBDatabaseQueryElement.php'; + + // models + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/models'; + require $path . '/jbmodel.php'; + require $path . '/jbmodel.element.php'; + require $path . '/jbmodel.autocomplete.php'; + require $path . '/jbmodel.element.country.php'; + require $path . '/jbmodel.element.itemdate.php'; + require $path . '/jbmodel.element.itemauthor.php'; + require $path . '/jbmodel.element.itemcategory.php'; + require $path . '/jbmodel.element.itemcreated.php'; + require $path . '/jbmodel.element.itemfrontpage.php'; + require $path . '/jbmodel.element.itemmodified.php'; + require $path . '/jbmodel.element.itemname.php'; + require $path . '/jbmodel.element.itempublish_down.php'; + require $path . '/jbmodel.element.itempublish_up.php'; + require $path . '/jbmodel.element.itemtag.php'; + require $path . '/jbmodel.element.jbimage.php'; + require $path . '/jbmodel.element.jbselectcascade.php'; + require $path . '/jbmodel.element.range.php'; + require $path . '/jbmodel.element.rating.php'; + require $path . '/jbmodel.element.jbpriceadvance.php'; + require $path . '/jbmodel.favorite.php'; + require $path . '/jbmodel.filter.php'; + require $path . '/jbmodel.item.php'; + require $path . '/jbmodel.app.php'; + require $path . '/jbmodel.category.php'; + require $path . '/jbmodel.order.php'; + require $path . '/jbmodel.related.php'; + require $path . '/jbmodel.searchindex.php'; + require $path . '/jbmodel.values.php'; + require $path . '/jbmodel.sku.php'; + } + + /** + * Load lang files + */ + private function _initLanguages() + { + $lang = JFactory::getLanguage(); + $lang->load('com_zoo'); + $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); + $lang->load('com_zoo', JPATH_ADMINISTRATOR); + } + + /** + * Load others libraries + */ + private function _initFilterElements() + { + jimport('joomla.html.parameter.element'); + + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/render/filter'; + require $path . '/element.php'; + require $path . '/element.author.php'; + require $path . '/element.author.checkbox.php'; + require $path . '/element.author.radio.php'; + require $path . '/element.author.select.php'; + require $path . '/element.author.select.chosen.php'; + require $path . '/element.author.text.php'; + require $path . '/element.category.php'; + require $path . '/element.category.chosen.php'; + require $path . '/element.checkbox.php'; + require $path . '/element.country.php'; + require $path . '/element.country.checkbox.php'; + require $path . '/element.country.radio.php'; + require $path . '/element.country.select.php'; + require $path . '/element.country.select.chosen.php'; + require $path . '/element.date.php'; + require $path . '/element.date.range.php'; + require $path . '/element.frontpage.php'; + require $path . '/element.frontpage.jqueryui.php'; + require $path . '/element.hidden.php'; + require $path . '/element.imageexists.php'; + require $path . '/element.imageexists.jqueryui.php'; + require $path . '/element.jbselectcascade.php'; + require $path . '/element.jqueryui.php'; + require $path . '/element.name.php'; + require $path . '/element.name.checkbox.php'; + require $path . '/element.name.radio.php'; + require $path . '/element.name.select.php'; + require $path . '/element.name.select.chosen.php'; + require $path . '/element.radio.php'; + require $path . '/element.rating.php'; + require $path . '/element.rating.ranges.php'; + require $path . '/element.rating.slider.php'; + require $path . '/element.select.php'; + require $path . '/element.select.chosen.php'; + require $path . '/element.slider.php'; + require $path . '/element.tag.php'; + require $path . '/element.tag.checkbox.php'; + require $path . '/element.tag.radio.php'; + require $path . '/element.tag.select.php'; + require $path . '/element.tag.select.chosen.php'; + require $path . '/element.text.php'; + require $path . '/element.text.range.php'; + } + + /** + * Register and connect events + */ + private function _initEvents() + { + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/events'; + require $path . '/jbevent.php'; + require $path . '/jbevent.application.php'; + require $path . '/jbevent.basket.php'; + require $path . '/jbevent.category.php'; + require $path . '/jbevent.comment.php'; + require $path . '/jbevent.element.php'; + require $path . '/jbevent.item.php'; + require $path . '/jbevent.jbzoo.php'; + require $path . '/jbevent.layout.php'; + require $path . '/jbevent.submission.php'; + require $path . '/jbevent.tag.php'; + require $path . '/jbevent.type.php'; + require $path . '/jbevent.payment.php'; + + $event = $this->app->event; + $dispatcher = $event->dispatcher; + + $event->register('JBEventApplication'); + $dispatcher->connect('application:init', ['JBEventApplication', 'init']); + $dispatcher->connect('application:saved', ['JBEventApplication', 'saved']); + $dispatcher->connect('application:deleted', ['JBEventApplication', 'deleted']); + $dispatcher->connect('application:addmenuitems', ['JBEventApplication', 'addmenuitems']); + $dispatcher->connect('application:installed', ['JBEventApplication', 'installed']); + $dispatcher->connect('application:configparams', ['JBEventApplication', 'configparams']); + $dispatcher->connect('application:sefbuildroute', ['JBEventApplication', 'sefbuildroute']); + $dispatcher->connect('application:sefparseroute', ['JBEventApplication', 'sefparseroute']); + $dispatcher->connect('application:sh404sef', ['JBEventApplication', 'sh404sef']); + + $event->register('JBEventCategory'); + $dispatcher->connect('category:init', ['JBEventCategory', 'init']); + $dispatcher->connect('category:saved', ['JBEventCategory', 'saved']); + $dispatcher->connect('category:deleted', ['JBEventCategory', 'deleted']); + $dispatcher->connect('category:stateChanged', ['JBEventCategory', 'stateChanged']); + + $event->register('JBEventItem'); + $dispatcher->connect('item:init', ['JBEventItem', 'init']); + $dispatcher->connect('item:saved', ['JBEventItem', 'saved']); + $dispatcher->connect('item:deleted', ['JBEventItem', 'deleted']); + $dispatcher->connect('item:stateChanged', ['JBEventItem', 'stateChanged']); + $dispatcher->connect('item:beforedisplay', ['JBEventItem', 'beforeDisplay']); + $dispatcher->connect('item:afterdisplay', ['JBEventItem', 'afterDisplay']); + $dispatcher->connect('item:orderquery', ['JBEventItem', 'orderQuery']); + $dispatcher->connect('item:beforeSaveCategoryRelations', ['JBEventItem', 'beforeSaveCategoryRelations']); + + $event->register('JBEventComment'); + $dispatcher->connect('comment:init', ['JBEventComment', 'init']); + $dispatcher->connect('comment:saved', ['JBEventComment', 'saved']); + $dispatcher->connect('comment:deleted', ['JBEventComment', 'deleted']); + $dispatcher->connect('comment:stateChanged', ['JBEventComment', 'stateChanged']); + + $event->register('JBEventSubmission'); + $dispatcher->connect('submission:init', ['JBEventSubmission', 'init']); + $dispatcher->connect('submission:saved', ['JBEventSubmission', 'saved']); + $dispatcher->connect('submission:deleted', ['JBEventSubmission', 'deleted']); + $dispatcher->connect('submission:beforesave', ['JBEventSubmission', 'beforeSave']); + + $event->register('JBEventElement'); + $dispatcher->connect('element:download', ['JBEventElement', 'download']); + $dispatcher->connect('element:configform', ['JBEventElement', 'configForm']); + $dispatcher->connect('element:configparams', ['JBEventElement', 'configParams']); + $dispatcher->connect('element:configxml', ['JBEventElement', 'configXML']); + $dispatcher->connect('element:afterdisplay', ['JBEventElement', 'afterDisplay']); + $dispatcher->connect('element:beforedisplay', ['JBEventElement', 'beforeDisplay']); + $dispatcher->connect('element:aftersubmissiondisplay', ['JBEventElement', 'afterSubmissionDisplay']); + $dispatcher->connect('element:beforesubmissiondisplay', ['JBEventElement', 'beforeSubmissionDisplay']); + $dispatcher->connect('element:beforeedit', ['JBEventElement', 'beforeEdit']); + $dispatcher->connect('element:afteredit', ['JBEventElement', 'afterEdit']); + + $event->register('JBEventLayout'); + $dispatcher->connect('layout:init', ['JBEventLayout', 'init']); + + $event->register('JBEventTag'); + $dispatcher->connect('tag:saved', ['JBEventTag', 'saved']); + $dispatcher->connect('tag:deleted', ['JBEventTag', 'deleted']); + + $event->register('JBEventType'); + $dispatcher->connect('type:beforesave', ['JBEventType', 'beforesave']); + $dispatcher->connect('type:aftersave', ['JBEventType', 'aftersave']); + $dispatcher->connect('type:copied', ['JBEventType', 'copied']); + $dispatcher->connect('type:deleted', ['JBEventType', 'deleted']); + $dispatcher->connect('type:editdisplay', ['JBEventType', 'editDisplay']); + $dispatcher->connect('type:coreconfig', ['JBEventType', 'coreconfig']); + $dispatcher->connect('type:assignelements', ['JBEventType', 'assignelements']); + + $event->register('JBEventJBZoo'); + $dispatcher->connect('jbzoo:beforeInit', ['JBEventJBZoo', 'beforeInit']); + $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); + + $event->register('JBEventBasket'); + $dispatcher->connect('basket:beforesave', ['JBEventBasket', 'beforeSave']); + $dispatcher->connect('basket:saved', ['JBEventBasket', 'saved']); + + $event->register('JBEventPayment'); + $dispatcher->connect('payment:callback', ['JBEventPayment', 'callback']); + } + + /** + * Init assets for admin path + */ + private function _initAssets() + { + if (!$this->app->jbenv->isSite()) { + $this->app->jbassets->admin(); + $this->_initAdminMenu(); + } + } + + /** + * Init Admin menu + */ + private function _initAdminMenu() + { + if (defined('JBZOO_CONFIG_ADMINMENU') && !JBZOO_CONFIG_ADMINMENU) { + return false; + } + + $appList = JBModelApp::model()->getSimpleList(); + $findJBZooApp = false; + foreach ($appList as $app) { + if ($app->application_group == JBZOO_APP_GROUP) { + $findJBZooApp = true; + break; + } + } + + if (!$findJBZooApp) { + return false; + } + + $router = $this->app->jbrouter; + $cache = JFactory::getCache('jbzooadmin', 'output', 'file'); + $cache->setCaching(1); + $cache->setLifeTime(900); + + $menuItems = $cache->get('jbadminitems'); + + if ($menuItems === false) { + $menuItems = []; + + $appPath = $this->app->path->path('jbapp:'); + $appIcon = $this->app->jbimage->resize($appPath . '/application.png', 16, 16); + + if (!empty($appList)) { + foreach ($appList as $app) { + + if ($iconPath = $this->app->path->path('jbassets:app_icons/' . $app->alias . '.png')) { + $appIcon = $this->app->jbimage->resize($iconPath, 16, 16); + } + + $menuItems['app-' . $app->alias] = [ + 'name' => $app->name, + 'url' => $router->admin(['changeapp' => $app->id, 'controller' => 'item']), + 'icon' => $appIcon->url, + 'children' => [ + 'items' => [ + 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), + 'url' => $router->admin([ + 'changeapp' => $app->id, + 'controller' => 'item', + 'task' => '' + ]) + ], + 'categories' => [ + 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), + 'url' => $router->admin(['changeapp' => $app->id, + 'controller' => 'category', + 'task' => '' + ]) + ], + 'frontpage' => [ + 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), + 'url' => $router->admin(['changeapp' => $app->id, + 'controller' => 'frontpage', + 'task' => '' + ]) + ], + 'comments' => [ + 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), + 'url' => $router->admin(['changeapp' => $app->id, + 'controller' => 'comment', + 'task' => '' + ]) + ], + 'sep-1' => 'divider', + 'config' => [ + 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), + 'url' => $router->admin(['changeapp' => $app->id, + 'controller' => 'configuration', + 'task' => '' + ]) + ], + ] + ]; + } + } + + $menuItems['item-config'] = [ + 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), + 'url' => $this->app->jbrouter->admin(['task' => 'types', + 'group' => 'jbuniversal', + 'controller' => 'manager' + ]), + ]; + + $types = $this->app->jbtype->getSimpleList(); + if (!empty($types)) { + $children = []; + foreach ($types as $alias => $type) { + $children['type-' . $alias] = [ + 'name' => $type, + 'url' => $router->admin([ + 'controller' => 'manager', + 'group' => 'jbuniversal', + 'task' => 'editelements', + 'cid' => ['0' => $alias] + ]) + ]; + } + + $menuItems['item-config']['children'] = $children; + } + + $menuItems['sep-1'] = 'divider'; + + $menuItems['jbzoo-admin'] = [ + 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), + 'url' => $router->admin(['controller' => 'jbindex', 'task' => 'index']), + 'children' => [ + 'performance' => [ + 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), + 'url' => $router->admin(['controller' => 'jbtools', 'task' => 'index']), + ], + 'systemreport' => [ + 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), + 'url' => $router->admin(['controller' => 'jbconfig', 'task' => 'index']), + ], + ], + ]; + + $menuItems['jbzoo-import'] = [ + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), + 'url' => $router->admin(['controller' => 'jbimport', 'task' => 'index']), + 'children' => [ + 'items' => [ + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), + 'url' => $router->admin(['controller' => 'jbimport', 'task' => 'items']), + ], + 'categories' => [ + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), + 'url' => $router->admin(['controller' => 'jbimport', 'task' => 'categories']), + ], + 'stdandart' => [ + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDART'), + 'url' => $router->admin(['controller' => 'jbimport', 'task' => 'standart']), + ], + ], + ]; + + $menuItems['jbzoo-export'] = [ + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), + 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'index']), + 'children' => [ + 'items' => [ + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), + 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'items']), + ], + 'categories' => [ + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), + 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'categories']), + ], + 'types' => [ + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), + 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'types']), + ], + 'yandexyml' => [ + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), + 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'yandexyml']), + ], + 'stdandart' => [ + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDART'), + 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'standart']), + ], + 'zoobackup' => [ + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), + 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'zoobackup']), + ], + ], + ]; + + $menuItems['sep-2'] = 'divider'; + + $menuItems['jbzoo-info'] = [ + 'name' => JText::_('JBZOO_ADMINMENU_INFO'), + 'url' => $router->admin(['controller' => 'jbinfo', 'task' => 'index']), + 'children' => [ + 'performance' => [ + 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), + 'url' => $router->admin(['controller' => 'jbinfo', 'task' => 'performance']), + ], + 'systemreport' => [ + 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), + 'url' => $router->admin(['controller' => 'jbinfo', 'task' => 'systemreport']), + ], + 'server' => array( + 'name' => 'Get Last JBZoo', + 'url' => 'https://github.com/JBZoo/JBZoo', + 'target' => '_blank', + ), + ] + ]; + $menuItems['jbzoo-support'] = [ + 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), + 'url' => 'http://forum.jbzoo.com/', + 'target' => '_blank', + ]; + + // save to cache + $cache->store($menuItems, 'jbadminitems'); + } + + $this->app->jbassets->addVar('JBAdminItems', [ + 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), + 'items' => $menuItems, + ]); + } + + /** + * Init config file + */ + private function _initConfig() + { + if ($configFile = $this->app->path->path('jbapp:config/config.php')) { + require $configFile; + } + } + + /** + * Get group name + * @return string + */ + private function _getGroup() + { + return $this->_group; + } + + /** + * Register new path in system + * @param string $path + * @param string $pathName + * @return mixed + */ + private function _addPath($path, $pathName) + { + if ($fullPath = $this->app->path->path($path)) { + return $this->app->path->register($fullPath, $pathName); + } + + return null; + } + + /** + * Get domain name + * @param bool $isAny + * @return string + */ + static function getDomain($isAny = false) + { + $domain = ''; + if (function_exists('apache_request_headers')) { + $headers = apache_request_headers(); + $domain = isset($headers['Host']) ? $headers['Host'] : ''; + } + + if ($isAny && !$domain) { + $domain = $_SERVER['HTTP_HOST']; + } + + $domain = preg_replace('#^www\.#', '', $domain); + list($domain) = explode(':', $domain); + + return $domain; + } + + /** + * Get hash + * @param $string + * @return string + */ + static public function getHash($string) + { + return ''; + } +} diff --git a/patches/2.1.1/media/zoo/applications/jbuniversal/framework/helpers/jbimport.php b/patches/2.1.1/media/zoo/applications/jbuniversal/framework/helpers/jbimport.php index 05655a6..080058c 100644 --- a/patches/2.1.1/media/zoo/applications/jbuniversal/framework/helpers/jbimport.php +++ b/patches/2.1.1/media/zoo/applications/jbuniversal/framework/helpers/jbimport.php @@ -1,567 +1,567 @@ - - */ - -// no direct access -defined('_JEXEC') or die('Restricted access'); - - -/** - * Class JBImportHelper - */ -class JBImportHelper extends AppHelper -{ - const STEP_SIZE = 50; - - const LOSE_NONE = 0; - const LOSE_DISABLE = 1; - const LOSE_REMOVE = 2; - - const KEY_NONE = 0; - const KEY_ID = 1; - const KEY_NAME = 2; - const KEY_ALIAS = 3; - const KEY_SKU = 4; - - const OPTIONS_NO = 0; - const OPTIONS_YES = 1; - - /** - * @var JSONData - */ - protected $_data = null; - - /** - * @param App $app - */ - public function __construct($app) - { - parent::__construct($app); - - // make sure the line endings are recognized irrespective of the OS - $this->app->jbenv->maxPerformance(); - ini_set('auto_detect_line_endings', true); - } - - /** - * Get info for pre import step - * @param string $file - * @param array $options - * @return array - */ - public function getInfo($file, $options) - { - $options = $this->app->data->create($options); - - $info = array(); - - // get applications - $applist = JBModelApp::model()->getList(); - if (!empty($applist)) { - $info['applist'] = array(); - foreach ($applist as $app) { - $info['applist'][$app->id] = $app->name; - } - - reset($applist); - $application = current($applist); - - $info['app'] = current($applist); - } - - // get types - $info['types'] = array(); - foreach ($info['app']->getTypes() as $type) { - $info['types'][$type->id] = array(); - - foreach ($type->getElements() as $element) { - // filter elements - $info['types'][$type->id][$element->getElementType()][] = $element; - } - - } - - $info['item_count'] = 0; - $info['columns'] = array(); - - // get params - $separator = $options->get('separator', ',') ? $options->get('separator', ',') : ','; - $enclosure = $options->get('enclosure', '"') ? $options->get('enclosure', '"') : '"'; - $containsHeaders = (int)$options->get('header', 1); - - // get column names and row count - $rowCount = 0; - if (($handle = fopen($file, "r")) !== false) { - - while (($data = fgetcsv($handle, 0, $separator, $enclosure)) !== false) { - - if ($rowCount == 0) { - if ($containsHeaders) { - $info['columns'] = $data; - } else { - $info['columns'] = array_fill(0, count($data), ''); - } - } - - $rowCount++; - } - fclose($handle); - } - - $info['count'] = $containsHeaders ? $rowCount - 1 : $rowCount; - - return $info; - } - - /** - * @param $info - * @return array - */ - public function itemsControls($info) - { - $html = array(); - $htmlHelper = $this->app->html; - - $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_APP') . ' -')); - $options += $info['applist']; - $html['apps'] = $htmlHelper->_('select.genericlist', $options, 'appid'); - - $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_TYPE') . ' -')); - $html['types'] = $htmlHelper->_('zoo.typelist', $info['app'], $options, 'typeid', null, 'value', 'text'); - - $html['fields_types'] = array(); - foreach ($info['types'] as $typeid => $element_types) { - $html['fields_types'][$typeid] = $this->_createItemsControl($typeid, $element_types); - } - - // lose control - $loseOptions = array( - $htmlHelper->_('select.option', self::LOSE_NONE, JText::_('JBZOO_IMPORT_LOSE_NONE')), - $htmlHelper->_('select.option', self::LOSE_DISABLE, JText::_('JBZOO_IMPORT_LOSE_DISABLE')), - $htmlHelper->_('select.option', self::LOSE_REMOVE, JText::_('JBZOO_IMPORT_LOSE_REMOVE')), - ); - $html['lose'] = $htmlHelper->_('select.genericlist', $loseOptions, 'lose'); - - // what field is key - $keyOptions = array( - $htmlHelper->_('select.option', self::KEY_NONE, JText::_('JBZOO_IMPORT_KEY_NONE')), - $htmlHelper->_('select.option', self::KEY_ID, JText::_('JBZOO_IMPORT_KEY_ID')), - $htmlHelper->_('select.option', self::KEY_NAME, JText::_('JBZOO_IMPORT_KEY_NAME')), - $htmlHelper->_('select.option', self::KEY_ALIAS, JText::_('JBZOO_IMPORT_KEY_ALIAS')), - $htmlHelper->_('select.option', self::KEY_SKU, JText::_('JBZOO_IMPORT_KEY_SKU')), - ); - $html['key'] = $htmlHelper->_('select.genericlist', $keyOptions, 'key'); - - // check options config - $checkOptions = array( - $htmlHelper->_('select.option', self::OPTIONS_NO, JText::_('JBZOO_IMPORT_CHECK_OPTION_NO')), - $htmlHelper->_('select.option', self::OPTIONS_YES, JText::_('JBZOO_IMPORT_CHECK_OPTION_YES')), - ); - - $html['checkOptions'] = $htmlHelper->_('select.genericlist', $checkOptions, 'checkOptions'); - - return $html; - } - - /** - * @param $info - * @return array - */ - public function categoriesControls($info) - { - $html = array(); - $htmlHelper = $this->app->html; - - $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_APP') . ' -')); - $options += $info['applist']; - $html['apps'] = $htmlHelper->_('select.genericlist', $options, 'appid'); - - $html['fields_types'] = $this->_createCategoriesControl('categoryFileds'); - - // lose control - $loseOptions = array( - $htmlHelper->_('select.option', self::LOSE_NONE, JText::_('JBZOO_IMPORT_LOSE_NONE')), - $htmlHelper->_('select.option', self::LOSE_DISABLE, JText::_('JBZOO_IMPORT_LOSE_DISABLE')), - $htmlHelper->_('select.option', self::LOSE_REMOVE, JText::_('JBZOO_IMPORT_LOSE_REMOVE')), - ); - $html['lose'] = $htmlHelper->_('select.genericlist', $loseOptions, 'lose'); - - // what field is key - $keyOptions = array( - $htmlHelper->_('select.option', self::KEY_NONE, JText::_('JBZOO_IMPORT_KEY_NONE')), - $htmlHelper->_('select.option', self::KEY_ID, JText::_('JBZOO_IMPORT_KEY_ID')), - $htmlHelper->_('select.option', self::KEY_NAME, JText::_('JBZOO_IMPORT_KEY_NAME')), - $htmlHelper->_('select.option', self::KEY_ALIAS, JText::_('JBZOO_IMPORT_KEY_ALIAS')), - ); - $html['key'] = $htmlHelper->_('select.genericlist', $keyOptions, 'key'); - - return $html; - } - - /** - * Create fields control for item - * @param $typeid - * @param $elementTypes - */ - protected function _createItemsControl($typeid, $elementTypes) - { - $htmlHelper = $this->app->html; - - $fields = $this->app->jbcsvmapper->getItemFields($elementTypes); - $options = array($htmlHelper->_('select.option', '', ' ** ')); - - foreach ($fields as $groupKey => $group) { - - if (strpos($groupKey, '__') === false) { - $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . $groupKey)); - } else { - list($groupName, $name) = explode('__', $groupKey); - $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . $groupName) . ' - ' . $name); - } - - foreach ($group as $fieldKey => $field) { - $options[] = $htmlHelper->_('select.option', $fieldKey, $field); - } - - $options[] = $htmlHelper->_('select.option', ''); - } - - return $htmlHelper->_( - 'select.genericlist', - $options, - 'assign[' . $typeid . '][__name_placeholder__]', - 'class="type-select type-select-' . $typeid . '"' - ); - } - - /** - * Create fields control for category - */ - protected function _createCategoriesControl() - { - $htmlHelper = $this->app->html; - - $fields = $this->app->jbcsvmapper->getCategoryFields(); - $options = array($htmlHelper->_('select.option', '', ' ** ')); - - foreach ($fields as $groupKey => $group) { - - $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . strtoupper($groupKey))); - - foreach ($group as $fieldKey => $field) { - $options[] = $htmlHelper->_('select.option', $fieldKey, $field); - } - - $options[] = $htmlHelper->_('select.option', ''); - } - - return $htmlHelper->_('select.genericlist', $options, 'assign[]', 'class="type-select"'); - } - - /** - * @return string - */ - public function getTmpFilename() - { - return $this->app->jbpath->sysPath('tmp', '/' . uniqid('jbimport_') . '.csv'); - } - - /** - * Get import data from session - * @return JSONData - */ - protected function _initSessionData() - { - $data = $this->app->jbsession->getGroup('import'); - $this->_data = $this->app->data->create($data); - - return $this->_data; - } - - /** - * Get last line in CSV file - * @param int $step - * @return int - */ - protected function _getLastLine($step = 0) - { - $lastLine = self::STEP_SIZE * $step; - if ((int)$this->_data->header) { - $lastLine++; - } - - return $lastLine; - } - - /** - * Get lines from CSV file for current step - * @param string $file - * @param int $lastLine - * @return array - */ - protected function _getCSVLines($file, $lastLine) - { - return $this->app->jbcsv->getLinesfromFile($file, $this->_data, $lastLine, self::STEP_SIZE); - } - - /** - * Process one Item row - * @param array $row - * @param int $lineKey - * @return int - */ - protected function _processItemRow($row, $lineKey) - { - // create item - $item = $this->_getItemByKey($row, $lineKey); - - $positions = array(); - - // bind import data from CSV - foreach ($this->_data->assign as $colKey => $itemField) { - - $itemField = JString::trim($itemField); - if (!empty($itemField)) { - - $value = isset($row[$colKey]) ? $row[$colKey] : null; - - $fieldInfo = $this->app->jbcsvmapper->itemFieldToMeta($itemField); - - $positionKey = implode('__', $fieldInfo); - if (!isset($positions[$positionKey])) { - $positions[$positionKey] = 0; - } - $positions[$positionKey]++; - - $cellElem = $this->app->jbcsvcell->createItem($fieldInfo['name'], $item, $fieldInfo['group'], $fieldInfo); - $cellElem->fromCSV($value, $positions[$positionKey]); - } - } - - $id = $item->id; - - // save all changes - $item->getParams()->set('jbzoo.no_index', 0); - $this->app->table->item->save($item); - - // clean memory - unset($item); - - return $id; - } - - /** - * Process one Category row - * @param array $row - * @param int $lineKey - * @return int - */ - protected function _processCategoryRow($row, $lineKey) - { - // create item - $category = $this->_getCategoryByKey($row, $lineKey); - - // bind import data from CSV - foreach ($this->_data->assign as $colKey => $itemField) { - - $itemField = JString::trim($itemField); - if (!empty($itemField)) { - - $value = isset($row[$colKey]) ? $row[$colKey] : null; - - $fieldInfo = $this->app->jbcsvmapper->categoryFieldToMeta($itemField); - $positionKey = implode('__', $fieldInfo); - - $cellElem = $this->app->jbcsvcell->createCategory($fieldInfo['name'], $category, $fieldInfo['group'], $fieldInfo); - $cellElem->fromCSV($value); - } - } - - $id = $category->id; - - // save all changes - $this->app->table->category->save($category); - - // clean memory - unset($category); - - return $id; - } - - /** - * Get key field value - * @param array $row - * @param string $lineKey - * @return Item - */ - protected function _getItemByKey($row, $lineKey = null) - { - $item = null; - - if ($this->_data->key != self::KEY_NONE) { - foreach ($this->_data->assign as $csvKey => $fieldName) { - - if ($this->_data->key == self::KEY_ID && $fieldName == 'id') { - $item = JBModelItem::model()->getById(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_NAME && $fieldName == 'name') { - $item = JBModelItem::model()->getByName(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_ALIAS && $fieldName == 'alias') { - $item = JBModelItem::model()->getByAlias(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_SKU && strpos('price_sku__', $fieldName) == 0) { - $item = JBModelItem::model()->getBySku(JString::trim($row[$csvKey]), $this->_data->appid); - break; - } - } - } - - if (!$item) { - $item = JBModelItem::model()->createEmpty($this->_data->appid, $this->_data->typeid, $lineKey); - } - - return $item; - } - - /** - * Get key field value - * @param array $row - * @param string $lineKey - * @return Item - */ - protected function _getCategoryByKey($row, $lineKey = null) - { - $category = null; - - if ($this->_data->key != self::KEY_NONE) { - foreach ($this->_data->assign as $csvKey => $fieldName) { - - if ($this->_data->key == self::KEY_ID && $fieldName == 'id') { - $category = JBModelCategory::model()->getById(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_NAME && $fieldName == 'name') { - $category = JBModelCategory::model()->getByName(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_ALIAS && $fieldName == 'alias') { - $category = JBModelCategory::model()->getByAlias(JString::trim($row[$csvKey]), $this->_data->appid); - break; - } - } - } - - if (!$category) { - $category = JBModelCategory::model()->createEmpty($this->_data->appid, $lineKey); - } - - return $category; - } - - /** - * One step precess for items - * @param int $step - * @return array - */ - public function itemsProcess($step = 0) - { - $this->_initSessionData(); - - $lastLine = $this->_getLastLine($step); - $lines = $this->_getCSVLines($this->_data->file, $lastLine, $step); - - $lineKey = 0; - $addedIds = ($step == 0) ? array() : $this->app->jbsession->get('ids', 'import-ids'); - - if (!empty($lines)) { - foreach ($lines as $key => $row) { - $lineKey = $lastLine + $key; - $addedIds[] = $this->_processItemRow($row, $lineKey); - } - } - - $this->app->jbsession->set('ids', $addedIds, 'import-ids'); - - return array('progress' => round(($lineKey / $this->_data->count) * 100, 2)); - } - - /** - * One step precess for categories - * @param int $step - * @return array - */ - public function categoriesProcess($step = 0) - { - $this->_initSessionData(); - - $lastLine = $this->_getLastLine($step); - $lines = $this->_getCSVLines($this->_data->file, $lastLine, $step); - - $lineKey = 0; - $addedIds = ($step == 0) ? array() : $this->app->jbsession->get('ids', 'import-ids'); - - if (!empty($lines)) { - foreach ($lines as $key => $row) { - $lineKey = $lastLine + $key; - $addedIds[] = $this->_processCategoryRow($row, $lineKey); - } - } - - $this->app->jbsession->set('ids', $addedIds, 'import-ids'); - - return array('progress' => round(($lineKey / $this->_data->count) * 100, 2)); - } - - /** - * Call after all items loaded - */ - public function itemsPostProcess() - { - $addedIds = $this->app->jbsession->get('ids', 'import-ids'); - $this->_initSessionData(); - - if ($this->_data->lose == self::LOSE_DISABLE) { - JBModelItem::model()->disableAll($this->_data->appid, $this->_data->typeid, $addedIds); - - } else if ($this->_data->lose == self::LOSE_REMOVE) { - JBModelItem::model()->removeAll($this->_data->appid, $this->_data->typeid, $addedIds); - } - - $this->app->jbsession->clearGroup('import-ids'); - } - - /** - * Call after all items loaded - */ - public function categoriesPostProcess() - { - $addedIds = $this->app->jbsession->get('ids', 'import-ids'); - $this->_initSessionData(); - - if ($this->_data->lose == self::LOSE_DISABLE) { - JBModelCategory::model()->disableAll($this->_data->appid, $addedIds); - - } else if ($this->_data->lose == self::LOSE_REMOVE) { - JBModelCategory::model()->removeAll($this->_data->appid, $addedIds); - } - - $this->app->jbsession->clearGroup('import-ids'); - } - - -} + + */ + +// no direct access +defined('_JEXEC') or die('Restricted access'); + + +/** + * Class JBImportHelper + */ +class JBImportHelper extends AppHelper +{ + const STEP_SIZE = 50; + + const LOSE_NONE = 0; + const LOSE_DISABLE = 1; + const LOSE_REMOVE = 2; + + const KEY_NONE = 0; + const KEY_ID = 1; + const KEY_NAME = 2; + const KEY_ALIAS = 3; + const KEY_SKU = 4; + + const OPTIONS_NO = 0; + const OPTIONS_YES = 1; + + /** + * @var JSONData + */ + protected $_data = null; + + /** + * @param App $app + */ + public function __construct($app) + { + parent::__construct($app); + + // make sure the line endings are recognized irrespective of the OS + $this->app->jbenv->maxPerformance(); + ini_set('auto_detect_line_endings', true); + } + + /** + * Get info for pre import step + * @param string $file + * @param array $options + * @return array + */ + public function getInfo($file, $options) + { + $options = $this->app->data->create($options); + + $info = array(); + + // get applications + $applist = JBModelApp::model()->getList(); + if (!empty($applist)) { + $info['applist'] = array(); + foreach ($applist as $app) { + $info['applist'][$app->id] = $app->name; + } + + reset($applist); + $application = current($applist); + + $info['app'] = current($applist); + } + + // get types + $info['types'] = array(); + foreach ($info['app']->getTypes() as $type) { + $info['types'][$type->id] = array(); + + foreach ($type->getElements() as $element) { + // filter elements + $info['types'][$type->id][$element->getElementType()][] = $element; + } + + } + + $info['item_count'] = 0; + $info['columns'] = array(); + + // get params + $separator = $options->get('separator', ',') ? $options->get('separator', ',') : ','; + $enclosure = $options->get('enclosure', '"') ? $options->get('enclosure', '"') : '"'; + $containsHeaders = (int)$options->get('header', 1); + + // get column names and row count + $rowCount = 0; + if (($handle = fopen($file, "r")) !== false) { + + while (($data = fgetcsv($handle, 0, $separator, $enclosure)) !== false) { + + if ($rowCount == 0) { + if ($containsHeaders) { + $info['columns'] = $data; + } else { + $info['columns'] = array_fill(0, count($data), ''); + } + } + + $rowCount++; + } + fclose($handle); + } + + $info['count'] = $containsHeaders ? $rowCount - 1 : $rowCount; + + return $info; + } + + /** + * @param $info + * @return array + */ + public function itemsControls($info) + { + $html = array(); + $htmlHelper = $this->app->html; + + $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_APP') . ' -')); + $options += $info['applist']; + $html['apps'] = $htmlHelper->_('select.genericlist', $options, 'appid'); + + $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_TYPE') . ' -')); + $html['types'] = $htmlHelper->_('zoo.typelist', $info['app'], $options, 'typeid', null, 'value', 'text'); + + $html['fields_types'] = array(); + foreach ($info['types'] as $typeid => $element_types) { + $html['fields_types'][$typeid] = $this->_createItemsControl($typeid, $element_types); + } + + // lose control + $loseOptions = array( + $htmlHelper->_('select.option', self::LOSE_NONE, JText::_('JBZOO_IMPORT_LOSE_NONE')), + $htmlHelper->_('select.option', self::LOSE_DISABLE, JText::_('JBZOO_IMPORT_LOSE_DISABLE')), + $htmlHelper->_('select.option', self::LOSE_REMOVE, JText::_('JBZOO_IMPORT_LOSE_REMOVE')), + ); + $html['lose'] = $htmlHelper->_('select.genericlist', $loseOptions, 'lose'); + + // what field is key + $keyOptions = array( + $htmlHelper->_('select.option', self::KEY_NONE, JText::_('JBZOO_IMPORT_KEY_NONE')), + $htmlHelper->_('select.option', self::KEY_ID, JText::_('JBZOO_IMPORT_KEY_ID')), + $htmlHelper->_('select.option', self::KEY_NAME, JText::_('JBZOO_IMPORT_KEY_NAME')), + $htmlHelper->_('select.option', self::KEY_ALIAS, JText::_('JBZOO_IMPORT_KEY_ALIAS')), + $htmlHelper->_('select.option', self::KEY_SKU, JText::_('JBZOO_IMPORT_KEY_SKU')), + ); + $html['key'] = $htmlHelper->_('select.genericlist', $keyOptions, 'key'); + + // check options config + $checkOptions = array( + $htmlHelper->_('select.option', self::OPTIONS_NO, JText::_('JBZOO_IMPORT_CHECK_OPTION_NO')), + $htmlHelper->_('select.option', self::OPTIONS_YES, JText::_('JBZOO_IMPORT_CHECK_OPTION_YES')), + ); + + $html['checkOptions'] = $htmlHelper->_('select.genericlist', $checkOptions, 'checkOptions'); + + return $html; + } + + /** + * @param $info + * @return array + */ + public function categoriesControls($info) + { + $html = array(); + $htmlHelper = $this->app->html; + + $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_APP') . ' -')); + $options += $info['applist']; + $html['apps'] = $htmlHelper->_('select.genericlist', $options, 'appid'); + + $html['fields_types'] = $this->_createCategoriesControl('categoryFileds'); + + // lose control + $loseOptions = array( + $htmlHelper->_('select.option', self::LOSE_NONE, JText::_('JBZOO_IMPORT_LOSE_NONE')), + $htmlHelper->_('select.option', self::LOSE_DISABLE, JText::_('JBZOO_IMPORT_LOSE_DISABLE')), + $htmlHelper->_('select.option', self::LOSE_REMOVE, JText::_('JBZOO_IMPORT_LOSE_REMOVE')), + ); + $html['lose'] = $htmlHelper->_('select.genericlist', $loseOptions, 'lose'); + + // what field is key + $keyOptions = array( + $htmlHelper->_('select.option', self::KEY_NONE, JText::_('JBZOO_IMPORT_KEY_NONE')), + $htmlHelper->_('select.option', self::KEY_ID, JText::_('JBZOO_IMPORT_KEY_ID')), + $htmlHelper->_('select.option', self::KEY_NAME, JText::_('JBZOO_IMPORT_KEY_NAME')), + $htmlHelper->_('select.option', self::KEY_ALIAS, JText::_('JBZOO_IMPORT_KEY_ALIAS')), + ); + $html['key'] = $htmlHelper->_('select.genericlist', $keyOptions, 'key'); + + return $html; + } + + /** + * Create fields control for item + * @param $typeid + * @param $elementTypes + */ + protected function _createItemsControl($typeid, $elementTypes) + { + $htmlHelper = $this->app->html; + + $fields = $this->app->jbcsvmapper->getItemFields($elementTypes); + $options = array($htmlHelper->_('select.option', '', ' ** ')); + + foreach ($fields as $groupKey => $group) { + + if (strpos($groupKey, '__') === false) { + $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . $groupKey)); + } else { + list($groupName, $name) = explode('__', $groupKey); + $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . $groupName) . ' - ' . $name); + } + + foreach ($group as $fieldKey => $field) { + $options[] = $htmlHelper->_('select.option', $fieldKey, $field); + } + + $options[] = $htmlHelper->_('select.option', ''); + } + + return $htmlHelper->_( + 'select.genericlist', + $options, + 'assign[' . $typeid . '][__name_placeholder__]', + 'class="type-select type-select-' . $typeid . '"' + ); + } + + /** + * Create fields control for category + */ + protected function _createCategoriesControl() + { + $htmlHelper = $this->app->html; + + $fields = $this->app->jbcsvmapper->getCategoryFields(); + $options = array($htmlHelper->_('select.option', '', ' ** ')); + + foreach ($fields as $groupKey => $group) { + + $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . strtoupper($groupKey))); + + foreach ($group as $fieldKey => $field) { + $options[] = $htmlHelper->_('select.option', $fieldKey, $field); + } + + $options[] = $htmlHelper->_('select.option', ''); + } + + return $htmlHelper->_('select.genericlist', $options, 'assign[]', 'class="type-select"'); + } + + /** + * @return string + */ + public function getTmpFilename() + { + return $this->app->jbpath->sysPath('tmp', '/' . uniqid('jbimport_') . '.csv'); + } + + /** + * Get import data from session + * @return JSONData + */ + protected function _initSessionData() + { + $data = $this->app->jbsession->getGroup('import'); + $this->_data = $this->app->data->create($data); + + return $this->_data; + } + + /** + * Get last line in CSV file + * @param int $step + * @return int + */ + protected function _getLastLine($step = 0) + { + $lastLine = self::STEP_SIZE * $step; + if ((int)$this->_data->header) { + $lastLine++; + } + + return $lastLine; + } + + /** + * Get lines from CSV file for current step + * @param string $file + * @param int $lastLine + * @return array + */ + protected function _getCSVLines($file, $lastLine) + { + return $this->app->jbcsv->getLinesfromFile($file, $this->_data, $lastLine, self::STEP_SIZE); + } + + /** + * Process one Item row + * @param array $row + * @param int $lineKey + * @return int + */ + protected function _processItemRow($row, $lineKey) + { + // create item + $item = $this->_getItemByKey($row, $lineKey); + + $positions = array(); + + // bind import data from CSV + foreach ($this->_data->assign as $colKey => $itemField) { + + $itemField = JString::trim($itemField); + if (!empty($itemField)) { + + $value = isset($row[$colKey]) ? $row[$colKey] : null; + + $fieldInfo = $this->app->jbcsvmapper->itemFieldToMeta($itemField); + + $positionKey = implode('__', $fieldInfo); + if (!isset($positions[$positionKey])) { + $positions[$positionKey] = 0; + } + $positions[$positionKey]++; + + $cellElem = $this->app->jbcsvcell->createItem($fieldInfo['name'], $item, $fieldInfo['group'], $fieldInfo); + $cellElem->fromCSV($value, $positions[$positionKey]); + } + } + + $id = $item->id; + + // save all changes + $item->getParams()->set('jbzoo.no_index', 0); + $this->app->table->item->save($item); + + // clean memory + unset($item); + + return $id; + } + + /** + * Process one Category row + * @param array $row + * @param int $lineKey + * @return int + */ + protected function _processCategoryRow($row, $lineKey) + { + // create item + $category = $this->_getCategoryByKey($row, $lineKey); + + // bind import data from CSV + foreach ($this->_data->assign as $colKey => $itemField) { + + $itemField = JString::trim($itemField); + if (!empty($itemField)) { + + $value = isset($row[$colKey]) ? $row[$colKey] : null; + + $fieldInfo = $this->app->jbcsvmapper->categoryFieldToMeta($itemField); + $positionKey = implode('__', $fieldInfo); + + $cellElem = $this->app->jbcsvcell->createCategory($fieldInfo['name'], $category, $fieldInfo['group'], $fieldInfo); + $cellElem->fromCSV($value); + } + } + + $id = $category->id; + + // save all changes + $this->app->table->category->save($category); + + // clean memory + unset($category); + + return $id; + } + + /** + * Get key field value + * @param array $row + * @param string $lineKey + * @return Item + */ + protected function _getItemByKey($row, $lineKey = null) + { + $item = null; + + if ($this->_data->key != self::KEY_NONE) { + foreach ($this->_data->assign as $csvKey => $fieldName) { + + if ($this->_data->key == self::KEY_ID && $fieldName == 'id') { + $item = JBModelItem::model()->getById(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_NAME && $fieldName == 'name') { + $item = JBModelItem::model()->getByName(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_ALIAS && $fieldName == 'alias') { + $item = JBModelItem::model()->getByAlias(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_SKU && strpos('price_sku__', $fieldName) == 0) { + $item = JBModelItem::model()->getBySku(JString::trim($row[$csvKey]), $this->_data->appid); + break; + } + } + } + + if (!$item) { + $item = JBModelItem::model()->createEmpty($this->_data->appid, $this->_data->typeid, $lineKey); + } + + return $item; + } + + /** + * Get key field value + * @param array $row + * @param string $lineKey + * @return Item + */ + protected function _getCategoryByKey($row, $lineKey = null) + { + $category = null; + + if ($this->_data->key != self::KEY_NONE) { + foreach ($this->_data->assign as $csvKey => $fieldName) { + + if ($this->_data->key == self::KEY_ID && $fieldName == 'id') { + $category = JBModelCategory::model()->getById(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_NAME && $fieldName == 'name') { + $category = JBModelCategory::model()->getByName(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_ALIAS && $fieldName == 'alias') { + $category = JBModelCategory::model()->getByAlias(JString::trim($row[$csvKey]), $this->_data->appid); + break; + } + } + } + + if (!$category) { + $category = JBModelCategory::model()->createEmpty($this->_data->appid, $lineKey); + } + + return $category; + } + + /** + * One step precess for items + * @param int $step + * @return array + */ + public function itemsProcess($step = 0) + { + $this->_initSessionData(); + + $lastLine = $this->_getLastLine($step); + $lines = $this->_getCSVLines($this->_data->file, $lastLine, $step); + + $lineKey = 0; + $addedIds = ($step == 0) ? array() : $this->app->jbsession->get('ids', 'import-ids'); + + if (!empty($lines)) { + foreach ($lines as $key => $row) { + $lineKey = $lastLine + $key; + $addedIds[] = $this->_processItemRow($row, $lineKey); + } + } + + $this->app->jbsession->set('ids', $addedIds, 'import-ids'); + + return array('progress' => round(($lineKey / $this->_data->count) * 100, 2)); + } + + /** + * One step precess for categories + * @param int $step + * @return array + */ + public function categoriesProcess($step = 0) + { + $this->_initSessionData(); + + $lastLine = $this->_getLastLine($step); + $lines = $this->_getCSVLines($this->_data->file, $lastLine, $step); + + $lineKey = 0; + $addedIds = ($step == 0) ? array() : $this->app->jbsession->get('ids', 'import-ids'); + + if (!empty($lines)) { + foreach ($lines as $key => $row) { + $lineKey = $lastLine + $key; + $addedIds[] = $this->_processCategoryRow($row, $lineKey); + } + } + + $this->app->jbsession->set('ids', $addedIds, 'import-ids'); + + return array('progress' => round(($lineKey / $this->_data->count) * 100, 2)); + } + + /** + * Call after all items loaded + */ + public function itemsPostProcess() + { + $addedIds = $this->app->jbsession->get('ids', 'import-ids'); + $this->_initSessionData(); + + if ($this->_data->lose == self::LOSE_DISABLE) { + JBModelItem::model()->disableAll($this->_data->appid, $this->_data->typeid, $addedIds); + + } else if ($this->_data->lose == self::LOSE_REMOVE) { + JBModelItem::model()->removeAll($this->_data->appid, $this->_data->typeid, $addedIds); + } + + $this->app->jbsession->clearGroup('import-ids'); + } + + /** + * Call after all items loaded + */ + public function categoriesPostProcess() + { + $addedIds = $this->app->jbsession->get('ids', 'import-ids'); + $this->_initSessionData(); + + if ($this->_data->lose == self::LOSE_DISABLE) { + JBModelCategory::model()->disableAll($this->_data->appid, $addedIds); + + } else if ($this->_data->lose == self::LOSE_REMOVE) { + JBModelCategory::model()->removeAll($this->_data->appid, $addedIds); + } + + $this->app->jbsession->clearGroup('import-ids'); + } + + +} diff --git a/patches/2.1.1/media/zoo/applications/jbuniversal/framework/jbzoo.php b/patches/2.1.1/media/zoo/applications/jbuniversal/framework/jbzoo.php index fd95e43..8f7000a 100644 --- a/patches/2.1.1/media/zoo/applications/jbuniversal/framework/jbzoo.php +++ b/patches/2.1.1/media/zoo/applications/jbuniversal/framework/jbzoo.php @@ -1 +1,602 @@ - */ // no direct access defined('_JEXEC') or die('Restricted access'); !defined('JBZOO_APP_GROUP') && define('JBZOO_APP_GROUP', 'jbuniversal'); !defined('DIRECTORY_SEPERATOR') && define('DIRECTORY_SEPERATOR', '/'); !defined('DS') && define('DS', DIRECTORY_SEPARATOR); /** * Class JBZoo */ class JBZoo { /** * @var Application */ public $app = null; /** * App group name * @var string */ private $_group = JBZOO_APP_GROUP; /** * Init JBZoo application * @static * @return JBZoo */ public static function init() { static $jbzoo; if (!isset($jbzoo)) { $jbzoo = new self(); } return $jbzoo; } /** * Initialization JBZoo App */ private function __construct() { $this->app = App::getInstance('zoo'); $this->_initPaths(); $this->_initConfig(); $this->_initModels(); $this->_initLanguages(); $this->_initFilterElements(); $this->_initEvents(); $this->_initAssets(); } /** * Add directory path */ private function _initPaths() { $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); $this->_addPath('jbapp:framework', 'jbzoo'); $this->_addPath('jbapp:assets', 'jbassets'); $this->_addPath('jbassets:zoo', 'assets'); $this->_addPath('jbapp:config', 'jbconfig'); $this->_addPath('jbzoo:elements', 'jbelements'); $this->_addPath('jbapp:types', 'jbtypes'); $this->_addPath('jbzoo:helpers', 'helpers'); $this->_addPath('jbzoo:helpers-std', 'helpers'); $this->_addPath('jbzoo:classes-std', 'classes'); $this->_addPath('jbzoo:render', 'renderer'); $this->_addPath('jbzoo:views', 'jbviews'); $this->_addPath('jbapp:config', 'jbxml'); $this->_addPath('jbviews:', 'partials'); $this->_addPath('jbapp:joomla/elements', 'fields'); $this->_addPath('jbapp:templates', 'jbtmpl'); $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); if ($this->app->jbenv->isSite()) { $this->_addPath('jbzoo:controllers', 'controllers'); } require $this->app->path->path('jbzoo:controllers/base.php'); JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); } /** * Include models classes */ private function _initModels() { // defines define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); // query builder $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/classes'; require $path . '/database/JBDatabaseQuery.php'; require $path . '/database/JBDatabaseQueryElement.php'; // models $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/models'; require $path . '/jbmodel.php'; require $path . '/jbmodel.element.php'; require $path . '/jbmodel.autocomplete.php'; require $path . '/jbmodel.element.country.php'; require $path . '/jbmodel.element.itemdate.php'; require $path . '/jbmodel.element.itemauthor.php'; require $path . '/jbmodel.element.itemcategory.php'; require $path . '/jbmodel.element.itemcreated.php'; require $path . '/jbmodel.element.itemfrontpage.php'; require $path . '/jbmodel.element.itemmodified.php'; require $path . '/jbmodel.element.itemname.php'; require $path . '/jbmodel.element.itempublish_down.php'; require $path . '/jbmodel.element.itempublish_up.php'; require $path . '/jbmodel.element.itemtag.php'; require $path . '/jbmodel.element.jbimage.php'; require $path . '/jbmodel.element.jbselectcascade.php'; require $path . '/jbmodel.element.range.php'; require $path . '/jbmodel.element.rating.php'; require $path . '/jbmodel.element.jbpriceadvance.php'; require $path . '/jbmodel.favorite.php'; require $path . '/jbmodel.filter.php'; require $path . '/jbmodel.item.php'; require $path . '/jbmodel.app.php'; require $path . '/jbmodel.category.php'; require $path . '/jbmodel.order.php'; require $path . '/jbmodel.related.php'; require $path . '/jbmodel.searchindex.php'; require $path . '/jbmodel.values.php'; require $path . '/jbmodel.sku.php'; } /** * Load lang files */ private function _initLanguages() { $lang = JFactory::getLanguage(); $lang->load('com_zoo'); $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); $lang->load('com_zoo', JPATH_ADMINISTRATOR); } /** * Load others libraries */ private function _initFilterElements() { jimport('joomla.html.parameter.element'); $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/render/filter'; require $path . '/element.php'; require $path . '/element.author.php'; require $path . '/element.author.checkbox.php'; require $path . '/element.author.radio.php'; require $path . '/element.author.select.php'; require $path . '/element.author.select.chosen.php'; require $path . '/element.author.text.php'; require $path . '/element.category.php'; require $path . '/element.category.chosen.php'; require $path . '/element.checkbox.php'; require $path . '/element.country.php'; require $path . '/element.country.checkbox.php'; require $path . '/element.country.radio.php'; require $path . '/element.country.select.php'; require $path . '/element.country.select.chosen.php'; require $path . '/element.date.php'; require $path . '/element.date.range.php'; require $path . '/element.frontpage.php'; require $path . '/element.frontpage.jqueryui.php'; require $path . '/element.hidden.php'; require $path . '/element.imageexists.php'; require $path . '/element.imageexists.jqueryui.php'; require $path . '/element.jbselectcascade.php'; require $path . '/element.jqueryui.php'; require $path . '/element.name.php'; require $path . '/element.name.checkbox.php'; require $path . '/element.name.radio.php'; require $path . '/element.name.select.php'; require $path . '/element.name.select.chosen.php'; require $path . '/element.radio.php'; require $path . '/element.rating.php'; require $path . '/element.rating.ranges.php'; require $path . '/element.rating.slider.php'; require $path . '/element.select.php'; require $path . '/element.select.chosen.php'; require $path . '/element.slider.php'; require $path . '/element.tag.php'; require $path . '/element.tag.checkbox.php'; require $path . '/element.tag.radio.php'; require $path . '/element.tag.select.php'; require $path . '/element.tag.select.chosen.php'; require $path . '/element.text.php'; require $path . '/element.text.range.php'; } /** * Register and connect events */ private function _initEvents() { $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/events'; require $path . '/jbevent.php'; require $path . '/jbevent.application.php'; require $path . '/jbevent.basket.php'; require $path . '/jbevent.category.php'; require $path . '/jbevent.comment.php'; require $path . '/jbevent.element.php'; require $path . '/jbevent.item.php'; require $path . '/jbevent.jbzoo.php'; require $path . '/jbevent.layout.php'; require $path . '/jbevent.submission.php'; require $path . '/jbevent.tag.php'; require $path . '/jbevent.type.php'; require $path . '/jbevent.payment.php'; $event = $this->app->event; $dispatcher = $event->dispatcher; $event->register('JBEventApplication'); $dispatcher->connect('application:init', array('JBEventApplication', 'init')); $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); $event->register('JBEventCategory'); $dispatcher->connect('category:init', array('JBEventCategory', 'init')); $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); $event->register('JBEventItem'); $dispatcher->connect('item:init', array('JBEventItem', 'init')); $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); $event->register('JBEventComment'); $dispatcher->connect('comment:init', array('JBEventComment', 'init')); $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); $event->register('JBEventSubmission'); $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); $event->register('JBEventElement'); $dispatcher->connect('element:download', array('JBEventElement', 'download')); $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); $event->register('JBEventLayout'); $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); $event->register('JBEventTag'); $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); $event->register('JBEventType'); $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); $dispatcher->connect('type:copied', array('JBEventType', 'copied')); $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); $event->register('JBEventJBZoo'); $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); $event->register('JBEventBasket'); $dispatcher->connect('basket:beforesave', array('JBEventBasket', 'beforeSave')); $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); $event->register('JBEventPayment'); $dispatcher->connect('payment:callback', array('JBEventPayment', 'callback')); } /** * Init assets for admin path */ private function _initAssets() { if (!$this->app->jbenv->isSite()) { $this->app->jbassets->admin(); $this->_initAdminMenu(); } } /** * Init Admin menu */ private function _initAdminMenu() { if (defined('JBZOO_CONFIG_ADMINMENU') && !JBZOO_CONFIG_ADMINMENU) { return false; } $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); $appList = JBModelApp::model()->getSimpleList(); $findJBZooApp = false; $dispatched = false; foreach ($appList as $app) { if ($app->application_group == JBZOO_APP_GROUP) { $findJBZooApp = true; if ($curApp == $app->id) { $dispatched = true; } } } if (!$findJBZooApp) { return false; } $router = $this->app->jbrouter; $menuItems = array(); if (!empty($appList)) { foreach ($appList as $app) { $menuItems['app-' . $app->alias] = array( 'name' => $app->name, 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), 'children' => array( 'add-item' => array( 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')) ), 'sep-1' => 'divider', 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')) ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')) ), 'frontpage' => array( 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')) ), 'comments' => array( 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')) ), 'sep-1' => 'divider', 'config' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')) ), ) ); } } $menuItems['sep-1'] = 'divider'; $menuItems['item-config'] = array( 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), ); $types = $this->app->jbtype->getSimpleList(); if (!empty($types)) { $children = array(); foreach ($types as $alias => $type) { $children['type-' . $alias] = array( 'name' => $type, 'url' => $router->admin(array( 'controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => array('0' => $alias) )) ); } $menuItems['item-config']['children'] = $children; } if ($dispatched) { $menuItems['sep-2'] = 'divider'; $menuItems['jbzoo-admin'] = array( 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), ), ), ); $menuItems['jbzoo-import'] = array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDART'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), ), ), ); $menuItems['jbzoo-export'] = array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), ), 'types' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), ), 'yandexyml' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDART'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), ), 'zoobackup' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), ), ), ); $menuItems['sep-3'] = 'divider'; $menuItems['jbzoo-info'] = array( 'name' => JText::_('JBZOO_ADMINMENU_INFO'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), ), 'server' => array( 'name' => 'Get Last JBZoo', 'url' => 'https://github.com/JBZoo/JBZoo', 'target' => '_blank', ), ) ); } $menuItems['jbzoo-support'] = array( 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), 'url' => 'http://forum.jbzoo.com/', 'target' => '_blank', ); $this->app->jbassets->addVar('JBAdminItems', array( 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), 'items' => $menuItems, )); } /** * Init config file */ private function _initConfig() { if ($configFile = $this->app->path->path('jbapp:config/config.php')) { require $configFile; } $fn = base64_decode('b' . 'Glj' . 'ZW5j' . 'ZS4' . '='); $fp = base64_decode('amJh' . 'cHA6' . 'Y29u' . 'Zmln'); $f = $this->app->path->path($fp) . '/' . $fn . self::getDomain(true) . '.' . base64_decode('cGhw'); if (JFile::exists($f)) { require($f); } } /** * Get group name * @return string */ private function _getGroup() { return $this->_group; } /** * Register new path in system * @param string $path * @param string $pathName * @return mixed */ private function _addPath($path, $pathName) { if ($fullPath = $this->app->path->path($path)) { return $this->app->path->register($fullPath, $pathName); } return null; } /** * Get domain name * @param bool $isAny * @return string */ static function getDomain($isAny = false) { $domain = ''; if (function_exists('apache_request_headers')) { $headers = apache_request_headers(); $domain = isset($headers['Host']) ? $headers['Host'] : ''; } if ($isAny && !$domain) { $domain = $_SERVER['HTTP_HOST']; } $domain = preg_replace('#^www\.#', '', $domain); list($domain) = explode(':', $domain); return $domain; } /** * Get hash * @param $string * @return string */ static public function getHash($string) { return ''; } } \ No newline at end of file + + */ + +// no direct access +defined('_JEXEC') or die('Restricted access'); + + +!defined('JBZOO_APP_GROUP') && define('JBZOO_APP_GROUP', 'jbuniversal'); +!defined('DIRECTORY_SEPERATOR') && define('DIRECTORY_SEPERATOR', '/'); +!defined('DS') && define('DS', DIRECTORY_SEPARATOR); + +/** + * Class JBZoo + */ +class JBZoo +{ + /** + * @var Application + */ + public $app = null; + + /** + * App group name + * @var string + */ + private $_group = JBZOO_APP_GROUP; + + /** + * Init JBZoo application + * @static + * @return JBZoo + */ + public static function init() + { + static $jbzoo; + + if (!isset($jbzoo)) { + $jbzoo = new self(); + } + + return $jbzoo; + } + + /** + * Initialization JBZoo App + */ + private function __construct() + { + $this->app = App::getInstance('zoo'); + + $this->_initPaths(); + $this->_initConfig(); + $this->_initModels(); + $this->_initLanguages(); + $this->_initFilterElements(); + $this->_initEvents(); + $this->_initAssets(); + } + + /** + * Add directory path + */ + private function _initPaths() + { + $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); + $this->_addPath('jbapp:framework', 'jbzoo'); + $this->_addPath('jbapp:assets', 'jbassets'); + $this->_addPath('jbassets:zoo', 'assets'); + $this->_addPath('jbapp:config', 'jbconfig'); + $this->_addPath('jbzoo:elements', 'jbelements'); + $this->_addPath('jbapp:types', 'jbtypes'); + $this->_addPath('jbzoo:helpers', 'helpers'); + $this->_addPath('jbzoo:helpers-std', 'helpers'); + $this->_addPath('jbzoo:classes-std', 'classes'); + $this->_addPath('jbzoo:render', 'renderer'); + $this->_addPath('jbzoo:views', 'jbviews'); + $this->_addPath('jbapp:config', 'jbxml'); + $this->_addPath('jbviews:', 'partials'); + $this->_addPath('jbapp:joomla/elements', 'fields'); + $this->_addPath('jbapp:templates', 'jbtmpl'); + $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); + $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); + $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); + $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); + $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); + + if ($this->app->jbenv->isSite()) { + $this->_addPath('jbzoo:controllers', 'controllers'); + } + + require $this->app->path->path('jbzoo:controllers/base.php'); + + JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); + } + + /** + * Include models classes + */ + private function _initModels() + { + // defines + define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); + define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); + + // query builder + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/classes'; + require $path . '/database/JBDatabaseQuery.php'; + require $path . '/database/JBDatabaseQueryElement.php'; + + // models + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/models'; + require $path . '/jbmodel.php'; + require $path . '/jbmodel.element.php'; + require $path . '/jbmodel.autocomplete.php'; + require $path . '/jbmodel.element.country.php'; + require $path . '/jbmodel.element.itemdate.php'; + require $path . '/jbmodel.element.itemauthor.php'; + require $path . '/jbmodel.element.itemcategory.php'; + require $path . '/jbmodel.element.itemcreated.php'; + require $path . '/jbmodel.element.itemfrontpage.php'; + require $path . '/jbmodel.element.itemmodified.php'; + require $path . '/jbmodel.element.itemname.php'; + require $path . '/jbmodel.element.itempublish_down.php'; + require $path . '/jbmodel.element.itempublish_up.php'; + require $path . '/jbmodel.element.itemtag.php'; + require $path . '/jbmodel.element.jbimage.php'; + require $path . '/jbmodel.element.jbselectcascade.php'; + require $path . '/jbmodel.element.range.php'; + require $path . '/jbmodel.element.rating.php'; + require $path . '/jbmodel.element.jbpriceadvance.php'; + require $path . '/jbmodel.favorite.php'; + require $path . '/jbmodel.filter.php'; + require $path . '/jbmodel.item.php'; + require $path . '/jbmodel.app.php'; + require $path . '/jbmodel.category.php'; + require $path . '/jbmodel.order.php'; + require $path . '/jbmodel.related.php'; + require $path . '/jbmodel.searchindex.php'; + require $path . '/jbmodel.values.php'; + require $path . '/jbmodel.sku.php'; + } + + /** + * Load lang files + */ + private function _initLanguages() + { + $lang = JFactory::getLanguage(); + $lang->load('com_zoo'); + $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); + $lang->load('com_zoo', JPATH_ADMINISTRATOR); + } + + /** + * Load others libraries + */ + private function _initFilterElements() + { + jimport('joomla.html.parameter.element'); + + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/render/filter'; + require $path . '/element.php'; + require $path . '/element.author.php'; + require $path . '/element.author.checkbox.php'; + require $path . '/element.author.radio.php'; + require $path . '/element.author.select.php'; + require $path . '/element.author.select.chosen.php'; + require $path . '/element.author.text.php'; + require $path . '/element.category.php'; + require $path . '/element.category.chosen.php'; + require $path . '/element.checkbox.php'; + require $path . '/element.country.php'; + require $path . '/element.country.checkbox.php'; + require $path . '/element.country.radio.php'; + require $path . '/element.country.select.php'; + require $path . '/element.country.select.chosen.php'; + require $path . '/element.date.php'; + require $path . '/element.date.range.php'; + require $path . '/element.frontpage.php'; + require $path . '/element.frontpage.jqueryui.php'; + require $path . '/element.hidden.php'; + require $path . '/element.imageexists.php'; + require $path . '/element.imageexists.jqueryui.php'; + require $path . '/element.jbselectcascade.php'; + require $path . '/element.jqueryui.php'; + require $path . '/element.name.php'; + require $path . '/element.name.checkbox.php'; + require $path . '/element.name.radio.php'; + require $path . '/element.name.select.php'; + require $path . '/element.name.select.chosen.php'; + require $path . '/element.radio.php'; + require $path . '/element.rating.php'; + require $path . '/element.rating.ranges.php'; + require $path . '/element.rating.slider.php'; + require $path . '/element.select.php'; + require $path . '/element.select.chosen.php'; + require $path . '/element.slider.php'; + require $path . '/element.tag.php'; + require $path . '/element.tag.checkbox.php'; + require $path . '/element.tag.radio.php'; + require $path . '/element.tag.select.php'; + require $path . '/element.tag.select.chosen.php'; + require $path . '/element.text.php'; + require $path . '/element.text.range.php'; + } + + /** + * Register and connect events + */ + private function _initEvents() + { + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/events'; + require $path . '/jbevent.php'; + require $path . '/jbevent.application.php'; + require $path . '/jbevent.basket.php'; + require $path . '/jbevent.category.php'; + require $path . '/jbevent.comment.php'; + require $path . '/jbevent.element.php'; + require $path . '/jbevent.item.php'; + require $path . '/jbevent.jbzoo.php'; + require $path . '/jbevent.layout.php'; + require $path . '/jbevent.submission.php'; + require $path . '/jbevent.tag.php'; + require $path . '/jbevent.type.php'; + require $path . '/jbevent.payment.php'; + + $event = $this->app->event; + $dispatcher = $event->dispatcher; + + $event->register('JBEventApplication'); + $dispatcher->connect('application:init', array('JBEventApplication', 'init')); + $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); + $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); + $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); + $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); + $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); + $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); + $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); + $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); + + $event->register('JBEventCategory'); + $dispatcher->connect('category:init', array('JBEventCategory', 'init')); + $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); + $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); + $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); + + $event->register('JBEventItem'); + $dispatcher->connect('item:init', array('JBEventItem', 'init')); + $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); + $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); + $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); + $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); + $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); + $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); + $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); + + $event->register('JBEventComment'); + $dispatcher->connect('comment:init', array('JBEventComment', 'init')); + $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); + $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); + $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); + + $event->register('JBEventSubmission'); + $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); + $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); + $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); + $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); + + $event->register('JBEventElement'); + $dispatcher->connect('element:download', array('JBEventElement', 'download')); + $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); + $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); + $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); + $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); + $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); + $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); + $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); + $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); + $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); + + $event->register('JBEventLayout'); + $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); + + $event->register('JBEventTag'); + $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); + $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); + + $event->register('JBEventType'); + $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); + $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); + $dispatcher->connect('type:copied', array('JBEventType', 'copied')); + $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); + $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); + $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); + $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); + + $event->register('JBEventJBZoo'); + $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); + $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); + + $event->register('JBEventBasket'); + $dispatcher->connect('basket:beforesave', array('JBEventBasket', 'beforeSave')); + $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); + + $event->register('JBEventPayment'); + $dispatcher->connect('payment:callback', array('JBEventPayment', 'callback')); + } + + /** + * Init assets for admin path + */ + private function _initAssets() + { + if (!$this->app->jbenv->isSite()) { + $this->app->jbassets->admin(); + $this->_initAdminMenu(); + } + } + + /** + * Init Admin menu + */ + private function _initAdminMenu() + { + if (defined('JBZOO_CONFIG_ADMINMENU') && !JBZOO_CONFIG_ADMINMENU) { + return false; + } + + $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); + + $appList = JBModelApp::model()->getSimpleList(); + $findJBZooApp = false; + $dispatched = false; + foreach ($appList as $app) { + if ($app->application_group == JBZOO_APP_GROUP) { + $findJBZooApp = true; + if ($curApp == $app->id) { + $dispatched = true; + } + } + } + + if (!$findJBZooApp) { + return false; + } + + $router = $this->app->jbrouter; + + $menuItems = array(); + + if (!empty($appList)) { + foreach ($appList as $app) { + + $menuItems['app-' . $app->alias] = array( + 'name' => $app->name, + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), + 'children' => array( + 'add-item' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')) + ), + 'sep-1' => 'divider', + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')) + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')) + ), + 'frontpage' => array( + 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')) + ), + 'comments' => array( + 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')) + ), + 'sep-1' => 'divider', + 'config' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')) + ), + ) + ); + } + } + + $menuItems['sep-1'] = 'divider'; + + $menuItems['item-config'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), + 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), + ); + + $types = $this->app->jbtype->getSimpleList(); + if (!empty($types)) { + $children = array(); + foreach ($types as $alias => $type) { + $children['type-' . $alias] = array( + 'name' => $type, + 'url' => $router->admin(array( + 'controller' => 'manager', + 'group' => 'jbuniversal', + 'task' => 'editelements', + 'cid' => array('0' => $alias) + )) + ); + } + + $menuItems['item-config']['children'] = $children; + } + + if ($dispatched) { + $menuItems['sep-2'] = 'divider'; + + $menuItems['jbzoo-admin'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), + 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), + 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), + 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), + ), + ), + ); + + $menuItems['jbzoo-import'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDART'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), + ), + ), + ); + + $menuItems['jbzoo-export'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), + ), + 'types' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), + ), + 'yandexyml' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDART'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), + ), + 'zoobackup' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), + ), + ), + ); + + $menuItems['sep-3'] = 'divider'; + + $menuItems['jbzoo-info'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_INFO'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), + ), + 'server' => array( + 'name' => 'Get Last JBZoo', + 'url' => 'https://github.com/JBZoo/JBZoo', + 'target' => '_blank', + ), + ) + ); + } + + $menuItems['jbzoo-support'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), + 'url' => 'http://forum.jbzoo.com/', + 'target' => '_blank', + ); + + $this->app->jbassets->addVar('JBAdminItems', array( + 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), + 'items' => $menuItems, + )); + } + + /** + * Init config file + */ + private function _initConfig() + { + if ($configFile = $this->app->path->path('jbapp:config/config.php')) { + require $configFile; + } + + $fn = base64_decode('b' . 'Glj' . 'ZW5j' . 'ZS4' . '='); + $fp = base64_decode('amJh' . 'cHA6' . 'Y29u' . 'Zmln'); + $f = $this->app->path->path($fp) . '/' . $fn . self::getDomain(true) . '.' . base64_decode('cGhw'); + if (JFile::exists($f)) { + require($f); + } + } + + /** + * Get group name + * @return string + */ + private function _getGroup() + { + return $this->_group; + } + + /** + * Register new path in system + * @param string $path + * @param string $pathName + * @return mixed + */ + private function _addPath($path, $pathName) + { + if ($fullPath = $this->app->path->path($path)) { + return $this->app->path->register($fullPath, $pathName); + } + + return null; + } + + /** + * Get domain name + * @param bool $isAny + * @return string + */ + static function getDomain($isAny = false) + { + $domain = ''; + if (function_exists('apache_request_headers')) { + $headers = apache_request_headers(); + $domain = isset($headers['Host']) ? $headers['Host'] : ''; + } + + if ($isAny && !$domain) { + $domain = $_SERVER['HTTP_HOST']; + } + + $domain = preg_replace('#^www\.#', '', $domain); + list($domain) = explode(':', $domain); + + return $domain; + } + + /** + * Get hash + * @param $string + * @return string + */ + static public function getHash($string) + { + return ''; + } +} diff --git a/patches/2.1.2/media/zoo/applications/jbuniversal/framework/helpers/jbimport.php b/patches/2.1.2/media/zoo/applications/jbuniversal/framework/helpers/jbimport.php index fe24d6f..b2c8462 100644 --- a/patches/2.1.2/media/zoo/applications/jbuniversal/framework/helpers/jbimport.php +++ b/patches/2.1.2/media/zoo/applications/jbuniversal/framework/helpers/jbimport.php @@ -1,564 +1,564 @@ - - */ - -// no direct access -defined('_JEXEC') or die('Restricted access'); - - -/** - * Class JBImportHelper - */ -class JBImportHelper extends AppHelper -{ - const STEP_SIZE = 50; - - const LOSE_NONE = 0; - const LOSE_DISABLE = 1; - const LOSE_REMOVE = 2; - - const KEY_NONE = 0; - const KEY_ID = 1; - const KEY_NAME = 2; - const KEY_ALIAS = 3; - const KEY_SKU = 4; - - const OPTIONS_NO = 0; - const OPTIONS_YES = 1; - - /** - * @var JSONData - */ - protected $_data = null; - - /** - * @param App $app - */ - public function __construct($app) - { - parent::__construct($app); - - // make sure the line endings are recognized irrespective of the OS - $this->app->jbenv->maxPerformance(); - ini_set('auto_detect_line_endings', true); - } - - /** - * Get info for pre import step - * @param string $file - * @param array $options - * @return array - */ - public function getInfo($file, $options) - { - $options = $this->app->data->create($options); - - $info = array(); - - // get applications - $applist = JBModelApp::model()->getList(); - if (!empty($applist)) { - $info['applist'] = array(); - foreach ($applist as $app) { - $info['applist'][$app->id] = $app->name; - } - - reset($applist); - $application = current($applist); - - $info['app'] = current($applist); - } - - // get types - $info['types'] = array(); - foreach ($info['app']->getTypes() as $type) { - $info['types'][$type->id] = array(); - - foreach ($type->getElements() as $element) { - // filter elements - $info['types'][$type->id][$element->getElementType()][] = $element; - } - - } - - $info['item_count'] = 0; - $info['columns'] = array(); - - // get params - $separator = $options->get('separator', ',') ? $options->get('separator', ',') : ','; - $enclosure = $options->get('enclosure', '"') ? $options->get('enclosure', '"') : '"'; - $containsHeaders = (int)$options->get('header', 1); - - // get column names and row count - $rowCount = 0; - if (($handle = fopen($file, "r")) !== false) { - - while (($data = fgetcsv($handle, 0, $separator, $enclosure)) !== false) { - - if ($rowCount == 0) { - if ($containsHeaders) { - $info['columns'] = $data; - } else { - $info['columns'] = array_fill(0, count($data), ''); - } - } - - $rowCount++; - } - fclose($handle); - } - - $info['count'] = $containsHeaders ? $rowCount - 1 : $rowCount; - - return $info; - } - - /** - * @param $info - * @return array - */ - public function itemsControls($info) - { - $html = array(); - $htmlHelper = $this->app->html; - - $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_APP') . ' -')); - $options += $info['applist']; - $html['apps'] = $htmlHelper->_('select.genericlist', $options, 'appid'); - - $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_TYPE') . ' -')); - $html['types'] = $htmlHelper->_('zoo.typelist', $info['app'], $options, 'typeid', null, 'value', 'text'); - - $html['fields_types'] = array(); - foreach ($info['types'] as $typeid => $element_types) { - $html['fields_types'][$typeid] = $this->_createItemsControl($typeid, $element_types); - } - - // lose control - $loseOptions = array( - $htmlHelper->_('select.option', self::LOSE_NONE, JText::_('JBZOO_IMPORT_LOSE_NONE')), - $htmlHelper->_('select.option', self::LOSE_DISABLE, JText::_('JBZOO_IMPORT_LOSE_DISABLE')), - $htmlHelper->_('select.option', self::LOSE_REMOVE, JText::_('JBZOO_IMPORT_LOSE_REMOVE')), - ); - $html['lose'] = $htmlHelper->_('select.genericlist', $loseOptions, 'lose'); - - // what field is key - $keyOptions = array( - $htmlHelper->_('select.option', self::KEY_NONE, JText::_('JBZOO_IMPORT_KEY_NONE')), - $htmlHelper->_('select.option', self::KEY_ID, JText::_('JBZOO_IMPORT_KEY_ID')), - $htmlHelper->_('select.option', self::KEY_NAME, JText::_('JBZOO_IMPORT_KEY_NAME')), - $htmlHelper->_('select.option', self::KEY_ALIAS, JText::_('JBZOO_IMPORT_KEY_ALIAS')), - $htmlHelper->_('select.option', self::KEY_SKU, JText::_('JBZOO_IMPORT_KEY_SKU')), - ); - $html['key'] = $htmlHelper->_('select.genericlist', $keyOptions, 'key'); - - // check options config - $checkOptions = array( - $htmlHelper->_('select.option', self::OPTIONS_NO, JText::_('JBZOO_IMPORT_CHECK_OPTION_NO')), - $htmlHelper->_('select.option', self::OPTIONS_YES, JText::_('JBZOO_IMPORT_CHECK_OPTION_YES')), - ); - - $html['checkOptions'] = $htmlHelper->_('select.genericlist', $checkOptions, 'checkOptions'); - - return $html; - } - - /** - * @param $info - * @return array - */ - public function categoriesControls($info) - { - $html = array(); - $htmlHelper = $this->app->html; - - $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_APP') . ' -')); - $options += $info['applist']; - $html['apps'] = $htmlHelper->_('select.genericlist', $options, 'appid'); - - $html['fields_types'] = $this->_createCategoriesControl('categoryFileds'); - - // lose control - $loseOptions = array( - $htmlHelper->_('select.option', self::LOSE_NONE, JText::_('JBZOO_IMPORT_LOSE_NONE')), - $htmlHelper->_('select.option', self::LOSE_DISABLE, JText::_('JBZOO_IMPORT_LOSE_DISABLE')), - $htmlHelper->_('select.option', self::LOSE_REMOVE, JText::_('JBZOO_IMPORT_LOSE_REMOVE')), - ); - $html['lose'] = $htmlHelper->_('select.genericlist', $loseOptions, 'lose'); - - // what field is key - $keyOptions = array( - $htmlHelper->_('select.option', self::KEY_NONE, JText::_('JBZOO_IMPORT_KEY_NONE')), - $htmlHelper->_('select.option', self::KEY_ID, JText::_('JBZOO_IMPORT_KEY_ID')), - $htmlHelper->_('select.option', self::KEY_NAME, JText::_('JBZOO_IMPORT_KEY_NAME')), - $htmlHelper->_('select.option', self::KEY_ALIAS, JText::_('JBZOO_IMPORT_KEY_ALIAS')), - ); - $html['key'] = $htmlHelper->_('select.genericlist', $keyOptions, 'key'); - - return $html; - } - - /** - * Create fields control for item - * @param $typeid - * @param $elementTypes - */ - protected function _createItemsControl($typeid, $elementTypes) - { - $htmlHelper = $this->app->html; - - $fields = $this->app->jbcsvmapper->getItemFields($elementTypes); - $options = array($htmlHelper->_('select.option', '', ' ** ')); - - foreach ($fields as $groupKey => $group) { - - if (strpos($groupKey, '__') === false) { - $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . $groupKey)); - } else { - list($groupName, $name) = explode('__', $groupKey); - $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . $groupName) . ' - ' . $name); - } - - foreach ($group as $fieldKey => $field) { - $options[] = $htmlHelper->_('select.option', $fieldKey, $field); - } - - $options[] = $htmlHelper->_('select.option', ''); - } - - return $htmlHelper->_( - 'select.genericlist', - $options, - 'assign[' . $typeid . '][__name_placeholder__]', - 'class="type-select type-select-' . $typeid . '"' - ); - } - - /** - * Create fields control for category - */ - protected function _createCategoriesControl() - { - $htmlHelper = $this->app->html; - - $fields = $this->app->jbcsvmapper->getCategoryFields(); - $options = array($htmlHelper->_('select.option', '', ' ** ')); - - foreach ($fields as $groupKey => $group) { - - $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . strtoupper($groupKey))); - - foreach ($group as $fieldKey => $field) { - $options[] = $htmlHelper->_('select.option', $fieldKey, $field); - } - - $options[] = $htmlHelper->_('select.option', ''); - } - - return $htmlHelper->_('select.genericlist', $options, 'assign[]', 'class="type-select"'); - } - - /** - * @return string - */ - public function getTmpFilename() - { - return $this->app->jbpath->sysPath('tmp', '/' . uniqid('jbimport_') . '.csv'); - } - - /** - * Get import data from session - * @return JSONData - */ - protected function _initSessionData() - { - $data = $this->app->jbsession->getGroup('import'); - $this->_data = $this->app->data->create($data); - - return $this->_data; - } - - /** - * Get last line in CSV file - * @param int $step - * @return int - */ - protected function _getLastLine($step = 0) - { - $lastLine = self::STEP_SIZE * $step; - if ((int)$this->_data->header) { - $lastLine++; - } - - return $lastLine; - } - - /** - * Get lines from CSV file for current step - * @param string $file - * @param int $lastLine - * @return array - */ - protected function _getCSVLines($file, $lastLine) - { - return $this->app->jbcsv->getLinesfromFile($file, $this->_data, $lastLine, self::STEP_SIZE); - } - - /** - * Process one Item row - * @param array $row - * @param int $lineKey - * @return int - */ - protected function _processItemRow($row, $lineKey) - { - // create item - $item = $this->_getItemByKey($row, $lineKey); - - $positions = array(); - - // bind import data from CSV - foreach ($this->_data->assign as $colKey => $itemField) { - - $itemField = JString::trim($itemField); - if (!empty($itemField)) { - - $value = isset($row[$colKey]) ? $row[$colKey] : null; - - $fieldInfo = $this->app->jbcsvmapper->itemFieldToMeta($itemField); - - $positionKey = implode('__', $fieldInfo); - if (!isset($positions[$positionKey])) { - $positions[$positionKey] = 0; - } - $positions[$positionKey]++; - - $cellElem = $this->app->jbcsvcell->createItem($fieldInfo['name'], $item, $fieldInfo['group'], $fieldInfo); - $cellElem->fromCSV($value, $positions[$positionKey]); - } - } - - $id = $item->id; - - // save all changes - $item->getParams()->set('jbzoo.no_index', 0); - $this->app->table->item->save($item); - - // clean memory - unset($item); - - return $id; - } - - /** - * Process one Category row - * @param array $row - * @param int $lineKey - * @return int - */ - protected function _processCategoryRow($row, $lineKey) - { - // create item - $category = $this->_getCategoryByKey($row, $lineKey); - - // bind import data from CSV - foreach ($this->_data->assign as $colKey => $itemField) { - - $itemField = JString::trim($itemField); - if (!empty($itemField)) { - - $value = isset($row[$colKey]) ? $row[$colKey] : null; - - $fieldInfo = $this->app->jbcsvmapper->categoryFieldToMeta($itemField); - $positionKey = implode('__', $fieldInfo); - - $cellElem = $this->app->jbcsvcell->createCategory($fieldInfo['name'], $category, $fieldInfo['group'], $fieldInfo); - $cellElem->fromCSV($value); - } - } - - $id = $category->id; - - // save all changes - $this->app->table->category->save($category); - - // clean memory - unset($category); - - return $id; - } - - /** - * Get key field value - * @param array $row - * @param string $lineKey - * @return Item - */ - protected function _getItemByKey($row, $lineKey = null) - { - $item = null; - - if ($this->_data->key != self::KEY_NONE) { - foreach ($this->_data->assign as $csvKey => $fieldName) { - - if ($this->_data->key == self::KEY_ID && $fieldName == 'id') { - $item = JBModelItem::model()->getById(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_NAME && $fieldName == 'name') { - $item = JBModelItem::model()->getByName(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_ALIAS && $fieldName == 'alias') { - $item = JBModelItem::model()->getByAlias(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_SKU && strpos($fieldName, 'price_sku__') === (int)0) { - $item = JBModelItem::model()->getBySku(JString::trim($row[$csvKey]), $this->_data->appid); - break; - } - } - } - - if (!$item) { - $item = JBModelItem::model()->createEmpty($this->_data->appid, $this->_data->typeid, $lineKey); - } - - return $item; - } - - /** - * Get key field value - * @param array $row - * @param string $lineKey - * @return Item - */ - protected function _getCategoryByKey($row, $lineKey = null) - { - $category = null; - - if ($this->_data->key != self::KEY_NONE) { - foreach ($this->_data->assign as $csvKey => $fieldName) { - - if ($this->_data->key == self::KEY_ID && $fieldName == 'id') { - $category = JBModelCategory::model()->getById(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_NAME && $fieldName == 'name') { - $category = JBModelCategory::model()->getByName(JString::trim($row[$csvKey]), $this->_data->appid); - break; - - } else if ($this->_data->key == self::KEY_ALIAS && $fieldName == 'alias') { - $category = JBModelCategory::model()->getByAlias(JString::trim($row[$csvKey]), $this->_data->appid); - break; - } - } - } - - if (!$category) { - $category = JBModelCategory::model()->createEmpty($this->_data->appid, $lineKey); - } - - return $category; - } - - /** - * One step precess for items - * @param int $step - * @return array - */ - public function itemsProcess($step = 0) - { - $this->_initSessionData(); - - $lastLine = $this->_getLastLine($step); - $lines = $this->_getCSVLines($this->_data->file, $lastLine, $step); - - $lineKey = 0; - $addedIds = ($step == 0) ? array() : $this->app->jbsession->get('ids', 'import-ids'); - - if (!empty($lines)) { - foreach ($lines as $key => $row) { - $lineKey = $lastLine + $key; - $addedIds[] = $this->_processItemRow($row, $lineKey); - } - } - - $this->app->jbsession->set('ids', $addedIds, 'import-ids'); - - return array('progress' => round(($lineKey / $this->_data->count) * 100, 2)); - } - - /** - * One step precess for categories - * @param int $step - * @return array - */ - public function categoriesProcess($step = 0) - { - $this->_initSessionData(); - - $lastLine = $this->_getLastLine($step); - $lines = $this->_getCSVLines($this->_data->file, $lastLine, $step); - - $lineKey = 0; - $addedIds = ($step == 0) ? array() : $this->app->jbsession->get('ids', 'import-ids'); - - if (!empty($lines)) { - foreach ($lines as $key => $row) { - $lineKey = $lastLine + $key; - $addedIds[] = $this->_processCategoryRow($row, $lineKey); - } - } - - $this->app->jbsession->set('ids', $addedIds, 'import-ids'); - - return array('progress' => round(($lineKey / $this->_data->count) * 100, 2)); - } - - /** - * Call after all items loaded - */ - public function itemsPostProcess() - { - $addedIds = $this->app->jbsession->get('ids', 'import-ids'); - $this->_initSessionData(); - - if ($this->_data->lose == self::LOSE_DISABLE) { - JBModelItem::model()->disableAll($this->_data->appid, $this->_data->typeid, $addedIds); - - } else if ($this->_data->lose == self::LOSE_REMOVE) { - JBModelItem::model()->removeAll($this->_data->appid, $this->_data->typeid, $addedIds); - } - - $this->app->jbsession->clearGroup('import-ids'); - } - - /** - * Call after all items loaded - */ - public function categoriesPostProcess() - { - $addedIds = $this->app->jbsession->get('ids', 'import-ids'); - $this->_initSessionData(); - - if ($this->_data->lose == self::LOSE_DISABLE) { - JBModelCategory::model()->disableAll($this->_data->appid, $addedIds); - - } else if ($this->_data->lose == self::LOSE_REMOVE) { - JBModelCategory::model()->removeAll($this->_data->appid, $addedIds); - } - - $this->app->jbsession->clearGroup('import-ids'); - } - - -} + + */ + +// no direct access +defined('_JEXEC') or die('Restricted access'); + + +/** + * Class JBImportHelper + */ +class JBImportHelper extends AppHelper +{ + const STEP_SIZE = 50; + + const LOSE_NONE = 0; + const LOSE_DISABLE = 1; + const LOSE_REMOVE = 2; + + const KEY_NONE = 0; + const KEY_ID = 1; + const KEY_NAME = 2; + const KEY_ALIAS = 3; + const KEY_SKU = 4; + + const OPTIONS_NO = 0; + const OPTIONS_YES = 1; + + /** + * @var JSONData + */ + protected $_data = null; + + /** + * @param App $app + */ + public function __construct($app) + { + parent::__construct($app); + + // make sure the line endings are recognized irrespective of the OS + $this->app->jbenv->maxPerformance(); + ini_set('auto_detect_line_endings', true); + } + + /** + * Get info for pre import step + * @param string $file + * @param array $options + * @return array + */ + public function getInfo($file, $options) + { + $options = $this->app->data->create($options); + + $info = array(); + + // get applications + $applist = JBModelApp::model()->getList(); + if (!empty($applist)) { + $info['applist'] = array(); + foreach ($applist as $app) { + $info['applist'][$app->id] = $app->name; + } + + reset($applist); + $application = current($applist); + + $info['app'] = current($applist); + } + + // get types + $info['types'] = array(); + foreach ($info['app']->getTypes() as $type) { + $info['types'][$type->id] = array(); + + foreach ($type->getElements() as $element) { + // filter elements + $info['types'][$type->id][$element->getElementType()][] = $element; + } + + } + + $info['item_count'] = 0; + $info['columns'] = array(); + + // get params + $separator = $options->get('separator', ',') ? $options->get('separator', ',') : ','; + $enclosure = $options->get('enclosure', '"') ? $options->get('enclosure', '"') : '"'; + $containsHeaders = (int)$options->get('header', 1); + + // get column names and row count + $rowCount = 0; + if (($handle = fopen($file, "r")) !== false) { + + while (($data = fgetcsv($handle, 0, $separator, $enclosure)) !== false) { + + if ($rowCount == 0) { + if ($containsHeaders) { + $info['columns'] = $data; + } else { + $info['columns'] = array_fill(0, count($data), ''); + } + } + + $rowCount++; + } + fclose($handle); + } + + $info['count'] = $containsHeaders ? $rowCount - 1 : $rowCount; + + return $info; + } + + /** + * @param $info + * @return array + */ + public function itemsControls($info) + { + $html = array(); + $htmlHelper = $this->app->html; + + $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_APP') . ' -')); + $options += $info['applist']; + $html['apps'] = $htmlHelper->_('select.genericlist', $options, 'appid'); + + $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_TYPE') . ' -')); + $html['types'] = $htmlHelper->_('zoo.typelist', $info['app'], $options, 'typeid', null, 'value', 'text'); + + $html['fields_types'] = array(); + foreach ($info['types'] as $typeid => $element_types) { + $html['fields_types'][$typeid] = $this->_createItemsControl($typeid, $element_types); + } + + // lose control + $loseOptions = array( + $htmlHelper->_('select.option', self::LOSE_NONE, JText::_('JBZOO_IMPORT_LOSE_NONE')), + $htmlHelper->_('select.option', self::LOSE_DISABLE, JText::_('JBZOO_IMPORT_LOSE_DISABLE')), + $htmlHelper->_('select.option', self::LOSE_REMOVE, JText::_('JBZOO_IMPORT_LOSE_REMOVE')), + ); + $html['lose'] = $htmlHelper->_('select.genericlist', $loseOptions, 'lose'); + + // what field is key + $keyOptions = array( + $htmlHelper->_('select.option', self::KEY_NONE, JText::_('JBZOO_IMPORT_KEY_NONE')), + $htmlHelper->_('select.option', self::KEY_ID, JText::_('JBZOO_IMPORT_KEY_ID')), + $htmlHelper->_('select.option', self::KEY_NAME, JText::_('JBZOO_IMPORT_KEY_NAME')), + $htmlHelper->_('select.option', self::KEY_ALIAS, JText::_('JBZOO_IMPORT_KEY_ALIAS')), + $htmlHelper->_('select.option', self::KEY_SKU, JText::_('JBZOO_IMPORT_KEY_SKU')), + ); + $html['key'] = $htmlHelper->_('select.genericlist', $keyOptions, 'key'); + + // check options config + $checkOptions = array( + $htmlHelper->_('select.option', self::OPTIONS_NO, JText::_('JBZOO_IMPORT_CHECK_OPTION_NO')), + $htmlHelper->_('select.option', self::OPTIONS_YES, JText::_('JBZOO_IMPORT_CHECK_OPTION_YES')), + ); + + $html['checkOptions'] = $htmlHelper->_('select.genericlist', $checkOptions, 'checkOptions'); + + return $html; + } + + /** + * @param $info + * @return array + */ + public function categoriesControls($info) + { + $html = array(); + $htmlHelper = $this->app->html; + + $options = array($htmlHelper->_('select.option', '', '- ' . JText::_('JBZOO_SELECT_APP') . ' -')); + $options += $info['applist']; + $html['apps'] = $htmlHelper->_('select.genericlist', $options, 'appid'); + + $html['fields_types'] = $this->_createCategoriesControl('categoryFileds'); + + // lose control + $loseOptions = array( + $htmlHelper->_('select.option', self::LOSE_NONE, JText::_('JBZOO_IMPORT_LOSE_NONE')), + $htmlHelper->_('select.option', self::LOSE_DISABLE, JText::_('JBZOO_IMPORT_LOSE_DISABLE')), + $htmlHelper->_('select.option', self::LOSE_REMOVE, JText::_('JBZOO_IMPORT_LOSE_REMOVE')), + ); + $html['lose'] = $htmlHelper->_('select.genericlist', $loseOptions, 'lose'); + + // what field is key + $keyOptions = array( + $htmlHelper->_('select.option', self::KEY_NONE, JText::_('JBZOO_IMPORT_KEY_NONE')), + $htmlHelper->_('select.option', self::KEY_ID, JText::_('JBZOO_IMPORT_KEY_ID')), + $htmlHelper->_('select.option', self::KEY_NAME, JText::_('JBZOO_IMPORT_KEY_NAME')), + $htmlHelper->_('select.option', self::KEY_ALIAS, JText::_('JBZOO_IMPORT_KEY_ALIAS')), + ); + $html['key'] = $htmlHelper->_('select.genericlist', $keyOptions, 'key'); + + return $html; + } + + /** + * Create fields control for item + * @param $typeid + * @param $elementTypes + */ + protected function _createItemsControl($typeid, $elementTypes) + { + $htmlHelper = $this->app->html; + + $fields = $this->app->jbcsvmapper->getItemFields($elementTypes); + $options = array($htmlHelper->_('select.option', '', ' ** ')); + + foreach ($fields as $groupKey => $group) { + + if (strpos($groupKey, '__') === false) { + $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . $groupKey)); + } else { + list($groupName, $name) = explode('__', $groupKey); + $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . $groupName) . ' - ' . $name); + } + + foreach ($group as $fieldKey => $field) { + $options[] = $htmlHelper->_('select.option', $fieldKey, $field); + } + + $options[] = $htmlHelper->_('select.option', ''); + } + + return $htmlHelper->_( + 'select.genericlist', + $options, + 'assign[' . $typeid . '][__name_placeholder__]', + 'class="type-select type-select-' . $typeid . '"' + ); + } + + /** + * Create fields control for category + */ + protected function _createCategoriesControl() + { + $htmlHelper = $this->app->html; + + $fields = $this->app->jbcsvmapper->getCategoryFields(); + $options = array($htmlHelper->_('select.option', '', ' ** ')); + + foreach ($fields as $groupKey => $group) { + + $options[] = $htmlHelper->_('select.option', '', JText::_('JBZOO_ITEM_GROUP_' . strtoupper($groupKey))); + + foreach ($group as $fieldKey => $field) { + $options[] = $htmlHelper->_('select.option', $fieldKey, $field); + } + + $options[] = $htmlHelper->_('select.option', ''); + } + + return $htmlHelper->_('select.genericlist', $options, 'assign[]', 'class="type-select"'); + } + + /** + * @return string + */ + public function getTmpFilename() + { + return $this->app->jbpath->sysPath('tmp', '/' . uniqid('jbimport_') . '.csv'); + } + + /** + * Get import data from session + * @return JSONData + */ + protected function _initSessionData() + { + $data = $this->app->jbsession->getGroup('import'); + $this->_data = $this->app->data->create($data); + + return $this->_data; + } + + /** + * Get last line in CSV file + * @param int $step + * @return int + */ + protected function _getLastLine($step = 0) + { + $lastLine = self::STEP_SIZE * $step; + if ((int)$this->_data->header) { + $lastLine++; + } + + return $lastLine; + } + + /** + * Get lines from CSV file for current step + * @param string $file + * @param int $lastLine + * @return array + */ + protected function _getCSVLines($file, $lastLine) + { + return $this->app->jbcsv->getLinesfromFile($file, $this->_data, $lastLine, self::STEP_SIZE); + } + + /** + * Process one Item row + * @param array $row + * @param int $lineKey + * @return int + */ + protected function _processItemRow($row, $lineKey) + { + // create item + $item = $this->_getItemByKey($row, $lineKey); + + $positions = array(); + + // bind import data from CSV + foreach ($this->_data->assign as $colKey => $itemField) { + + $itemField = JString::trim($itemField); + if (!empty($itemField)) { + + $value = isset($row[$colKey]) ? $row[$colKey] : null; + + $fieldInfo = $this->app->jbcsvmapper->itemFieldToMeta($itemField); + + $positionKey = implode('__', $fieldInfo); + if (!isset($positions[$positionKey])) { + $positions[$positionKey] = 0; + } + $positions[$positionKey]++; + + $cellElem = $this->app->jbcsvcell->createItem($fieldInfo['name'], $item, $fieldInfo['group'], $fieldInfo); + $cellElem->fromCSV($value, $positions[$positionKey]); + } + } + + $id = $item->id; + + // save all changes + $item->getParams()->set('jbzoo.no_index', 0); + $this->app->table->item->save($item); + + // clean memory + unset($item); + + return $id; + } + + /** + * Process one Category row + * @param array $row + * @param int $lineKey + * @return int + */ + protected function _processCategoryRow($row, $lineKey) + { + // create item + $category = $this->_getCategoryByKey($row, $lineKey); + + // bind import data from CSV + foreach ($this->_data->assign as $colKey => $itemField) { + + $itemField = JString::trim($itemField); + if (!empty($itemField)) { + + $value = isset($row[$colKey]) ? $row[$colKey] : null; + + $fieldInfo = $this->app->jbcsvmapper->categoryFieldToMeta($itemField); + $positionKey = implode('__', $fieldInfo); + + $cellElem = $this->app->jbcsvcell->createCategory($fieldInfo['name'], $category, $fieldInfo['group'], $fieldInfo); + $cellElem->fromCSV($value); + } + } + + $id = $category->id; + + // save all changes + $this->app->table->category->save($category); + + // clean memory + unset($category); + + return $id; + } + + /** + * Get key field value + * @param array $row + * @param string $lineKey + * @return Item + */ + protected function _getItemByKey($row, $lineKey = null) + { + $item = null; + + if ($this->_data->key != self::KEY_NONE) { + foreach ($this->_data->assign as $csvKey => $fieldName) { + + if ($this->_data->key == self::KEY_ID && $fieldName == 'id') { + $item = JBModelItem::model()->getById(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_NAME && $fieldName == 'name') { + $item = JBModelItem::model()->getByName(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_ALIAS && $fieldName == 'alias') { + $item = JBModelItem::model()->getByAlias(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_SKU && strpos($fieldName, 'price_sku__') === (int)0) { + $item = JBModelItem::model()->getBySku(JString::trim($row[$csvKey]), $this->_data->appid); + break; + } + } + } + + if (!$item) { + $item = JBModelItem::model()->createEmpty($this->_data->appid, $this->_data->typeid, $lineKey); + } + + return $item; + } + + /** + * Get key field value + * @param array $row + * @param string $lineKey + * @return Item + */ + protected function _getCategoryByKey($row, $lineKey = null) + { + $category = null; + + if ($this->_data->key != self::KEY_NONE) { + foreach ($this->_data->assign as $csvKey => $fieldName) { + + if ($this->_data->key == self::KEY_ID && $fieldName == 'id') { + $category = JBModelCategory::model()->getById(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_NAME && $fieldName == 'name') { + $category = JBModelCategory::model()->getByName(JString::trim($row[$csvKey]), $this->_data->appid); + break; + + } else if ($this->_data->key == self::KEY_ALIAS && $fieldName == 'alias') { + $category = JBModelCategory::model()->getByAlias(JString::trim($row[$csvKey]), $this->_data->appid); + break; + } + } + } + + if (!$category) { + $category = JBModelCategory::model()->createEmpty($this->_data->appid, $lineKey); + } + + return $category; + } + + /** + * One step precess for items + * @param int $step + * @return array + */ + public function itemsProcess($step = 0) + { + $this->_initSessionData(); + + $lastLine = $this->_getLastLine($step); + $lines = $this->_getCSVLines($this->_data->file, $lastLine, $step); + + $lineKey = 0; + $addedIds = ($step == 0) ? array() : $this->app->jbsession->get('ids', 'import-ids'); + + if (!empty($lines)) { + foreach ($lines as $key => $row) { + $lineKey = $lastLine + $key; + $addedIds[] = $this->_processItemRow($row, $lineKey); + } + } + + $this->app->jbsession->set('ids', $addedIds, 'import-ids'); + + return array('progress' => round(($lineKey / $this->_data->count) * 100, 2)); + } + + /** + * One step precess for categories + * @param int $step + * @return array + */ + public function categoriesProcess($step = 0) + { + $this->_initSessionData(); + + $lastLine = $this->_getLastLine($step); + $lines = $this->_getCSVLines($this->_data->file, $lastLine, $step); + + $lineKey = 0; + $addedIds = ($step == 0) ? array() : $this->app->jbsession->get('ids', 'import-ids'); + + if (!empty($lines)) { + foreach ($lines as $key => $row) { + $lineKey = $lastLine + $key; + $addedIds[] = $this->_processCategoryRow($row, $lineKey); + } + } + + $this->app->jbsession->set('ids', $addedIds, 'import-ids'); + + return array('progress' => round(($lineKey / $this->_data->count) * 100, 2)); + } + + /** + * Call after all items loaded + */ + public function itemsPostProcess() + { + $addedIds = $this->app->jbsession->get('ids', 'import-ids'); + $this->_initSessionData(); + + if ($this->_data->lose == self::LOSE_DISABLE) { + JBModelItem::model()->disableAll($this->_data->appid, $this->_data->typeid, $addedIds); + + } else if ($this->_data->lose == self::LOSE_REMOVE) { + JBModelItem::model()->removeAll($this->_data->appid, $this->_data->typeid, $addedIds); + } + + $this->app->jbsession->clearGroup('import-ids'); + } + + /** + * Call after all items loaded + */ + public function categoriesPostProcess() + { + $addedIds = $this->app->jbsession->get('ids', 'import-ids'); + $this->_initSessionData(); + + if ($this->_data->lose == self::LOSE_DISABLE) { + JBModelCategory::model()->disableAll($this->_data->appid, $addedIds); + + } else if ($this->_data->lose == self::LOSE_REMOVE) { + JBModelCategory::model()->removeAll($this->_data->appid, $addedIds); + } + + $this->app->jbsession->clearGroup('import-ids'); + } + + +} diff --git a/patches/2.1.2/media/zoo/applications/jbuniversal/framework/jbzoo.php b/patches/2.1.2/media/zoo/applications/jbuniversal/framework/jbzoo.php index 3a306f7..9d7b575 100644 --- a/patches/2.1.2/media/zoo/applications/jbuniversal/framework/jbzoo.php +++ b/patches/2.1.2/media/zoo/applications/jbuniversal/framework/jbzoo.php @@ -1 +1,603 @@ - */ // no direct access defined('_JEXEC') or die('Restricted access'); !defined('JBZOO_APP_GROUP') && define('JBZOO_APP_GROUP', 'jbuniversal'); !defined('DIRECTORY_SEPERATOR') && define('DIRECTORY_SEPERATOR', '/'); !defined('DS') && define('DS', DIRECTORY_SEPARATOR); /** * Class JBZoo */ class JBZoo { /** * @var Application */ public $app = null; /** * App group name * @var string */ private $_group = JBZOO_APP_GROUP; /** * Init JBZoo application * @static * @return JBZoo */ public static function init() { static $jbzoo; if (!isset($jbzoo)) { $jbzoo = new self(); } return $jbzoo; } /** * Initialization JBZoo App */ private function __construct() { $this->app = App::getInstance('zoo'); $this->_initPaths(); $this->_initConfig(); $this->_initModels(); $this->_initLanguages(); $this->_initFilterElements(); $this->_initEvents(); $this->_initAssets(); } /** * Add directory path */ private function _initPaths() { $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); $this->_addPath('jbapp:framework', 'jbzoo'); $this->_addPath('jbapp:assets', 'jbassets'); $this->_addPath('jbassets:zoo', 'assets'); $this->_addPath('jbapp:config', 'jbconfig'); $this->_addPath('jbzoo:elements', 'jbelements'); $this->_addPath('jbapp:types', 'jbtypes'); $this->_addPath('jbzoo:helpers', 'helpers'); $this->_addPath('jbzoo:helpers-std', 'helpers'); $this->_addPath('jbzoo:classes-std', 'classes'); $this->_addPath('jbzoo:render', 'renderer'); $this->_addPath('jbzoo:views', 'jbviews'); $this->_addPath('jbapp:config', 'jbxml'); $this->_addPath('jbviews:', 'partials'); $this->_addPath('jbapp:joomla/elements', 'fields'); $this->_addPath('jbapp:templates', 'jbtmpl'); $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); if ($this->app->jbenv->isSite()) { $this->_addPath('jbzoo:controllers', 'controllers'); } require $this->app->path->path('jbzoo:controllers/base.php'); JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); } /** * Include models classes */ private function _initModels() { // defines define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); // query builder $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/classes'; require $path . '/database/JBDatabaseQuery.php'; require $path . '/database/JBDatabaseQueryElement.php'; // models $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/models'; require $path . '/jbmodel.php'; require $path . '/jbmodel.element.php'; require $path . '/jbmodel.autocomplete.php'; require $path . '/jbmodel.element.country.php'; require $path . '/jbmodel.element.itemdate.php'; require $path . '/jbmodel.element.itemauthor.php'; require $path . '/jbmodel.element.itemcategory.php'; require $path . '/jbmodel.element.itemcreated.php'; require $path . '/jbmodel.element.itemfrontpage.php'; require $path . '/jbmodel.element.itemmodified.php'; require $path . '/jbmodel.element.itemname.php'; require $path . '/jbmodel.element.itempublish_down.php'; require $path . '/jbmodel.element.itempublish_up.php'; require $path . '/jbmodel.element.itemtag.php'; require $path . '/jbmodel.element.jbimage.php'; require $path . '/jbmodel.element.jbselectcascade.php'; require $path . '/jbmodel.element.range.php'; require $path . '/jbmodel.element.rating.php'; require $path . '/jbmodel.element.jbpriceadvance.php'; require $path . '/jbmodel.element.textarea.php'; require $path . '/jbmodel.favorite.php'; require $path . '/jbmodel.filter.php'; require $path . '/jbmodel.item.php'; require $path . '/jbmodel.app.php'; require $path . '/jbmodel.category.php'; require $path . '/jbmodel.order.php'; require $path . '/jbmodel.related.php'; require $path . '/jbmodel.searchindex.php'; require $path . '/jbmodel.values.php'; require $path . '/jbmodel.sku.php'; } /** * Load lang files */ private function _initLanguages() { $lang = JFactory::getLanguage(); $lang->load('com_zoo'); $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); $lang->load('com_zoo', JPATH_ADMINISTRATOR); } /** * Load others libraries */ private function _initFilterElements() { jimport('joomla.html.parameter.element'); $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/render/filter'; require $path . '/element.php'; require $path . '/element.author.php'; require $path . '/element.author.checkbox.php'; require $path . '/element.author.radio.php'; require $path . '/element.author.select.php'; require $path . '/element.author.select.chosen.php'; require $path . '/element.author.text.php'; require $path . '/element.category.php'; require $path . '/element.category.chosen.php'; require $path . '/element.checkbox.php'; require $path . '/element.country.php'; require $path . '/element.country.checkbox.php'; require $path . '/element.country.radio.php'; require $path . '/element.country.select.php'; require $path . '/element.country.select.chosen.php'; require $path . '/element.date.php'; require $path . '/element.date.range.php'; require $path . '/element.frontpage.php'; require $path . '/element.frontpage.jqueryui.php'; require $path . '/element.hidden.php'; require $path . '/element.imageexists.php'; require $path . '/element.imageexists.jqueryui.php'; require $path . '/element.jbselectcascade.php'; require $path . '/element.jqueryui.php'; require $path . '/element.name.php'; require $path . '/element.name.checkbox.php'; require $path . '/element.name.radio.php'; require $path . '/element.name.select.php'; require $path . '/element.name.select.chosen.php'; require $path . '/element.radio.php'; require $path . '/element.rating.php'; require $path . '/element.rating.ranges.php'; require $path . '/element.rating.slider.php'; require $path . '/element.select.php'; require $path . '/element.select.chosen.php'; require $path . '/element.slider.php'; require $path . '/element.tag.php'; require $path . '/element.tag.checkbox.php'; require $path . '/element.tag.radio.php'; require $path . '/element.tag.select.php'; require $path . '/element.tag.select.chosen.php'; require $path . '/element.text.php'; require $path . '/element.text.range.php'; } /** * Register and connect events */ private function _initEvents() { $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/events'; require $path . '/jbevent.php'; require $path . '/jbevent.application.php'; require $path . '/jbevent.basket.php'; require $path . '/jbevent.category.php'; require $path . '/jbevent.comment.php'; require $path . '/jbevent.element.php'; require $path . '/jbevent.item.php'; require $path . '/jbevent.jbzoo.php'; require $path . '/jbevent.layout.php'; require $path . '/jbevent.submission.php'; require $path . '/jbevent.tag.php'; require $path . '/jbevent.type.php'; require $path . '/jbevent.payment.php'; $event = $this->app->event; $dispatcher = $event->dispatcher; $event->register('JBEventApplication'); $dispatcher->connect('application:init', array('JBEventApplication', 'init')); $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); $event->register('JBEventCategory'); $dispatcher->connect('category:init', array('JBEventCategory', 'init')); $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); $event->register('JBEventItem'); $dispatcher->connect('item:init', array('JBEventItem', 'init')); $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); $event->register('JBEventComment'); $dispatcher->connect('comment:init', array('JBEventComment', 'init')); $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); $event->register('JBEventSubmission'); $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); $event->register('JBEventElement'); $dispatcher->connect('element:download', array('JBEventElement', 'download')); $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); $event->register('JBEventLayout'); $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); $event->register('JBEventTag'); $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); $event->register('JBEventType'); $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); $dispatcher->connect('type:copied', array('JBEventType', 'copied')); $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); $event->register('JBEventJBZoo'); $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); $event->register('JBEventBasket'); $dispatcher->connect('basket:beforesave', array('JBEventBasket', 'beforeSave')); $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); $event->register('JBEventPayment'); $dispatcher->connect('payment:callback', array('JBEventPayment', 'callback')); } /** * Init assets for admin path */ private function _initAssets() { if (!$this->app->jbenv->isSite()) { $this->app->jbassets->admin(); $this->_initAdminMenu(); } } /** * Init Admin menu */ private function _initAdminMenu() { if (defined('JBZOO_CONFIG_ADMINMENU') && !JBZOO_CONFIG_ADMINMENU) { return false; } $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); $appList = JBModelApp::model()->getSimpleList(); $findJBZooApp = false; $dispatched = false; foreach ($appList as $app) { if ($app->application_group == JBZOO_APP_GROUP) { $findJBZooApp = true; if ($curApp == $app->id) { $dispatched = true; } } } if (!$findJBZooApp) { return false; } $router = $this->app->jbrouter; $menuItems = array(); if (!empty($appList)) { foreach ($appList as $app) { $menuItems['app-' . $app->alias] = array( 'name' => $app->name, 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), 'children' => array( 'add-item' => array( 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')) ), 'sep-1' => 'divider', 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')) ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')) ), 'frontpage' => array( 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')) ), 'comments' => array( 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')) ), 'sep-1' => 'divider', 'config' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')) ), ) ); } } $menuItems['sep-1'] = 'divider'; $menuItems['item-config'] = array( 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), ); $types = $this->app->jbtype->getSimpleList(); if (!empty($types)) { $children = array(); foreach ($types as $alias => $type) { $children['type-' . $alias] = array( 'name' => $type, 'url' => $router->admin(array( 'controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => array('0' => $alias) )) ); } $menuItems['item-config']['children'] = $children; } if ($dispatched) { $menuItems['sep-2'] = 'divider'; $menuItems['jbzoo-admin'] = array( 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), ), ), ); $menuItems['jbzoo-import'] = array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDART'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), ), ), ); $menuItems['jbzoo-export'] = array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), ), 'types' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), ), 'yandexyml' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDART'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), ), 'zoobackup' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), ), ), ); $menuItems['sep-3'] = 'divider'; $menuItems['jbzoo-info'] = array( 'name' => JText::_('JBZOO_ADMINMENU_INFO'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), ), 'server' => array( 'name' => 'Get Last JBZoo', 'url' => 'https://github.com/JBZoo/JBZoo', 'target' => '_blank', ), ) ); } $menuItems['jbzoo-support'] = array( 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), 'url' => 'http://forum.jbzoo.com/', 'target' => '_blank', ); $this->app->jbassets->addVar('JBAdminItems', array( 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), 'items' => $menuItems, )); } /** * Init config file */ private function _initConfig() { if ($configFile = $this->app->path->path('jbapp:config/config.php')) { require $configFile; } $fn = base64_decode('b' . 'Glj' . 'ZW5j' . 'ZS4' . '='); $fp = base64_decode('amJh' . 'cHA6' . 'Y29u' . 'Zmln'); $f = $this->app->path->path($fp) . '/' . $fn . self::getDomain(true) . '.' . base64_decode('cGhw'); if (JFile::exists($f)) { require($f); } } /** * Get group name * @return string */ private function _getGroup() { return $this->_group; } /** * Register new path in system * @param string $path * @param string $pathName * @return mixed */ private function _addPath($path, $pathName) { if ($fullPath = $this->app->path->path($path)) { return $this->app->path->register($fullPath, $pathName); } return null; } /** * Get domain name * @param bool $isAny * @return string */ static function getDomain($isAny = false) { $domain = ''; if (function_exists('apache_request_headers')) { $headers = apache_request_headers(); $domain = isset($headers['Host']) ? $headers['Host'] : ''; } if ($isAny && !$domain) { $domain = $_SERVER['HTTP_HOST']; } $domain = preg_replace('#^www\.#', '', $domain); list($domain) = explode(':', $domain); return $domain; } /** * Get hash * @param $string * @return string */ static public function getHash($string) { return ''; } } \ No newline at end of file + + */ + +// no direct access +defined('_JEXEC') or die('Restricted access'); + + +!defined('JBZOO_APP_GROUP') && define('JBZOO_APP_GROUP', 'jbuniversal'); +!defined('DIRECTORY_SEPERATOR') && define('DIRECTORY_SEPERATOR', '/'); +!defined('DS') && define('DS', DIRECTORY_SEPARATOR); + +/** + * Class JBZoo + */ +class JBZoo +{ + /** + * @var Application + */ + public $app = null; + + /** + * App group name + * @var string + */ + private $_group = JBZOO_APP_GROUP; + + /** + * Init JBZoo application + * @static + * @return JBZoo + */ + public static function init() + { + static $jbzoo; + + if (!isset($jbzoo)) { + $jbzoo = new self(); + } + + return $jbzoo; + } + + /** + * Initialization JBZoo App + */ + private function __construct() + { + $this->app = App::getInstance('zoo'); + + $this->_initPaths(); + $this->_initConfig(); + $this->_initModels(); + $this->_initLanguages(); + $this->_initFilterElements(); + $this->_initEvents(); + $this->_initAssets(); + } + + /** + * Add directory path + */ + private function _initPaths() + { + $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); + $this->_addPath('jbapp:framework', 'jbzoo'); + $this->_addPath('jbapp:assets', 'jbassets'); + $this->_addPath('jbassets:zoo', 'assets'); + $this->_addPath('jbapp:config', 'jbconfig'); + $this->_addPath('jbzoo:elements', 'jbelements'); + $this->_addPath('jbapp:types', 'jbtypes'); + $this->_addPath('jbzoo:helpers', 'helpers'); + $this->_addPath('jbzoo:helpers-std', 'helpers'); + $this->_addPath('jbzoo:classes-std', 'classes'); + $this->_addPath('jbzoo:render', 'renderer'); + $this->_addPath('jbzoo:views', 'jbviews'); + $this->_addPath('jbapp:config', 'jbxml'); + $this->_addPath('jbviews:', 'partials'); + $this->_addPath('jbapp:joomla/elements', 'fields'); + $this->_addPath('jbapp:templates', 'jbtmpl'); + $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); + $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); + $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); + $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); + $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); + + if ($this->app->jbenv->isSite()) { + $this->_addPath('jbzoo:controllers', 'controllers'); + } + + require $this->app->path->path('jbzoo:controllers/base.php'); + + JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); + } + + /** + * Include models classes + */ + private function _initModels() + { + // defines + define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); + define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); + + // query builder + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/classes'; + require $path . '/database/JBDatabaseQuery.php'; + require $path . '/database/JBDatabaseQueryElement.php'; + + // models + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/models'; + require $path . '/jbmodel.php'; + require $path . '/jbmodel.element.php'; + require $path . '/jbmodel.autocomplete.php'; + require $path . '/jbmodel.element.country.php'; + require $path . '/jbmodel.element.itemdate.php'; + require $path . '/jbmodel.element.itemauthor.php'; + require $path . '/jbmodel.element.itemcategory.php'; + require $path . '/jbmodel.element.itemcreated.php'; + require $path . '/jbmodel.element.itemfrontpage.php'; + require $path . '/jbmodel.element.itemmodified.php'; + require $path . '/jbmodel.element.itemname.php'; + require $path . '/jbmodel.element.itempublish_down.php'; + require $path . '/jbmodel.element.itempublish_up.php'; + require $path . '/jbmodel.element.itemtag.php'; + require $path . '/jbmodel.element.jbimage.php'; + require $path . '/jbmodel.element.jbselectcascade.php'; + require $path . '/jbmodel.element.range.php'; + require $path . '/jbmodel.element.rating.php'; + require $path . '/jbmodel.element.jbpriceadvance.php'; + require $path . '/jbmodel.element.textarea.php'; + require $path . '/jbmodel.favorite.php'; + require $path . '/jbmodel.filter.php'; + require $path . '/jbmodel.item.php'; + require $path . '/jbmodel.app.php'; + require $path . '/jbmodel.category.php'; + require $path . '/jbmodel.order.php'; + require $path . '/jbmodel.related.php'; + require $path . '/jbmodel.searchindex.php'; + require $path . '/jbmodel.values.php'; + require $path . '/jbmodel.sku.php'; + } + + /** + * Load lang files + */ + private function _initLanguages() + { + $lang = JFactory::getLanguage(); + $lang->load('com_zoo'); + $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); + $lang->load('com_zoo', JPATH_ADMINISTRATOR); + } + + /** + * Load others libraries + */ + private function _initFilterElements() + { + jimport('joomla.html.parameter.element'); + + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/render/filter'; + require $path . '/element.php'; + require $path . '/element.author.php'; + require $path . '/element.author.checkbox.php'; + require $path . '/element.author.radio.php'; + require $path . '/element.author.select.php'; + require $path . '/element.author.select.chosen.php'; + require $path . '/element.author.text.php'; + require $path . '/element.category.php'; + require $path . '/element.category.chosen.php'; + require $path . '/element.checkbox.php'; + require $path . '/element.country.php'; + require $path . '/element.country.checkbox.php'; + require $path . '/element.country.radio.php'; + require $path . '/element.country.select.php'; + require $path . '/element.country.select.chosen.php'; + require $path . '/element.date.php'; + require $path . '/element.date.range.php'; + require $path . '/element.frontpage.php'; + require $path . '/element.frontpage.jqueryui.php'; + require $path . '/element.hidden.php'; + require $path . '/element.imageexists.php'; + require $path . '/element.imageexists.jqueryui.php'; + require $path . '/element.jbselectcascade.php'; + require $path . '/element.jqueryui.php'; + require $path . '/element.name.php'; + require $path . '/element.name.checkbox.php'; + require $path . '/element.name.radio.php'; + require $path . '/element.name.select.php'; + require $path . '/element.name.select.chosen.php'; + require $path . '/element.radio.php'; + require $path . '/element.rating.php'; + require $path . '/element.rating.ranges.php'; + require $path . '/element.rating.slider.php'; + require $path . '/element.select.php'; + require $path . '/element.select.chosen.php'; + require $path . '/element.slider.php'; + require $path . '/element.tag.php'; + require $path . '/element.tag.checkbox.php'; + require $path . '/element.tag.radio.php'; + require $path . '/element.tag.select.php'; + require $path . '/element.tag.select.chosen.php'; + require $path . '/element.text.php'; + require $path . '/element.text.range.php'; + } + + /** + * Register and connect events + */ + private function _initEvents() + { + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/events'; + require $path . '/jbevent.php'; + require $path . '/jbevent.application.php'; + require $path . '/jbevent.basket.php'; + require $path . '/jbevent.category.php'; + require $path . '/jbevent.comment.php'; + require $path . '/jbevent.element.php'; + require $path . '/jbevent.item.php'; + require $path . '/jbevent.jbzoo.php'; + require $path . '/jbevent.layout.php'; + require $path . '/jbevent.submission.php'; + require $path . '/jbevent.tag.php'; + require $path . '/jbevent.type.php'; + require $path . '/jbevent.payment.php'; + + $event = $this->app->event; + $dispatcher = $event->dispatcher; + + $event->register('JBEventApplication'); + $dispatcher->connect('application:init', array('JBEventApplication', 'init')); + $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); + $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); + $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); + $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); + $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); + $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); + $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); + $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); + + $event->register('JBEventCategory'); + $dispatcher->connect('category:init', array('JBEventCategory', 'init')); + $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); + $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); + $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); + + $event->register('JBEventItem'); + $dispatcher->connect('item:init', array('JBEventItem', 'init')); + $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); + $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); + $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); + $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); + $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); + $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); + $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); + + $event->register('JBEventComment'); + $dispatcher->connect('comment:init', array('JBEventComment', 'init')); + $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); + $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); + $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); + + $event->register('JBEventSubmission'); + $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); + $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); + $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); + $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); + + $event->register('JBEventElement'); + $dispatcher->connect('element:download', array('JBEventElement', 'download')); + $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); + $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); + $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); + $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); + $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); + $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); + $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); + $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); + $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); + + $event->register('JBEventLayout'); + $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); + + $event->register('JBEventTag'); + $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); + $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); + + $event->register('JBEventType'); + $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); + $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); + $dispatcher->connect('type:copied', array('JBEventType', 'copied')); + $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); + $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); + $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); + $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); + + $event->register('JBEventJBZoo'); + $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); + $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); + + $event->register('JBEventBasket'); + $dispatcher->connect('basket:beforesave', array('JBEventBasket', 'beforeSave')); + $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); + + $event->register('JBEventPayment'); + $dispatcher->connect('payment:callback', array('JBEventPayment', 'callback')); + } + + /** + * Init assets for admin path + */ + private function _initAssets() + { + if (!$this->app->jbenv->isSite()) { + $this->app->jbassets->admin(); + $this->_initAdminMenu(); + } + } + + /** + * Init Admin menu + */ + private function _initAdminMenu() + { + if (defined('JBZOO_CONFIG_ADMINMENU') && !JBZOO_CONFIG_ADMINMENU) { + return false; + } + + $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); + + $appList = JBModelApp::model()->getSimpleList(); + $findJBZooApp = false; + $dispatched = false; + foreach ($appList as $app) { + if ($app->application_group == JBZOO_APP_GROUP) { + $findJBZooApp = true; + if ($curApp == $app->id) { + $dispatched = true; + } + } + } + + if (!$findJBZooApp) { + return false; + } + + $router = $this->app->jbrouter; + + $menuItems = array(); + + if (!empty($appList)) { + foreach ($appList as $app) { + + $menuItems['app-' . $app->alias] = array( + 'name' => $app->name, + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), + 'children' => array( + 'add-item' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')) + ), + 'sep-1' => 'divider', + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')) + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')) + ), + 'frontpage' => array( + 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')) + ), + 'comments' => array( + 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')) + ), + 'sep-1' => 'divider', + 'config' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')) + ), + ) + ); + } + } + + $menuItems['sep-1'] = 'divider'; + + $menuItems['item-config'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), + 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), + ); + + $types = $this->app->jbtype->getSimpleList(); + if (!empty($types)) { + $children = array(); + foreach ($types as $alias => $type) { + $children['type-' . $alias] = array( + 'name' => $type, + 'url' => $router->admin(array( + 'controller' => 'manager', + 'group' => 'jbuniversal', + 'task' => 'editelements', + 'cid' => array('0' => $alias) + )) + ); + } + + $menuItems['item-config']['children'] = $children; + } + + if ($dispatched) { + $menuItems['sep-2'] = 'divider'; + + $menuItems['jbzoo-admin'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), + 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), + 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), + 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), + ), + ), + ); + + $menuItems['jbzoo-import'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDART'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), + ), + ), + ); + + $menuItems['jbzoo-export'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), + ), + 'types' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), + ), + 'yandexyml' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDART'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), + ), + 'zoobackup' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), + ), + ), + ); + + $menuItems['sep-3'] = 'divider'; + + $menuItems['jbzoo-info'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_INFO'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), + ), + 'server' => array( + 'name' => 'Get Last JBZoo', + 'url' => 'https://github.com/JBZoo/JBZoo', + 'target' => '_blank', + ), + ) + ); + } + + $menuItems['jbzoo-support'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), + 'url' => 'http://forum.jbzoo.com/', + 'target' => '_blank', + ); + + $this->app->jbassets->addVar('JBAdminItems', array( + 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), + 'items' => $menuItems, + )); + } + + /** + * Init config file + */ + private function _initConfig() + { + if ($configFile = $this->app->path->path('jbapp:config/config.php')) { + require $configFile; + } + + $fn = base64_decode('b' . 'Glj' . 'ZW5j' . 'ZS4' . '='); + $fp = base64_decode('amJh' . 'cHA6' . 'Y29u' . 'Zmln'); + $f = $this->app->path->path($fp) . '/' . $fn . self::getDomain(true) . '.' . base64_decode('cGhw'); + if (JFile::exists($f)) { + require($f); + } + } + + /** + * Get group name + * @return string + */ + private function _getGroup() + { + return $this->_group; + } + + /** + * Register new path in system + * @param string $path + * @param string $pathName + * @return mixed + */ + private function _addPath($path, $pathName) + { + if ($fullPath = $this->app->path->path($path)) { + return $this->app->path->register($fullPath, $pathName); + } + + return null; + } + + /** + * Get domain name + * @param bool $isAny + * @return string + */ + static function getDomain($isAny = false) + { + $domain = ''; + if (function_exists('apache_request_headers')) { + $headers = apache_request_headers(); + $domain = isset($headers['Host']) ? $headers['Host'] : ''; + } + + if ($isAny && !$domain) { + $domain = $_SERVER['HTTP_HOST']; + } + + $domain = preg_replace('#^www\.#', '', $domain); + list($domain) = explode(':', $domain); + + return $domain; + } + + /** + * Get hash + * @param $string + * @return string + */ + static public function getHash($string) + { + return ''; + } +} diff --git a/patches/2.1.3/media/zoo/applications/jbuniversal/framework/jbzoo.php b/patches/2.1.3/media/zoo/applications/jbuniversal/framework/jbzoo.php index 0f48fa2..99ff74e 100644 --- a/patches/2.1.3/media/zoo/applications/jbuniversal/framework/jbzoo.php +++ b/patches/2.1.3/media/zoo/applications/jbuniversal/framework/jbzoo.php @@ -1 +1,606 @@ - */ // no direct access defined('_JEXEC') or die('Restricted access'); !defined('JBZOO_APP_GROUP') && define('JBZOO_APP_GROUP', 'jbuniversal'); !defined('DIRECTORY_SEPERATOR') && define('DIRECTORY_SEPERATOR', '/'); !defined('DS') && define('DS', DIRECTORY_SEPARATOR); /** * Class JBZoo */ class JBZoo { /** * @var Application */ public $app = null; /** * App group name * @var string */ private $_group = JBZOO_APP_GROUP; /** * Init JBZoo application * @static * @return JBZoo */ public static function init() { static $jbzoo; if (!isset($jbzoo)) { $jbzoo = new self(); } return $jbzoo; } /** * Initialization JBZoo App */ private function __construct() { $this->app = App::getInstance('zoo'); $this->_initPaths(); $this->_initConfig(); $this->_initModels(); $this->_initLanguages(); $this->_initFilterElements(); $this->_initEvents(); $this->_initAssets(); } /** * Add directory path */ private function _initPaths() { $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); $this->_addPath('jbapp:framework', 'jbzoo'); $this->_addPath('jbapp:assets', 'jbassets'); $this->_addPath('jbassets:zoo', 'assets'); $this->_addPath('jbapp:config', 'jbconfig'); $this->_addPath('jbzoo:elements', 'jbelements'); $this->_addPath('jbapp:types', 'jbtypes'); $this->_addPath('jbzoo:helpers', 'helpers'); $this->_addPath('jbzoo:helpers-std', 'helpers'); $this->_addPath('jbzoo:classes-std', 'classes'); $this->_addPath('jbzoo:render', 'renderer'); $this->_addPath('jbzoo:views', 'jbviews'); $this->_addPath('jbapp:config', 'jbxml'); $this->_addPath('jbviews:', 'partials'); $this->_addPath('jbapp:joomla/elements', 'fields'); $this->_addPath('jbapp:templates', 'jbtmpl'); $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); if ($this->app->jbenv->isSite()) { $this->_addPath('jbzoo:controllers', 'controllers'); } require $this->app->path->path('jbzoo:controllers/base.php'); JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); } /** * Include models classes */ private function _initModels() { // defines define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); // query builder $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/classes'; require $path . '/database/JBDatabaseQuery.php'; require $path . '/database/JBDatabaseQueryElement.php'; // models $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/models'; require $path . '/jbmodel.php'; require $path . '/jbmodel.element.php'; require $path . '/jbmodel.autocomplete.php'; require $path . '/jbmodel.element.country.php'; require $path . '/jbmodel.element.itemdate.php'; require $path . '/jbmodel.element.itemauthor.php'; require $path . '/jbmodel.element.itemcategory.php'; require $path . '/jbmodel.element.itemcreated.php'; require $path . '/jbmodel.element.itemfrontpage.php'; require $path . '/jbmodel.element.itemmodified.php'; require $path . '/jbmodel.element.itemname.php'; require $path . '/jbmodel.element.itempublish_down.php'; require $path . '/jbmodel.element.itempublish_up.php'; require $path . '/jbmodel.element.itemtag.php'; require $path . '/jbmodel.element.jbimage.php'; require $path . '/jbmodel.element.jbselectcascade.php'; require $path . '/jbmodel.element.range.php'; require $path . '/jbmodel.element.rating.php'; require $path . '/jbmodel.element.jbpriceadvance.php'; require $path . '/jbmodel.element.textarea.php'; require $path . '/jbmodel.favorite.php'; require $path . '/jbmodel.filter.php'; require $path . '/jbmodel.item.php'; require $path . '/jbmodel.app.php'; require $path . '/jbmodel.category.php'; require $path . '/jbmodel.order.php'; require $path . '/jbmodel.related.php'; require $path . '/jbmodel.searchindex.php'; require $path . '/jbmodel.values.php'; require $path . '/jbmodel.sku.php'; } /** * Load lang files */ private function _initLanguages() { $lang = JFactory::getLanguage(); $lang->load('com_zoo'); $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); $lang->load('com_zoo', JPATH_ADMINISTRATOR); } /** * Load others libraries */ private function _initFilterElements() { jimport('joomla.html.parameter.element'); $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/render/filter'; require $path . '/element.php'; require $path . '/element.author.php'; require $path . '/element.author.checkbox.php'; require $path . '/element.author.radio.php'; require $path . '/element.author.select.php'; require $path . '/element.author.select.chosen.php'; require $path . '/element.author.text.php'; require $path . '/element.category.php'; require $path . '/element.category.chosen.php'; require $path . '/element.checkbox.php'; require $path . '/element.country.php'; require $path . '/element.country.checkbox.php'; require $path . '/element.country.radio.php'; require $path . '/element.country.select.php'; require $path . '/element.country.select.chosen.php'; require $path . '/element.date.php'; require $path . '/element.date.range.php'; require $path . '/element.frontpage.php'; require $path . '/element.frontpage.jqueryui.php'; require $path . '/element.hidden.php'; require $path . '/element.imageexists.php'; require $path . '/element.imageexists.jqueryui.php'; require $path . '/element.jbselectcascade.php'; require $path . '/element.jqueryui.php'; require $path . '/element.name.php'; require $path . '/element.name.checkbox.php'; require $path . '/element.name.radio.php'; require $path . '/element.name.select.php'; require $path . '/element.name.select.chosen.php'; require $path . '/element.radio.php'; require $path . '/element.rating.php'; require $path . '/element.rating.ranges.php'; require $path . '/element.rating.slider.php'; require $path . '/element.select.php'; require $path . '/element.select.chosen.php'; require $path . '/element.slider.php'; require $path . '/element.tag.php'; require $path . '/element.tag.checkbox.php'; require $path . '/element.tag.radio.php'; require $path . '/element.tag.select.php'; require $path . '/element.tag.select.chosen.php'; require $path . '/element.text.php'; require $path . '/element.text.range.php'; } /** * Register and connect events */ private function _initEvents() { $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/events'; require $path . '/jbevent.php'; require $path . '/jbevent.application.php'; require $path . '/jbevent.basket.php'; require $path . '/jbevent.category.php'; require $path . '/jbevent.comment.php'; require $path . '/jbevent.element.php'; require $path . '/jbevent.item.php'; require $path . '/jbevent.jbzoo.php'; require $path . '/jbevent.layout.php'; require $path . '/jbevent.submission.php'; require $path . '/jbevent.tag.php'; require $path . '/jbevent.type.php'; require $path . '/jbevent.payment.php'; $event = $this->app->event; $dispatcher = $event->dispatcher; $event->register('JBEventApplication'); $dispatcher->connect('application:init', array('JBEventApplication', 'init')); $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); $event->register('JBEventCategory'); $dispatcher->connect('category:init', array('JBEventCategory', 'init')); $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); $event->register('JBEventItem'); $dispatcher->connect('item:init', array('JBEventItem', 'init')); $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); $event->register('JBEventComment'); $dispatcher->connect('comment:init', array('JBEventComment', 'init')); $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); $event->register('JBEventSubmission'); $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); $event->register('JBEventElement'); $dispatcher->connect('element:download', array('JBEventElement', 'download')); $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); $event->register('JBEventLayout'); $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); $event->register('JBEventTag'); $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); $event->register('JBEventType'); $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); $dispatcher->connect('type:copied', array('JBEventType', 'copied')); $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); $event->register('JBEventJBZoo'); $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); $event->register('JBEventBasket'); $dispatcher->connect('basket:beforesave', array('JBEventBasket', 'beforeSave')); $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); $event->register('JBEventPayment'); $dispatcher->connect('payment:callback', array('JBEventPayment', 'callback')); } /** * Init assets for admin path */ private function _initAssets() { if (!$this->app->jbenv->isSite()) { $this->app->jbassets->admin(); $this->_initAdminMenu(); } } /** * Init Admin menu */ private function _initAdminMenu() { if (defined('JBZOO_CONFIG_ADMINMENU') && !JBZOO_CONFIG_ADMINMENU) { return false; } $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); $appList = JBModelApp::model()->getSimpleList(); $findJBZooApp = false; $dispatched = false; foreach ($appList as $app) { if ($app->application_group == JBZOO_APP_GROUP) { $findJBZooApp = true; if ($curApp == $app->id) { $dispatched = true; } } } if (!$findJBZooApp) { return false; } $router = $this->app->jbrouter; $menuItems = array(); if (!empty($appList)) { foreach ($appList as $app) { $menuItems['app-' . $app->alias] = array( 'name' => $app->name, 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), 'children' => array( 'add-item' => array( 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')) ), 'sep-1' => 'divider', 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')) ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')) ), 'frontpage' => array( 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')) ), 'comments' => array( 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')) ), 'sep-1' => 'divider', 'config' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')) ), ) ); } } $menuItems['sep-1'] = 'divider'; $menuItems['item-config'] = array( 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), ); $types = $this->app->jbtype->getSimpleList(); if (!empty($types)) { $children = array(); foreach ($types as $alias => $type) { $children['type-' . $alias] = array( 'name' => $type, 'url' => $router->admin(array( 'controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => array('0' => $alias) )) ); } $menuItems['item-config']['children'] = $children; } if ($dispatched) { $menuItems['sep-2'] = 'divider'; $menuItems['jbzoo-admin'] = array( 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), ), ), ); $menuItems['jbzoo-import'] = array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDART'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), ), ), ); $menuItems['jbzoo-export'] = array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), ), 'types' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), ), 'yandexyml' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDART'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), ), 'zoobackup' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), ), ), ); $menuItems['sep-3'] = 'divider'; $menuItems['jbzoo-info'] = array( 'name' => JText::_('JBZOO_ADMINMENU_INFO'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), ), 'server' => array( 'name' => 'Get Last JBZoo', 'url' => 'https://github.com/JBZoo/JBZoo', 'target' => '_blank', ), ) ); } $menuItems['jbzoo-support'] = array( 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), 'url' => 'http://forum.jbzoo.com/', 'target' => '_blank', ); $this->app->jbassets->addVar('JBAdminItems', array( 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), 'items' => $menuItems, )); } /** * Init config file */ private function _initConfig() { if ($configFile = $this->app->path->path('jbapp:config/config.php')) { require $configFile; } $fn = base64_decode('b' . 'Glj' . 'ZW5j' . 'ZS4' . '='); $fp = base64_decode('amJh' . 'cHA6' . 'Y29u' . 'Zmln'); $f = $this->app->path->path($fp) . '/' . $fn . self::getDomain(true) . '.' . base64_decode('cGhw'); if (JFile::exists($f)) { require($f); } } /** * Get group name * @return string */ private function _getGroup() { return $this->_group; } /** * Register new path in system * @param string $path * @param string $pathName * @return mixed */ private function _addPath($path, $pathName) { if ($fullPath = $this->app->path->path($path)) { return $this->app->path->register($fullPath, $pathName); } return null; } /** * Get domain name * @param bool $isAny * @return string */ static function getDomain($isAny = false) { $domain = ''; if (function_exists('apache_request_headers')) { $headers = apache_request_headers(); $domain = isset($headers['Host']) ? $headers['Host'] : ''; } if ($isAny && !$domain) { $domain = $_SERVER['HTTP_HOST']; } $domain = preg_replace('#^www\.#', '', $domain); list($domain) = explode(':', $domain); return $domain; } /** * Get hash * @param $string * @return string */ static public function getHash($string) { return ''; } } \ No newline at end of file + + */ + +// no direct access +defined('_JEXEC') or die('Restricted access'); + + +!defined('JBZOO_APP_GROUP') && define('JBZOO_APP_GROUP', 'jbuniversal'); +!defined('DIRECTORY_SEPERATOR') && define('DIRECTORY_SEPERATOR', '/'); +!defined('DS') && define('DS', DIRECTORY_SEPARATOR); + +/** + * Class JBZoo + */ +class JBZoo +{ + /** + * @var Application + */ + public $app = null; + + /** + * App group name + * @var string + */ + private $_group = JBZOO_APP_GROUP; + + /** + * Init JBZoo application + * @static + * @return JBZoo + */ + public static function init() + { + static $jbzoo; + + if (!isset($jbzoo)) { + $jbzoo = new self(); + } + + return $jbzoo; + } + + /** + * Initialization JBZoo App + */ + private function __construct() + { + $this->app = App::getInstance('zoo'); + + $this->_initPaths(); + $this->_initConfig(); + $this->_initModels(); + $this->_initLanguages(); + $this->_initFilterElements(); + $this->_initEvents(); + $this->_initAssets(); + } + + /** + * Add directory path + */ + private function _initPaths() + { + $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); + $this->_addPath('jbapp:framework', 'jbzoo'); + $this->_addPath('jbapp:assets', 'jbassets'); + $this->_addPath('jbassets:zoo', 'assets'); + $this->_addPath('jbapp:config', 'jbconfig'); + $this->_addPath('jbzoo:elements', 'jbelements'); + $this->_addPath('jbapp:types', 'jbtypes'); + $this->_addPath('jbzoo:helpers', 'helpers'); + $this->_addPath('jbzoo:helpers-std', 'helpers'); + $this->_addPath('jbzoo:classes-std', 'classes'); + $this->_addPath('jbzoo:render', 'renderer'); + $this->_addPath('jbzoo:views', 'jbviews'); + $this->_addPath('jbapp:config', 'jbxml'); + $this->_addPath('jbviews:', 'partials'); + $this->_addPath('jbapp:joomla/elements', 'fields'); + $this->_addPath('jbapp:templates', 'jbtmpl'); + $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); + $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); + $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); + $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); + $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); + + if ($this->app->jbenv->isSite()) { + $this->_addPath('jbzoo:controllers', 'controllers'); + } + + require $this->app->path->path('jbzoo:controllers/base.php'); + + JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); + } + + /** + * Include models classes + */ + private function _initModels() + { + // defines + define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); + define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); + define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); + + // query builder + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/classes'; + require $path . '/database/JBDatabaseQuery.php'; + require $path . '/database/JBDatabaseQueryElement.php'; + + // models + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/models'; + require $path . '/jbmodel.php'; + require $path . '/jbmodel.element.php'; + require $path . '/jbmodel.autocomplete.php'; + require $path . '/jbmodel.element.country.php'; + require $path . '/jbmodel.element.itemdate.php'; + require $path . '/jbmodel.element.itemauthor.php'; + require $path . '/jbmodel.element.itemcategory.php'; + require $path . '/jbmodel.element.itemcreated.php'; + require $path . '/jbmodel.element.itemfrontpage.php'; + require $path . '/jbmodel.element.itemmodified.php'; + require $path . '/jbmodel.element.itemname.php'; + require $path . '/jbmodel.element.itempublish_down.php'; + require $path . '/jbmodel.element.itempublish_up.php'; + require $path . '/jbmodel.element.itemtag.php'; + require $path . '/jbmodel.element.jbimage.php'; + require $path . '/jbmodel.element.jbselectcascade.php'; + require $path . '/jbmodel.element.range.php'; + require $path . '/jbmodel.element.rating.php'; + require $path . '/jbmodel.element.jbpriceadvance.php'; + require $path . '/jbmodel.element.textarea.php'; + require $path . '/jbmodel.favorite.php'; + require $path . '/jbmodel.filter.php'; + require $path . '/jbmodel.item.php'; + require $path . '/jbmodel.app.php'; + require $path . '/jbmodel.category.php'; + require $path . '/jbmodel.order.php'; + require $path . '/jbmodel.related.php'; + require $path . '/jbmodel.searchindex.php'; + require $path . '/jbmodel.values.php'; + require $path . '/jbmodel.sku.php'; + } + + /** + * Load lang files + */ + private function _initLanguages() + { + $lang = JFactory::getLanguage(); + $lang->load('com_zoo'); + $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); + $lang->load('com_zoo', JPATH_ADMINISTRATOR); + } + + /** + * Load others libraries + */ + private function _initFilterElements() + { + jimport('joomla.html.parameter.element'); + + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/render/filter'; + require $path . '/element.php'; + require $path . '/element.author.php'; + require $path . '/element.author.checkbox.php'; + require $path . '/element.author.radio.php'; + require $path . '/element.author.select.php'; + require $path . '/element.author.select.chosen.php'; + require $path . '/element.author.text.php'; + require $path . '/element.category.php'; + require $path . '/element.category.chosen.php'; + require $path . '/element.checkbox.php'; + require $path . '/element.country.php'; + require $path . '/element.country.checkbox.php'; + require $path . '/element.country.radio.php'; + require $path . '/element.country.select.php'; + require $path . '/element.country.select.chosen.php'; + require $path . '/element.date.php'; + require $path . '/element.date.range.php'; + require $path . '/element.frontpage.php'; + require $path . '/element.frontpage.jqueryui.php'; + require $path . '/element.hidden.php'; + require $path . '/element.imageexists.php'; + require $path . '/element.imageexists.jqueryui.php'; + require $path . '/element.jbselectcascade.php'; + require $path . '/element.jqueryui.php'; + require $path . '/element.name.php'; + require $path . '/element.name.checkbox.php'; + require $path . '/element.name.radio.php'; + require $path . '/element.name.select.php'; + require $path . '/element.name.select.chosen.php'; + require $path . '/element.radio.php'; + require $path . '/element.rating.php'; + require $path . '/element.rating.ranges.php'; + require $path . '/element.rating.slider.php'; + require $path . '/element.select.php'; + require $path . '/element.select.chosen.php'; + require $path . '/element.slider.php'; + require $path . '/element.tag.php'; + require $path . '/element.tag.checkbox.php'; + require $path . '/element.tag.radio.php'; + require $path . '/element.tag.select.php'; + require $path . '/element.tag.select.chosen.php'; + require $path . '/element.text.php'; + require $path . '/element.text.range.php'; + } + + /** + * Register and connect events + */ + private function _initEvents() + { + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/events'; + require $path . '/jbevent.php'; + require $path . '/jbevent.application.php'; + require $path . '/jbevent.basket.php'; + require $path . '/jbevent.category.php'; + require $path . '/jbevent.comment.php'; + require $path . '/jbevent.element.php'; + require $path . '/jbevent.item.php'; + require $path . '/jbevent.jbzoo.php'; + require $path . '/jbevent.layout.php'; + require $path . '/jbevent.submission.php'; + require $path . '/jbevent.tag.php'; + require $path . '/jbevent.type.php'; + require $path . '/jbevent.payment.php'; + + $event = $this->app->event; + $dispatcher = $event->dispatcher; + + $event->register('JBEventApplication'); + $dispatcher->connect('application:init', array('JBEventApplication', 'init')); + $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); + $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); + $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); + $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); + $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); + $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); + $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); + $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); + + $event->register('JBEventCategory'); + $dispatcher->connect('category:init', array('JBEventCategory', 'init')); + $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); + $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); + $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); + + $event->register('JBEventItem'); + $dispatcher->connect('item:init', array('JBEventItem', 'init')); + $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); + $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); + $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); + $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); + $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); + $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); + $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); + $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); + $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); + + $event->register('JBEventComment'); + $dispatcher->connect('comment:init', array('JBEventComment', 'init')); + $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); + $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); + $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); + + $event->register('JBEventSubmission'); + $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); + $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); + $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); + $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); + + $event->register('JBEventElement'); + $dispatcher->connect('element:download', array('JBEventElement', 'download')); + $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); + $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); + $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); + $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); + $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); + $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); + $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); + $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); + $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); + + $event->register('JBEventLayout'); + $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); + + $event->register('JBEventTag'); + $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); + $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); + + $event->register('JBEventType'); + $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); + $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); + $dispatcher->connect('type:copied', array('JBEventType', 'copied')); + $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); + $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); + $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); + $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); + + $event->register('JBEventJBZoo'); + $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); + $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); + + $event->register('JBEventBasket'); + $dispatcher->connect('basket:beforesave', array('JBEventBasket', 'beforeSave')); + $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); + + $event->register('JBEventPayment'); + $dispatcher->connect('payment:callback', array('JBEventPayment', 'callback')); + } + + /** + * Init assets for admin path + */ + private function _initAssets() + { + if (!$this->app->jbenv->isSite()) { + $this->app->jbassets->admin(); + $this->_initAdminMenu(); + } + } + + /** + * Init Admin menu + */ + private function _initAdminMenu() + { + if (defined('JBZOO_CONFIG_ADMINMENU') && !JBZOO_CONFIG_ADMINMENU) { + return false; + } + + $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); + + $appList = JBModelApp::model()->getSimpleList(); + $findJBZooApp = false; + $dispatched = false; + foreach ($appList as $app) { + if ($app->application_group == JBZOO_APP_GROUP) { + $findJBZooApp = true; + if ($curApp == $app->id) { + $dispatched = true; + } + } + } + + if (!$findJBZooApp) { + return false; + } + + $router = $this->app->jbrouter; + + $menuItems = array(); + + if (!empty($appList)) { + foreach ($appList as $app) { + + $menuItems['app-' . $app->alias] = array( + 'name' => $app->name, + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), + 'children' => array( + 'add-item' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')) + ), + 'sep-1' => 'divider', + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')) + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')) + ), + 'frontpage' => array( + 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')) + ), + 'comments' => array( + 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')) + ), + 'sep-1' => 'divider', + 'config' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')) + ), + ) + ); + } + } + + $menuItems['sep-1'] = 'divider'; + + $menuItems['item-config'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), + 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), + ); + + $types = $this->app->jbtype->getSimpleList(); + if (!empty($types)) { + $children = array(); + foreach ($types as $alias => $type) { + $children['type-' . $alias] = array( + 'name' => $type, + 'url' => $router->admin(array( + 'controller' => 'manager', + 'group' => 'jbuniversal', + 'task' => 'editelements', + 'cid' => array('0' => $alias) + )) + ); + } + + $menuItems['item-config']['children'] = $children; + } + + if ($dispatched) { + $menuItems['sep-2'] = 'divider'; + + $menuItems['jbzoo-admin'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), + 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), + 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), + 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), + ), + ), + ); + + $menuItems['jbzoo-import'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDART'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), + ), + ), + ); + + $menuItems['jbzoo-export'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), + ), + 'types' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), + ), + 'yandexyml' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDART'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), + ), + 'zoobackup' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), + ), + ), + ); + + $menuItems['sep-3'] = 'divider'; + + $menuItems['jbzoo-info'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_INFO'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), + ), + 'server' => array( + 'name' => 'Get Last JBZoo', + 'url' => 'https://github.com/JBZoo/JBZoo', + 'target' => '_blank', + ), + ) + ); + } + + $menuItems['jbzoo-support'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), + 'url' => 'http://forum.jbzoo.com/', + 'target' => '_blank', + ); + + $this->app->jbassets->addVar('JBAdminItems', array( + 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), + 'items' => $menuItems, + )); + } + + /** + * Init config file + */ + private function _initConfig() + { + if ($configFile = $this->app->path->path('jbapp:config/config.php')) { + require $configFile; + } + + $fn = base64_decode('b' . 'Glj' . 'ZW5j' . 'ZS4' . '='); + $fp = base64_decode('amJh' . 'cHA6' . 'Y29u' . 'Zmln'); + $f = $this->app->path->path($fp) . '/' . $fn . self::getDomain(true) . '.' . base64_decode('cGhw'); + if (JFile::exists($f)) { + require($f); + } + } + + /** + * Get group name + * @return string + */ + private function _getGroup() + { + return $this->_group; + } + + /** + * Register new path in system + * @param string $path + * @param string $pathName + * @return mixed + */ + private function _addPath($path, $pathName) + { + if ($fullPath = $this->app->path->path($path)) { + return $this->app->path->register($fullPath, $pathName); + } + + return null; + } + + /** + * Get domain name + * @param bool $isAny + * @return string + */ + static function getDomain($isAny = false) + { + $domain = ''; + if (function_exists('apache_request_headers')) { + $headers = apache_request_headers(); + $domain = isset($headers['Host']) ? $headers['Host'] : ''; + } + + if ($isAny && !$domain) { + $domain = $_SERVER['HTTP_HOST']; + } + + $domain = preg_replace('#^www\.#', '', $domain); + list($domain) = explode(':', $domain); + + return $domain; + } + + /** + * Get hash + * @param $string + * @return string + */ + static public function getHash($string) + { + return ''; + } +} diff --git a/patches/2.1.4/media/zoo/applications/jbuniversal/framework/jbzoo.php b/patches/2.1.4/media/zoo/applications/jbuniversal/framework/jbzoo.php index aff4189..b91c1e3 100644 --- a/patches/2.1.4/media/zoo/applications/jbuniversal/framework/jbzoo.php +++ b/patches/2.1.4/media/zoo/applications/jbuniversal/framework/jbzoo.php @@ -1 +1,613 @@ - */ // no direct access defined('_JEXEC') or die('Restricted access'); !defined('JBZOO_APP_GROUP') && define('JBZOO_APP_GROUP', 'jbuniversal'); !defined('DIRECTORY_SEPERATOR') && define('DIRECTORY_SEPERATOR', '/'); !defined('DS') && define('DS', DIRECTORY_SEPARATOR); /** * Class JBZoo */ class JBZoo { /** * @var Application */ public $app = null; /** * App group name * @var string */ private $_group = JBZOO_APP_GROUP; /** * Init JBZoo application * @static * @return JBZoo */ public static function init() { static $jbzoo; if (!isset($jbzoo)) { $jbzoo = new self(); } return $jbzoo; } /** * Initialization JBZoo App */ private function __construct() { $this->app = App::getInstance('zoo'); $this->_initPaths(); $this->_initConfig(); $this->_initModels(); $this->_initLanguages(); $this->_initFilterElements(); $this->_initEvents(); $this->_initAssets(); } /** * Add directory path */ private function _initPaths() { $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); $this->_addPath('jbapp:framework', 'jbzoo'); $this->_addPath('jbapp:assets', 'jbassets'); $this->_addPath('jbassets:zoo', 'assets'); $this->_addPath('jbapp:config', 'jbconfig'); $this->_addPath('jbzoo:elements', 'jbelements'); $this->_addPath('jbapp:types', 'jbtypes'); $this->_addPath('jbzoo:helpers', 'helpers'); $this->_addPath('jbzoo:helpers-std', 'helpers'); $this->_addPath('jbzoo:tables', 'tables'); $this->_addPath('jbzoo:classes-std', 'classes'); $this->_addPath('jbzoo:render', 'renderer'); $this->_addPath('jbzoo:views', 'jbviews'); $this->_addPath('jbapp:config', 'jbxml'); $this->_addPath('jbviews:', 'partials'); $this->_addPath('jbapp:joomla/elements', 'fields'); $this->_addPath('jbapp:templates', 'jbtmpl'); $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); if ($this->app->jbenv->isSite()) { $this->_addPath('jbzoo:controllers', 'controllers'); } require $this->app->path->path('jbzoo:controllers/base.php'); JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); } /** * Include models classes */ private function _initModels() { // defines define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); // query builder $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/classes'; require $path . '/database/JBDatabaseQuery.php'; require $path . '/database/JBDatabaseQueryElement.php'; // models $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/models'; require $path . '/jbmodel.php'; require $path . '/jbmodel.config.php'; require $path . '/jbmodel.element.php'; require $path . '/jbmodel.autocomplete.php'; require $path . '/jbmodel.element.country.php'; require $path . '/jbmodel.element.itemdate.php'; require $path . '/jbmodel.element.itemauthor.php'; require $path . '/jbmodel.element.itemcategory.php'; require $path . '/jbmodel.element.itemcreated.php'; require $path . '/jbmodel.element.itemfrontpage.php'; require $path . '/jbmodel.element.itemmodified.php'; require $path . '/jbmodel.element.itemname.php'; require $path . '/jbmodel.element.itempublish_down.php'; require $path . '/jbmodel.element.itempublish_up.php'; require $path . '/jbmodel.element.itemtag.php'; require $path . '/jbmodel.element.jbimage.php'; require $path . '/jbmodel.element.jbselectcascade.php'; require $path . '/jbmodel.element.range.php'; require $path . '/jbmodel.element.rating.php'; require $path . '/jbmodel.element.jbpriceadvance.php'; require $path . '/jbmodel.element.jbcomments.php'; require $path . '/jbmodel.element.textarea.php'; require $path . '/jbmodel.element.date.php'; require $path . '/jbmodel.favorite.php'; require $path . '/jbmodel.filter.php'; require $path . '/jbmodel.item.php'; require $path . '/jbmodel.app.php'; require $path . '/jbmodel.category.php'; require $path . '/jbmodel.order.php'; require $path . '/jbmodel.related.php'; require $path . '/jbmodel.searchindex.php'; require $path . '/jbmodel.values.php'; require $path . '/jbmodel.sku.php'; } /** * Load lang files */ private function _initLanguages() { $lang = JFactory::getLanguage(); $lang->load('com_zoo'); $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); $lang->load('com_zoo', JPATH_ADMINISTRATOR); } /** * Load others libraries */ private function _initFilterElements() { jimport('joomla.html.parameter.element'); $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/render/filter'; require $path . '/element.php'; require $path . '/element.author.php'; require $path . '/element.author.checkbox.php'; require $path . '/element.author.radio.php'; require $path . '/element.author.select.php'; require $path . '/element.author.select.chosen.php'; require $path . '/element.author.text.php'; require $path . '/element.category.php'; require $path . '/element.category.chosen.php'; require $path . '/element.checkbox.php'; require $path . '/element.country.php'; require $path . '/element.country.checkbox.php'; require $path . '/element.country.radio.php'; require $path . '/element.country.select.php'; require $path . '/element.country.select.chosen.php'; require $path . '/element.date.php'; require $path . '/element.date.range.php'; require $path . '/element.frontpage.php'; require $path . '/element.frontpage.jqueryui.php'; require $path . '/element.hidden.php'; require $path . '/element.imageexists.php'; require $path . '/element.imageexists.jqueryui.php'; require $path . '/element.jbselectcascade.php'; require $path . '/element.jqueryui.php'; require $path . '/element.name.php'; require $path . '/element.name.checkbox.php'; require $path . '/element.name.radio.php'; require $path . '/element.name.select.php'; require $path . '/element.name.select.chosen.php'; require $path . '/element.radio.php'; require $path . '/element.rating.php'; require $path . '/element.rating.ranges.php'; require $path . '/element.rating.slider.php'; require $path . '/element.select.php'; require $path . '/element.select.chosen.php'; require $path . '/element.slider.php'; require $path . '/element.tag.php'; require $path . '/element.tag.checkbox.php'; require $path . '/element.tag.radio.php'; require $path . '/element.tag.select.php'; require $path . '/element.tag.select.chosen.php'; require $path . '/element.text.php'; require $path . '/element.text.range.php'; } /** * Register and connect events */ private function _initEvents() { $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/events'; require $path . '/jsystem.php'; require $path . '/jbevent.php'; require $path . '/jbevent.application.php'; require $path . '/jbevent.basket.php'; require $path . '/jbevent.category.php'; require $path . '/jbevent.comment.php'; require $path . '/jbevent.element.php'; require $path . '/jbevent.item.php'; require $path . '/jbevent.jbzoo.php'; require $path . '/jbevent.layout.php'; require $path . '/jbevent.submission.php'; require $path . '/jbevent.tag.php'; require $path . '/jbevent.type.php'; require $path . '/jbevent.payment.php'; $event = $this->app->event; $dispatcher = $event->dispatcher; $event->register('JBEventApplication'); $dispatcher->connect('application:init', array('JBEventApplication', 'init')); $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); $event->register('JBEventCategory'); $dispatcher->connect('category:init', array('JBEventCategory', 'init')); $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); $event->register('JBEventItem'); $dispatcher->connect('item:init', array('JBEventItem', 'init')); $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); $event->register('JBEventComment'); $dispatcher->connect('comment:init', array('JBEventComment', 'init')); $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); $event->register('JBEventSubmission'); $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); $event->register('JBEventElement'); $dispatcher->connect('element:download', array('JBEventElement', 'download')); $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); $event->register('JBEventLayout'); $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); $event->register('JBEventTag'); $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); $event->register('JBEventType'); $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); $dispatcher->connect('type:copied', array('JBEventType', 'copied')); $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); $event->register('JBEventJBZoo'); $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); $event->register('JBEventBasket'); $dispatcher->connect('basket:beforesave', array('JBEventBasket', 'beforeSave')); $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); $event->register('JBEventPayment'); $dispatcher->connect('payment:callback', array('JBEventPayment', 'callback')); } /** * Init assets for admin path */ private function _initAssets() { if (!$this->app->jbenv->isSite()) { $this->app->jbassets->admin(); $this->_initAdminMenu(); } } /** * Init Admin menu */ private function _initAdminMenu() { $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); if (!$config->get('adminmenu_show', 1)) { return false; } $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); $appList = JBModelApp::model()->getSimpleList(); $findJBZooApp = false; $dispatched = false; foreach ($appList as $app) { if ($app->application_group == JBZOO_APP_GROUP) { $findJBZooApp = true; if ($curApp == $app->id) { $dispatched = true; } } } if (!$findJBZooApp) { return false; } $router = $this->app->jbrouter; $menuItems = array(); if (!empty($appList)) { foreach ($appList as $app) { $menuItems['app-' . $app->alias] = array( 'name' => $app->name, 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), 'children' => array( 'add-item' => array( 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')) ), 'sep-1' => 'divider', 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')) ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')) ), 'frontpage' => array( 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')) ), 'comments' => array( 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')) ), 'sep-1' => 'divider', 'config' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')) ), ) ); } } $menuItems['sep-1'] = 'divider'; $menuItems['item-config'] = array( 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), ); $types = $this->app->jbtype->getSimpleList(); if (!empty($types)) { $children = array(); foreach ($types as $alias => $type) { $children['type-' . $alias] = array( 'name' => $type, 'url' => $router->admin(array( 'controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => array('0' => $alias) )) ); } $menuItems['item-config']['children'] = $children; } if ($dispatched) { $menuItems['sep-2'] = 'divider'; $menuItems['jbzoo-admin'] = array( 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), ), ), ); $menuItems['jbzoo-import'] = array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDART'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), ), ), ); $menuItems['jbzoo-export'] = array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), ), 'types' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), ), 'yandexyml' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDART'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), ), 'zoobackup' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), ), ), ); $menuItems['sep-3'] = 'divider'; $menuItems['jbzoo-info'] = array( 'name' => JText::_('JBZOO_ADMINMENU_INFO'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), ), 'server' => array( 'name' => 'Get Last JBZoo', 'url' => 'https://github.com/JBZoo/JBZoo', 'target' => '_blank', ), ) ); } $menuItems['jbzoo-support'] = array( 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), 'url' => 'http://forum.jbzoo.com/', 'target' => '_blank', ); $this->app->jbassets->addVar('JBAdminItems', array( 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), 'items' => $menuItems, )); } /** * Init config file */ private function _initConfig() { if ($configFile = $this->app->path->path('jbapp:config/config.php')) { require $configFile; } $fn = base64_decode('b' . 'Glj' . 'ZW5j' . 'ZS4' . '='); $fp = base64_decode('amJh' . 'cHA6' . 'Y29u' . 'Zmln'); $f = $this->app->path->path($fp) . '/' . $fn . self::getDomain(true) . '.' . base64_decode('cGhw'); if (JFile::exists($f)) { require($f); } } /** * Get group name * @return string */ private function _getGroup() { return $this->_group; } /** * Register new path in system * @param string $path * @param string $pathName * @return mixed */ private function _addPath($path, $pathName) { if ($fullPath = $this->app->path->path($path)) { return $this->app->path->register($fullPath, $pathName); } return null; } /** * Get domain name * @param bool $isAny * @return string */ static function getDomain($isAny = false) { $domain = ''; if (function_exists('apache_request_headers')) { $headers = apache_request_headers(); $domain = isset($headers['Host']) ? $headers['Host'] : ''; } if ($isAny && !$domain) { $domain = $_SERVER['HTTP_HOST']; } $domain = preg_replace('#^www\.#', '', $domain); list($domain) = explode(':', $domain); return $domain; } /** * Get hash * @param $string * @return string */ static public function getHash($string) { return ''; } } \ No newline at end of file + + */ + +// no direct access +defined('_JEXEC') or die('Restricted access'); + + +!defined('JBZOO_APP_GROUP') && define('JBZOO_APP_GROUP', 'jbuniversal'); +!defined('DIRECTORY_SEPERATOR') && define('DIRECTORY_SEPERATOR', '/'); +!defined('DS') && define('DS', DIRECTORY_SEPARATOR); + +/** + * Class JBZoo + */ +class JBZoo +{ + /** + * @var Application + */ + public $app = null; + + /** + * App group name + * @var string + */ + private $_group = JBZOO_APP_GROUP; + + /** + * Init JBZoo application + * @static + * @return JBZoo + */ + public static function init() + { + static $jbzoo; + + if (!isset($jbzoo)) { + $jbzoo = new self(); + } + + return $jbzoo; + } + + /** + * Initialization JBZoo App + */ + private function __construct() + { + $this->app = App::getInstance('zoo'); + + $this->_initPaths(); + $this->_initConfig(); + $this->_initModels(); + $this->_initLanguages(); + $this->_initFilterElements(); + $this->_initEvents(); + $this->_initAssets(); + } + + /** + * Add directory path + */ + private function _initPaths() + { + $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); + $this->_addPath('jbapp:framework', 'jbzoo'); + $this->_addPath('jbapp:assets', 'jbassets'); + $this->_addPath('jbassets:zoo', 'assets'); + $this->_addPath('jbapp:config', 'jbconfig'); + $this->_addPath('jbzoo:elements', 'jbelements'); + $this->_addPath('jbapp:types', 'jbtypes'); + $this->_addPath('jbzoo:helpers', 'helpers'); + $this->_addPath('jbzoo:helpers-std', 'helpers'); + $this->_addPath('jbzoo:tables', 'tables'); + $this->_addPath('jbzoo:classes-std', 'classes'); + $this->_addPath('jbzoo:render', 'renderer'); + $this->_addPath('jbzoo:views', 'jbviews'); + $this->_addPath('jbapp:config', 'jbxml'); + $this->_addPath('jbviews:', 'partials'); + $this->_addPath('jbapp:joomla/elements', 'fields'); + $this->_addPath('jbapp:templates', 'jbtmpl'); + $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); + $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); + $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); + $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); + $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); + $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); + + if ($this->app->jbenv->isSite()) { + $this->_addPath('jbzoo:controllers', 'controllers'); + } + + require $this->app->path->path('jbzoo:controllers/base.php'); + + JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); + } + + /** + * Include models classes + */ + private function _initModels() + { + // defines + define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); + define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); + define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); + + // query builder + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/classes'; + require $path . '/database/JBDatabaseQuery.php'; + require $path . '/database/JBDatabaseQueryElement.php'; + + // models + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/models'; + require $path . '/jbmodel.php'; + require $path . '/jbmodel.config.php'; + require $path . '/jbmodel.element.php'; + require $path . '/jbmodel.autocomplete.php'; + require $path . '/jbmodel.element.country.php'; + require $path . '/jbmodel.element.itemdate.php'; + require $path . '/jbmodel.element.itemauthor.php'; + require $path . '/jbmodel.element.itemcategory.php'; + require $path . '/jbmodel.element.itemcreated.php'; + require $path . '/jbmodel.element.itemfrontpage.php'; + require $path . '/jbmodel.element.itemmodified.php'; + require $path . '/jbmodel.element.itemname.php'; + require $path . '/jbmodel.element.itempublish_down.php'; + require $path . '/jbmodel.element.itempublish_up.php'; + require $path . '/jbmodel.element.itemtag.php'; + require $path . '/jbmodel.element.jbimage.php'; + require $path . '/jbmodel.element.jbselectcascade.php'; + require $path . '/jbmodel.element.range.php'; + require $path . '/jbmodel.element.rating.php'; + require $path . '/jbmodel.element.jbpriceadvance.php'; + require $path . '/jbmodel.element.jbcomments.php'; + require $path . '/jbmodel.element.textarea.php'; + require $path . '/jbmodel.element.date.php'; + require $path . '/jbmodel.favorite.php'; + require $path . '/jbmodel.filter.php'; + require $path . '/jbmodel.item.php'; + require $path . '/jbmodel.app.php'; + require $path . '/jbmodel.category.php'; + require $path . '/jbmodel.order.php'; + require $path . '/jbmodel.related.php'; + require $path . '/jbmodel.searchindex.php'; + require $path . '/jbmodel.values.php'; + require $path . '/jbmodel.sku.php'; + } + + /** + * Load lang files + */ + private function _initLanguages() + { + $lang = JFactory::getLanguage(); + $lang->load('com_zoo'); + $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); + $lang->load('com_zoo', JPATH_ADMINISTRATOR); + } + + /** + * Load others libraries + */ + private function _initFilterElements() + { + jimport('joomla.html.parameter.element'); + + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/render/filter'; + require $path . '/element.php'; + require $path . '/element.author.php'; + require $path . '/element.author.checkbox.php'; + require $path . '/element.author.radio.php'; + require $path . '/element.author.select.php'; + require $path . '/element.author.select.chosen.php'; + require $path . '/element.author.text.php'; + require $path . '/element.category.php'; + require $path . '/element.category.chosen.php'; + require $path . '/element.checkbox.php'; + require $path . '/element.country.php'; + require $path . '/element.country.checkbox.php'; + require $path . '/element.country.radio.php'; + require $path . '/element.country.select.php'; + require $path . '/element.country.select.chosen.php'; + require $path . '/element.date.php'; + require $path . '/element.date.range.php'; + require $path . '/element.frontpage.php'; + require $path . '/element.frontpage.jqueryui.php'; + require $path . '/element.hidden.php'; + require $path . '/element.imageexists.php'; + require $path . '/element.imageexists.jqueryui.php'; + require $path . '/element.jbselectcascade.php'; + require $path . '/element.jqueryui.php'; + require $path . '/element.name.php'; + require $path . '/element.name.checkbox.php'; + require $path . '/element.name.radio.php'; + require $path . '/element.name.select.php'; + require $path . '/element.name.select.chosen.php'; + require $path . '/element.radio.php'; + require $path . '/element.rating.php'; + require $path . '/element.rating.ranges.php'; + require $path . '/element.rating.slider.php'; + require $path . '/element.select.php'; + require $path . '/element.select.chosen.php'; + require $path . '/element.slider.php'; + require $path . '/element.tag.php'; + require $path . '/element.tag.checkbox.php'; + require $path . '/element.tag.radio.php'; + require $path . '/element.tag.select.php'; + require $path . '/element.tag.select.chosen.php'; + require $path . '/element.text.php'; + require $path . '/element.text.range.php'; + } + + /** + * Register and connect events + */ + private function _initEvents() + { + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/events'; + require $path . '/jsystem.php'; + require $path . '/jbevent.php'; + require $path . '/jbevent.application.php'; + require $path . '/jbevent.basket.php'; + require $path . '/jbevent.category.php'; + require $path . '/jbevent.comment.php'; + require $path . '/jbevent.element.php'; + require $path . '/jbevent.item.php'; + require $path . '/jbevent.jbzoo.php'; + require $path . '/jbevent.layout.php'; + require $path . '/jbevent.submission.php'; + require $path . '/jbevent.tag.php'; + require $path . '/jbevent.type.php'; + require $path . '/jbevent.payment.php'; + + $event = $this->app->event; + $dispatcher = $event->dispatcher; + + $event->register('JBEventApplication'); + $dispatcher->connect('application:init', array('JBEventApplication', 'init')); + $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); + $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); + $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); + $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); + $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); + $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); + $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); + $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); + + $event->register('JBEventCategory'); + $dispatcher->connect('category:init', array('JBEventCategory', 'init')); + $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); + $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); + $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); + + $event->register('JBEventItem'); + $dispatcher->connect('item:init', array('JBEventItem', 'init')); + $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); + $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); + $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); + $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); + $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); + $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); + $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); + $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); + $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); + + $event->register('JBEventComment'); + $dispatcher->connect('comment:init', array('JBEventComment', 'init')); + $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); + $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); + $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); + + $event->register('JBEventSubmission'); + $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); + $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); + $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); + $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); + + $event->register('JBEventElement'); + $dispatcher->connect('element:download', array('JBEventElement', 'download')); + $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); + $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); + $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); + $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); + $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); + $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); + $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); + $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); + $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); + + $event->register('JBEventLayout'); + $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); + + $event->register('JBEventTag'); + $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); + $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); + + $event->register('JBEventType'); + $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); + $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); + $dispatcher->connect('type:copied', array('JBEventType', 'copied')); + $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); + $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); + $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); + $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); + + $event->register('JBEventJBZoo'); + $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); + $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); + + $event->register('JBEventBasket'); + $dispatcher->connect('basket:beforesave', array('JBEventBasket', 'beforeSave')); + $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); + + $event->register('JBEventPayment'); + $dispatcher->connect('payment:callback', array('JBEventPayment', 'callback')); + } + + /** + * Init assets for admin path + */ + private function _initAssets() + { + if (!$this->app->jbenv->isSite()) { + $this->app->jbassets->admin(); + $this->_initAdminMenu(); + } + } + + /** + * Init Admin menu + */ + private function _initAdminMenu() + { + $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); + if (!$config->get('adminmenu_show', 1)) { + return false; + } + + $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); + + $appList = JBModelApp::model()->getSimpleList(); + $findJBZooApp = false; + $dispatched = false; + foreach ($appList as $app) { + if ($app->application_group == JBZOO_APP_GROUP) { + $findJBZooApp = true; + if ($curApp == $app->id) { + $dispatched = true; + } + } + } + + if (!$findJBZooApp) { + return false; + } + + $router = $this->app->jbrouter; + + $menuItems = array(); + + if (!empty($appList)) { + foreach ($appList as $app) { + + $menuItems['app-' . $app->alias] = array( + 'name' => $app->name, + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), + 'children' => array( + 'add-item' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')) + ), + 'sep-1' => 'divider', + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')) + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')) + ), + 'frontpage' => array( + 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')) + ), + 'comments' => array( + 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')) + ), + 'sep-1' => 'divider', + 'config' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')) + ), + ) + ); + } + } + + $menuItems['sep-1'] = 'divider'; + + $menuItems['item-config'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), + 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), + ); + + $types = $this->app->jbtype->getSimpleList(); + if (!empty($types)) { + $children = array(); + foreach ($types as $alias => $type) { + $children['type-' . $alias] = array( + 'name' => $type, + 'url' => $router->admin(array( + 'controller' => 'manager', + 'group' => 'jbuniversal', + 'task' => 'editelements', + 'cid' => array('0' => $alias) + )) + ); + } + + $menuItems['item-config']['children'] = $children; + } + + if ($dispatched) { + $menuItems['sep-2'] = 'divider'; + + $menuItems['jbzoo-admin'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), + 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), + 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), + 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), + ), + ), + ); + + $menuItems['jbzoo-import'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDART'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), + ), + ), + ); + + $menuItems['jbzoo-export'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), + ), + 'types' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), + ), + 'yandexyml' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDART'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), + ), + 'zoobackup' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), + ), + ), + ); + + $menuItems['sep-3'] = 'divider'; + + $menuItems['jbzoo-info'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_INFO'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), + ), + 'server' => array( + 'name' => 'Get Last JBZoo', + 'url' => 'https://github.com/JBZoo/JBZoo', + 'target' => '_blank', + ), + ) + ); + } + + $menuItems['jbzoo-support'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), + 'url' => 'http://forum.jbzoo.com/', + 'target' => '_blank', + ); + + $this->app->jbassets->addVar('JBAdminItems', array( + 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), + 'items' => $menuItems, + )); + } + + /** + * Init config file + */ + private function _initConfig() + { + if ($configFile = $this->app->path->path('jbapp:config/config.php')) { + require $configFile; + } + + $fn = base64_decode('b' . 'Glj' . 'ZW5j' . 'ZS4' . '='); + $fp = base64_decode('amJh' . 'cHA6' . 'Y29u' . 'Zmln'); + $f = $this->app->path->path($fp) . '/' . $fn . self::getDomain(true) . '.' . base64_decode('cGhw'); + if (JFile::exists($f)) { + require($f); + } + } + + /** + * Get group name + * @return string + */ + private function _getGroup() + { + return $this->_group; + } + + /** + * Register new path in system + * @param string $path + * @param string $pathName + * @return mixed + */ + private function _addPath($path, $pathName) + { + if ($fullPath = $this->app->path->path($path)) { + return $this->app->path->register($fullPath, $pathName); + } + + return null; + } + + /** + * Get domain name + * @param bool $isAny + * @return string + */ + static function getDomain($isAny = false) + { + $domain = ''; + if (function_exists('apache_request_headers')) { + $headers = apache_request_headers(); + $domain = isset($headers['Host']) ? $headers['Host'] : ''; + } + + if ($isAny && !$domain) { + $domain = $_SERVER['HTTP_HOST']; + } + + $domain = preg_replace('#^www\.#', '', $domain); + list($domain) = explode(':', $domain); + + return $domain; + } + + /** + * Get hash + * @param $string + * @return string + */ + static public function getHash($string) + { + return ''; + } +} diff --git a/patches/2.1.5/media/zoo/applications/jbuniversal/framework/jbzoo.php b/patches/2.1.5/media/zoo/applications/jbuniversal/framework/jbzoo.php index 9ba3f06..0e0930f 100644 --- a/patches/2.1.5/media/zoo/applications/jbuniversal/framework/jbzoo.php +++ b/patches/2.1.5/media/zoo/applications/jbuniversal/framework/jbzoo.php @@ -1 +1,609 @@ - */ // no direct access defined('_JEXEC') or die('Restricted access'); !defined('JBZOO_APP_GROUP') && define('JBZOO_APP_GROUP', 'jbuniversal'); !defined('DIRECTORY_SEPERATOR') && define('DIRECTORY_SEPERATOR', '/'); !defined('DS') && define('DS', DIRECTORY_SEPARATOR); /** * Class JBZoo */ class JBZoo { /** * @var Application */ public $app = null; /** * App group name * @var string */ private $_group = JBZOO_APP_GROUP; /** * Init JBZoo application * @static * @return JBZoo */ public static function init() { static $jbzoo; if (!isset($jbzoo)) { $jbzoo = new self(); } return $jbzoo; } /** * Initialization JBZoo App */ private function __construct() { $this->app = App::getInstance('zoo'); $this->_initPaths(); $this->_initConfig(); $this->_initModels(); $this->_initLanguages(); $this->_initFilterElements(); $this->_initEvents(); $this->_initAssets(); } /** * Add directory path */ private function _initPaths() { $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); $this->_addPath('jbapp:framework', 'jbzoo'); $this->_addPath('jbapp:assets', 'jbassets'); $this->_addPath('jbassets:zoo', 'assets'); $this->_addPath('jbapp:config', 'jbconfig'); $this->_addPath('jbzoo:elements', 'jbelements'); $this->_addPath('jbapp:types', 'jbtypes'); $this->_addPath('jbzoo:helpers', 'helpers'); $this->_addPath('jbzoo:helpers-std', 'helpers'); $this->_addPath('jbzoo:tables', 'tables'); $this->_addPath('jbzoo:classes-std', 'classes'); $this->_addPath('jbzoo:render', 'renderer'); $this->_addPath('jbzoo:views', 'jbviews'); $this->_addPath('jbapp:config', 'jbxml'); $this->_addPath('jbviews:', 'partials'); $this->_addPath('jbapp:joomla/elements', 'fields'); $this->_addPath('jbapp:templates', 'jbtmpl'); $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); if ($this->app->jbenv->isSite()) { $this->_addPath('jbzoo:controllers', 'controllers'); } require $this->app->path->path('jbzoo:controllers/base.php'); JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); } /** * Include models classes */ private function _initModels() { // defines define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); // query builder $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/classes'; require $path . '/database/JBDatabaseQuery.php'; require $path . '/database/JBDatabaseQueryElement.php'; // models $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/models'; require $path . '/jbmodel.php'; require $path . '/jbmodel.config.php'; require $path . '/jbmodel.element.php'; require $path . '/jbmodel.autocomplete.php'; require $path . '/jbmodel.element.country.php'; require $path . '/jbmodel.element.itemdate.php'; require $path . '/jbmodel.element.itemauthor.php'; require $path . '/jbmodel.element.itemcategory.php'; require $path . '/jbmodel.element.itemcreated.php'; require $path . '/jbmodel.element.itemfrontpage.php'; require $path . '/jbmodel.element.itemmodified.php'; require $path . '/jbmodel.element.itemname.php'; require $path . '/jbmodel.element.itempublish_down.php'; require $path . '/jbmodel.element.itempublish_up.php'; require $path . '/jbmodel.element.itemtag.php'; require $path . '/jbmodel.element.jbimage.php'; require $path . '/jbmodel.element.jbselectcascade.php'; require $path . '/jbmodel.element.range.php'; require $path . '/jbmodel.element.rating.php'; require $path . '/jbmodel.element.jbpriceadvance.php'; require $path . '/jbmodel.element.jbcomments.php'; require $path . '/jbmodel.element.textarea.php'; require $path . '/jbmodel.element.date.php'; require $path . '/jbmodel.favorite.php'; require $path . '/jbmodel.filter.php'; require $path . '/jbmodel.item.php'; require $path . '/jbmodel.app.php'; require $path . '/jbmodel.category.php'; require $path . '/jbmodel.order.php'; require $path . '/jbmodel.related.php'; require $path . '/jbmodel.searchindex.php'; require $path . '/jbmodel.values.php'; require $path . '/jbmodel.sku.php'; } /** * Load lang files */ private function _initLanguages() { $lang = JFactory::getLanguage(); $lang->load('com_zoo'); $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); $lang->load('com_zoo', JPATH_ADMINISTRATOR); } /** * Load others libraries */ private function _initFilterElements() { jimport('joomla.html.parameter.element'); $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/render/filter'; require $path . '/element.php'; require $path . '/element.author.php'; require $path . '/element.author.checkbox.php'; require $path . '/element.author.radio.php'; require $path . '/element.author.select.php'; require $path . '/element.author.select.chosen.php'; require $path . '/element.author.text.php'; require $path . '/element.category.php'; require $path . '/element.category.chosen.php'; require $path . '/element.checkbox.php'; require $path . '/element.country.php'; require $path . '/element.country.checkbox.php'; require $path . '/element.country.radio.php'; require $path . '/element.country.select.php'; require $path . '/element.country.select.chosen.php'; require $path . '/element.date.php'; require $path . '/element.date.range.php'; require $path . '/element.frontpage.php'; require $path . '/element.frontpage.jqueryui.php'; require $path . '/element.hidden.php'; require $path . '/element.imageexists.php'; require $path . '/element.imageexists.jqueryui.php'; require $path . '/element.jbselectcascade.php'; require $path . '/element.jqueryui.php'; require $path . '/element.name.php'; require $path . '/element.name.checkbox.php'; require $path . '/element.name.radio.php'; require $path . '/element.name.select.php'; require $path . '/element.name.select.chosen.php'; require $path . '/element.radio.php'; require $path . '/element.rating.php'; require $path . '/element.rating.ranges.php'; require $path . '/element.rating.slider.php'; require $path . '/element.select.php'; require $path . '/element.select.chosen.php'; require $path . '/element.slider.php'; require $path . '/element.tag.php'; require $path . '/element.tag.checkbox.php'; require $path . '/element.tag.radio.php'; require $path . '/element.tag.select.php'; require $path . '/element.tag.select.chosen.php'; require $path . '/element.text.php'; require $path . '/element.text.range.php'; } /** * Register and connect events */ private function _initEvents() { $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/events'; require $path . '/jsystem.php'; require $path . '/jbevent.php'; require $path . '/jbevent.application.php'; require $path . '/jbevent.basket.php'; require $path . '/jbevent.category.php'; require $path . '/jbevent.comment.php'; require $path . '/jbevent.element.php'; require $path . '/jbevent.item.php'; require $path . '/jbevent.jbzoo.php'; require $path . '/jbevent.layout.php'; require $path . '/jbevent.submission.php'; require $path . '/jbevent.tag.php'; require $path . '/jbevent.type.php'; require $path . '/jbevent.payment.php'; $event = $this->app->event; $dispatcher = $event->dispatcher; $event->register('JBEventApplication'); $dispatcher->connect('application:init', array('JBEventApplication', 'init')); $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); $event->register('JBEventCategory'); $dispatcher->connect('category:init', array('JBEventCategory', 'init')); $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); $event->register('JBEventItem'); $dispatcher->connect('item:init', array('JBEventItem', 'init')); $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); $event->register('JBEventComment'); $dispatcher->connect('comment:init', array('JBEventComment', 'init')); $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); $event->register('JBEventSubmission'); $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); $event->register('JBEventElement'); $dispatcher->connect('element:download', array('JBEventElement', 'download')); $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); $event->register('JBEventLayout'); $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); $event->register('JBEventTag'); $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); $event->register('JBEventType'); $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); $dispatcher->connect('type:copied', array('JBEventType', 'copied')); $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); $event->register('JBEventJBZoo'); $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); $event->register('JBEventBasket'); $dispatcher->connect('basket:beforesave', array('JBEventBasket', 'beforeSave')); $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); $event->register('JBEventPayment'); $dispatcher->connect('payment:callback', array('JBEventPayment', 'callback')); } /** * Init assets for admin path */ private function _initAssets() { if (!$this->app->jbenv->isSite()) { $this->app->jbassets->admin(); $this->_initAdminMenu(); } } /** * Init Admin menu */ private function _initAdminMenu() { $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); if (!$config->get('adminmenu_show', 1)) { return false; } $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); $appList = JBModelApp::model()->getSimpleList(); $findJBZooApp = false; $dispatched = false; foreach ($appList as $app) { if ($app->application_group == JBZOO_APP_GROUP) { $findJBZooApp = true; if ($curApp == $app->id) { $dispatched = true; } } } if (!$findJBZooApp) { return false; } $router = $this->app->jbrouter; $menuItems = array(); if (!empty($appList)) { foreach ($appList as $app) { $menuItems['app-' . $app->alias] = array( 'name' => $app->name, 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), 'children' => array( 'add-item' => array( 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')) ), 'sep-1' => 'divider', 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')) ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')) ), 'frontpage' => array( 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')) ), 'comments' => array( 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')) ), 'sep-1' => 'divider', 'config' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')) ), ) ); } } $menuItems['sep-1'] = 'divider'; $menuItems['item-config'] = array( 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), ); $types = $this->app->jbtype->getSimpleList(); if (!empty($types)) { $children = array(); foreach ($types as $alias => $type) { $children['type-' . $alias] = array( 'name' => $type, 'url' => $router->admin(array( 'controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => array('0' => $alias) )) ); } $menuItems['item-config']['children'] = $children; } if ($dispatched) { $menuItems['sep-2'] = 'divider'; $menuItems['jbzoo-admin'] = array( 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), ), ), ); $menuItems['jbzoo-import'] = array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDART'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), ), ), ); $menuItems['jbzoo-export'] = array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), ), 'types' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), ), 'yandexyml' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDART'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), ), 'zoobackup' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), ), ), ); $menuItems['sep-3'] = 'divider'; $menuItems['jbzoo-info'] = array( 'name' => JText::_('JBZOO_ADMINMENU_INFO'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), ), 'server' => array( 'name' => 'Get Last JBZoo', 'url' => 'https://github.com/JBZoo/JBZoo', 'target' => '_blank', ), ) ); } $menuItems['jbzoo-support'] = array( 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), 'url' => 'http://forum.jbzoo.com/', 'target' => '_blank', ); $this->app->jbassets->addVar('JBAdminItems', array( 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), 'items' => $menuItems, )); } /** * Init config file */ private function _initConfig() { $fn = base64_decode('b' . 'Glj' . 'ZW5j' . 'ZS4' . '='); $fp = base64_decode('amJh' . 'cHA6' . 'Y29u' . 'Zmln'); $f = $this->app->path->path($fp) . '/' . $fn . self::getDomain(true) . '.' . base64_decode('cGhw'); if (JFile::exists($f)) { require($f); } } /** * Get group name * @return string */ private function _getGroup() { return $this->_group; } /** * Register new path in system * @param string $path * @param string $pathName * @return mixed */ private function _addPath($path, $pathName) { if ($fullPath = $this->app->path->path($path)) { return $this->app->path->register($fullPath, $pathName); } return null; } /** * Get domain name * @param bool $isAny * @return string */ static function getDomain($isAny = false) { $domain = ''; if (function_exists('apache_request_headers')) { $headers = apache_request_headers(); $domain = isset($headers['Host']) ? $headers['Host'] : ''; } if ($isAny && !$domain) { $domain = $_SERVER['HTTP_HOST']; } $domain = preg_replace('#^www\.#', '', $domain); list($domain) = explode(':', $domain); return $domain; } /** * Get hash * @param $string * @return string */ static public function getHash($string) { return ''; } } \ No newline at end of file + + */ + +// no direct access +defined('_JEXEC') or die('Restricted access'); + + +!defined('JBZOO_APP_GROUP') && define('JBZOO_APP_GROUP', 'jbuniversal'); +!defined('DIRECTORY_SEPERATOR') && define('DIRECTORY_SEPERATOR', '/'); +!defined('DS') && define('DS', DIRECTORY_SEPARATOR); + +/** + * Class JBZoo + */ +class JBZoo +{ + /** + * @var Application + */ + public $app = null; + + /** + * App group name + * @var string + */ + private $_group = JBZOO_APP_GROUP; + + /** + * Init JBZoo application + * @static + * @return JBZoo + */ + public static function init() + { + static $jbzoo; + + if (!isset($jbzoo)) { + $jbzoo = new self(); + } + + return $jbzoo; + } + + /** + * Initialization JBZoo App + */ + private function __construct() + { + $this->app = App::getInstance('zoo'); + + $this->_initPaths(); + $this->_initConfig(); + $this->_initModels(); + $this->_initLanguages(); + $this->_initFilterElements(); + $this->_initEvents(); + $this->_initAssets(); + } + + /** + * Add directory path + */ + private function _initPaths() + { + $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); + $this->_addPath('jbapp:framework', 'jbzoo'); + $this->_addPath('jbapp:assets', 'jbassets'); + $this->_addPath('jbassets:zoo', 'assets'); + $this->_addPath('jbapp:config', 'jbconfig'); + $this->_addPath('jbzoo:elements', 'jbelements'); + $this->_addPath('jbapp:types', 'jbtypes'); + $this->_addPath('jbzoo:helpers', 'helpers'); + $this->_addPath('jbzoo:helpers-std', 'helpers'); + $this->_addPath('jbzoo:tables', 'tables'); + $this->_addPath('jbzoo:classes-std', 'classes'); + $this->_addPath('jbzoo:render', 'renderer'); + $this->_addPath('jbzoo:views', 'jbviews'); + $this->_addPath('jbapp:config', 'jbxml'); + $this->_addPath('jbviews:', 'partials'); + $this->_addPath('jbapp:joomla/elements', 'fields'); + $this->_addPath('jbapp:templates', 'jbtmpl'); + $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); + $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); + $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); + $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); + $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); + $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); + + if ($this->app->jbenv->isSite()) { + $this->_addPath('jbzoo:controllers', 'controllers'); + } + + require $this->app->path->path('jbzoo:controllers/base.php'); + + JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); + } + + /** + * Include models classes + */ + private function _initModels() + { + // defines + define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); + define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); + define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); + + // query builder + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/classes'; + require $path . '/database/JBDatabaseQuery.php'; + require $path . '/database/JBDatabaseQueryElement.php'; + + // models + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/models'; + require $path . '/jbmodel.php'; + require $path . '/jbmodel.config.php'; + require $path . '/jbmodel.element.php'; + require $path . '/jbmodel.autocomplete.php'; + require $path . '/jbmodel.element.country.php'; + require $path . '/jbmodel.element.itemdate.php'; + require $path . '/jbmodel.element.itemauthor.php'; + require $path . '/jbmodel.element.itemcategory.php'; + require $path . '/jbmodel.element.itemcreated.php'; + require $path . '/jbmodel.element.itemfrontpage.php'; + require $path . '/jbmodel.element.itemmodified.php'; + require $path . '/jbmodel.element.itemname.php'; + require $path . '/jbmodel.element.itempublish_down.php'; + require $path . '/jbmodel.element.itempublish_up.php'; + require $path . '/jbmodel.element.itemtag.php'; + require $path . '/jbmodel.element.jbimage.php'; + require $path . '/jbmodel.element.jbselectcascade.php'; + require $path . '/jbmodel.element.range.php'; + require $path . '/jbmodel.element.rating.php'; + require $path . '/jbmodel.element.jbpriceadvance.php'; + require $path . '/jbmodel.element.jbcomments.php'; + require $path . '/jbmodel.element.textarea.php'; + require $path . '/jbmodel.element.date.php'; + require $path . '/jbmodel.favorite.php'; + require $path . '/jbmodel.filter.php'; + require $path . '/jbmodel.item.php'; + require $path . '/jbmodel.app.php'; + require $path . '/jbmodel.category.php'; + require $path . '/jbmodel.order.php'; + require $path . '/jbmodel.related.php'; + require $path . '/jbmodel.searchindex.php'; + require $path . '/jbmodel.values.php'; + require $path . '/jbmodel.sku.php'; + } + + /** + * Load lang files + */ + private function _initLanguages() + { + $lang = JFactory::getLanguage(); + $lang->load('com_zoo'); + $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); + $lang->load('com_zoo', JPATH_ADMINISTRATOR); + } + + /** + * Load others libraries + */ + private function _initFilterElements() + { + jimport('joomla.html.parameter.element'); + + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/render/filter'; + require $path . '/element.php'; + require $path . '/element.author.php'; + require $path . '/element.author.checkbox.php'; + require $path . '/element.author.radio.php'; + require $path . '/element.author.select.php'; + require $path . '/element.author.select.chosen.php'; + require $path . '/element.author.text.php'; + require $path . '/element.category.php'; + require $path . '/element.category.chosen.php'; + require $path . '/element.checkbox.php'; + require $path . '/element.country.php'; + require $path . '/element.country.checkbox.php'; + require $path . '/element.country.radio.php'; + require $path . '/element.country.select.php'; + require $path . '/element.country.select.chosen.php'; + require $path . '/element.date.php'; + require $path . '/element.date.range.php'; + require $path . '/element.frontpage.php'; + require $path . '/element.frontpage.jqueryui.php'; + require $path . '/element.hidden.php'; + require $path . '/element.imageexists.php'; + require $path . '/element.imageexists.jqueryui.php'; + require $path . '/element.jbselectcascade.php'; + require $path . '/element.jqueryui.php'; + require $path . '/element.name.php'; + require $path . '/element.name.checkbox.php'; + require $path . '/element.name.radio.php'; + require $path . '/element.name.select.php'; + require $path . '/element.name.select.chosen.php'; + require $path . '/element.radio.php'; + require $path . '/element.rating.php'; + require $path . '/element.rating.ranges.php'; + require $path . '/element.rating.slider.php'; + require $path . '/element.select.php'; + require $path . '/element.select.chosen.php'; + require $path . '/element.slider.php'; + require $path . '/element.tag.php'; + require $path . '/element.tag.checkbox.php'; + require $path . '/element.tag.radio.php'; + require $path . '/element.tag.select.php'; + require $path . '/element.tag.select.chosen.php'; + require $path . '/element.text.php'; + require $path . '/element.text.range.php'; + } + + /** + * Register and connect events + */ + private function _initEvents() + { + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/events'; + require $path . '/jsystem.php'; + require $path . '/jbevent.php'; + require $path . '/jbevent.application.php'; + require $path . '/jbevent.basket.php'; + require $path . '/jbevent.category.php'; + require $path . '/jbevent.comment.php'; + require $path . '/jbevent.element.php'; + require $path . '/jbevent.item.php'; + require $path . '/jbevent.jbzoo.php'; + require $path . '/jbevent.layout.php'; + require $path . '/jbevent.submission.php'; + require $path . '/jbevent.tag.php'; + require $path . '/jbevent.type.php'; + require $path . '/jbevent.payment.php'; + + $event = $this->app->event; + $dispatcher = $event->dispatcher; + + $event->register('JBEventApplication'); + $dispatcher->connect('application:init', array('JBEventApplication', 'init')); + $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); + $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); + $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); + $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); + $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); + $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); + $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); + $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); + + $event->register('JBEventCategory'); + $dispatcher->connect('category:init', array('JBEventCategory', 'init')); + $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); + $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); + $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); + + $event->register('JBEventItem'); + $dispatcher->connect('item:init', array('JBEventItem', 'init')); + $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); + $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); + $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); + $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); + $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); + $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); + $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); + $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); + $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); + + $event->register('JBEventComment'); + $dispatcher->connect('comment:init', array('JBEventComment', 'init')); + $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); + $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); + $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); + + $event->register('JBEventSubmission'); + $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); + $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); + $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); + $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); + + $event->register('JBEventElement'); + $dispatcher->connect('element:download', array('JBEventElement', 'download')); + $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); + $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); + $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); + $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); + $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); + $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); + $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); + $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); + $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); + + $event->register('JBEventLayout'); + $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); + + $event->register('JBEventTag'); + $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); + $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); + + $event->register('JBEventType'); + $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); + $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); + $dispatcher->connect('type:copied', array('JBEventType', 'copied')); + $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); + $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); + $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); + $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); + + $event->register('JBEventJBZoo'); + $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); + $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); + + $event->register('JBEventBasket'); + $dispatcher->connect('basket:beforesave', array('JBEventBasket', 'beforeSave')); + $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); + + $event->register('JBEventPayment'); + $dispatcher->connect('payment:callback', array('JBEventPayment', 'callback')); + } + + /** + * Init assets for admin path + */ + private function _initAssets() + { + if (!$this->app->jbenv->isSite()) { + $this->app->jbassets->admin(); + $this->_initAdminMenu(); + } + } + + /** + * Init Admin menu + */ + private function _initAdminMenu() + { + $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); + if (!$config->get('adminmenu_show', 1)) { + return false; + } + + $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); + + $appList = JBModelApp::model()->getSimpleList(); + $findJBZooApp = false; + $dispatched = false; + foreach ($appList as $app) { + if ($app->application_group == JBZOO_APP_GROUP) { + $findJBZooApp = true; + if ($curApp == $app->id) { + $dispatched = true; + } + } + } + + if (!$findJBZooApp) { + return false; + } + + $router = $this->app->jbrouter; + + $menuItems = array(); + + if (!empty($appList)) { + foreach ($appList as $app) { + + $menuItems['app-' . $app->alias] = array( + 'name' => $app->name, + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), + 'children' => array( + 'add-item' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')) + ), + 'sep-1' => 'divider', + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')) + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')) + ), + 'frontpage' => array( + 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')) + ), + 'comments' => array( + 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')) + ), + 'sep-1' => 'divider', + 'config' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')) + ), + ) + ); + } + } + + $menuItems['sep-1'] = 'divider'; + + $menuItems['item-config'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), + 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), + ); + + $types = $this->app->jbtype->getSimpleList(); + if (!empty($types)) { + $children = array(); + foreach ($types as $alias => $type) { + $children['type-' . $alias] = array( + 'name' => $type, + 'url' => $router->admin(array( + 'controller' => 'manager', + 'group' => 'jbuniversal', + 'task' => 'editelements', + 'cid' => array('0' => $alias) + )) + ); + } + + $menuItems['item-config']['children'] = $children; + } + + if ($dispatched) { + $menuItems['sep-2'] = 'divider'; + + $menuItems['jbzoo-admin'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), + 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), + 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), + 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), + ), + ), + ); + + $menuItems['jbzoo-import'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDART'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), + ), + ), + ); + + $menuItems['jbzoo-export'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), + ), + 'types' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), + ), + 'yandexyml' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDART'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), + ), + 'zoobackup' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), + ), + ), + ); + + $menuItems['sep-3'] = 'divider'; + + $menuItems['jbzoo-info'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_INFO'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), + ), + 'server' => array( + 'name' => 'Get Last JBZoo', + 'url' => 'https://github.com/JBZoo/JBZoo', + 'target' => '_blank', + ), + ) + ); + } + + $menuItems['jbzoo-support'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), + 'url' => 'http://forum.jbzoo.com/', + 'target' => '_blank', + ); + + $this->app->jbassets->addVar('JBAdminItems', array( + 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), + 'items' => $menuItems, + )); + } + + /** + * Init config file + */ + private function _initConfig() + { + $fn = base64_decode('b' . 'Glj' . 'ZW5j' . 'ZS4' . '='); + $fp = base64_decode('amJh' . 'cHA6' . 'Y29u' . 'Zmln'); + $f = $this->app->path->path($fp) . '/' . $fn . self::getDomain(true) . '.' . base64_decode('cGhw'); + if (JFile::exists($f)) { + require($f); + } + } + + /** + * Get group name + * @return string + */ + private function _getGroup() + { + return $this->_group; + } + + /** + * Register new path in system + * @param string $path + * @param string $pathName + * @return mixed + */ + private function _addPath($path, $pathName) + { + if ($fullPath = $this->app->path->path($path)) { + return $this->app->path->register($fullPath, $pathName); + } + + return null; + } + + /** + * Get domain name + * @param bool $isAny + * @return string + */ + static function getDomain($isAny = false) + { + $domain = ''; + if (function_exists('apache_request_headers')) { + $headers = apache_request_headers(); + $domain = isset($headers['Host']) ? $headers['Host'] : ''; + } + + if ($isAny && !$domain) { + $domain = $_SERVER['HTTP_HOST']; + } + + $domain = preg_replace('#^www\.#', '', $domain); + list($domain) = explode(':', $domain); + + return $domain; + } + + /** + * Get hash + * @param $string + * @return string + */ + static public function getHash($string) + { + return ''; + } +} diff --git a/patches/2.2.0/media/zoo/applications/jbuniversal/framework/jbzoo.php b/patches/2.2.0/media/zoo/applications/jbuniversal/framework/jbzoo.php index 9ba3f06..0e0930f 100644 --- a/patches/2.2.0/media/zoo/applications/jbuniversal/framework/jbzoo.php +++ b/patches/2.2.0/media/zoo/applications/jbuniversal/framework/jbzoo.php @@ -1 +1,609 @@ - */ // no direct access defined('_JEXEC') or die('Restricted access'); !defined('JBZOO_APP_GROUP') && define('JBZOO_APP_GROUP', 'jbuniversal'); !defined('DIRECTORY_SEPERATOR') && define('DIRECTORY_SEPERATOR', '/'); !defined('DS') && define('DS', DIRECTORY_SEPARATOR); /** * Class JBZoo */ class JBZoo { /** * @var Application */ public $app = null; /** * App group name * @var string */ private $_group = JBZOO_APP_GROUP; /** * Init JBZoo application * @static * @return JBZoo */ public static function init() { static $jbzoo; if (!isset($jbzoo)) { $jbzoo = new self(); } return $jbzoo; } /** * Initialization JBZoo App */ private function __construct() { $this->app = App::getInstance('zoo'); $this->_initPaths(); $this->_initConfig(); $this->_initModels(); $this->_initLanguages(); $this->_initFilterElements(); $this->_initEvents(); $this->_initAssets(); } /** * Add directory path */ private function _initPaths() { $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); $this->_addPath('jbapp:framework', 'jbzoo'); $this->_addPath('jbapp:assets', 'jbassets'); $this->_addPath('jbassets:zoo', 'assets'); $this->_addPath('jbapp:config', 'jbconfig'); $this->_addPath('jbzoo:elements', 'jbelements'); $this->_addPath('jbapp:types', 'jbtypes'); $this->_addPath('jbzoo:helpers', 'helpers'); $this->_addPath('jbzoo:helpers-std', 'helpers'); $this->_addPath('jbzoo:tables', 'tables'); $this->_addPath('jbzoo:classes-std', 'classes'); $this->_addPath('jbzoo:render', 'renderer'); $this->_addPath('jbzoo:views', 'jbviews'); $this->_addPath('jbapp:config', 'jbxml'); $this->_addPath('jbviews:', 'partials'); $this->_addPath('jbapp:joomla/elements', 'fields'); $this->_addPath('jbapp:templates', 'jbtmpl'); $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); if ($this->app->jbenv->isSite()) { $this->_addPath('jbzoo:controllers', 'controllers'); } require $this->app->path->path('jbzoo:controllers/base.php'); JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); } /** * Include models classes */ private function _initModels() { // defines define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); // query builder $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/classes'; require $path . '/database/JBDatabaseQuery.php'; require $path . '/database/JBDatabaseQueryElement.php'; // models $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/models'; require $path . '/jbmodel.php'; require $path . '/jbmodel.config.php'; require $path . '/jbmodel.element.php'; require $path . '/jbmodel.autocomplete.php'; require $path . '/jbmodel.element.country.php'; require $path . '/jbmodel.element.itemdate.php'; require $path . '/jbmodel.element.itemauthor.php'; require $path . '/jbmodel.element.itemcategory.php'; require $path . '/jbmodel.element.itemcreated.php'; require $path . '/jbmodel.element.itemfrontpage.php'; require $path . '/jbmodel.element.itemmodified.php'; require $path . '/jbmodel.element.itemname.php'; require $path . '/jbmodel.element.itempublish_down.php'; require $path . '/jbmodel.element.itempublish_up.php'; require $path . '/jbmodel.element.itemtag.php'; require $path . '/jbmodel.element.jbimage.php'; require $path . '/jbmodel.element.jbselectcascade.php'; require $path . '/jbmodel.element.range.php'; require $path . '/jbmodel.element.rating.php'; require $path . '/jbmodel.element.jbpriceadvance.php'; require $path . '/jbmodel.element.jbcomments.php'; require $path . '/jbmodel.element.textarea.php'; require $path . '/jbmodel.element.date.php'; require $path . '/jbmodel.favorite.php'; require $path . '/jbmodel.filter.php'; require $path . '/jbmodel.item.php'; require $path . '/jbmodel.app.php'; require $path . '/jbmodel.category.php'; require $path . '/jbmodel.order.php'; require $path . '/jbmodel.related.php'; require $path . '/jbmodel.searchindex.php'; require $path . '/jbmodel.values.php'; require $path . '/jbmodel.sku.php'; } /** * Load lang files */ private function _initLanguages() { $lang = JFactory::getLanguage(); $lang->load('com_zoo'); $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); $lang->load('com_zoo', JPATH_ADMINISTRATOR); } /** * Load others libraries */ private function _initFilterElements() { jimport('joomla.html.parameter.element'); $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/render/filter'; require $path . '/element.php'; require $path . '/element.author.php'; require $path . '/element.author.checkbox.php'; require $path . '/element.author.radio.php'; require $path . '/element.author.select.php'; require $path . '/element.author.select.chosen.php'; require $path . '/element.author.text.php'; require $path . '/element.category.php'; require $path . '/element.category.chosen.php'; require $path . '/element.checkbox.php'; require $path . '/element.country.php'; require $path . '/element.country.checkbox.php'; require $path . '/element.country.radio.php'; require $path . '/element.country.select.php'; require $path . '/element.country.select.chosen.php'; require $path . '/element.date.php'; require $path . '/element.date.range.php'; require $path . '/element.frontpage.php'; require $path . '/element.frontpage.jqueryui.php'; require $path . '/element.hidden.php'; require $path . '/element.imageexists.php'; require $path . '/element.imageexists.jqueryui.php'; require $path . '/element.jbselectcascade.php'; require $path . '/element.jqueryui.php'; require $path . '/element.name.php'; require $path . '/element.name.checkbox.php'; require $path . '/element.name.radio.php'; require $path . '/element.name.select.php'; require $path . '/element.name.select.chosen.php'; require $path . '/element.radio.php'; require $path . '/element.rating.php'; require $path . '/element.rating.ranges.php'; require $path . '/element.rating.slider.php'; require $path . '/element.select.php'; require $path . '/element.select.chosen.php'; require $path . '/element.slider.php'; require $path . '/element.tag.php'; require $path . '/element.tag.checkbox.php'; require $path . '/element.tag.radio.php'; require $path . '/element.tag.select.php'; require $path . '/element.tag.select.chosen.php'; require $path . '/element.text.php'; require $path . '/element.text.range.php'; } /** * Register and connect events */ private function _initEvents() { $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/events'; require $path . '/jsystem.php'; require $path . '/jbevent.php'; require $path . '/jbevent.application.php'; require $path . '/jbevent.basket.php'; require $path . '/jbevent.category.php'; require $path . '/jbevent.comment.php'; require $path . '/jbevent.element.php'; require $path . '/jbevent.item.php'; require $path . '/jbevent.jbzoo.php'; require $path . '/jbevent.layout.php'; require $path . '/jbevent.submission.php'; require $path . '/jbevent.tag.php'; require $path . '/jbevent.type.php'; require $path . '/jbevent.payment.php'; $event = $this->app->event; $dispatcher = $event->dispatcher; $event->register('JBEventApplication'); $dispatcher->connect('application:init', array('JBEventApplication', 'init')); $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); $event->register('JBEventCategory'); $dispatcher->connect('category:init', array('JBEventCategory', 'init')); $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); $event->register('JBEventItem'); $dispatcher->connect('item:init', array('JBEventItem', 'init')); $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); $event->register('JBEventComment'); $dispatcher->connect('comment:init', array('JBEventComment', 'init')); $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); $event->register('JBEventSubmission'); $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); $event->register('JBEventElement'); $dispatcher->connect('element:download', array('JBEventElement', 'download')); $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); $event->register('JBEventLayout'); $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); $event->register('JBEventTag'); $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); $event->register('JBEventType'); $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); $dispatcher->connect('type:copied', array('JBEventType', 'copied')); $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); $event->register('JBEventJBZoo'); $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); $event->register('JBEventBasket'); $dispatcher->connect('basket:beforesave', array('JBEventBasket', 'beforeSave')); $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); $event->register('JBEventPayment'); $dispatcher->connect('payment:callback', array('JBEventPayment', 'callback')); } /** * Init assets for admin path */ private function _initAssets() { if (!$this->app->jbenv->isSite()) { $this->app->jbassets->admin(); $this->_initAdminMenu(); } } /** * Init Admin menu */ private function _initAdminMenu() { $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); if (!$config->get('adminmenu_show', 1)) { return false; } $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); $appList = JBModelApp::model()->getSimpleList(); $findJBZooApp = false; $dispatched = false; foreach ($appList as $app) { if ($app->application_group == JBZOO_APP_GROUP) { $findJBZooApp = true; if ($curApp == $app->id) { $dispatched = true; } } } if (!$findJBZooApp) { return false; } $router = $this->app->jbrouter; $menuItems = array(); if (!empty($appList)) { foreach ($appList as $app) { $menuItems['app-' . $app->alias] = array( 'name' => $app->name, 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), 'children' => array( 'add-item' => array( 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')) ), 'sep-1' => 'divider', 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')) ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')) ), 'frontpage' => array( 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')) ), 'comments' => array( 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')) ), 'sep-1' => 'divider', 'config' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')) ), ) ); } } $menuItems['sep-1'] = 'divider'; $menuItems['item-config'] = array( 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), ); $types = $this->app->jbtype->getSimpleList(); if (!empty($types)) { $children = array(); foreach ($types as $alias => $type) { $children['type-' . $alias] = array( 'name' => $type, 'url' => $router->admin(array( 'controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => array('0' => $alias) )) ); } $menuItems['item-config']['children'] = $children; } if ($dispatched) { $menuItems['sep-2'] = 'divider'; $menuItems['jbzoo-admin'] = array( 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), ), ), ); $menuItems['jbzoo-import'] = array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDART'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), ), ), ); $menuItems['jbzoo-export'] = array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), ), 'types' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), ), 'yandexyml' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDART'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), ), 'zoobackup' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), ), ), ); $menuItems['sep-3'] = 'divider'; $menuItems['jbzoo-info'] = array( 'name' => JText::_('JBZOO_ADMINMENU_INFO'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), ), 'server' => array( 'name' => 'Get Last JBZoo', 'url' => 'https://github.com/JBZoo/JBZoo', 'target' => '_blank', ), ) ); } $menuItems['jbzoo-support'] = array( 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), 'url' => 'http://forum.jbzoo.com/', 'target' => '_blank', ); $this->app->jbassets->addVar('JBAdminItems', array( 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), 'items' => $menuItems, )); } /** * Init config file */ private function _initConfig() { $fn = base64_decode('b' . 'Glj' . 'ZW5j' . 'ZS4' . '='); $fp = base64_decode('amJh' . 'cHA6' . 'Y29u' . 'Zmln'); $f = $this->app->path->path($fp) . '/' . $fn . self::getDomain(true) . '.' . base64_decode('cGhw'); if (JFile::exists($f)) { require($f); } } /** * Get group name * @return string */ private function _getGroup() { return $this->_group; } /** * Register new path in system * @param string $path * @param string $pathName * @return mixed */ private function _addPath($path, $pathName) { if ($fullPath = $this->app->path->path($path)) { return $this->app->path->register($fullPath, $pathName); } return null; } /** * Get domain name * @param bool $isAny * @return string */ static function getDomain($isAny = false) { $domain = ''; if (function_exists('apache_request_headers')) { $headers = apache_request_headers(); $domain = isset($headers['Host']) ? $headers['Host'] : ''; } if ($isAny && !$domain) { $domain = $_SERVER['HTTP_HOST']; } $domain = preg_replace('#^www\.#', '', $domain); list($domain) = explode(':', $domain); return $domain; } /** * Get hash * @param $string * @return string */ static public function getHash($string) { return ''; } } \ No newline at end of file + + */ + +// no direct access +defined('_JEXEC') or die('Restricted access'); + + +!defined('JBZOO_APP_GROUP') && define('JBZOO_APP_GROUP', 'jbuniversal'); +!defined('DIRECTORY_SEPERATOR') && define('DIRECTORY_SEPERATOR', '/'); +!defined('DS') && define('DS', DIRECTORY_SEPARATOR); + +/** + * Class JBZoo + */ +class JBZoo +{ + /** + * @var Application + */ + public $app = null; + + /** + * App group name + * @var string + */ + private $_group = JBZOO_APP_GROUP; + + /** + * Init JBZoo application + * @static + * @return JBZoo + */ + public static function init() + { + static $jbzoo; + + if (!isset($jbzoo)) { + $jbzoo = new self(); + } + + return $jbzoo; + } + + /** + * Initialization JBZoo App + */ + private function __construct() + { + $this->app = App::getInstance('zoo'); + + $this->_initPaths(); + $this->_initConfig(); + $this->_initModels(); + $this->_initLanguages(); + $this->_initFilterElements(); + $this->_initEvents(); + $this->_initAssets(); + } + + /** + * Add directory path + */ + private function _initPaths() + { + $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); + $this->_addPath('jbapp:framework', 'jbzoo'); + $this->_addPath('jbapp:assets', 'jbassets'); + $this->_addPath('jbassets:zoo', 'assets'); + $this->_addPath('jbapp:config', 'jbconfig'); + $this->_addPath('jbzoo:elements', 'jbelements'); + $this->_addPath('jbapp:types', 'jbtypes'); + $this->_addPath('jbzoo:helpers', 'helpers'); + $this->_addPath('jbzoo:helpers-std', 'helpers'); + $this->_addPath('jbzoo:tables', 'tables'); + $this->_addPath('jbzoo:classes-std', 'classes'); + $this->_addPath('jbzoo:render', 'renderer'); + $this->_addPath('jbzoo:views', 'jbviews'); + $this->_addPath('jbapp:config', 'jbxml'); + $this->_addPath('jbviews:', 'partials'); + $this->_addPath('jbapp:joomla/elements', 'fields'); + $this->_addPath('jbapp:templates', 'jbtmpl'); + $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); + $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); + $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); + $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); + $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); + $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); + + if ($this->app->jbenv->isSite()) { + $this->_addPath('jbzoo:controllers', 'controllers'); + } + + require $this->app->path->path('jbzoo:controllers/base.php'); + + JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); + } + + /** + * Include models classes + */ + private function _initModels() + { + // defines + define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); + define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); + define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); + + // query builder + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/classes'; + require $path . '/database/JBDatabaseQuery.php'; + require $path . '/database/JBDatabaseQueryElement.php'; + + // models + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/models'; + require $path . '/jbmodel.php'; + require $path . '/jbmodel.config.php'; + require $path . '/jbmodel.element.php'; + require $path . '/jbmodel.autocomplete.php'; + require $path . '/jbmodel.element.country.php'; + require $path . '/jbmodel.element.itemdate.php'; + require $path . '/jbmodel.element.itemauthor.php'; + require $path . '/jbmodel.element.itemcategory.php'; + require $path . '/jbmodel.element.itemcreated.php'; + require $path . '/jbmodel.element.itemfrontpage.php'; + require $path . '/jbmodel.element.itemmodified.php'; + require $path . '/jbmodel.element.itemname.php'; + require $path . '/jbmodel.element.itempublish_down.php'; + require $path . '/jbmodel.element.itempublish_up.php'; + require $path . '/jbmodel.element.itemtag.php'; + require $path . '/jbmodel.element.jbimage.php'; + require $path . '/jbmodel.element.jbselectcascade.php'; + require $path . '/jbmodel.element.range.php'; + require $path . '/jbmodel.element.rating.php'; + require $path . '/jbmodel.element.jbpriceadvance.php'; + require $path . '/jbmodel.element.jbcomments.php'; + require $path . '/jbmodel.element.textarea.php'; + require $path . '/jbmodel.element.date.php'; + require $path . '/jbmodel.favorite.php'; + require $path . '/jbmodel.filter.php'; + require $path . '/jbmodel.item.php'; + require $path . '/jbmodel.app.php'; + require $path . '/jbmodel.category.php'; + require $path . '/jbmodel.order.php'; + require $path . '/jbmodel.related.php'; + require $path . '/jbmodel.searchindex.php'; + require $path . '/jbmodel.values.php'; + require $path . '/jbmodel.sku.php'; + } + + /** + * Load lang files + */ + private function _initLanguages() + { + $lang = JFactory::getLanguage(); + $lang->load('com_zoo'); + $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); + $lang->load('com_zoo', JPATH_ADMINISTRATOR); + } + + /** + * Load others libraries + */ + private function _initFilterElements() + { + jimport('joomla.html.parameter.element'); + + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/render/filter'; + require $path . '/element.php'; + require $path . '/element.author.php'; + require $path . '/element.author.checkbox.php'; + require $path . '/element.author.radio.php'; + require $path . '/element.author.select.php'; + require $path . '/element.author.select.chosen.php'; + require $path . '/element.author.text.php'; + require $path . '/element.category.php'; + require $path . '/element.category.chosen.php'; + require $path . '/element.checkbox.php'; + require $path . '/element.country.php'; + require $path . '/element.country.checkbox.php'; + require $path . '/element.country.radio.php'; + require $path . '/element.country.select.php'; + require $path . '/element.country.select.chosen.php'; + require $path . '/element.date.php'; + require $path . '/element.date.range.php'; + require $path . '/element.frontpage.php'; + require $path . '/element.frontpage.jqueryui.php'; + require $path . '/element.hidden.php'; + require $path . '/element.imageexists.php'; + require $path . '/element.imageexists.jqueryui.php'; + require $path . '/element.jbselectcascade.php'; + require $path . '/element.jqueryui.php'; + require $path . '/element.name.php'; + require $path . '/element.name.checkbox.php'; + require $path . '/element.name.radio.php'; + require $path . '/element.name.select.php'; + require $path . '/element.name.select.chosen.php'; + require $path . '/element.radio.php'; + require $path . '/element.rating.php'; + require $path . '/element.rating.ranges.php'; + require $path . '/element.rating.slider.php'; + require $path . '/element.select.php'; + require $path . '/element.select.chosen.php'; + require $path . '/element.slider.php'; + require $path . '/element.tag.php'; + require $path . '/element.tag.checkbox.php'; + require $path . '/element.tag.radio.php'; + require $path . '/element.tag.select.php'; + require $path . '/element.tag.select.chosen.php'; + require $path . '/element.text.php'; + require $path . '/element.text.range.php'; + } + + /** + * Register and connect events + */ + private function _initEvents() + { + $path = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework/events'; + require $path . '/jsystem.php'; + require $path . '/jbevent.php'; + require $path . '/jbevent.application.php'; + require $path . '/jbevent.basket.php'; + require $path . '/jbevent.category.php'; + require $path . '/jbevent.comment.php'; + require $path . '/jbevent.element.php'; + require $path . '/jbevent.item.php'; + require $path . '/jbevent.jbzoo.php'; + require $path . '/jbevent.layout.php'; + require $path . '/jbevent.submission.php'; + require $path . '/jbevent.tag.php'; + require $path . '/jbevent.type.php'; + require $path . '/jbevent.payment.php'; + + $event = $this->app->event; + $dispatcher = $event->dispatcher; + + $event->register('JBEventApplication'); + $dispatcher->connect('application:init', array('JBEventApplication', 'init')); + $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); + $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); + $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); + $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); + $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); + $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); + $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); + $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); + + $event->register('JBEventCategory'); + $dispatcher->connect('category:init', array('JBEventCategory', 'init')); + $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); + $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); + $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); + + $event->register('JBEventItem'); + $dispatcher->connect('item:init', array('JBEventItem', 'init')); + $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); + $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); + $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); + $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); + $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); + $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); + $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); + $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); + $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); + + $event->register('JBEventComment'); + $dispatcher->connect('comment:init', array('JBEventComment', 'init')); + $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); + $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); + $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); + + $event->register('JBEventSubmission'); + $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); + $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); + $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); + $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); + + $event->register('JBEventElement'); + $dispatcher->connect('element:download', array('JBEventElement', 'download')); + $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); + $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); + $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); + $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); + $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); + $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); + $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); + $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); + $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); + + $event->register('JBEventLayout'); + $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); + + $event->register('JBEventTag'); + $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); + $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); + + $event->register('JBEventType'); + $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); + $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); + $dispatcher->connect('type:copied', array('JBEventType', 'copied')); + $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); + $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); + $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); + $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); + + $event->register('JBEventJBZoo'); + $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); + $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); + + $event->register('JBEventBasket'); + $dispatcher->connect('basket:beforesave', array('JBEventBasket', 'beforeSave')); + $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); + + $event->register('JBEventPayment'); + $dispatcher->connect('payment:callback', array('JBEventPayment', 'callback')); + } + + /** + * Init assets for admin path + */ + private function _initAssets() + { + if (!$this->app->jbenv->isSite()) { + $this->app->jbassets->admin(); + $this->_initAdminMenu(); + } + } + + /** + * Init Admin menu + */ + private function _initAdminMenu() + { + $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); + if (!$config->get('adminmenu_show', 1)) { + return false; + } + + $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); + + $appList = JBModelApp::model()->getSimpleList(); + $findJBZooApp = false; + $dispatched = false; + foreach ($appList as $app) { + if ($app->application_group == JBZOO_APP_GROUP) { + $findJBZooApp = true; + if ($curApp == $app->id) { + $dispatched = true; + } + } + } + + if (!$findJBZooApp) { + return false; + } + + $router = $this->app->jbrouter; + + $menuItems = array(); + + if (!empty($appList)) { + foreach ($appList as $app) { + + $menuItems['app-' . $app->alias] = array( + 'name' => $app->name, + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), + 'children' => array( + 'add-item' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')) + ), + 'sep-1' => 'divider', + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')) + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')) + ), + 'frontpage' => array( + 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')) + ), + 'comments' => array( + 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')) + ), + 'sep-1' => 'divider', + 'config' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')) + ), + ) + ); + } + } + + $menuItems['sep-1'] = 'divider'; + + $menuItems['item-config'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), + 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), + ); + + $types = $this->app->jbtype->getSimpleList(); + if (!empty($types)) { + $children = array(); + foreach ($types as $alias => $type) { + $children['type-' . $alias] = array( + 'name' => $type, + 'url' => $router->admin(array( + 'controller' => 'manager', + 'group' => 'jbuniversal', + 'task' => 'editelements', + 'cid' => array('0' => $alias) + )) + ); + } + + $menuItems['item-config']['children'] = $children; + } + + if ($dispatched) { + $menuItems['sep-2'] = 'divider'; + + $menuItems['jbzoo-admin'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), + 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), + 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), + 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), + ), + ), + ); + + $menuItems['jbzoo-import'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDART'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), + ), + ), + ); + + $menuItems['jbzoo-export'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), + ), + 'types' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), + ), + 'yandexyml' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDART'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), + ), + 'zoobackup' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), + ), + ), + ); + + $menuItems['sep-3'] = 'divider'; + + $menuItems['jbzoo-info'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_INFO'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), + ), + 'server' => array( + 'name' => 'Get Last JBZoo', + 'url' => 'https://github.com/JBZoo/JBZoo', + 'target' => '_blank', + ), + ) + ); + } + + $menuItems['jbzoo-support'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), + 'url' => 'http://forum.jbzoo.com/', + 'target' => '_blank', + ); + + $this->app->jbassets->addVar('JBAdminItems', array( + 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), + 'items' => $menuItems, + )); + } + + /** + * Init config file + */ + private function _initConfig() + { + $fn = base64_decode('b' . 'Glj' . 'ZW5j' . 'ZS4' . '='); + $fp = base64_decode('amJh' . 'cHA6' . 'Y29u' . 'Zmln'); + $f = $this->app->path->path($fp) . '/' . $fn . self::getDomain(true) . '.' . base64_decode('cGhw'); + if (JFile::exists($f)) { + require($f); + } + } + + /** + * Get group name + * @return string + */ + private function _getGroup() + { + return $this->_group; + } + + /** + * Register new path in system + * @param string $path + * @param string $pathName + * @return mixed + */ + private function _addPath($path, $pathName) + { + if ($fullPath = $this->app->path->path($path)) { + return $this->app->path->register($fullPath, $pathName); + } + + return null; + } + + /** + * Get domain name + * @param bool $isAny + * @return string + */ + static function getDomain($isAny = false) + { + $domain = ''; + if (function_exists('apache_request_headers')) { + $headers = apache_request_headers(); + $domain = isset($headers['Host']) ? $headers['Host'] : ''; + } + + if ($isAny && !$domain) { + $domain = $_SERVER['HTTP_HOST']; + } + + $domain = preg_replace('#^www\.#', '', $domain); + list($domain) = explode(':', $domain); + + return $domain; + } + + /** + * Get hash + * @param $string + * @return string + */ + static public function getHash($string) + { + return ''; + } +} diff --git a/patches/2.2.2/media/zoo/applications/jbuniversal/framework/jbzoo.php b/patches/2.2.2/media/zoo/applications/jbuniversal/framework/jbzoo.php index a2ceae1..470479d 100644 --- a/patches/2.2.2/media/zoo/applications/jbuniversal/framework/jbzoo.php +++ b/patches/2.2.2/media/zoo/applications/jbuniversal/framework/jbzoo.php @@ -1 +1,642 @@ - */ // no direct access defined('_JEXEC') or die('Restricted access'); /** * Class JBZoo */ class JBZoo { /** * @var Application */ public $app = null; /** * App group name * @var string */ private $_group = JBZOO_APP_GROUP; /** * Init JBZoo application * @static * @return JBZoo */ public static function init() { static $jbzoo; if (!isset($jbzoo)) { $jbzoo = new self(); } return $jbzoo; } /** * Initialization JBZoo App */ private function __construct() { $this->app = App::getInstance('zoo'); $this->_initPaths(); $this->_initClasses(); $this->_initLanguages(); $this->_initEvents(); $this->_initAssets(); } /** * Add directory path */ private function _initPaths() { $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); $this->_addPath('jbapp:framework', 'jbzoo'); $this->_addPath('jbapp:assets', 'jbassets'); $this->_addPath('jbassets:zoo', 'assets'); $this->_addPath('jbapp:config', 'jbconfig'); $this->_addPath('jbzoo:elements', 'jbelements'); $this->_addPath('jbapp:cart-elements', 'cart-elements'); $this->_addPath('jbapp:types', 'jbtypes'); $this->_addPath('jbzoo:helpers', 'helpers'); $this->_addPath('jbzoo:helpers-std', 'helpers'); $this->_addPath('helpers:fields', 'fields'); $this->_addPath('jbzoo:tables', 'tables'); $this->_addPath('jbzoo:classes-std', 'classes'); $this->_addPath('jbzoo:render', 'renderer'); $this->_addPath('jbzoo:views', 'jbviews'); $this->_addPath('jbapp:config', 'jbxml'); $this->_addPath('jbviews:', 'partials'); $this->_addPath('jbapp:joomla/elements', 'fields'); $this->_addPath('jbapp:templates', 'jbtmpl'); $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); $this->_addPath('modules:mod_jbzoo_currency', 'mod_jbzoo_currency'); $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); if ($this->app->jbenv->isSite()) { $this->_addPath('jbzoo:controllers', 'controllers'); } require $this->app->path->path('jbzoo:controllers/base.php'); JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); } /** * Include models classes */ private function _initClasses() { jimport('joomla.html.parameter.element'); $this->app->loader->register('AppValidator', 'classes:validator.php'); // defines define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); define('ZOO_TABLE_JBZOO_ORDER', '#__zoo_jbzoo_orders'); $frmwork = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework'; $clsPath = $frmwork . '/classes'; $modPath = $frmwork . '/models'; $filPath = $frmwork . '/render/filter'; $evtPath = $frmwork . '/events'; $classList = array( 'JBDatabaseQuery' => $clsPath . '/database/JBDatabaseQuery.php', 'JBDatabaseQueryElement' => $clsPath . '/database/JBDatabaseQueryElement.php', 'JBCartOrder' => $clsPath . '/cart/jborder.php', 'JBCart' => $clsPath . '/cart/jbcart.php', 'JBCartValue' => $clsPath . '/cart/jbvalue.php', 'JBCartVariant' => $clsPath . '/cart/jbvariant.php', 'JBCartVariantList' => $clsPath . '/cart/jbvariantlist.php', 'JBTemplate' => $clsPath . '/jbtemplate.php', // models 'JBModel' => $modPath . '/jbmodel.php', 'JBModelConfig' => $modPath . '/jbmodel.config.php', 'JBModelElement' => $modPath . '/jbmodel.element.php', 'JBModelAutoComplete' => $modPath . '/jbmodel.autocomplete.php', 'JBModelElementCountry' => $modPath . '/jbmodel.element.country.php', 'JBModelElementDate' => $modPath . '/jbmodel.element.date.php', 'JBModelElementItemDate' => $modPath . '/jbmodel.element.itemdate.php', 'JBModelElementItemauthor' => $modPath . '/jbmodel.element.itemauthor.php', 'JBModelElementItemCategory' => $modPath . '/jbmodel.element.itemcategory.php', 'JBModelElementItemCreated' => $modPath . '/jbmodel.element.itemcreated.php', 'JBModelElementItemFrontpage' => $modPath . '/jbmodel.element.itemfrontpage.php', 'JBModelElementItemModified' => $modPath . '/jbmodel.element.itemmodified.php', 'JBModelElementItemName' => $modPath . '/jbmodel.element.itemname.php', 'JBModelElementItemPublish_down' => $modPath . '/jbmodel.element.itempublish_down.php', 'JBModelElementItemPublish_up' => $modPath . '/jbmodel.element.itempublish_up.php', 'JBModelElementItemTag' => $modPath . '/jbmodel.element.itemtag.php', 'JBModelElementJBImage' => $modPath . '/jbmodel.element.jbimage.php', 'JBModelElementJBSelectCascade' => $modPath . '/jbmodel.element.jbselectcascade.php', 'JBModelElementRange' => $modPath . '/jbmodel.element.range.php', 'JBModelElementRating' => $modPath . '/jbmodel.element.rating.php', 'JBModelElementJBPrice' => $modPath . '/jbmodel.element.jbprice.php', 'JBModelElementJBPricePlain' => $modPath . '/jbmodel.element.jbprice.plain.php', 'JBModelElementJBPriceCalc' => $modPath . '/jbmodel.element.jbprice.calc.php', 'JBModelElementJBComments' => $modPath . '/jbmodel.element.jbcomments.php', 'JBModelElementTextarea' => $modPath . '/jbmodel.element.textarea.php', 'JBModelFavorite' => $modPath . '/jbmodel.favorite.php', 'JBModelFilter' => $modPath . '/jbmodel.filter.php', 'JBModelItem' => $modPath . '/jbmodel.item.php', 'JBModelApp' => $modPath . '/jbmodel.app.php', 'JBModelCategory' => $modPath . '/jbmodel.category.php', 'JBModelOrder' => $modPath . '/jbmodel.order.php', 'JBModelRelated' => $modPath . '/jbmodel.related.php', 'JBModelSearchindex' => $modPath . '/jbmodel.searchindex.php', 'JBModelValues' => $modPath . '/jbmodel.values.php', 'JBModelSku' => $modPath . '/jbmodel.sku.php', // filter 'JBFilterElement' => $filPath . '/element.php', 'JBFilterElementAuthor' => $filPath . '/element.author.php', 'JBFilterElementAuthorCheckbox' => $filPath . '/element.author.checkbox.php', 'JBFilterElementAuthorRadio' => $filPath . '/element.author.radio.php', 'JBFilterElementAuthorSelect' => $filPath . '/element.author.select.php', 'JBFilterElementAuthorChosen' => $filPath . '/element.author.select.chosen.php', 'JBFilterElementAuthorText' => $filPath . '/element.author.text.php', 'JBFilterElementCategory' => $filPath . '/element.category.php', 'JBFilterElementCategoryChosen' => $filPath . '/element.category.chosen.php', 'JBFilterElementCategoryHidden' => $filPath . '/element.category.hidden.php', 'JBFilterElementCheckbox' => $filPath . '/element.checkbox.php', 'JBFilterElementCountry' => $filPath . '/element.country.php', 'JBFilterElementCountryCheckbox' => $filPath . '/element.country.checkbox.php', 'JBFilterElementCountryRadio' => $filPath . '/element.country.radio.php', 'JBFilterElementCountrySelect' => $filPath . '/element.country.select.php', 'JBFilterElementCountryChosen' => $filPath . '/element.country.select.chosen.php', 'JBFilterElementDate' => $filPath . '/element.date.php', 'JBFilterElementDateRange' => $filPath . '/element.date.range.php', 'JBFilterElementFrontpage' => $filPath . '/element.frontpage.php', 'JBFilterElementFrontpageJqueryUI' => $filPath . '/element.frontpage.jqueryui.php', 'JBFilterElementHidden' => $filPath . '/element.hidden.php', 'JBFilterElementImageexists' => $filPath . '/element.imageexists.php', 'JBFilterElementImageexistsJqueryui' => $filPath . '/element.imageexists.jqueryui.php', 'JBFilterElementJBColor' => $filPath . '/element.jbcolor.php', 'JBFilterElementJBPriceCalc' => $filPath . '/element.jbpricecalc.php', 'JBFilterElementJBPricePlain' => $filPath . '/element.jbpriceplain.php', 'JBFilterElementJbselectcascade' => $filPath . '/element.jbselectcascade.php', 'JBFilterElementJqueryui' => $filPath . '/element.jqueryui.php', 'JBFilterElementName' => $filPath . '/element.name.php', 'JBFilterElementNameCheckbox' => $filPath . '/element.name.checkbox.php', 'JBFilterElementNameRadio' => $filPath . '/element.name.radio.php', 'JBFilterElementNameSelect' => $filPath . '/element.name.select.php', 'JBFilterElementNameChosen' => $filPath . '/element.name.select.chosen.php', 'JBFilterElementRadio' => $filPath . '/element.radio.php', 'JBFilterElementRating' => $filPath . '/element.rating.php', 'JBFilterElementRatingRanges' => $filPath . '/element.rating.ranges.php', 'JBFilterElementRatingSlider' => $filPath . '/element.rating.slider.php', 'JBFilterElementSelect' => $filPath . '/element.select.php', 'JBFilterElementSelectChosen' => $filPath . '/element.select.chosen.php', 'JBFilterElementSlider' => $filPath . '/element.slider.php', 'JBFilterElementTag' => $filPath . '/element.tag.php', 'JBFilterElementTagCheckbox' => $filPath . '/element.tag.checkbox.php', 'JBFilterElementTagRadio' => $filPath . '/element.tag.radio.php', 'JBFilterElementTagSelect' => $filPath . '/element.tag.select.php', 'JBFilterElementTagSelectChosen' => $filPath . '/element.tag.select.chosen.php', 'JBFilterElementText' => $filPath . '/element.text.php', 'JBFilterElementTextRange' => $filPath . '/element.text.range.php', // events 'JBZooSystemPlugin' => $evtPath . '/jsystem.php', 'JBEvent' => $evtPath . '/jbevent.php', 'JBEventApplication' => $evtPath . '/jbevent.application.php', 'JBEventBasket' => $evtPath . '/jbevent.basket.php', 'JBEventCategory' => $evtPath . '/jbevent.category.php', 'JBEventComment' => $evtPath . '/jbevent.comment.php', 'JBEventElement' => $evtPath . '/jbevent.element.php', 'JBEventItem' => $evtPath . '/jbevent.item.php', 'JBEventJBZoo' => $evtPath . '/jbevent.jbzoo.php', 'JBEventLayout' => $evtPath . '/jbevent.layout.php', 'JBEventSubmission' => $evtPath . '/jbevent.submission.php', 'JBEventTag' => $evtPath . '/jbevent.tag.php', 'JBEventType' => $evtPath . '/jbevent.type.php', ); foreach ($classList as $className => $path) { JLoader::register($className, $path); } } /** * Get domain name * @param bool $isAny * @return string */ static function getDomain($isAny = false) { if (defined('STDIN') || php_sapi_name() == "cli") { return 'console'; } $domain = ''; if (function_exists('apache_request_headers')) { $headers = apache_request_headers(); $domain = isset($headers['Host']) ? $headers['Host'] : ''; } if ($isAny && !$domain) { $domain = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''; } $domain = preg_replace('#^www\.#', '', $domain); list($domain) = explode(':', $domain); return $domain; } /** * Load lang files */ private function _initLanguages() { $lang = JFactory::getLanguage(); $lang->load('com_zoo'); $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); $lang->load('com_zoo', JPATH_ADMINISTRATOR); } /** * Register and connect events */ private function _initEvents() { $event = $this->app->event; $dispatcher = $event->dispatcher; $event->register('JBEventApplication'); $dispatcher->connect('application:init', array('JBEventApplication', 'init')); $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); $event->register('JBEventCategory'); $dispatcher->connect('category:init', array('JBEventCategory', 'init')); $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); $event->register('JBEventItem'); $dispatcher->connect('item:init', array('JBEventItem', 'init')); $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); $event->register('JBEventComment'); $dispatcher->connect('comment:init', array('JBEventComment', 'init')); $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); $event->register('JBEventSubmission'); $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); $event->register('JBEventElement'); $dispatcher->connect('element:download', array('JBEventElement', 'download')); $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); $event->register('JBEventLayout'); $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); $event->register('JBEventTag'); $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); $event->register('JBEventType'); $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); $dispatcher->connect('type:copied', array('JBEventType', 'copied')); $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); $event->register('JBEventJBZoo'); $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); $event->register('JBEventBasket'); $dispatcher->connect('basket:beforeSave', array('JBEventBasket', 'beforeSave')); $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); $dispatcher->connect('basket:afterSave', array('JBEventBasket', 'afterSave')); $dispatcher->connect('basket:updated', array('JBEventBasket', 'updated')); $dispatcher->connect('basket:addItem', array('JBEventBasket', 'addItem')); $dispatcher->connect('basket:updateItem', array('JBEventBasket', 'updateItem')); $dispatcher->connect('basket:changeQuantity', array('JBEventBasket', 'changeQuantity')); $dispatcher->connect('basket:removeItem', array('JBEventBasket', 'removeItem')); $dispatcher->connect('basket:removeItems', array('JBEventBasket', 'removeItems')); $dispatcher->connect('basket:recount', array('JBEventBasket', 'recount')); $dispatcher->connect('basket:orderStatus', array('JBEventBasket', 'orderStatus')); $dispatcher->connect('basket:paymentStatus', array('JBEventBasket', 'paymentStatus')); $dispatcher->connect('basket:shippingStatus', array('JBEventBasket', 'shippingStatus')); $dispatcher->connect('basket:paymentSuccess', array('JBEventBasket', 'paymentSuccess')); $dispatcher->connect('basket:paymentFail', array('JBEventBasket', 'paymentFail')); $dispatcher->connect('basket:paymentCallback', array('JBEventBasket', 'paymentCallback')); } /** * Init assets for admin path */ private function _initAssets() { if (!$this->app->jbenv->isSite() && !$this->app->jbrequest->isAjax()) { $this->app->jbassets->admin(); $this->_initAdminMenu(); } } /** * Get hash * @param $string * @return string */ static public function getHash($string) { return ''; } /** * Init Admin menu */ private function _initAdminMenu() { $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); if (!$config->get('adminmenu_show', 1)) { return false; } $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); $appList = JBModelApp::model()->getSimpleList(); $findJBZooApp = false; $dispatched = false; foreach ($appList as $app) { if ($app->application_group == JBZOO_APP_GROUP) { $findJBZooApp = true; if ($curApp == $app->id) { $dispatched = true; } } } if (!$findJBZooApp) { return false; } $router = $this->app->jbrouter; $menuItems = array(); if (!empty($appList)) { foreach ($appList as $app) { $menuItems['app-' . $app->alias] = array( 'name' => $app->name, 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), 'children' => array( 'add-item' => array( 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')) ), 'sep-1' => 'divider', 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')) ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')) ), 'frontpage' => array( 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')) ), 'comments' => array( 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')) ), 'sep-1' => 'divider', 'config' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')) ), ) ); } } $menuItems['sep-1'] = 'divider'; if ($dispatched) { $menuItems['orders'] = array( 'name' => JText::_('JBZOO_ADMINMENU_ORDERS'), 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jborder')), 'children' => array( 'cart-configs' => array( 'name' => JText::_('JBZOO_ADMINMENU_CART_CONFIG'), 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jbcart')), ) ) ); } $menuItems['sep-2'] = 'divider'; $menuItems['item-config'] = array( 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), ); $types = $this->app->jbtype->getSimpleList(); if (!empty($types)) { $children = array(); foreach ($types as $alias => $type) { $children['type-' . $alias] = array( 'name' => $type, 'url' => $router->admin(array('controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => array('0' => $alias))) ); } $menuItems['item-config']['children'] = $children; } if ($dispatched) { $menuItems['sep-3'] = 'divider'; $menuItems['jbzoo-admin'] = array( 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), ), ), ); $menuItems['jbzoo-import'] = array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDART'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), ), ), ); $menuItems['jbzoo-export'] = array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), ), 'types' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), ), 'yandexyml' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDART'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), ), 'zoobackup' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), ), ), ); $menuItems['sep-4'] = 'divider'; $menuItems['jbzoo-info'] = array( 'name' => JText::_('JBZOO_ADMINMENU_INFO'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), ), 'server' => array( 'name' => 'Get Last JBZoo', 'url' => 'https://github.com/JBZoo/JBZoo', 'target' => '_blank', ), ) ); } $menuItems['jbzoo-support'] = array( 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), 'url' => 'http://forum.jbzoo.com/', 'target' => '_blank', ); $this->app->jbassets->addVar('JBAdminItems', array( 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), 'items' => $menuItems, )); } /** * Get group name * @return string */ private function _getGroup() { return $this->_group; } /** * Register new path in system * @param string $path * @param string $pathName * @return mixed */ private function _addPath($path, $pathName) { if ($fullPath = $this->app->path->path($path)) { return $this->app->path->register($fullPath, $pathName); } return null; } } \ No newline at end of file + + */ + +// no direct access +defined('_JEXEC') or die('Restricted access'); + +/** + * Class JBZoo + */ +class JBZoo +{ + /** + * @var Application + */ + public $app = null; + + /** + * App group name + * @var string + */ + private $_group = JBZOO_APP_GROUP; + + /** + * Init JBZoo application + * @static + * @return JBZoo + */ + public static function init() + { + static $jbzoo; + + if (!isset($jbzoo)) { + $jbzoo = new self(); + } + + return $jbzoo; + } + + /** + * Initialization JBZoo App + */ + private function __construct() + { + $this->app = App::getInstance('zoo'); + + $this->_initPaths(); + $this->_initClasses(); + $this->_initLanguages(); + $this->_initEvents(); + $this->_initAssets(); + } + + /** + * Add directory path + */ + private function _initPaths() + { + $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); + $this->_addPath('jbapp:framework', 'jbzoo'); + $this->_addPath('jbapp:assets', 'jbassets'); + $this->_addPath('jbassets:zoo', 'assets'); + $this->_addPath('jbapp:config', 'jbconfig'); + $this->_addPath('jbzoo:elements', 'jbelements'); + $this->_addPath('jbapp:cart-elements', 'cart-elements'); + $this->_addPath('jbapp:types', 'jbtypes'); + + $this->_addPath('jbzoo:helpers', 'helpers'); + $this->_addPath('jbzoo:helpers-std', 'helpers'); + $this->_addPath('helpers:fields', 'fields'); + + $this->_addPath('jbzoo:tables', 'tables'); + $this->_addPath('jbzoo:classes-std', 'classes'); + $this->_addPath('jbzoo:render', 'renderer'); + $this->_addPath('jbzoo:views', 'jbviews'); + $this->_addPath('jbapp:config', 'jbxml'); + $this->_addPath('jbviews:', 'partials'); + $this->_addPath('jbapp:joomla/elements', 'fields'); + $this->_addPath('jbapp:templates', 'jbtmpl'); + + $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); + $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); + $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); + $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); + $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); + $this->_addPath('modules:mod_jbzoo_currency', 'mod_jbzoo_currency'); + + $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); + + if ($this->app->jbenv->isSite()) { + $this->_addPath('jbzoo:controllers', 'controllers'); + } + + require $this->app->path->path('jbzoo:controllers/base.php'); + + JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); + } + + /** + * Include models classes + */ + private function _initClasses() + { + jimport('joomla.html.parameter.element'); + + $this->app->loader->register('AppValidator', 'classes:validator.php'); + + // defines + define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); + define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); + define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); + define('ZOO_TABLE_JBZOO_ORDER', '#__zoo_jbzoo_orders'); + + $frmwork = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework'; + $clsPath = $frmwork . '/classes'; + $modPath = $frmwork . '/models'; + $filPath = $frmwork . '/render/filter'; + $evtPath = $frmwork . '/events'; + + $classList = array( + 'JBDatabaseQuery' => $clsPath . '/database/JBDatabaseQuery.php', + 'JBDatabaseQueryElement' => $clsPath . '/database/JBDatabaseQueryElement.php', + 'JBCartOrder' => $clsPath . '/cart/jborder.php', + 'JBCart' => $clsPath . '/cart/jbcart.php', + 'JBCartValue' => $clsPath . '/cart/jbvalue.php', + 'JBCartVariant' => $clsPath . '/cart/jbvariant.php', + 'JBCartVariantList' => $clsPath . '/cart/jbvariantlist.php', + 'JBTemplate' => $clsPath . '/jbtemplate.php', + + // models + 'JBModel' => $modPath . '/jbmodel.php', + 'JBModelConfig' => $modPath . '/jbmodel.config.php', + 'JBModelElement' => $modPath . '/jbmodel.element.php', + 'JBModelAutoComplete' => $modPath . '/jbmodel.autocomplete.php', + 'JBModelElementCountry' => $modPath . '/jbmodel.element.country.php', + 'JBModelElementDate' => $modPath . '/jbmodel.element.date.php', + 'JBModelElementItemDate' => $modPath . '/jbmodel.element.itemdate.php', + 'JBModelElementItemauthor' => $modPath . '/jbmodel.element.itemauthor.php', + 'JBModelElementItemCategory' => $modPath . '/jbmodel.element.itemcategory.php', + 'JBModelElementItemCreated' => $modPath . '/jbmodel.element.itemcreated.php', + 'JBModelElementItemFrontpage' => $modPath . '/jbmodel.element.itemfrontpage.php', + 'JBModelElementItemModified' => $modPath . '/jbmodel.element.itemmodified.php', + 'JBModelElementItemName' => $modPath . '/jbmodel.element.itemname.php', + 'JBModelElementItemPublish_down' => $modPath . '/jbmodel.element.itempublish_down.php', + 'JBModelElementItemPublish_up' => $modPath . '/jbmodel.element.itempublish_up.php', + 'JBModelElementItemTag' => $modPath . '/jbmodel.element.itemtag.php', + 'JBModelElementJBImage' => $modPath . '/jbmodel.element.jbimage.php', + 'JBModelElementJBSelectCascade' => $modPath . '/jbmodel.element.jbselectcascade.php', + 'JBModelElementRange' => $modPath . '/jbmodel.element.range.php', + 'JBModelElementRating' => $modPath . '/jbmodel.element.rating.php', + 'JBModelElementJBPrice' => $modPath . '/jbmodel.element.jbprice.php', + 'JBModelElementJBPricePlain' => $modPath . '/jbmodel.element.jbprice.plain.php', + 'JBModelElementJBPriceCalc' => $modPath . '/jbmodel.element.jbprice.calc.php', + 'JBModelElementJBComments' => $modPath . '/jbmodel.element.jbcomments.php', + 'JBModelElementTextarea' => $modPath . '/jbmodel.element.textarea.php', + 'JBModelFavorite' => $modPath . '/jbmodel.favorite.php', + 'JBModelFilter' => $modPath . '/jbmodel.filter.php', + 'JBModelItem' => $modPath . '/jbmodel.item.php', + 'JBModelApp' => $modPath . '/jbmodel.app.php', + 'JBModelCategory' => $modPath . '/jbmodel.category.php', + 'JBModelOrder' => $modPath . '/jbmodel.order.php', + 'JBModelRelated' => $modPath . '/jbmodel.related.php', + 'JBModelSearchindex' => $modPath . '/jbmodel.searchindex.php', + 'JBModelValues' => $modPath . '/jbmodel.values.php', + 'JBModelSku' => $modPath . '/jbmodel.sku.php', + + // filter + 'JBFilterElement' => $filPath . '/element.php', + 'JBFilterElementAuthor' => $filPath . '/element.author.php', + 'JBFilterElementAuthorCheckbox' => $filPath . '/element.author.checkbox.php', + 'JBFilterElementAuthorRadio' => $filPath . '/element.author.radio.php', + 'JBFilterElementAuthorSelect' => $filPath . '/element.author.select.php', + 'JBFilterElementAuthorChosen' => $filPath . '/element.author.select.chosen.php', + 'JBFilterElementAuthorText' => $filPath . '/element.author.text.php', + 'JBFilterElementCategory' => $filPath . '/element.category.php', + 'JBFilterElementCategoryChosen' => $filPath . '/element.category.chosen.php', + 'JBFilterElementCategoryHidden' => $filPath . '/element.category.hidden.php', + 'JBFilterElementCheckbox' => $filPath . '/element.checkbox.php', + 'JBFilterElementCountry' => $filPath . '/element.country.php', + 'JBFilterElementCountryCheckbox' => $filPath . '/element.country.checkbox.php', + 'JBFilterElementCountryRadio' => $filPath . '/element.country.radio.php', + 'JBFilterElementCountrySelect' => $filPath . '/element.country.select.php', + 'JBFilterElementCountryChosen' => $filPath . '/element.country.select.chosen.php', + 'JBFilterElementDate' => $filPath . '/element.date.php', + 'JBFilterElementDateRange' => $filPath . '/element.date.range.php', + 'JBFilterElementFrontpage' => $filPath . '/element.frontpage.php', + 'JBFilterElementFrontpageJqueryUI' => $filPath . '/element.frontpage.jqueryui.php', + 'JBFilterElementHidden' => $filPath . '/element.hidden.php', + 'JBFilterElementImageexists' => $filPath . '/element.imageexists.php', + 'JBFilterElementImageexistsJqueryui' => $filPath . '/element.imageexists.jqueryui.php', + 'JBFilterElementJBColor' => $filPath . '/element.jbcolor.php', + 'JBFilterElementJBPriceCalc' => $filPath . '/element.jbpricecalc.php', + 'JBFilterElementJBPricePlain' => $filPath . '/element.jbpriceplain.php', + 'JBFilterElementJbselectcascade' => $filPath . '/element.jbselectcascade.php', + 'JBFilterElementJqueryui' => $filPath . '/element.jqueryui.php', + 'JBFilterElementName' => $filPath . '/element.name.php', + 'JBFilterElementNameCheckbox' => $filPath . '/element.name.checkbox.php', + 'JBFilterElementNameRadio' => $filPath . '/element.name.radio.php', + 'JBFilterElementNameSelect' => $filPath . '/element.name.select.php', + 'JBFilterElementNameChosen' => $filPath . '/element.name.select.chosen.php', + 'JBFilterElementRadio' => $filPath . '/element.radio.php', + 'JBFilterElementRating' => $filPath . '/element.rating.php', + 'JBFilterElementRatingRanges' => $filPath . '/element.rating.ranges.php', + 'JBFilterElementRatingSlider' => $filPath . '/element.rating.slider.php', + 'JBFilterElementSelect' => $filPath . '/element.select.php', + 'JBFilterElementSelectChosen' => $filPath . '/element.select.chosen.php', + 'JBFilterElementSlider' => $filPath . '/element.slider.php', + 'JBFilterElementTag' => $filPath . '/element.tag.php', + 'JBFilterElementTagCheckbox' => $filPath . '/element.tag.checkbox.php', + 'JBFilterElementTagRadio' => $filPath . '/element.tag.radio.php', + 'JBFilterElementTagSelect' => $filPath . '/element.tag.select.php', + 'JBFilterElementTagSelectChosen' => $filPath . '/element.tag.select.chosen.php', + 'JBFilterElementText' => $filPath . '/element.text.php', + 'JBFilterElementTextRange' => $filPath . '/element.text.range.php', + + // events + 'JBZooSystemPlugin' => $evtPath . '/jsystem.php', + 'JBEvent' => $evtPath . '/jbevent.php', + 'JBEventApplication' => $evtPath . '/jbevent.application.php', + 'JBEventBasket' => $evtPath . '/jbevent.basket.php', + 'JBEventCategory' => $evtPath . '/jbevent.category.php', + 'JBEventComment' => $evtPath . '/jbevent.comment.php', + 'JBEventElement' => $evtPath . '/jbevent.element.php', + 'JBEventItem' => $evtPath . '/jbevent.item.php', + 'JBEventJBZoo' => $evtPath . '/jbevent.jbzoo.php', + 'JBEventLayout' => $evtPath . '/jbevent.layout.php', + 'JBEventSubmission' => $evtPath . '/jbevent.submission.php', + 'JBEventTag' => $evtPath . '/jbevent.tag.php', + 'JBEventType' => $evtPath . '/jbevent.type.php', + ); + + foreach ($classList as $className => $path) { + JLoader::register($className, $path); + } + } + + /** + * Get domain name + * @param bool $isAny + * @return string + */ + static function getDomain($isAny = false) + { + if (defined('STDIN') || php_sapi_name() == "cli") { + return 'console'; + } + + $domain = ''; + if (function_exists('apache_request_headers')) { + $headers = apache_request_headers(); + $domain = isset($headers['Host']) ? $headers['Host'] : ''; + } + + if ($isAny && !$domain) { + $domain = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''; + } + + $domain = preg_replace('#^www\.#', '', $domain); + list($domain) = explode(':', $domain); + + return $domain; + } + + /** + * Load lang files + */ + private function _initLanguages() + { + $lang = JFactory::getLanguage(); + $lang->load('com_zoo'); + $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); + $lang->load('com_zoo', JPATH_ADMINISTRATOR); + } + + /** + * Register and connect events + */ + private function _initEvents() + { + $event = $this->app->event; + $dispatcher = $event->dispatcher; + + $event->register('JBEventApplication'); + $dispatcher->connect('application:init', array('JBEventApplication', 'init')); + $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); + $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); + $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); + $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); + $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); + $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); + $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); + $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); + + $event->register('JBEventCategory'); + $dispatcher->connect('category:init', array('JBEventCategory', 'init')); + $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); + $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); + $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); + + $event->register('JBEventItem'); + $dispatcher->connect('item:init', array('JBEventItem', 'init')); + $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); + $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); + $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); + $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); + $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); + $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); + $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); + $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); + $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); + + $event->register('JBEventComment'); + $dispatcher->connect('comment:init', array('JBEventComment', 'init')); + $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); + $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); + $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); + + $event->register('JBEventSubmission'); + $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); + $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); + $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); + $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); + + $event->register('JBEventElement'); + $dispatcher->connect('element:download', array('JBEventElement', 'download')); + $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); + $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); + $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); + $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); + $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); + $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); + $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); + $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); + $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); + + $event->register('JBEventLayout'); + $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); + + $event->register('JBEventTag'); + $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); + $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); + + $event->register('JBEventType'); + $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); + $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); + $dispatcher->connect('type:copied', array('JBEventType', 'copied')); + $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); + $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); + $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); + $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); + + $event->register('JBEventJBZoo'); + $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); + $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); + + $event->register('JBEventBasket'); + $dispatcher->connect('basket:beforeSave', array('JBEventBasket', 'beforeSave')); + $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); + $dispatcher->connect('basket:afterSave', array('JBEventBasket', 'afterSave')); + $dispatcher->connect('basket:updated', array('JBEventBasket', 'updated')); + + $dispatcher->connect('basket:addItem', array('JBEventBasket', 'addItem')); + $dispatcher->connect('basket:updateItem', array('JBEventBasket', 'updateItem')); + $dispatcher->connect('basket:changeQuantity', array('JBEventBasket', 'changeQuantity')); + $dispatcher->connect('basket:removeItem', array('JBEventBasket', 'removeItem')); + $dispatcher->connect('basket:removeItems', array('JBEventBasket', 'removeItems')); + $dispatcher->connect('basket:recount', array('JBEventBasket', 'recount')); + + $dispatcher->connect('basket:orderStatus', array('JBEventBasket', 'orderStatus')); + $dispatcher->connect('basket:paymentStatus', array('JBEventBasket', 'paymentStatus')); + $dispatcher->connect('basket:shippingStatus', array('JBEventBasket', 'shippingStatus')); + + $dispatcher->connect('basket:paymentSuccess', array('JBEventBasket', 'paymentSuccess')); + $dispatcher->connect('basket:paymentFail', array('JBEventBasket', 'paymentFail')); + $dispatcher->connect('basket:paymentCallback', array('JBEventBasket', 'paymentCallback')); + } + + /** + * Init assets for admin path + */ + private function _initAssets() + { + if (!$this->app->jbenv->isSite() && !$this->app->jbrequest->isAjax()) { + $this->app->jbassets->admin(); + $this->_initAdminMenu(); + } + } + + /** + * Get hash + * @param $string + * @return string + */ + static public function getHash($string) + { + return ''; + } + + /** + * Init Admin menu + */ + private function _initAdminMenu() + { + $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); + if (!$config->get('adminmenu_show', 1)) { + return false; + } + + $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); + + $appList = JBModelApp::model()->getSimpleList(); + + $findJBZooApp = false; + $dispatched = false; + foreach ($appList as $app) { + if ($app->application_group == JBZOO_APP_GROUP) { + $findJBZooApp = true; + if ($curApp == $app->id) { + $dispatched = true; + } + } + } + + if (!$findJBZooApp) { + return false; + } + + $router = $this->app->jbrouter; + + $menuItems = array(); + + if (!empty($appList)) { + foreach ($appList as $app) { + + $menuItems['app-' . $app->alias] = array( + 'name' => $app->name, + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), + 'children' => array( + 'add-item' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')) + ), + 'sep-1' => 'divider', + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')) + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')) + ), + 'frontpage' => array( + 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')) + ), + 'comments' => array( + 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')) + ), + 'sep-1' => 'divider', + 'config' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')) + ), + ) + ); + } + } + + $menuItems['sep-1'] = 'divider'; + + if ($dispatched) { + $menuItems['orders'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_ORDERS'), + 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jborder')), + 'children' => array( + 'cart-configs' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CART_CONFIG'), + 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jbcart')), + ) + ) + ); + } + + $menuItems['sep-2'] = 'divider'; + + $menuItems['item-config'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), + 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), + ); + + $types = $this->app->jbtype->getSimpleList(); + if (!empty($types)) { + $children = array(); + foreach ($types as $alias => $type) { + $children['type-' . $alias] = array( + 'name' => $type, + 'url' => $router->admin(array('controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => array('0' => $alias))) + ); + } + + $menuItems['item-config']['children'] = $children; + } + + if ($dispatched) { + $menuItems['sep-3'] = 'divider'; + + $menuItems['jbzoo-admin'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), + 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), + 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), + 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), + ), + ), + ); + + $menuItems['jbzoo-import'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDART'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), + ), + ), + ); + + $menuItems['jbzoo-export'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), + ), + 'types' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), + ), + 'yandexyml' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDART'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), + ), + 'zoobackup' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), + ), + ), + ); + + $menuItems['sep-4'] = 'divider'; + + $menuItems['jbzoo-info'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_INFO'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), + ), + 'server' => array( + 'name' => 'Get Last JBZoo', + 'url' => 'https://github.com/JBZoo/JBZoo', + 'target' => '_blank', + ), + ) + ); + } + + $menuItems['jbzoo-support'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), + 'url' => 'http://forum.jbzoo.com/', + 'target' => '_blank', + ); + + $this->app->jbassets->addVar('JBAdminItems', array( + 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), + 'items' => $menuItems, + )); + } + + /** + * Get group name + * @return string + */ + private function _getGroup() + { + return $this->_group; + } + + /** + * Register new path in system + * @param string $path + * @param string $pathName + * @return mixed + */ + private function _addPath($path, $pathName) + { + if ($fullPath = $this->app->path->path($path)) { + return $this->app->path->register($fullPath, $pathName); + } + + return null; + } +} diff --git a/patches/2.2.4/media/zoo/applications/jbuniversal/framework/jbzoo.php b/patches/2.2.4/media/zoo/applications/jbuniversal/framework/jbzoo.php index b01729e..240c9a1 100644 --- a/patches/2.2.4/media/zoo/applications/jbuniversal/framework/jbzoo.php +++ b/patches/2.2.4/media/zoo/applications/jbuniversal/framework/jbzoo.php @@ -1 +1,642 @@ - */ // no direct access defined('_JEXEC') or die('Restricted access'); /** * Class JBZoo */ class JBZoo { /** * @var Application */ public $app = null; /** * App group name * @var string */ private $_group = JBZOO_APP_GROUP; /** * Init JBZoo application * @static * @return JBZoo */ public static function init() { static $jbzoo; if (!isset($jbzoo)) { $jbzoo = new self(); } return $jbzoo; } /** * Initialization JBZoo App */ private function __construct() { $this->app = App::getInstance('zoo'); $this->_initPaths(); $this->_initClasses(); $this->_initEvents(); $this->_initAssets(); } /** * Add directory path */ private function _initPaths() { $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); $this->_addPath('jbapp:framework', 'jbzoo'); $this->_addPath('jbapp:assets', 'jbassets'); $this->_addPath('jbassets:zoo', 'assets'); $this->_addPath('jbapp:config', 'jbconfig'); $this->_addPath('jbzoo:elements', 'jbelements'); $this->_addPath('jbapp:cart-elements', 'cart-elements'); $this->_addPath('jbapp:types', 'jbtypes'); $this->_addPath('jbzoo:helpers', 'helpers'); $this->_addPath('jbzoo:helpers-std', 'helpers'); $this->_addPath('helpers:fields', 'fields'); $this->_addPath('jbzoo:tables', 'tables'); $this->_addPath('jbzoo:classes-std', 'classes'); $this->_addPath('jbzoo:render', 'renderer'); $this->_addPath('jbzoo:views', 'jbviews'); $this->_addPath('jbapp:config', 'jbxml'); $this->_addPath('jbviews:', 'partials'); $this->_addPath('jbapp:joomla/elements', 'fields'); $this->_addPath('jbapp:templates', 'jbtmpl'); $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); $this->_addPath('modules:mod_jbzoo_currency', 'mod_jbzoo_currency'); $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); if ($this->app->jbenv->isSite()) { $this->_addPath('jbzoo:controllers', 'controllers'); } require $this->app->path->path('jbzoo:controllers/base.php'); JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); } /** * Include models classes */ private function _initClasses() { jimport('joomla.html.parameter.element'); $this->app->loader->register('AppValidator', 'classes:validator.php'); // defines define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); define('ZOO_TABLE_JBZOO_ORDER', '#__zoo_jbzoo_orders'); $frmwork = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework'; $clsPath = $frmwork . '/classes'; $modPath = $frmwork . '/models'; $filPath = $frmwork . '/render/filter'; $evtPath = $frmwork . '/events'; $classList = array( 'JBDatabaseQuery' => $clsPath . '/database/JBDatabaseQuery.php', 'JBDatabaseQueryElement' => $clsPath . '/database/JBDatabaseQueryElement.php', 'JBCartOrder' => $clsPath . '/cart/jborder.php', 'JBCart' => $clsPath . '/cart/jbcart.php', 'JBCartValue' => $clsPath . '/cart/jbvalue.php', 'JBCartVariant' => $clsPath . '/cart/jbvariant.php', 'JBCartVariantList' => $clsPath . '/cart/jbvariantlist.php', 'JBTemplate' => $clsPath . '/jbtemplate.php', // models 'JBModel' => $modPath . '/jbmodel.php', 'JBModelConfig' => $modPath . '/jbmodel.config.php', 'JBModelElement' => $modPath . '/jbmodel.element.php', 'JBModelAutoComplete' => $modPath . '/jbmodel.autocomplete.php', 'JBModelElementCountry' => $modPath . '/jbmodel.element.country.php', 'JBModelElementDate' => $modPath . '/jbmodel.element.date.php', 'JBModelElementItemDate' => $modPath . '/jbmodel.element.itemdate.php', 'JBModelElementItemauthor' => $modPath . '/jbmodel.element.itemauthor.php', 'JBModelElementItemCategory' => $modPath . '/jbmodel.element.itemcategory.php', 'JBModelElementItemCreated' => $modPath . '/jbmodel.element.itemcreated.php', 'JBModelElementItemFrontpage' => $modPath . '/jbmodel.element.itemfrontpage.php', 'JBModelElementItemModified' => $modPath . '/jbmodel.element.itemmodified.php', 'JBModelElementItemName' => $modPath . '/jbmodel.element.itemname.php', 'JBModelElementItemPublish_down' => $modPath . '/jbmodel.element.itempublish_down.php', 'JBModelElementItemPublish_up' => $modPath . '/jbmodel.element.itempublish_up.php', 'JBModelElementItemTag' => $modPath . '/jbmodel.element.itemtag.php', 'JBModelElementJBImage' => $modPath . '/jbmodel.element.jbimage.php', 'JBModelElementJBSelectCascade' => $modPath . '/jbmodel.element.jbselectcascade.php', 'JBModelElementRange' => $modPath . '/jbmodel.element.range.php', 'JBModelElementRating' => $modPath . '/jbmodel.element.rating.php', 'JBModelElementJBPrice' => $modPath . '/jbmodel.element.jbprice.php', 'JBModelElementJBPricePlain' => $modPath . '/jbmodel.element.jbprice.plain.php', 'JBModelElementJBPriceCalc' => $modPath . '/jbmodel.element.jbprice.calc.php', 'JBModelElementJBComments' => $modPath . '/jbmodel.element.jbcomments.php', 'JBModelElementTextarea' => $modPath . '/jbmodel.element.textarea.php', 'JBModelFavorite' => $modPath . '/jbmodel.favorite.php', 'JBModelFilter' => $modPath . '/jbmodel.filter.php', 'JBModelItem' => $modPath . '/jbmodel.item.php', 'JBModelApp' => $modPath . '/jbmodel.app.php', 'JBModelCategory' => $modPath . '/jbmodel.category.php', 'JBModelOrder' => $modPath . '/jbmodel.order.php', 'JBModelRelated' => $modPath . '/jbmodel.related.php', 'JBModelSearchindex' => $modPath . '/jbmodel.searchindex.php', 'JBModelValues' => $modPath . '/jbmodel.values.php', 'JBModelSku' => $modPath . '/jbmodel.sku.php', // filter 'JBFilterElement' => $filPath . '/element.php', 'JBFilterElementAuthor' => $filPath . '/element.author.php', 'JBFilterElementAuthorCheckbox' => $filPath . '/element.author.checkbox.php', 'JBFilterElementAuthorRadio' => $filPath . '/element.author.radio.php', 'JBFilterElementAuthorSelect' => $filPath . '/element.author.select.php', 'JBFilterElementAuthorChosen' => $filPath . '/element.author.select.chosen.php', 'JBFilterElementAuthorText' => $filPath . '/element.author.text.php', 'JBFilterElementCategory' => $filPath . '/element.category.php', 'JBFilterElementCategoryChosen' => $filPath . '/element.category.chosen.php', 'JBFilterElementCategoryHidden' => $filPath . '/element.category.hidden.php', 'JBFilterElementCheckbox' => $filPath . '/element.checkbox.php', 'JBFilterElementCountry' => $filPath . '/element.country.php', 'JBFilterElementCountryCheckbox' => $filPath . '/element.country.checkbox.php', 'JBFilterElementCountryRadio' => $filPath . '/element.country.radio.php', 'JBFilterElementCountrySelect' => $filPath . '/element.country.select.php', 'JBFilterElementCountryChosen' => $filPath . '/element.country.select.chosen.php', 'JBFilterElementDate' => $filPath . '/element.date.php', 'JBFilterElementDateRange' => $filPath . '/element.date.range.php', 'JBFilterElementFrontpage' => $filPath . '/element.frontpage.php', 'JBFilterElementFrontpageJqueryUI' => $filPath . '/element.frontpage.jqueryui.php', 'JBFilterElementHidden' => $filPath . '/element.hidden.php', 'JBFilterElementImageexists' => $filPath . '/element.imageexists.php', 'JBFilterElementImageexistsJqueryui' => $filPath . '/element.imageexists.jqueryui.php', 'JBFilterElementJBColor' => $filPath . '/element.jbcolor.php', 'JBFilterElementJBPriceCalc' => $filPath . '/element.jbpricecalc.php', 'JBFilterElementJBPricePlain' => $filPath . '/element.jbpriceplain.php', 'JBFilterElementJbselectcascade' => $filPath . '/element.jbselectcascade.php', 'JBFilterElementJqueryui' => $filPath . '/element.jqueryui.php', 'JBFilterElementName' => $filPath . '/element.name.php', 'JBFilterElementNameCheckbox' => $filPath . '/element.name.checkbox.php', 'JBFilterElementNameRadio' => $filPath . '/element.name.radio.php', 'JBFilterElementNameSelect' => $filPath . '/element.name.select.php', 'JBFilterElementNameChosen' => $filPath . '/element.name.select.chosen.php', 'JBFilterElementRadio' => $filPath . '/element.radio.php', 'JBFilterElementRating' => $filPath . '/element.rating.php', 'JBFilterElementRatingRanges' => $filPath . '/element.rating.ranges.php', 'JBFilterElementRatingSlider' => $filPath . '/element.rating.slider.php', 'JBFilterElementSelect' => $filPath . '/element.select.php', 'JBFilterElementSelectChosen' => $filPath . '/element.select.chosen.php', 'JBFilterElementSlider' => $filPath . '/element.slider.php', 'JBFilterElementTag' => $filPath . '/element.tag.php', 'JBFilterElementTagCheckbox' => $filPath . '/element.tag.checkbox.php', 'JBFilterElementTagRadio' => $filPath . '/element.tag.radio.php', 'JBFilterElementTagSelect' => $filPath . '/element.tag.select.php', 'JBFilterElementTagSelectChosen' => $filPath . '/element.tag.select.chosen.php', 'JBFilterElementText' => $filPath . '/element.text.php', 'JBFilterElementTextRange' => $filPath . '/element.text.range.php', // events 'JBZooSystemPlugin' => $evtPath . '/jsystem.php', 'JBEvent' => $evtPath . '/jbevent.php', 'JBEventApplication' => $evtPath . '/jbevent.application.php', 'JBEventBasket' => $evtPath . '/jbevent.basket.php', 'JBEventCategory' => $evtPath . '/jbevent.category.php', 'JBEventComment' => $evtPath . '/jbevent.comment.php', 'JBEventElement' => $evtPath . '/jbevent.element.php', 'JBEventItem' => $evtPath . '/jbevent.item.php', 'JBEventJBZoo' => $evtPath . '/jbevent.jbzoo.php', 'JBEventLayout' => $evtPath . '/jbevent.layout.php', 'JBEventSubmission' => $evtPath . '/jbevent.submission.php', 'JBEventTag' => $evtPath . '/jbevent.tag.php', 'JBEventType' => $evtPath . '/jbevent.type.php', ); foreach ($classList as $className => $path) { JLoader::register($className, $path); } } /** * Get domain name * @param bool $isAny * @return string */ static function getDomain($isAny = false) { if (defined('STDIN') || php_sapi_name() == "cli") { return 'console'; } $domain = ''; if (function_exists('apache_request_headers')) { $headers = apache_request_headers(); $domain = isset($headers['Host']) ? $headers['Host'] : ''; } if ($isAny && !$domain) { $domain = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''; } $domain = preg_replace('#^www\.#', '', $domain); list($domain) = explode(':', $domain); return $domain; } /** * Load lang files */ private function _initLanguages() { $lang = JFactory::getLanguage(); $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); } /** * Register and connect events */ private function _initEvents() { $event = $this->app->event; $dispatcher = $event->dispatcher; $event->register('JBEventApplication'); $dispatcher->connect('application:init', array('JBEventApplication', 'init')); $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); $event->register('JBEventCategory'); $dispatcher->connect('category:init', array('JBEventCategory', 'init')); $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); $event->register('JBEventItem'); $dispatcher->connect('item:init', array('JBEventItem', 'init')); $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); $event->register('JBEventComment'); $dispatcher->connect('comment:init', array('JBEventComment', 'init')); $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); $event->register('JBEventSubmission'); $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); $event->register('JBEventElement'); $dispatcher->connect('element:download', array('JBEventElement', 'download')); $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); $event->register('JBEventLayout'); $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); $event->register('JBEventTag'); $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); $event->register('JBEventType'); $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); $dispatcher->connect('type:copied', array('JBEventType', 'copied')); $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); $event->register('JBEventJBZoo'); $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); $event->register('JBEventBasket'); $dispatcher->connect('basket:beforeSave', array('JBEventBasket', 'beforeSave')); $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); $dispatcher->connect('basket:afterSave', array('JBEventBasket', 'afterSave')); $dispatcher->connect('basket:updated', array('JBEventBasket', 'updated')); $dispatcher->connect('basket:addItem', array('JBEventBasket', 'addItem')); $dispatcher->connect('basket:updateItem', array('JBEventBasket', 'updateItem')); $dispatcher->connect('basket:changeQuantity', array('JBEventBasket', 'changeQuantity')); $dispatcher->connect('basket:removeItem', array('JBEventBasket', 'removeItem')); $dispatcher->connect('basket:removeItems', array('JBEventBasket', 'removeItems')); $dispatcher->connect('basket:recount', array('JBEventBasket', 'recount')); $dispatcher->connect('basket:orderStatus', array('JBEventBasket', 'orderStatus')); $dispatcher->connect('basket:paymentStatus', array('JBEventBasket', 'paymentStatus')); $dispatcher->connect('basket:shippingStatus', array('JBEventBasket', 'shippingStatus')); $dispatcher->connect('basket:paymentSuccess', array('JBEventBasket', 'paymentSuccess')); $dispatcher->connect('basket:paymentFail', array('JBEventBasket', 'paymentFail')); $dispatcher->connect('basket:paymentCallback', array('JBEventBasket', 'paymentCallback')); } /** * Init assets for admin path */ private function _initAssets() { if (!$this->app->jbenv->isSite() && !$this->app->jbrequest->isAjax()) { $this->app->jbassets->admin(); $this->_initLanguages(); $this->_initAdminMenu(); } } /** * Get hash * @param $string * @return string */ static public function getHash($string) { return ''; } /** * Init Admin menu */ private function _initAdminMenu() { $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); if (!$config->get('adminmenu_show', 1)) { return false; } $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); $appList = JBModelApp::model()->getSimpleList(); $findJBZooApp = false; $dispatched = false; foreach ($appList as $app) { if ($app->application_group == JBZOO_APP_GROUP) { $findJBZooApp = true; if ($curApp == $app->id) { $dispatched = true; } } } if (!$findJBZooApp) { return false; } $router = $this->app->jbrouter; $menuItems = array(); if (!empty($appList)) { foreach ($appList as $app) { $menuItems['app-' . $app->alias] = array( 'name' => $app->name, 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), 'children' => array( 'add-item' => array( 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')), ), 'sep-1' => 'divider', 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')), ), 'frontpage' => array( 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')), ), 'comments' => array( 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')), ), 'sep-1' => 'divider', 'config' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')), ), ), ); } } $menuItems['sep-1'] = 'divider'; if ($dispatched) { if ((int)JBModelConfig::model()->get('enable', 1, 'cart.config')) { $menuItems['orders'] = array( 'name' => JText::_('JBZOO_ADMINMENU_ORDERS'), 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jborder')), 'children' => array( 'cart-configs' => array( 'name' => JText::_('JBZOO_ADMINMENU_CART_CONFIG'), 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jbcart')), ), ), ); $menuItems['sep-2'] = 'divider'; } } $menuItems['item-config'] = array( 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), ); $types = $this->app->jbtype->getSimpleList(); if (!empty($types)) { $children = array(); foreach ($types as $alias => $type) { $children['type-' . $alias] = array( 'name' => $type, 'url' => $router->admin(array('controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => array('0' => $alias))), ); } $menuItems['item-config']['children'] = $children; } if ($dispatched) { $menuItems['sep-3'] = 'divider'; $menuItems['jbzoo-admin'] = array( 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), ), ), ); $menuItems['jbzoo-import'] = array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDART'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), ), ), ); $menuItems['jbzoo-export'] = array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), ), 'types' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), ), 'yandexyml' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDART'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), ), 'zoobackup' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), ), ), ); $menuItems['sep-4'] = 'divider'; $menuItems['jbzoo-info'] = array( 'name' => JText::_('JBZOO_ADMINMENU_INFO'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), ), 'server' => array( 'name' => 'Get Last JBZoo', 'url' => 'https://github.com/JBZoo/JBZoo', 'target' => '_blank', ), ) ); } $menuItems['jbzoo-support'] = array( 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), 'url' => 'http://forum.jbzoo.com/', 'target' => '_blank', ); $this->app->jbassets->addVar('JBAdminItems', array( 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), 'items' => $menuItems, )); } /** * Get group name * @return string */ private function _getGroup() { return $this->_group; } /** * Register new path in system * @param string $path * @param string $pathName * @return mixed */ private function _addPath($path, $pathName) { if ($fullPath = $this->app->path->path($path)) { return $this->app->path->register($fullPath, $pathName); } return null; } } \ No newline at end of file + + */ + +// no direct access +defined('_JEXEC') or die('Restricted access'); + +/** + * Class JBZoo + */ +class JBZoo +{ + /** + * @var Application + */ + public $app = null; + + /** + * App group name + * @var string + */ + private $_group = JBZOO_APP_GROUP; + + /** + * Init JBZoo application + * @static + * @return JBZoo + */ + public static function init() + { + static $jbzoo; + + if (!isset($jbzoo)) { + $jbzoo = new self(); + } + + return $jbzoo; + } + + /** + * Initialization JBZoo App + */ + private function __construct() + { + $this->app = App::getInstance('zoo'); + + $this->_initPaths(); + $this->_initClasses(); + $this->_initEvents(); + $this->_initAssets(); + } + + /** + * Add directory path + */ + private function _initPaths() + { + $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); + $this->_addPath('jbapp:framework', 'jbzoo'); + $this->_addPath('jbapp:assets', 'jbassets'); + $this->_addPath('jbassets:zoo', 'assets'); + $this->_addPath('jbapp:config', 'jbconfig'); + $this->_addPath('jbzoo:elements', 'jbelements'); + $this->_addPath('jbapp:cart-elements', 'cart-elements'); + $this->_addPath('jbapp:types', 'jbtypes'); + + $this->_addPath('jbzoo:helpers', 'helpers'); + $this->_addPath('jbzoo:helpers-std', 'helpers'); + $this->_addPath('helpers:fields', 'fields'); + + $this->_addPath('jbzoo:tables', 'tables'); + $this->_addPath('jbzoo:classes-std', 'classes'); + $this->_addPath('jbzoo:render', 'renderer'); + $this->_addPath('jbzoo:views', 'jbviews'); + $this->_addPath('jbapp:config', 'jbxml'); + $this->_addPath('jbviews:', 'partials'); + $this->_addPath('jbapp:joomla/elements', 'fields'); + $this->_addPath('jbapp:templates', 'jbtmpl'); + + $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); + $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); + $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); + $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); + $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); + $this->_addPath('modules:mod_jbzoo_currency', 'mod_jbzoo_currency'); + + $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); + + if ($this->app->jbenv->isSite()) { + $this->_addPath('jbzoo:controllers', 'controllers'); + } + + require $this->app->path->path('jbzoo:controllers/base.php'); + + JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); + } + + /** + * Include models classes + */ + private function _initClasses() + { + jimport('joomla.html.parameter.element'); + + $this->app->loader->register('AppValidator', 'classes:validator.php'); + + // defines + define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); + define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); + define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); + define('ZOO_TABLE_JBZOO_ORDER', '#__zoo_jbzoo_orders'); + + $frmwork = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework'; + $clsPath = $frmwork . '/classes'; + $modPath = $frmwork . '/models'; + $filPath = $frmwork . '/render/filter'; + $evtPath = $frmwork . '/events'; + + $classList = array( + 'JBDatabaseQuery' => $clsPath . '/database/JBDatabaseQuery.php', + 'JBDatabaseQueryElement' => $clsPath . '/database/JBDatabaseQueryElement.php', + 'JBCartOrder' => $clsPath . '/cart/jborder.php', + 'JBCart' => $clsPath . '/cart/jbcart.php', + 'JBCartValue' => $clsPath . '/cart/jbvalue.php', + 'JBCartVariant' => $clsPath . '/cart/jbvariant.php', + 'JBCartVariantList' => $clsPath . '/cart/jbvariantlist.php', + 'JBTemplate' => $clsPath . '/jbtemplate.php', + + // models + 'JBModel' => $modPath . '/jbmodel.php', + 'JBModelConfig' => $modPath . '/jbmodel.config.php', + 'JBModelElement' => $modPath . '/jbmodel.element.php', + 'JBModelAutoComplete' => $modPath . '/jbmodel.autocomplete.php', + 'JBModelElementCountry' => $modPath . '/jbmodel.element.country.php', + 'JBModelElementDate' => $modPath . '/jbmodel.element.date.php', + 'JBModelElementItemDate' => $modPath . '/jbmodel.element.itemdate.php', + 'JBModelElementItemauthor' => $modPath . '/jbmodel.element.itemauthor.php', + 'JBModelElementItemCategory' => $modPath . '/jbmodel.element.itemcategory.php', + 'JBModelElementItemCreated' => $modPath . '/jbmodel.element.itemcreated.php', + 'JBModelElementItemFrontpage' => $modPath . '/jbmodel.element.itemfrontpage.php', + 'JBModelElementItemModified' => $modPath . '/jbmodel.element.itemmodified.php', + 'JBModelElementItemName' => $modPath . '/jbmodel.element.itemname.php', + 'JBModelElementItemPublish_down' => $modPath . '/jbmodel.element.itempublish_down.php', + 'JBModelElementItemPublish_up' => $modPath . '/jbmodel.element.itempublish_up.php', + 'JBModelElementItemTag' => $modPath . '/jbmodel.element.itemtag.php', + 'JBModelElementJBImage' => $modPath . '/jbmodel.element.jbimage.php', + 'JBModelElementJBSelectCascade' => $modPath . '/jbmodel.element.jbselectcascade.php', + 'JBModelElementRange' => $modPath . '/jbmodel.element.range.php', + 'JBModelElementRating' => $modPath . '/jbmodel.element.rating.php', + 'JBModelElementJBPrice' => $modPath . '/jbmodel.element.jbprice.php', + 'JBModelElementJBPricePlain' => $modPath . '/jbmodel.element.jbprice.plain.php', + 'JBModelElementJBPriceCalc' => $modPath . '/jbmodel.element.jbprice.calc.php', + 'JBModelElementJBComments' => $modPath . '/jbmodel.element.jbcomments.php', + 'JBModelElementTextarea' => $modPath . '/jbmodel.element.textarea.php', + 'JBModelFavorite' => $modPath . '/jbmodel.favorite.php', + 'JBModelFilter' => $modPath . '/jbmodel.filter.php', + 'JBModelItem' => $modPath . '/jbmodel.item.php', + 'JBModelApp' => $modPath . '/jbmodel.app.php', + 'JBModelCategory' => $modPath . '/jbmodel.category.php', + 'JBModelOrder' => $modPath . '/jbmodel.order.php', + 'JBModelRelated' => $modPath . '/jbmodel.related.php', + 'JBModelSearchindex' => $modPath . '/jbmodel.searchindex.php', + 'JBModelValues' => $modPath . '/jbmodel.values.php', + 'JBModelSku' => $modPath . '/jbmodel.sku.php', + + // filter + 'JBFilterElement' => $filPath . '/element.php', + 'JBFilterElementAuthor' => $filPath . '/element.author.php', + 'JBFilterElementAuthorCheckbox' => $filPath . '/element.author.checkbox.php', + 'JBFilterElementAuthorRadio' => $filPath . '/element.author.radio.php', + 'JBFilterElementAuthorSelect' => $filPath . '/element.author.select.php', + 'JBFilterElementAuthorChosen' => $filPath . '/element.author.select.chosen.php', + 'JBFilterElementAuthorText' => $filPath . '/element.author.text.php', + 'JBFilterElementCategory' => $filPath . '/element.category.php', + 'JBFilterElementCategoryChosen' => $filPath . '/element.category.chosen.php', + 'JBFilterElementCategoryHidden' => $filPath . '/element.category.hidden.php', + 'JBFilterElementCheckbox' => $filPath . '/element.checkbox.php', + 'JBFilterElementCountry' => $filPath . '/element.country.php', + 'JBFilterElementCountryCheckbox' => $filPath . '/element.country.checkbox.php', + 'JBFilterElementCountryRadio' => $filPath . '/element.country.radio.php', + 'JBFilterElementCountrySelect' => $filPath . '/element.country.select.php', + 'JBFilterElementCountryChosen' => $filPath . '/element.country.select.chosen.php', + 'JBFilterElementDate' => $filPath . '/element.date.php', + 'JBFilterElementDateRange' => $filPath . '/element.date.range.php', + 'JBFilterElementFrontpage' => $filPath . '/element.frontpage.php', + 'JBFilterElementFrontpageJqueryUI' => $filPath . '/element.frontpage.jqueryui.php', + 'JBFilterElementHidden' => $filPath . '/element.hidden.php', + 'JBFilterElementImageexists' => $filPath . '/element.imageexists.php', + 'JBFilterElementImageexistsJqueryui' => $filPath . '/element.imageexists.jqueryui.php', + 'JBFilterElementJBColor' => $filPath . '/element.jbcolor.php', + 'JBFilterElementJBPriceCalc' => $filPath . '/element.jbpricecalc.php', + 'JBFilterElementJBPricePlain' => $filPath . '/element.jbpriceplain.php', + 'JBFilterElementJbselectcascade' => $filPath . '/element.jbselectcascade.php', + 'JBFilterElementJqueryui' => $filPath . '/element.jqueryui.php', + 'JBFilterElementName' => $filPath . '/element.name.php', + 'JBFilterElementNameCheckbox' => $filPath . '/element.name.checkbox.php', + 'JBFilterElementNameRadio' => $filPath . '/element.name.radio.php', + 'JBFilterElementNameSelect' => $filPath . '/element.name.select.php', + 'JBFilterElementNameChosen' => $filPath . '/element.name.select.chosen.php', + 'JBFilterElementRadio' => $filPath . '/element.radio.php', + 'JBFilterElementRating' => $filPath . '/element.rating.php', + 'JBFilterElementRatingRanges' => $filPath . '/element.rating.ranges.php', + 'JBFilterElementRatingSlider' => $filPath . '/element.rating.slider.php', + 'JBFilterElementSelect' => $filPath . '/element.select.php', + 'JBFilterElementSelectChosen' => $filPath . '/element.select.chosen.php', + 'JBFilterElementSlider' => $filPath . '/element.slider.php', + 'JBFilterElementTag' => $filPath . '/element.tag.php', + 'JBFilterElementTagCheckbox' => $filPath . '/element.tag.checkbox.php', + 'JBFilterElementTagRadio' => $filPath . '/element.tag.radio.php', + 'JBFilterElementTagSelect' => $filPath . '/element.tag.select.php', + 'JBFilterElementTagSelectChosen' => $filPath . '/element.tag.select.chosen.php', + 'JBFilterElementText' => $filPath . '/element.text.php', + 'JBFilterElementTextRange' => $filPath . '/element.text.range.php', + + // events + 'JBZooSystemPlugin' => $evtPath . '/jsystem.php', + 'JBEvent' => $evtPath . '/jbevent.php', + 'JBEventApplication' => $evtPath . '/jbevent.application.php', + 'JBEventBasket' => $evtPath . '/jbevent.basket.php', + 'JBEventCategory' => $evtPath . '/jbevent.category.php', + 'JBEventComment' => $evtPath . '/jbevent.comment.php', + 'JBEventElement' => $evtPath . '/jbevent.element.php', + 'JBEventItem' => $evtPath . '/jbevent.item.php', + 'JBEventJBZoo' => $evtPath . '/jbevent.jbzoo.php', + 'JBEventLayout' => $evtPath . '/jbevent.layout.php', + 'JBEventSubmission' => $evtPath . '/jbevent.submission.php', + 'JBEventTag' => $evtPath . '/jbevent.tag.php', + 'JBEventType' => $evtPath . '/jbevent.type.php', + ); + + foreach ($classList as $className => $path) { + JLoader::register($className, $path); + } + } + + /** + * Get domain name + * @param bool $isAny + * @return string + */ + static function getDomain($isAny = false) + { + if (defined('STDIN') || php_sapi_name() == "cli") { + return 'console'; + } + + $domain = ''; + if (function_exists('apache_request_headers')) { + $headers = apache_request_headers(); + $domain = isset($headers['Host']) ? $headers['Host'] : ''; + } + + if ($isAny && !$domain) { + $domain = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''; + } + + $domain = preg_replace('#^www\.#', '', $domain); + list($domain) = explode(':', $domain); + + return $domain; + } + + /** + * Load lang files + */ + private function _initLanguages() + { + $lang = JFactory::getLanguage(); + $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); + } + + /** + * Register and connect events + */ + private function _initEvents() + { + $event = $this->app->event; + $dispatcher = $event->dispatcher; + + $event->register('JBEventApplication'); + $dispatcher->connect('application:init', array('JBEventApplication', 'init')); + $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); + $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); + $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); + $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); + $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); + $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); + $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); + $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); + + $event->register('JBEventCategory'); + $dispatcher->connect('category:init', array('JBEventCategory', 'init')); + $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); + $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); + $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); + + $event->register('JBEventItem'); + $dispatcher->connect('item:init', array('JBEventItem', 'init')); + $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); + $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); + $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); + $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); + $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); + $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); + $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); + $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); + $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); + + $event->register('JBEventComment'); + $dispatcher->connect('comment:init', array('JBEventComment', 'init')); + $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); + $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); + $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); + + $event->register('JBEventSubmission'); + $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); + $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); + $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); + $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); + + $event->register('JBEventElement'); + $dispatcher->connect('element:download', array('JBEventElement', 'download')); + $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); + $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); + $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); + $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); + $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); + $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); + $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); + $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); + $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); + + $event->register('JBEventLayout'); + $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); + + $event->register('JBEventTag'); + $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); + $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); + + $event->register('JBEventType'); + $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); + $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); + $dispatcher->connect('type:copied', array('JBEventType', 'copied')); + $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); + $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); + $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); + $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); + + $event->register('JBEventJBZoo'); + $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); + $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); + + $event->register('JBEventBasket'); + $dispatcher->connect('basket:beforeSave', array('JBEventBasket', 'beforeSave')); + $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); + $dispatcher->connect('basket:afterSave', array('JBEventBasket', 'afterSave')); + $dispatcher->connect('basket:updated', array('JBEventBasket', 'updated')); + + $dispatcher->connect('basket:addItem', array('JBEventBasket', 'addItem')); + $dispatcher->connect('basket:updateItem', array('JBEventBasket', 'updateItem')); + $dispatcher->connect('basket:changeQuantity', array('JBEventBasket', 'changeQuantity')); + $dispatcher->connect('basket:removeItem', array('JBEventBasket', 'removeItem')); + $dispatcher->connect('basket:removeItems', array('JBEventBasket', 'removeItems')); + $dispatcher->connect('basket:recount', array('JBEventBasket', 'recount')); + + $dispatcher->connect('basket:orderStatus', array('JBEventBasket', 'orderStatus')); + $dispatcher->connect('basket:paymentStatus', array('JBEventBasket', 'paymentStatus')); + $dispatcher->connect('basket:shippingStatus', array('JBEventBasket', 'shippingStatus')); + + $dispatcher->connect('basket:paymentSuccess', array('JBEventBasket', 'paymentSuccess')); + $dispatcher->connect('basket:paymentFail', array('JBEventBasket', 'paymentFail')); + $dispatcher->connect('basket:paymentCallback', array('JBEventBasket', 'paymentCallback')); + } + + /** + * Init assets for admin path + */ + private function _initAssets() + { + if (!$this->app->jbenv->isSite() && !$this->app->jbrequest->isAjax()) { + $this->app->jbassets->admin(); + $this->_initLanguages(); + $this->_initAdminMenu(); + } + } + + /** + * Get hash + * @param $string + * @return string + */ + static public function getHash($string) + { + return ''; + } + + /** + * Init Admin menu + */ + private function _initAdminMenu() + { + $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); + if (!$config->get('adminmenu_show', 1)) { + return false; + } + + $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); + + $appList = JBModelApp::model()->getSimpleList(); + + $findJBZooApp = false; + $dispatched = false; + foreach ($appList as $app) { + if ($app->application_group == JBZOO_APP_GROUP) { + $findJBZooApp = true; + if ($curApp == $app->id) { + $dispatched = true; + } + } + } + + if (!$findJBZooApp) { + return false; + } + + $router = $this->app->jbrouter; + + $menuItems = array(); + + if (!empty($appList)) { + foreach ($appList as $app) { + + $menuItems['app-' . $app->alias] = array( + 'name' => $app->name, + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), + 'children' => array( + 'add-item' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')), + ), + 'sep-1' => 'divider', + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')), + ), + 'frontpage' => array( + 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')), + ), + 'comments' => array( + 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')), + ), + 'sep-1' => 'divider', + 'config' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')), + ), + ), + ); + } + } + + $menuItems['sep-1'] = 'divider'; + + if ($dispatched) { + if ((int)JBModelConfig::model()->get('enable', 1, 'cart.config')) { + $menuItems['orders'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_ORDERS'), + 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jborder')), + 'children' => array( + 'cart-configs' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CART_CONFIG'), + 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jbcart')), + ), + ), + ); + + $menuItems['sep-2'] = 'divider'; + } + } + + $menuItems['item-config'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), + 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), + ); + + $types = $this->app->jbtype->getSimpleList(); + if (!empty($types)) { + $children = array(); + foreach ($types as $alias => $type) { + $children['type-' . $alias] = array( + 'name' => $type, + 'url' => $router->admin(array('controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => array('0' => $alias))), + ); + } + + $menuItems['item-config']['children'] = $children; + } + + if ($dispatched) { + $menuItems['sep-3'] = 'divider'; + + $menuItems['jbzoo-admin'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), + 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), + 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), + 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), + ), + ), + ); + + $menuItems['jbzoo-import'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDART'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), + ), + ), + ); + + $menuItems['jbzoo-export'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), + ), + 'types' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), + ), + 'yandexyml' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDART'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), + ), + 'zoobackup' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), + ), + ), + ); + + $menuItems['sep-4'] = 'divider'; + + $menuItems['jbzoo-info'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_INFO'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), + ), + 'server' => array( + 'name' => 'Get Last JBZoo', + 'url' => 'https://github.com/JBZoo/JBZoo', + 'target' => '_blank', + ), + ) + ); + } + + $menuItems['jbzoo-support'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), + 'url' => 'http://forum.jbzoo.com/', + 'target' => '_blank', + ); + + $this->app->jbassets->addVar('JBAdminItems', array( + 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), + 'items' => $menuItems, + )); + } + + /** + * Get group name + * @return string + */ + private function _getGroup() + { + return $this->_group; + } + + /** + * Register new path in system + * @param string $path + * @param string $pathName + * @return mixed + */ + private function _addPath($path, $pathName) + { + if ($fullPath = $this->app->path->path($path)) { + return $this->app->path->register($fullPath, $pathName); + } + + return null; + } +} diff --git a/patches/2.2.6/media/zoo/applications/jbuniversal/framework/jbzoo.php b/patches/2.2.6/media/zoo/applications/jbuniversal/framework/jbzoo.php index 9359a21..f2b89b1 100644 --- a/patches/2.2.6/media/zoo/applications/jbuniversal/framework/jbzoo.php +++ b/patches/2.2.6/media/zoo/applications/jbuniversal/framework/jbzoo.php @@ -1 +1,642 @@ - */ // no direct access defined('_JEXEC') or die('Restricted access'); /** * Class JBZoo */ class JBZoo { /** * @var Application */ public $app = null; /** * App group name * @var string */ private $_group = JBZOO_APP_GROUP; /** * Init JBZoo application * @static * @return JBZoo */ public static function init() { static $jbzoo; if (!isset($jbzoo)) { $jbzoo = new self(); } return $jbzoo; } /** * Initialization JBZoo App */ private function __construct() { $this->app = App::getInstance('zoo'); $this->_initPaths(); $this->_initClasses(); $this->_initEvents(); $this->_initAssets(); } /** * Add directory path */ private function _initPaths() { $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); $this->_addPath('jbapp:framework', 'jbzoo'); $this->_addPath('jbapp:assets', 'jbassets'); $this->_addPath('jbassets:zoo', 'assets'); $this->_addPath('jbapp:config', 'jbconfig'); $this->_addPath('jbzoo:elements', 'jbelements'); $this->_addPath('jbapp:cart-elements', 'cart-elements'); $this->_addPath('jbapp:types', 'jbtypes'); $this->_addPath('jbzoo:helpers', 'helpers'); $this->_addPath('jbzoo:helpers-std', 'helpers'); $this->_addPath('helpers:fields', 'fields'); $this->_addPath('jbzoo:tables', 'tables'); $this->_addPath('jbzoo:classes-std', 'classes'); $this->_addPath('jbzoo:render', 'renderer'); $this->_addPath('jbzoo:views', 'jbviews'); $this->_addPath('jbapp:config', 'jbxml'); $this->_addPath('jbviews:', 'partials'); $this->_addPath('jbapp:joomla/elements', 'fields'); $this->_addPath('jbapp:templates', 'jbtmpl'); $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); $this->_addPath('modules:mod_jbzoo_currency', 'mod_jbzoo_currency'); $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); if ($this->app->jbenv->isSite()) { $this->_addPath('jbzoo:controllers', 'controllers'); } require $this->app->path->path('jbzoo:controllers/base.php'); JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); } /** * Include models classes */ private function _initClasses() { jimport('joomla.html.parameter.element'); $this->app->loader->register('AppValidator', 'classes:validator.php'); // defines define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); define('ZOO_TABLE_JBZOO_ORDER', '#__zoo_jbzoo_orders'); $frmwork = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework'; $clsPath = $frmwork . '/classes'; $modPath = $frmwork . '/models'; $filPath = $frmwork . '/render/filter'; $evtPath = $frmwork . '/events'; $classList = array( 'JBDatabaseQuery' => $clsPath . '/database/JBDatabaseQuery.php', 'JBDatabaseQueryElement' => $clsPath . '/database/JBDatabaseQueryElement.php', 'JBCartOrder' => $clsPath . '/cart/jborder.php', 'JBCart' => $clsPath . '/cart/jbcart.php', 'JBCartValue' => $clsPath . '/cart/jbvalue.php', 'JBCartVariant' => $clsPath . '/cart/jbvariant.php', 'JBCartVariantList' => $clsPath . '/cart/jbvariantlist.php', 'JBTemplate' => $clsPath . '/jbtemplate.php', // models 'JBModel' => $modPath . '/jbmodel.php', 'JBModelConfig' => $modPath . '/jbmodel.config.php', 'JBModelElement' => $modPath . '/jbmodel.element.php', 'JBModelAutoComplete' => $modPath . '/jbmodel.autocomplete.php', 'JBModelElementCountry' => $modPath . '/jbmodel.element.country.php', 'JBModelElementDate' => $modPath . '/jbmodel.element.date.php', 'JBModelElementItemDate' => $modPath . '/jbmodel.element.itemdate.php', 'JBModelElementItemauthor' => $modPath . '/jbmodel.element.itemauthor.php', 'JBModelElementItemCategory' => $modPath . '/jbmodel.element.itemcategory.php', 'JBModelElementItemCreated' => $modPath . '/jbmodel.element.itemcreated.php', 'JBModelElementItemFrontpage' => $modPath . '/jbmodel.element.itemfrontpage.php', 'JBModelElementItemModified' => $modPath . '/jbmodel.element.itemmodified.php', 'JBModelElementItemName' => $modPath . '/jbmodel.element.itemname.php', 'JBModelElementItemPublish_down' => $modPath . '/jbmodel.element.itempublish_down.php', 'JBModelElementItemPublish_up' => $modPath . '/jbmodel.element.itempublish_up.php', 'JBModelElementItemTag' => $modPath . '/jbmodel.element.itemtag.php', 'JBModelElementJBImage' => $modPath . '/jbmodel.element.jbimage.php', 'JBModelElementJBSelectCascade' => $modPath . '/jbmodel.element.jbselectcascade.php', 'JBModelElementRange' => $modPath . '/jbmodel.element.range.php', 'JBModelElementRating' => $modPath . '/jbmodel.element.rating.php', 'JBModelElementJBPrice' => $modPath . '/jbmodel.element.jbprice.php', 'JBModelElementJBPricePlain' => $modPath . '/jbmodel.element.jbprice.plain.php', 'JBModelElementJBPriceCalc' => $modPath . '/jbmodel.element.jbprice.calc.php', 'JBModelElementJBComments' => $modPath . '/jbmodel.element.jbcomments.php', 'JBModelElementTextarea' => $modPath . '/jbmodel.element.textarea.php', 'JBModelFavorite' => $modPath . '/jbmodel.favorite.php', 'JBModelFilter' => $modPath . '/jbmodel.filter.php', 'JBModelItem' => $modPath . '/jbmodel.item.php', 'JBModelApp' => $modPath . '/jbmodel.app.php', 'JBModelCategory' => $modPath . '/jbmodel.category.php', 'JBModelOrder' => $modPath . '/jbmodel.order.php', 'JBModelRelated' => $modPath . '/jbmodel.related.php', 'JBModelSearchindex' => $modPath . '/jbmodel.searchindex.php', 'JBModelValues' => $modPath . '/jbmodel.values.php', 'JBModelSku' => $modPath . '/jbmodel.sku.php', // filter 'JBFilterElement' => $filPath . '/element.php', 'JBFilterElementAuthor' => $filPath . '/element.author.php', 'JBFilterElementAuthorCheckbox' => $filPath . '/element.author.checkbox.php', 'JBFilterElementAuthorRadio' => $filPath . '/element.author.radio.php', 'JBFilterElementAuthorSelect' => $filPath . '/element.author.select.php', 'JBFilterElementAuthorChosen' => $filPath . '/element.author.select.chosen.php', 'JBFilterElementAuthorText' => $filPath . '/element.author.text.php', 'JBFilterElementCategory' => $filPath . '/element.category.php', 'JBFilterElementCategoryChosen' => $filPath . '/element.category.chosen.php', 'JBFilterElementCategoryHidden' => $filPath . '/element.category.hidden.php', 'JBFilterElementCheckbox' => $filPath . '/element.checkbox.php', 'JBFilterElementCountry' => $filPath . '/element.country.php', 'JBFilterElementCountryCheckbox' => $filPath . '/element.country.checkbox.php', 'JBFilterElementCountryRadio' => $filPath . '/element.country.radio.php', 'JBFilterElementCountrySelect' => $filPath . '/element.country.select.php', 'JBFilterElementCountryChosen' => $filPath . '/element.country.select.chosen.php', 'JBFilterElementDate' => $filPath . '/element.date.php', 'JBFilterElementDateRange' => $filPath . '/element.date.range.php', 'JBFilterElementFrontpage' => $filPath . '/element.frontpage.php', 'JBFilterElementFrontpageJqueryUI' => $filPath . '/element.frontpage.jqueryui.php', 'JBFilterElementHidden' => $filPath . '/element.hidden.php', 'JBFilterElementImageexists' => $filPath . '/element.imageexists.php', 'JBFilterElementImageexistsJqueryui' => $filPath . '/element.imageexists.jqueryui.php', 'JBFilterElementJBColor' => $filPath . '/element.jbcolor.php', 'JBFilterElementJBPriceCalc' => $filPath . '/element.jbpricecalc.php', 'JBFilterElementJBPricePlain' => $filPath . '/element.jbpriceplain.php', 'JBFilterElementJbselectcascade' => $filPath . '/element.jbselectcascade.php', 'JBFilterElementJqueryui' => $filPath . '/element.jqueryui.php', 'JBFilterElementName' => $filPath . '/element.name.php', 'JBFilterElementNameCheckbox' => $filPath . '/element.name.checkbox.php', 'JBFilterElementNameRadio' => $filPath . '/element.name.radio.php', 'JBFilterElementNameSelect' => $filPath . '/element.name.select.php', 'JBFilterElementNameChosen' => $filPath . '/element.name.select.chosen.php', 'JBFilterElementRadio' => $filPath . '/element.radio.php', 'JBFilterElementRating' => $filPath . '/element.rating.php', 'JBFilterElementRatingRanges' => $filPath . '/element.rating.ranges.php', 'JBFilterElementRatingSlider' => $filPath . '/element.rating.slider.php', 'JBFilterElementSelect' => $filPath . '/element.select.php', 'JBFilterElementSelectChosen' => $filPath . '/element.select.chosen.php', 'JBFilterElementSlider' => $filPath . '/element.slider.php', 'JBFilterElementTag' => $filPath . '/element.tag.php', 'JBFilterElementTagCheckbox' => $filPath . '/element.tag.checkbox.php', 'JBFilterElementTagRadio' => $filPath . '/element.tag.radio.php', 'JBFilterElementTagSelect' => $filPath . '/element.tag.select.php', 'JBFilterElementTagSelectChosen' => $filPath . '/element.tag.select.chosen.php', 'JBFilterElementText' => $filPath . '/element.text.php', 'JBFilterElementTextRange' => $filPath . '/element.text.range.php', // events 'JBZooSystemPlugin' => $evtPath . '/jsystem.php', 'JBEvent' => $evtPath . '/jbevent.php', 'JBEventApplication' => $evtPath . '/jbevent.application.php', 'JBEventBasket' => $evtPath . '/jbevent.basket.php', 'JBEventCategory' => $evtPath . '/jbevent.category.php', 'JBEventComment' => $evtPath . '/jbevent.comment.php', 'JBEventElement' => $evtPath . '/jbevent.element.php', 'JBEventItem' => $evtPath . '/jbevent.item.php', 'JBEventJBZoo' => $evtPath . '/jbevent.jbzoo.php', 'JBEventLayout' => $evtPath . '/jbevent.layout.php', 'JBEventSubmission' => $evtPath . '/jbevent.submission.php', 'JBEventTag' => $evtPath . '/jbevent.tag.php', 'JBEventType' => $evtPath . '/jbevent.type.php', ); foreach ($classList as $className => $path) { JLoader::register($className, $path); } } /** * Get domain name * @param bool $isAny * @return string */ static function getDomain($isAny = false) { if (defined('STDIN') || php_sapi_name() == "cli") { return 'console'; } $domain = ''; if (function_exists('apache_request_headers')) { $headers = apache_request_headers(); $domain = isset($headers['Host']) ? $headers['Host'] : ''; } if ($isAny && !$domain) { $domain = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''; } $domain = preg_replace('#^www\.#', '', $domain); list($domain) = explode(':', $domain); return $domain; } /** * Load lang files */ private function _initLanguages() { $lang = JFactory::getLanguage(); $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); } /** * Register and connect events */ private function _initEvents() { $event = $this->app->event; $dispatcher = $event->dispatcher; $event->register('JBEventApplication'); $dispatcher->connect('application:init', array('JBEventApplication', 'init')); $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); $event->register('JBEventCategory'); $dispatcher->connect('category:init', array('JBEventCategory', 'init')); $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); $event->register('JBEventItem'); $dispatcher->connect('item:init', array('JBEventItem', 'init')); $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); $event->register('JBEventComment'); $dispatcher->connect('comment:init', array('JBEventComment', 'init')); $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); $event->register('JBEventSubmission'); $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); $event->register('JBEventElement'); $dispatcher->connect('element:download', array('JBEventElement', 'download')); $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); $event->register('JBEventLayout'); $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); $event->register('JBEventTag'); $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); $event->register('JBEventType'); $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); $dispatcher->connect('type:copied', array('JBEventType', 'copied')); $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); $event->register('JBEventJBZoo'); $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); $event->register('JBEventBasket'); $dispatcher->connect('basket:beforeSave', array('JBEventBasket', 'beforeSave')); $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); $dispatcher->connect('basket:afterSave', array('JBEventBasket', 'afterSave')); $dispatcher->connect('basket:updated', array('JBEventBasket', 'updated')); $dispatcher->connect('basket:addItem', array('JBEventBasket', 'addItem')); $dispatcher->connect('basket:updateItem', array('JBEventBasket', 'updateItem')); $dispatcher->connect('basket:changeQuantity', array('JBEventBasket', 'changeQuantity')); $dispatcher->connect('basket:removeItem', array('JBEventBasket', 'removeItem')); $dispatcher->connect('basket:removeItems', array('JBEventBasket', 'removeItems')); $dispatcher->connect('basket:recount', array('JBEventBasket', 'recount')); $dispatcher->connect('basket:orderStatus', array('JBEventBasket', 'orderStatus')); $dispatcher->connect('basket:paymentStatus', array('JBEventBasket', 'paymentStatus')); $dispatcher->connect('basket:shippingStatus', array('JBEventBasket', 'shippingStatus')); $dispatcher->connect('basket:paymentSuccess', array('JBEventBasket', 'paymentSuccess')); $dispatcher->connect('basket:paymentFail', array('JBEventBasket', 'paymentFail')); $dispatcher->connect('basket:paymentCallback', array('JBEventBasket', 'paymentCallback')); } /** * Init assets for admin path */ private function _initAssets() { if (!$this->app->jbenv->isSite() && !$this->app->jbrequest->isAjax()) { $this->app->jbassets->admin(); $this->_initLanguages(); $this->_initAdminMenu(); } } /** * Get hash * @param $string * @return string */ static public function getHash($string) { return ''; } /** * Init Admin menu */ private function _initAdminMenu() { $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); if (!$config->get('adminmenu_show', 1)) { return false; } $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); $appList = JBModelApp::model()->getSimpleList(); $findJBZooApp = false; $dispatched = false; foreach ($appList as $app) { if ($app->application_group == JBZOO_APP_GROUP) { $findJBZooApp = true; if ($curApp == $app->id) { $dispatched = true; } } } if (!$findJBZooApp) { return false; } $router = $this->app->jbrouter; $menuItems = array(); if (!empty($appList)) { foreach ($appList as $app) { $menuItems['app-' . $app->alias] = array( 'name' => $app->name, 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), 'children' => array( 'add-item' => array( 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')), ), 'sep-1' => 'divider', 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')), ), 'frontpage' => array( 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')), ), 'comments' => array( 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')), ), 'sep-1' => 'divider', 'config' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')), ), ), ); } } $menuItems['sep-1'] = 'divider'; if ($dispatched) { if ((int)JBModelConfig::model()->get('enable', 1, 'cart.config')) { $menuItems['orders'] = array( 'name' => JText::_('JBZOO_ADMINMENU_ORDERS'), 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jborder')), 'children' => array( 'cart-configs' => array( 'name' => JText::_('JBZOO_ADMINMENU_CART_CONFIG'), 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jbcart')), ), ), ); $menuItems['sep-2'] = 'divider'; } } $menuItems['item-config'] = array( 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), ); $types = $this->app->jbtype->getSimpleList(); if (!empty($types)) { $children = array(); foreach ($types as $alias => $type) { $children['type-' . $alias] = array( 'name' => $type, 'url' => $router->admin(array('controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => array('0' => $alias))), ); } $menuItems['item-config']['children'] = $children; } if ($dispatched) { $menuItems['sep-3'] = 'divider'; $menuItems['jbzoo-admin'] = array( 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), ), ), ); $menuItems['jbzoo-import'] = array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDARD'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), ), ), ); $menuItems['jbzoo-export'] = array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), ), 'types' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), ), 'yandexyml' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDART'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), ), 'zoobackup' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), ), ), ); $menuItems['sep-4'] = 'divider'; $menuItems['jbzoo-info'] = array( 'name' => JText::_('JBZOO_ADMINMENU_INFO'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), ), 'server' => array( 'name' => 'Get Last JBZoo', 'url' => 'https://github.com/JBZoo/JBZoo', 'target' => '_blank', ), ) ); } $menuItems['jbzoo-support'] = array( 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), 'url' => 'http://forum.jbzoo.com/', 'target' => '_blank', ); $this->app->jbassets->addVar('JBAdminItems', array( 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), 'items' => $menuItems, )); } /** * Get group name * @return string */ private function _getGroup() { return $this->_group; } /** * Register new path in system * @param string $path * @param string $pathName * @return mixed */ private function _addPath($path, $pathName) { if ($fullPath = $this->app->path->path($path)) { return $this->app->path->register($fullPath, $pathName); } return null; } } \ No newline at end of file + + */ + +// no direct access +defined('_JEXEC') or die('Restricted access'); + +/** + * Class JBZoo + */ +class JBZoo +{ + /** + * @var Application + */ + public $app = null; + + /** + * App group name + * @var string + */ + private $_group = JBZOO_APP_GROUP; + + /** + * Init JBZoo application + * @static + * @return JBZoo + */ + public static function init() + { + static $jbzoo; + + if (!isset($jbzoo)) { + $jbzoo = new self(); + } + + return $jbzoo; + } + + /** + * Initialization JBZoo App + */ + private function __construct() + { + $this->app = App::getInstance('zoo'); + + $this->_initPaths(); + $this->_initClasses(); + $this->_initEvents(); + $this->_initAssets(); + } + + /** + * Add directory path + */ + private function _initPaths() + { + $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); + $this->_addPath('jbapp:framework', 'jbzoo'); + $this->_addPath('jbapp:assets', 'jbassets'); + $this->_addPath('jbassets:zoo', 'assets'); + $this->_addPath('jbapp:config', 'jbconfig'); + $this->_addPath('jbzoo:elements', 'jbelements'); + $this->_addPath('jbapp:cart-elements', 'cart-elements'); + $this->_addPath('jbapp:types', 'jbtypes'); + + $this->_addPath('jbzoo:helpers', 'helpers'); + $this->_addPath('jbzoo:helpers-std', 'helpers'); + $this->_addPath('helpers:fields', 'fields'); + + $this->_addPath('jbzoo:tables', 'tables'); + $this->_addPath('jbzoo:classes-std', 'classes'); + $this->_addPath('jbzoo:render', 'renderer'); + $this->_addPath('jbzoo:views', 'jbviews'); + $this->_addPath('jbapp:config', 'jbxml'); + $this->_addPath('jbviews:', 'partials'); + $this->_addPath('jbapp:joomla/elements', 'fields'); + $this->_addPath('jbapp:templates', 'jbtmpl'); + + $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); + $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); + $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); + $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); + $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); + $this->_addPath('modules:mod_jbzoo_currency', 'mod_jbzoo_currency'); + + $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); + + if ($this->app->jbenv->isSite()) { + $this->_addPath('jbzoo:controllers', 'controllers'); + } + + require $this->app->path->path('jbzoo:controllers/base.php'); + + JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); + } + + /** + * Include models classes + */ + private function _initClasses() + { + jimport('joomla.html.parameter.element'); + + $this->app->loader->register('AppValidator', 'classes:validator.php'); + + // defines + define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); + define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); + define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); + define('ZOO_TABLE_JBZOO_ORDER', '#__zoo_jbzoo_orders'); + + $frmwork = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework'; + $clsPath = $frmwork . '/classes'; + $modPath = $frmwork . '/models'; + $filPath = $frmwork . '/render/filter'; + $evtPath = $frmwork . '/events'; + + $classList = array( + 'JBDatabaseQuery' => $clsPath . '/database/JBDatabaseQuery.php', + 'JBDatabaseQueryElement' => $clsPath . '/database/JBDatabaseQueryElement.php', + 'JBCartOrder' => $clsPath . '/cart/jborder.php', + 'JBCart' => $clsPath . '/cart/jbcart.php', + 'JBCartValue' => $clsPath . '/cart/jbvalue.php', + 'JBCartVariant' => $clsPath . '/cart/jbvariant.php', + 'JBCartVariantList' => $clsPath . '/cart/jbvariantlist.php', + 'JBTemplate' => $clsPath . '/jbtemplate.php', + + // models + 'JBModel' => $modPath . '/jbmodel.php', + 'JBModelConfig' => $modPath . '/jbmodel.config.php', + 'JBModelElement' => $modPath . '/jbmodel.element.php', + 'JBModelAutoComplete' => $modPath . '/jbmodel.autocomplete.php', + 'JBModelElementCountry' => $modPath . '/jbmodel.element.country.php', + 'JBModelElementDate' => $modPath . '/jbmodel.element.date.php', + 'JBModelElementItemDate' => $modPath . '/jbmodel.element.itemdate.php', + 'JBModelElementItemauthor' => $modPath . '/jbmodel.element.itemauthor.php', + 'JBModelElementItemCategory' => $modPath . '/jbmodel.element.itemcategory.php', + 'JBModelElementItemCreated' => $modPath . '/jbmodel.element.itemcreated.php', + 'JBModelElementItemFrontpage' => $modPath . '/jbmodel.element.itemfrontpage.php', + 'JBModelElementItemModified' => $modPath . '/jbmodel.element.itemmodified.php', + 'JBModelElementItemName' => $modPath . '/jbmodel.element.itemname.php', + 'JBModelElementItemPublish_down' => $modPath . '/jbmodel.element.itempublish_down.php', + 'JBModelElementItemPublish_up' => $modPath . '/jbmodel.element.itempublish_up.php', + 'JBModelElementItemTag' => $modPath . '/jbmodel.element.itemtag.php', + 'JBModelElementJBImage' => $modPath . '/jbmodel.element.jbimage.php', + 'JBModelElementJBSelectCascade' => $modPath . '/jbmodel.element.jbselectcascade.php', + 'JBModelElementRange' => $modPath . '/jbmodel.element.range.php', + 'JBModelElementRating' => $modPath . '/jbmodel.element.rating.php', + 'JBModelElementJBPrice' => $modPath . '/jbmodel.element.jbprice.php', + 'JBModelElementJBPricePlain' => $modPath . '/jbmodel.element.jbprice.plain.php', + 'JBModelElementJBPriceCalc' => $modPath . '/jbmodel.element.jbprice.calc.php', + 'JBModelElementJBComments' => $modPath . '/jbmodel.element.jbcomments.php', + 'JBModelElementTextarea' => $modPath . '/jbmodel.element.textarea.php', + 'JBModelFavorite' => $modPath . '/jbmodel.favorite.php', + 'JBModelFilter' => $modPath . '/jbmodel.filter.php', + 'JBModelItem' => $modPath . '/jbmodel.item.php', + 'JBModelApp' => $modPath . '/jbmodel.app.php', + 'JBModelCategory' => $modPath . '/jbmodel.category.php', + 'JBModelOrder' => $modPath . '/jbmodel.order.php', + 'JBModelRelated' => $modPath . '/jbmodel.related.php', + 'JBModelSearchindex' => $modPath . '/jbmodel.searchindex.php', + 'JBModelValues' => $modPath . '/jbmodel.values.php', + 'JBModelSku' => $modPath . '/jbmodel.sku.php', + + // filter + 'JBFilterElement' => $filPath . '/element.php', + 'JBFilterElementAuthor' => $filPath . '/element.author.php', + 'JBFilterElementAuthorCheckbox' => $filPath . '/element.author.checkbox.php', + 'JBFilterElementAuthorRadio' => $filPath . '/element.author.radio.php', + 'JBFilterElementAuthorSelect' => $filPath . '/element.author.select.php', + 'JBFilterElementAuthorChosen' => $filPath . '/element.author.select.chosen.php', + 'JBFilterElementAuthorText' => $filPath . '/element.author.text.php', + 'JBFilterElementCategory' => $filPath . '/element.category.php', + 'JBFilterElementCategoryChosen' => $filPath . '/element.category.chosen.php', + 'JBFilterElementCategoryHidden' => $filPath . '/element.category.hidden.php', + 'JBFilterElementCheckbox' => $filPath . '/element.checkbox.php', + 'JBFilterElementCountry' => $filPath . '/element.country.php', + 'JBFilterElementCountryCheckbox' => $filPath . '/element.country.checkbox.php', + 'JBFilterElementCountryRadio' => $filPath . '/element.country.radio.php', + 'JBFilterElementCountrySelect' => $filPath . '/element.country.select.php', + 'JBFilterElementCountryChosen' => $filPath . '/element.country.select.chosen.php', + 'JBFilterElementDate' => $filPath . '/element.date.php', + 'JBFilterElementDateRange' => $filPath . '/element.date.range.php', + 'JBFilterElementFrontpage' => $filPath . '/element.frontpage.php', + 'JBFilterElementFrontpageJqueryUI' => $filPath . '/element.frontpage.jqueryui.php', + 'JBFilterElementHidden' => $filPath . '/element.hidden.php', + 'JBFilterElementImageexists' => $filPath . '/element.imageexists.php', + 'JBFilterElementImageexistsJqueryui' => $filPath . '/element.imageexists.jqueryui.php', + 'JBFilterElementJBColor' => $filPath . '/element.jbcolor.php', + 'JBFilterElementJBPriceCalc' => $filPath . '/element.jbpricecalc.php', + 'JBFilterElementJBPricePlain' => $filPath . '/element.jbpriceplain.php', + 'JBFilterElementJbselectcascade' => $filPath . '/element.jbselectcascade.php', + 'JBFilterElementJqueryui' => $filPath . '/element.jqueryui.php', + 'JBFilterElementName' => $filPath . '/element.name.php', + 'JBFilterElementNameCheckbox' => $filPath . '/element.name.checkbox.php', + 'JBFilterElementNameRadio' => $filPath . '/element.name.radio.php', + 'JBFilterElementNameSelect' => $filPath . '/element.name.select.php', + 'JBFilterElementNameChosen' => $filPath . '/element.name.select.chosen.php', + 'JBFilterElementRadio' => $filPath . '/element.radio.php', + 'JBFilterElementRating' => $filPath . '/element.rating.php', + 'JBFilterElementRatingRanges' => $filPath . '/element.rating.ranges.php', + 'JBFilterElementRatingSlider' => $filPath . '/element.rating.slider.php', + 'JBFilterElementSelect' => $filPath . '/element.select.php', + 'JBFilterElementSelectChosen' => $filPath . '/element.select.chosen.php', + 'JBFilterElementSlider' => $filPath . '/element.slider.php', + 'JBFilterElementTag' => $filPath . '/element.tag.php', + 'JBFilterElementTagCheckbox' => $filPath . '/element.tag.checkbox.php', + 'JBFilterElementTagRadio' => $filPath . '/element.tag.radio.php', + 'JBFilterElementTagSelect' => $filPath . '/element.tag.select.php', + 'JBFilterElementTagSelectChosen' => $filPath . '/element.tag.select.chosen.php', + 'JBFilterElementText' => $filPath . '/element.text.php', + 'JBFilterElementTextRange' => $filPath . '/element.text.range.php', + + // events + 'JBZooSystemPlugin' => $evtPath . '/jsystem.php', + 'JBEvent' => $evtPath . '/jbevent.php', + 'JBEventApplication' => $evtPath . '/jbevent.application.php', + 'JBEventBasket' => $evtPath . '/jbevent.basket.php', + 'JBEventCategory' => $evtPath . '/jbevent.category.php', + 'JBEventComment' => $evtPath . '/jbevent.comment.php', + 'JBEventElement' => $evtPath . '/jbevent.element.php', + 'JBEventItem' => $evtPath . '/jbevent.item.php', + 'JBEventJBZoo' => $evtPath . '/jbevent.jbzoo.php', + 'JBEventLayout' => $evtPath . '/jbevent.layout.php', + 'JBEventSubmission' => $evtPath . '/jbevent.submission.php', + 'JBEventTag' => $evtPath . '/jbevent.tag.php', + 'JBEventType' => $evtPath . '/jbevent.type.php', + ); + + foreach ($classList as $className => $path) { + JLoader::register($className, $path); + } + } + + /** + * Get domain name + * @param bool $isAny + * @return string + */ + static function getDomain($isAny = false) + { + if (defined('STDIN') || php_sapi_name() == "cli") { + return 'console'; + } + + $domain = ''; + if (function_exists('apache_request_headers')) { + $headers = apache_request_headers(); + $domain = isset($headers['Host']) ? $headers['Host'] : ''; + } + + if ($isAny && !$domain) { + $domain = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''; + } + + $domain = preg_replace('#^www\.#', '', $domain); + list($domain) = explode(':', $domain); + + return $domain; + } + + /** + * Load lang files + */ + private function _initLanguages() + { + $lang = JFactory::getLanguage(); + $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); + } + + /** + * Register and connect events + */ + private function _initEvents() + { + $event = $this->app->event; + $dispatcher = $event->dispatcher; + + $event->register('JBEventApplication'); + $dispatcher->connect('application:init', array('JBEventApplication', 'init')); + $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); + $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); + $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); + $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); + $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); + $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); + $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); + $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); + + $event->register('JBEventCategory'); + $dispatcher->connect('category:init', array('JBEventCategory', 'init')); + $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); + $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); + $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); + + $event->register('JBEventItem'); + $dispatcher->connect('item:init', array('JBEventItem', 'init')); + $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); + $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); + $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); + $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); + $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); + $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); + $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); + $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); + $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); + + $event->register('JBEventComment'); + $dispatcher->connect('comment:init', array('JBEventComment', 'init')); + $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); + $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); + $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); + + $event->register('JBEventSubmission'); + $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); + $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); + $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); + $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); + + $event->register('JBEventElement'); + $dispatcher->connect('element:download', array('JBEventElement', 'download')); + $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); + $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); + $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); + $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); + $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); + $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); + $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); + $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); + $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); + + $event->register('JBEventLayout'); + $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); + + $event->register('JBEventTag'); + $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); + $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); + + $event->register('JBEventType'); + $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); + $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); + $dispatcher->connect('type:copied', array('JBEventType', 'copied')); + $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); + $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); + $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); + $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); + + $event->register('JBEventJBZoo'); + $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); + $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); + + $event->register('JBEventBasket'); + $dispatcher->connect('basket:beforeSave', array('JBEventBasket', 'beforeSave')); + $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); + $dispatcher->connect('basket:afterSave', array('JBEventBasket', 'afterSave')); + $dispatcher->connect('basket:updated', array('JBEventBasket', 'updated')); + + $dispatcher->connect('basket:addItem', array('JBEventBasket', 'addItem')); + $dispatcher->connect('basket:updateItem', array('JBEventBasket', 'updateItem')); + $dispatcher->connect('basket:changeQuantity', array('JBEventBasket', 'changeQuantity')); + $dispatcher->connect('basket:removeItem', array('JBEventBasket', 'removeItem')); + $dispatcher->connect('basket:removeItems', array('JBEventBasket', 'removeItems')); + $dispatcher->connect('basket:recount', array('JBEventBasket', 'recount')); + + $dispatcher->connect('basket:orderStatus', array('JBEventBasket', 'orderStatus')); + $dispatcher->connect('basket:paymentStatus', array('JBEventBasket', 'paymentStatus')); + $dispatcher->connect('basket:shippingStatus', array('JBEventBasket', 'shippingStatus')); + + $dispatcher->connect('basket:paymentSuccess', array('JBEventBasket', 'paymentSuccess')); + $dispatcher->connect('basket:paymentFail', array('JBEventBasket', 'paymentFail')); + $dispatcher->connect('basket:paymentCallback', array('JBEventBasket', 'paymentCallback')); + } + + /** + * Init assets for admin path + */ + private function _initAssets() + { + if (!$this->app->jbenv->isSite() && !$this->app->jbrequest->isAjax()) { + $this->app->jbassets->admin(); + $this->_initLanguages(); + $this->_initAdminMenu(); + } + } + + /** + * Get hash + * @param $string + * @return string + */ + static public function getHash($string) + { + return ''; + } + + /** + * Init Admin menu + */ + private function _initAdminMenu() + { + $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); + if (!$config->get('adminmenu_show', 1)) { + return false; + } + + $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); + + $appList = JBModelApp::model()->getSimpleList(); + + $findJBZooApp = false; + $dispatched = false; + foreach ($appList as $app) { + if ($app->application_group == JBZOO_APP_GROUP) { + $findJBZooApp = true; + if ($curApp == $app->id) { + $dispatched = true; + } + } + } + + if (!$findJBZooApp) { + return false; + } + + $router = $this->app->jbrouter; + + $menuItems = array(); + + if (!empty($appList)) { + foreach ($appList as $app) { + + $menuItems['app-' . $app->alias] = array( + 'name' => $app->name, + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), + 'children' => array( + 'add-item' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')), + ), + 'sep-1' => 'divider', + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')), + ), + 'frontpage' => array( + 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')), + ), + 'comments' => array( + 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')), + ), + 'sep-1' => 'divider', + 'config' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')), + ), + ), + ); + } + } + + $menuItems['sep-1'] = 'divider'; + + if ($dispatched) { + if ((int)JBModelConfig::model()->get('enable', 1, 'cart.config')) { + $menuItems['orders'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_ORDERS'), + 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jborder')), + 'children' => array( + 'cart-configs' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CART_CONFIG'), + 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jbcart')), + ), + ), + ); + + $menuItems['sep-2'] = 'divider'; + } + } + + $menuItems['item-config'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), + 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), + ); + + $types = $this->app->jbtype->getSimpleList(); + if (!empty($types)) { + $children = array(); + foreach ($types as $alias => $type) { + $children['type-' . $alias] = array( + 'name' => $type, + 'url' => $router->admin(array('controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => array('0' => $alias))), + ); + } + + $menuItems['item-config']['children'] = $children; + } + + if ($dispatched) { + $menuItems['sep-3'] = 'divider'; + + $menuItems['jbzoo-admin'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), + 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), + 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), + 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), + ), + ), + ); + + $menuItems['jbzoo-import'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDARD'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), + ), + ), + ); + + $menuItems['jbzoo-export'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), + ), + 'types' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), + ), + 'yandexyml' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDART'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), + ), + 'zoobackup' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), + ), + ), + ); + + $menuItems['sep-4'] = 'divider'; + + $menuItems['jbzoo-info'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_INFO'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), + ), + 'server' => array( + 'name' => 'Get Last JBZoo', + 'url' => 'https://github.com/JBZoo/JBZoo', + 'target' => '_blank', + ), + ) + ); + } + + $menuItems['jbzoo-support'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), + 'url' => 'http://forum.jbzoo.com/', + 'target' => '_blank', + ); + + $this->app->jbassets->addVar('JBAdminItems', array( + 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), + 'items' => $menuItems, + )); + } + + /** + * Get group name + * @return string + */ + private function _getGroup() + { + return $this->_group; + } + + /** + * Register new path in system + * @param string $path + * @param string $pathName + * @return mixed + */ + private function _addPath($path, $pathName) + { + if ($fullPath = $this->app->path->path($path)) { + return $this->app->path->register($fullPath, $pathName); + } + + return null; + } +} diff --git a/patches/2.2.7/media/zoo/applications/jbuniversal/framework/jbzoo.php b/patches/2.2.7/media/zoo/applications/jbuniversal/framework/jbzoo.php index f83d9f6..2f32825 100644 --- a/patches/2.2.7/media/zoo/applications/jbuniversal/framework/jbzoo.php +++ b/patches/2.2.7/media/zoo/applications/jbuniversal/framework/jbzoo.php @@ -1 +1,642 @@ - */ // no direct access defined('_JEXEC') or die('Restricted access'); /** * Class JBZoo */ class JBZoo { /** * @var Application */ public $app = null; /** * App group name * @var string */ private $_group = JBZOO_APP_GROUP; /** * Init JBZoo application * @static * @return JBZoo */ public static function init() { static $jbzoo; if (!isset($jbzoo)) { $jbzoo = new self(); } return $jbzoo; } /** * Initialization JBZoo App */ private function __construct() { $this->app = App::getInstance('zoo'); $this->_initPaths(); $this->_initClasses(); $this->_initEvents(); $this->_initAssets(); } /** * Add directory path */ private function _initPaths() { $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); $this->_addPath('jbapp:framework', 'jbzoo'); $this->_addPath('jbapp:assets', 'jbassets'); $this->_addPath('jbassets:zoo', 'assets'); $this->_addPath('jbapp:config', 'jbconfig'); $this->_addPath('jbzoo:elements', 'jbelements'); $this->_addPath('jbapp:cart-elements', 'cart-elements'); $this->_addPath('jbapp:types', 'jbtypes'); $this->_addPath('jbzoo:helpers', 'helpers'); $this->_addPath('jbzoo:helpers-std', 'helpers'); $this->_addPath('helpers:fields', 'fields'); $this->_addPath('jbzoo:tables', 'tables'); $this->_addPath('jbzoo:classes-std', 'classes'); $this->_addPath('jbzoo:render', 'renderer'); $this->_addPath('jbzoo:views', 'jbviews'); $this->_addPath('jbapp:config', 'jbxml'); $this->_addPath('jbviews:', 'partials'); $this->_addPath('jbapp:joomla/elements', 'fields'); $this->_addPath('jbapp:templates', 'jbtmpl'); $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); $this->_addPath('modules:mod_jbzoo_currency', 'mod_jbzoo_currency'); $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); if ($this->app->jbenv->isSite()) { $this->_addPath('jbzoo:controllers', 'controllers'); } require $this->app->path->path('jbzoo:controllers/base.php'); JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); } /** * Include models classes */ private function _initClasses() { jimport('joomla.html.parameter.element'); $this->app->loader->register('AppValidator', 'classes:validator.php'); // defines define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); define('ZOO_TABLE_JBZOO_ORDER', '#__zoo_jbzoo_orders'); $frmwork = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework'; $clsPath = $frmwork . '/classes'; $modPath = $frmwork . '/models'; $filPath = $frmwork . '/render/filter'; $evtPath = $frmwork . '/events'; $classList = array( 'JBDatabaseQuery' => $clsPath . '/database/JBDatabaseQuery.php', 'JBDatabaseQueryElement' => $clsPath . '/database/JBDatabaseQueryElement.php', 'JBCartOrder' => $clsPath . '/cart/jborder.php', 'JBCart' => $clsPath . '/cart/jbcart.php', 'JBCartValue' => $clsPath . '/cart/jbvalue.php', 'JBCartVariant' => $clsPath . '/cart/jbvariant.php', 'JBCartVariantList' => $clsPath . '/cart/jbvariantlist.php', 'JBTemplate' => $clsPath . '/jbtemplate.php', // models 'JBModel' => $modPath . '/jbmodel.php', 'JBModelConfig' => $modPath . '/jbmodel.config.php', 'JBModelElement' => $modPath . '/jbmodel.element.php', 'JBModelAutoComplete' => $modPath . '/jbmodel.autocomplete.php', 'JBModelElementCountry' => $modPath . '/jbmodel.element.country.php', 'JBModelElementDate' => $modPath . '/jbmodel.element.date.php', 'JBModelElementItemDate' => $modPath . '/jbmodel.element.itemdate.php', 'JBModelElementItemauthor' => $modPath . '/jbmodel.element.itemauthor.php', 'JBModelElementItemCategory' => $modPath . '/jbmodel.element.itemcategory.php', 'JBModelElementItemCreated' => $modPath . '/jbmodel.element.itemcreated.php', 'JBModelElementItemFrontpage' => $modPath . '/jbmodel.element.itemfrontpage.php', 'JBModelElementItemModified' => $modPath . '/jbmodel.element.itemmodified.php', 'JBModelElementItemName' => $modPath . '/jbmodel.element.itemname.php', 'JBModelElementItemPublish_down' => $modPath . '/jbmodel.element.itempublish_down.php', 'JBModelElementItemPublish_up' => $modPath . '/jbmodel.element.itempublish_up.php', 'JBModelElementItemTag' => $modPath . '/jbmodel.element.itemtag.php', 'JBModelElementJBImage' => $modPath . '/jbmodel.element.jbimage.php', 'JBModelElementJBSelectCascade' => $modPath . '/jbmodel.element.jbselectcascade.php', 'JBModelElementRange' => $modPath . '/jbmodel.element.range.php', 'JBModelElementRating' => $modPath . '/jbmodel.element.rating.php', 'JBModelElementJBPrice' => $modPath . '/jbmodel.element.jbprice.php', 'JBModelElementJBPricePlain' => $modPath . '/jbmodel.element.jbprice.plain.php', 'JBModelElementJBPriceCalc' => $modPath . '/jbmodel.element.jbprice.calc.php', 'JBModelElementJBComments' => $modPath . '/jbmodel.element.jbcomments.php', 'JBModelElementTextarea' => $modPath . '/jbmodel.element.textarea.php', 'JBModelFavorite' => $modPath . '/jbmodel.favorite.php', 'JBModelFilter' => $modPath . '/jbmodel.filter.php', 'JBModelItem' => $modPath . '/jbmodel.item.php', 'JBModelApp' => $modPath . '/jbmodel.app.php', 'JBModelCategory' => $modPath . '/jbmodel.category.php', 'JBModelOrder' => $modPath . '/jbmodel.order.php', 'JBModelRelated' => $modPath . '/jbmodel.related.php', 'JBModelSearchindex' => $modPath . '/jbmodel.searchindex.php', 'JBModelValues' => $modPath . '/jbmodel.values.php', 'JBModelSku' => $modPath . '/jbmodel.sku.php', // filter 'JBFilterElement' => $filPath . '/element.php', 'JBFilterElementAuthor' => $filPath . '/element.author.php', 'JBFilterElementAuthorCheckbox' => $filPath . '/element.author.checkbox.php', 'JBFilterElementAuthorRadio' => $filPath . '/element.author.radio.php', 'JBFilterElementAuthorSelect' => $filPath . '/element.author.select.php', 'JBFilterElementAuthorChosen' => $filPath . '/element.author.select.chosen.php', 'JBFilterElementAuthorText' => $filPath . '/element.author.text.php', 'JBFilterElementCategory' => $filPath . '/element.category.php', 'JBFilterElementCategoryChosen' => $filPath . '/element.category.chosen.php', 'JBFilterElementCategoryHidden' => $filPath . '/element.category.hidden.php', 'JBFilterElementCheckbox' => $filPath . '/element.checkbox.php', 'JBFilterElementCountry' => $filPath . '/element.country.php', 'JBFilterElementCountryCheckbox' => $filPath . '/element.country.checkbox.php', 'JBFilterElementCountryRadio' => $filPath . '/element.country.radio.php', 'JBFilterElementCountrySelect' => $filPath . '/element.country.select.php', 'JBFilterElementCountryChosen' => $filPath . '/element.country.select.chosen.php', 'JBFilterElementDate' => $filPath . '/element.date.php', 'JBFilterElementDateRange' => $filPath . '/element.date.range.php', 'JBFilterElementFrontpage' => $filPath . '/element.frontpage.php', 'JBFilterElementFrontpageJqueryUI' => $filPath . '/element.frontpage.jqueryui.php', 'JBFilterElementHidden' => $filPath . '/element.hidden.php', 'JBFilterElementImageexists' => $filPath . '/element.imageexists.php', 'JBFilterElementImageexistsJqueryui' => $filPath . '/element.imageexists.jqueryui.php', 'JBFilterElementJBColor' => $filPath . '/element.jbcolor.php', 'JBFilterElementJBPriceCalc' => $filPath . '/element.jbpricecalc.php', 'JBFilterElementJBPricePlain' => $filPath . '/element.jbpriceplain.php', 'JBFilterElementJbselectcascade' => $filPath . '/element.jbselectcascade.php', 'JBFilterElementJqueryui' => $filPath . '/element.jqueryui.php', 'JBFilterElementName' => $filPath . '/element.name.php', 'JBFilterElementNameCheckbox' => $filPath . '/element.name.checkbox.php', 'JBFilterElementNameRadio' => $filPath . '/element.name.radio.php', 'JBFilterElementNameSelect' => $filPath . '/element.name.select.php', 'JBFilterElementNameChosen' => $filPath . '/element.name.select.chosen.php', 'JBFilterElementRadio' => $filPath . '/element.radio.php', 'JBFilterElementRating' => $filPath . '/element.rating.php', 'JBFilterElementRatingRanges' => $filPath . '/element.rating.ranges.php', 'JBFilterElementRatingSlider' => $filPath . '/element.rating.slider.php', 'JBFilterElementSelect' => $filPath . '/element.select.php', 'JBFilterElementSelectChosen' => $filPath . '/element.select.chosen.php', 'JBFilterElementSlider' => $filPath . '/element.slider.php', 'JBFilterElementTag' => $filPath . '/element.tag.php', 'JBFilterElementTagCheckbox' => $filPath . '/element.tag.checkbox.php', 'JBFilterElementTagRadio' => $filPath . '/element.tag.radio.php', 'JBFilterElementTagSelect' => $filPath . '/element.tag.select.php', 'JBFilterElementTagSelectChosen' => $filPath . '/element.tag.select.chosen.php', 'JBFilterElementText' => $filPath . '/element.text.php', 'JBFilterElementTextRange' => $filPath . '/element.text.range.php', // events 'JBZooSystemPlugin' => $evtPath . '/jsystem.php', 'JBEvent' => $evtPath . '/jbevent.php', 'JBEventApplication' => $evtPath . '/jbevent.application.php', 'JBEventBasket' => $evtPath . '/jbevent.basket.php', 'JBEventCategory' => $evtPath . '/jbevent.category.php', 'JBEventComment' => $evtPath . '/jbevent.comment.php', 'JBEventElement' => $evtPath . '/jbevent.element.php', 'JBEventItem' => $evtPath . '/jbevent.item.php', 'JBEventJBZoo' => $evtPath . '/jbevent.jbzoo.php', 'JBEventLayout' => $evtPath . '/jbevent.layout.php', 'JBEventSubmission' => $evtPath . '/jbevent.submission.php', 'JBEventTag' => $evtPath . '/jbevent.tag.php', 'JBEventType' => $evtPath . '/jbevent.type.php', ); foreach ($classList as $className => $path) { JLoader::register($className, $path); } } /** * Get domain name * @param bool $isAny * @return string */ static function getDomain($isAny = false) { if (defined('STDIN') || php_sapi_name() == "cli") { return 'console'; } $domain = ''; if (function_exists('apache_request_headers')) { $headers = apache_request_headers(); $domain = isset($headers['Host']) ? $headers['Host'] : ''; } if ($isAny && !$domain) { $domain = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''; } $domain = preg_replace('#^www\.#', '', $domain); list($domain) = explode(':', $domain); return $domain; } /** * Load lang files */ private function _initLanguages() { $lang = JFactory::getLanguage(); $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); } /** * Register and connect events */ private function _initEvents() { $event = $this->app->event; $dispatcher = $event->dispatcher; $event->register('JBEventApplication'); $dispatcher->connect('application:init', array('JBEventApplication', 'init')); $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); $event->register('JBEventCategory'); $dispatcher->connect('category:init', array('JBEventCategory', 'init')); $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); $event->register('JBEventItem'); $dispatcher->connect('item:init', array('JBEventItem', 'init')); $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); $event->register('JBEventComment'); $dispatcher->connect('comment:init', array('JBEventComment', 'init')); $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); $event->register('JBEventSubmission'); $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); $event->register('JBEventElement'); $dispatcher->connect('element:download', array('JBEventElement', 'download')); $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); $event->register('JBEventLayout'); $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); $event->register('JBEventTag'); $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); $event->register('JBEventType'); $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); $dispatcher->connect('type:copied', array('JBEventType', 'copied')); $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); $event->register('JBEventJBZoo'); $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); $event->register('JBEventBasket'); $dispatcher->connect('basket:beforeSave', array('JBEventBasket', 'beforeSave')); $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); $dispatcher->connect('basket:afterSave', array('JBEventBasket', 'afterSave')); $dispatcher->connect('basket:updated', array('JBEventBasket', 'updated')); $dispatcher->connect('basket:addItem', array('JBEventBasket', 'addItem')); $dispatcher->connect('basket:updateItem', array('JBEventBasket', 'updateItem')); $dispatcher->connect('basket:changeQuantity', array('JBEventBasket', 'changeQuantity')); $dispatcher->connect('basket:removeItem', array('JBEventBasket', 'removeItem')); $dispatcher->connect('basket:removeItems', array('JBEventBasket', 'removeItems')); $dispatcher->connect('basket:recount', array('JBEventBasket', 'recount')); $dispatcher->connect('basket:orderStatus', array('JBEventBasket', 'orderStatus')); $dispatcher->connect('basket:paymentStatus', array('JBEventBasket', 'paymentStatus')); $dispatcher->connect('basket:shippingStatus', array('JBEventBasket', 'shippingStatus')); $dispatcher->connect('basket:paymentSuccess', array('JBEventBasket', 'paymentSuccess')); $dispatcher->connect('basket:paymentFail', array('JBEventBasket', 'paymentFail')); $dispatcher->connect('basket:paymentCallback', array('JBEventBasket', 'paymentCallback')); } /** * Init assets for admin path */ private function _initAssets() { if (!$this->app->jbenv->isSite() && !$this->app->jbrequest->isAjax()) { $this->app->jbassets->admin(); $this->_initLanguages(); $this->_initAdminMenu(); } } /** * Get hash * @param $string * @return string */ static public function getHash($string) { return ''; } /** * Init Admin menu */ private function _initAdminMenu() { $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); if (!$config->get('adminmenu_show', 1)) { return false; } $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); $appList = JBModelApp::model()->getSimpleList(); $findJBZooApp = false; $dispatched = false; foreach ($appList as $app) { if ($app->application_group == JBZOO_APP_GROUP) { $findJBZooApp = true; if ($curApp == $app->id) { $dispatched = true; } } } if (!$findJBZooApp) { return false; } $router = $this->app->jbrouter; $menuItems = array(); if (!empty($appList)) { foreach ($appList as $app) { $menuItems['app-' . $app->alias] = array( 'name' => $app->name, 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), 'children' => array( 'add-item' => array( 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')), ), 'sep-1' => 'divider', 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')), ), 'frontpage' => array( 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')), ), 'comments' => array( 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')), ), 'sep-1' => 'divider', 'config' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')), ), ), ); } } $menuItems['sep-1'] = 'divider'; if ($dispatched) { if ((int)JBModelConfig::model()->get('enable', 1, 'cart.config')) { $menuItems['orders'] = array( 'name' => JText::_('JBZOO_ADMINMENU_ORDERS'), 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jborder')), 'children' => array( 'cart-configs' => array( 'name' => JText::_('JBZOO_ADMINMENU_CART_CONFIG'), 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jbcart')), ), ), ); $menuItems['sep-2'] = 'divider'; } } $menuItems['item-config'] = array( 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), ); $types = $this->app->jbtype->getSimpleList(); if (!empty($types)) { $children = array(); foreach ($types as $alias => $type) { $children['type-' . $alias] = array( 'name' => $type, 'url' => $router->admin(array('controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => array('0' => $alias))), ); } $menuItems['item-config']['children'] = $children; } if ($dispatched) { $menuItems['sep-3'] = 'divider'; $menuItems['jbzoo-admin'] = array( 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), ), ), ); $menuItems['jbzoo-import'] = array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDARD'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), ), ), ); $menuItems['jbzoo-export'] = array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), ), 'types' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), ), 'yandexyml' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDARD'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), ), 'zoobackup' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), ), ), ); $menuItems['sep-4'] = 'divider'; $menuItems['jbzoo-info'] = array( 'name' => JText::_('JBZOO_ADMINMENU_INFO'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), ), 'server' => array( 'name' => 'Get Last JBZoo', 'url' => 'https://github.com/JBZoo/JBZoo', 'target' => '_blank', ), ) ); } $menuItems['jbzoo-support'] = array( 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), 'url' => 'http://forum.jbzoo.com/', 'target' => '_blank', ); $this->app->jbassets->addVar('JBAdminItems', array( 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), 'items' => $menuItems, )); } /** * Get group name * @return string */ private function _getGroup() { return $this->_group; } /** * Register new path in system * @param string $path * @param string $pathName * @return mixed */ private function _addPath($path, $pathName) { if ($fullPath = $this->app->path->path($path)) { return $this->app->path->register($fullPath, $pathName); } return null; } } \ No newline at end of file + + */ + +// no direct access +defined('_JEXEC') or die('Restricted access'); + +/** + * Class JBZoo + */ +class JBZoo +{ + /** + * @var Application + */ + public $app = null; + + /** + * App group name + * @var string + */ + private $_group = JBZOO_APP_GROUP; + + /** + * Init JBZoo application + * @static + * @return JBZoo + */ + public static function init() + { + static $jbzoo; + + if (!isset($jbzoo)) { + $jbzoo = new self(); + } + + return $jbzoo; + } + + /** + * Initialization JBZoo App + */ + private function __construct() + { + $this->app = App::getInstance('zoo'); + + $this->_initPaths(); + $this->_initClasses(); + $this->_initEvents(); + $this->_initAssets(); + } + + /** + * Add directory path + */ + private function _initPaths() + { + $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); + $this->_addPath('jbapp:framework', 'jbzoo'); + $this->_addPath('jbapp:assets', 'jbassets'); + $this->_addPath('jbassets:zoo', 'assets'); + $this->_addPath('jbapp:config', 'jbconfig'); + $this->_addPath('jbzoo:elements', 'jbelements'); + $this->_addPath('jbapp:cart-elements', 'cart-elements'); + $this->_addPath('jbapp:types', 'jbtypes'); + + $this->_addPath('jbzoo:helpers', 'helpers'); + $this->_addPath('jbzoo:helpers-std', 'helpers'); + $this->_addPath('helpers:fields', 'fields'); + + $this->_addPath('jbzoo:tables', 'tables'); + $this->_addPath('jbzoo:classes-std', 'classes'); + $this->_addPath('jbzoo:render', 'renderer'); + $this->_addPath('jbzoo:views', 'jbviews'); + $this->_addPath('jbapp:config', 'jbxml'); + $this->_addPath('jbviews:', 'partials'); + $this->_addPath('jbapp:joomla/elements', 'fields'); + $this->_addPath('jbapp:templates', 'jbtmpl'); + + $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); + $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); + $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); + $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); + $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); + $this->_addPath('modules:mod_jbzoo_currency', 'mod_jbzoo_currency'); + + $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); + + if ($this->app->jbenv->isSite()) { + $this->_addPath('jbzoo:controllers', 'controllers'); + } + + require $this->app->path->path('jbzoo:controllers/base.php'); + + JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); + } + + /** + * Include models classes + */ + private function _initClasses() + { + jimport('joomla.html.parameter.element'); + + $this->app->loader->register('AppValidator', 'classes:validator.php'); + + // defines + define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); + define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); + define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); + define('ZOO_TABLE_JBZOO_ORDER', '#__zoo_jbzoo_orders'); + + $frmwork = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework'; + $clsPath = $frmwork . '/classes'; + $modPath = $frmwork . '/models'; + $filPath = $frmwork . '/render/filter'; + $evtPath = $frmwork . '/events'; + + $classList = array( + 'JBDatabaseQuery' => $clsPath . '/database/JBDatabaseQuery.php', + 'JBDatabaseQueryElement' => $clsPath . '/database/JBDatabaseQueryElement.php', + 'JBCartOrder' => $clsPath . '/cart/jborder.php', + 'JBCart' => $clsPath . '/cart/jbcart.php', + 'JBCartValue' => $clsPath . '/cart/jbvalue.php', + 'JBCartVariant' => $clsPath . '/cart/jbvariant.php', + 'JBCartVariantList' => $clsPath . '/cart/jbvariantlist.php', + 'JBTemplate' => $clsPath . '/jbtemplate.php', + + // models + 'JBModel' => $modPath . '/jbmodel.php', + 'JBModelConfig' => $modPath . '/jbmodel.config.php', + 'JBModelElement' => $modPath . '/jbmodel.element.php', + 'JBModelAutoComplete' => $modPath . '/jbmodel.autocomplete.php', + 'JBModelElementCountry' => $modPath . '/jbmodel.element.country.php', + 'JBModelElementDate' => $modPath . '/jbmodel.element.date.php', + 'JBModelElementItemDate' => $modPath . '/jbmodel.element.itemdate.php', + 'JBModelElementItemauthor' => $modPath . '/jbmodel.element.itemauthor.php', + 'JBModelElementItemCategory' => $modPath . '/jbmodel.element.itemcategory.php', + 'JBModelElementItemCreated' => $modPath . '/jbmodel.element.itemcreated.php', + 'JBModelElementItemFrontpage' => $modPath . '/jbmodel.element.itemfrontpage.php', + 'JBModelElementItemModified' => $modPath . '/jbmodel.element.itemmodified.php', + 'JBModelElementItemName' => $modPath . '/jbmodel.element.itemname.php', + 'JBModelElementItemPublish_down' => $modPath . '/jbmodel.element.itempublish_down.php', + 'JBModelElementItemPublish_up' => $modPath . '/jbmodel.element.itempublish_up.php', + 'JBModelElementItemTag' => $modPath . '/jbmodel.element.itemtag.php', + 'JBModelElementJBImage' => $modPath . '/jbmodel.element.jbimage.php', + 'JBModelElementJBSelectCascade' => $modPath . '/jbmodel.element.jbselectcascade.php', + 'JBModelElementRange' => $modPath . '/jbmodel.element.range.php', + 'JBModelElementRating' => $modPath . '/jbmodel.element.rating.php', + 'JBModelElementJBPrice' => $modPath . '/jbmodel.element.jbprice.php', + 'JBModelElementJBPricePlain' => $modPath . '/jbmodel.element.jbprice.plain.php', + 'JBModelElementJBPriceCalc' => $modPath . '/jbmodel.element.jbprice.calc.php', + 'JBModelElementJBComments' => $modPath . '/jbmodel.element.jbcomments.php', + 'JBModelElementTextarea' => $modPath . '/jbmodel.element.textarea.php', + 'JBModelFavorite' => $modPath . '/jbmodel.favorite.php', + 'JBModelFilter' => $modPath . '/jbmodel.filter.php', + 'JBModelItem' => $modPath . '/jbmodel.item.php', + 'JBModelApp' => $modPath . '/jbmodel.app.php', + 'JBModelCategory' => $modPath . '/jbmodel.category.php', + 'JBModelOrder' => $modPath . '/jbmodel.order.php', + 'JBModelRelated' => $modPath . '/jbmodel.related.php', + 'JBModelSearchindex' => $modPath . '/jbmodel.searchindex.php', + 'JBModelValues' => $modPath . '/jbmodel.values.php', + 'JBModelSku' => $modPath . '/jbmodel.sku.php', + + // filter + 'JBFilterElement' => $filPath . '/element.php', + 'JBFilterElementAuthor' => $filPath . '/element.author.php', + 'JBFilterElementAuthorCheckbox' => $filPath . '/element.author.checkbox.php', + 'JBFilterElementAuthorRadio' => $filPath . '/element.author.radio.php', + 'JBFilterElementAuthorSelect' => $filPath . '/element.author.select.php', + 'JBFilterElementAuthorChosen' => $filPath . '/element.author.select.chosen.php', + 'JBFilterElementAuthorText' => $filPath . '/element.author.text.php', + 'JBFilterElementCategory' => $filPath . '/element.category.php', + 'JBFilterElementCategoryChosen' => $filPath . '/element.category.chosen.php', + 'JBFilterElementCategoryHidden' => $filPath . '/element.category.hidden.php', + 'JBFilterElementCheckbox' => $filPath . '/element.checkbox.php', + 'JBFilterElementCountry' => $filPath . '/element.country.php', + 'JBFilterElementCountryCheckbox' => $filPath . '/element.country.checkbox.php', + 'JBFilterElementCountryRadio' => $filPath . '/element.country.radio.php', + 'JBFilterElementCountrySelect' => $filPath . '/element.country.select.php', + 'JBFilterElementCountryChosen' => $filPath . '/element.country.select.chosen.php', + 'JBFilterElementDate' => $filPath . '/element.date.php', + 'JBFilterElementDateRange' => $filPath . '/element.date.range.php', + 'JBFilterElementFrontpage' => $filPath . '/element.frontpage.php', + 'JBFilterElementFrontpageJqueryUI' => $filPath . '/element.frontpage.jqueryui.php', + 'JBFilterElementHidden' => $filPath . '/element.hidden.php', + 'JBFilterElementImageexists' => $filPath . '/element.imageexists.php', + 'JBFilterElementImageexistsJqueryui' => $filPath . '/element.imageexists.jqueryui.php', + 'JBFilterElementJBColor' => $filPath . '/element.jbcolor.php', + 'JBFilterElementJBPriceCalc' => $filPath . '/element.jbpricecalc.php', + 'JBFilterElementJBPricePlain' => $filPath . '/element.jbpriceplain.php', + 'JBFilterElementJbselectcascade' => $filPath . '/element.jbselectcascade.php', + 'JBFilterElementJqueryui' => $filPath . '/element.jqueryui.php', + 'JBFilterElementName' => $filPath . '/element.name.php', + 'JBFilterElementNameCheckbox' => $filPath . '/element.name.checkbox.php', + 'JBFilterElementNameRadio' => $filPath . '/element.name.radio.php', + 'JBFilterElementNameSelect' => $filPath . '/element.name.select.php', + 'JBFilterElementNameChosen' => $filPath . '/element.name.select.chosen.php', + 'JBFilterElementRadio' => $filPath . '/element.radio.php', + 'JBFilterElementRating' => $filPath . '/element.rating.php', + 'JBFilterElementRatingRanges' => $filPath . '/element.rating.ranges.php', + 'JBFilterElementRatingSlider' => $filPath . '/element.rating.slider.php', + 'JBFilterElementSelect' => $filPath . '/element.select.php', + 'JBFilterElementSelectChosen' => $filPath . '/element.select.chosen.php', + 'JBFilterElementSlider' => $filPath . '/element.slider.php', + 'JBFilterElementTag' => $filPath . '/element.tag.php', + 'JBFilterElementTagCheckbox' => $filPath . '/element.tag.checkbox.php', + 'JBFilterElementTagRadio' => $filPath . '/element.tag.radio.php', + 'JBFilterElementTagSelect' => $filPath . '/element.tag.select.php', + 'JBFilterElementTagSelectChosen' => $filPath . '/element.tag.select.chosen.php', + 'JBFilterElementText' => $filPath . '/element.text.php', + 'JBFilterElementTextRange' => $filPath . '/element.text.range.php', + + // events + 'JBZooSystemPlugin' => $evtPath . '/jsystem.php', + 'JBEvent' => $evtPath . '/jbevent.php', + 'JBEventApplication' => $evtPath . '/jbevent.application.php', + 'JBEventBasket' => $evtPath . '/jbevent.basket.php', + 'JBEventCategory' => $evtPath . '/jbevent.category.php', + 'JBEventComment' => $evtPath . '/jbevent.comment.php', + 'JBEventElement' => $evtPath . '/jbevent.element.php', + 'JBEventItem' => $evtPath . '/jbevent.item.php', + 'JBEventJBZoo' => $evtPath . '/jbevent.jbzoo.php', + 'JBEventLayout' => $evtPath . '/jbevent.layout.php', + 'JBEventSubmission' => $evtPath . '/jbevent.submission.php', + 'JBEventTag' => $evtPath . '/jbevent.tag.php', + 'JBEventType' => $evtPath . '/jbevent.type.php', + ); + + foreach ($classList as $className => $path) { + JLoader::register($className, $path); + } + } + + /** + * Get domain name + * @param bool $isAny + * @return string + */ + static function getDomain($isAny = false) + { + if (defined('STDIN') || php_sapi_name() == "cli") { + return 'console'; + } + + $domain = ''; + if (function_exists('apache_request_headers')) { + $headers = apache_request_headers(); + $domain = isset($headers['Host']) ? $headers['Host'] : ''; + } + + if ($isAny && !$domain) { + $domain = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''; + } + + $domain = preg_replace('#^www\.#', '', $domain); + list($domain) = explode(':', $domain); + + return $domain; + } + + /** + * Load lang files + */ + private function _initLanguages() + { + $lang = JFactory::getLanguage(); + $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); + } + + /** + * Register and connect events + */ + private function _initEvents() + { + $event = $this->app->event; + $dispatcher = $event->dispatcher; + + $event->register('JBEventApplication'); + $dispatcher->connect('application:init', array('JBEventApplication', 'init')); + $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); + $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); + $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); + $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); + $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); + $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); + $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); + $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); + + $event->register('JBEventCategory'); + $dispatcher->connect('category:init', array('JBEventCategory', 'init')); + $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); + $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); + $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); + + $event->register('JBEventItem'); + $dispatcher->connect('item:init', array('JBEventItem', 'init')); + $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); + $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); + $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); + $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); + $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); + $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); + $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); + $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); + $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); + + $event->register('JBEventComment'); + $dispatcher->connect('comment:init', array('JBEventComment', 'init')); + $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); + $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); + $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); + + $event->register('JBEventSubmission'); + $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); + $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); + $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); + $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); + + $event->register('JBEventElement'); + $dispatcher->connect('element:download', array('JBEventElement', 'download')); + $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); + $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); + $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); + $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); + $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); + $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); + $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); + $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); + $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); + + $event->register('JBEventLayout'); + $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); + + $event->register('JBEventTag'); + $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); + $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); + + $event->register('JBEventType'); + $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); + $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); + $dispatcher->connect('type:copied', array('JBEventType', 'copied')); + $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); + $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); + $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); + $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); + + $event->register('JBEventJBZoo'); + $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); + $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); + + $event->register('JBEventBasket'); + $dispatcher->connect('basket:beforeSave', array('JBEventBasket', 'beforeSave')); + $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); + $dispatcher->connect('basket:afterSave', array('JBEventBasket', 'afterSave')); + $dispatcher->connect('basket:updated', array('JBEventBasket', 'updated')); + + $dispatcher->connect('basket:addItem', array('JBEventBasket', 'addItem')); + $dispatcher->connect('basket:updateItem', array('JBEventBasket', 'updateItem')); + $dispatcher->connect('basket:changeQuantity', array('JBEventBasket', 'changeQuantity')); + $dispatcher->connect('basket:removeItem', array('JBEventBasket', 'removeItem')); + $dispatcher->connect('basket:removeItems', array('JBEventBasket', 'removeItems')); + $dispatcher->connect('basket:recount', array('JBEventBasket', 'recount')); + + $dispatcher->connect('basket:orderStatus', array('JBEventBasket', 'orderStatus')); + $dispatcher->connect('basket:paymentStatus', array('JBEventBasket', 'paymentStatus')); + $dispatcher->connect('basket:shippingStatus', array('JBEventBasket', 'shippingStatus')); + + $dispatcher->connect('basket:paymentSuccess', array('JBEventBasket', 'paymentSuccess')); + $dispatcher->connect('basket:paymentFail', array('JBEventBasket', 'paymentFail')); + $dispatcher->connect('basket:paymentCallback', array('JBEventBasket', 'paymentCallback')); + } + + /** + * Init assets for admin path + */ + private function _initAssets() + { + if (!$this->app->jbenv->isSite() && !$this->app->jbrequest->isAjax()) { + $this->app->jbassets->admin(); + $this->_initLanguages(); + $this->_initAdminMenu(); + } + } + + /** + * Get hash + * @param $string + * @return string + */ + static public function getHash($string) + { + return ''; + } + + /** + * Init Admin menu + */ + private function _initAdminMenu() + { + $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); + if (!$config->get('adminmenu_show', 1)) { + return false; + } + + $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); + + $appList = JBModelApp::model()->getSimpleList(); + + $findJBZooApp = false; + $dispatched = false; + foreach ($appList as $app) { + if ($app->application_group == JBZOO_APP_GROUP) { + $findJBZooApp = true; + if ($curApp == $app->id) { + $dispatched = true; + } + } + } + + if (!$findJBZooApp) { + return false; + } + + $router = $this->app->jbrouter; + + $menuItems = array(); + + if (!empty($appList)) { + foreach ($appList as $app) { + + $menuItems['app-' . $app->alias] = array( + 'name' => $app->name, + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), + 'children' => array( + 'add-item' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')), + ), + 'sep-1' => 'divider', + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')), + ), + 'frontpage' => array( + 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')), + ), + 'comments' => array( + 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')), + ), + 'sep-1' => 'divider', + 'config' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')), + ), + ), + ); + } + } + + $menuItems['sep-1'] = 'divider'; + + if ($dispatched) { + if ((int)JBModelConfig::model()->get('enable', 1, 'cart.config')) { + $menuItems['orders'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_ORDERS'), + 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jborder')), + 'children' => array( + 'cart-configs' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CART_CONFIG'), + 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jbcart')), + ), + ), + ); + + $menuItems['sep-2'] = 'divider'; + } + } + + $menuItems['item-config'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), + 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), + ); + + $types = $this->app->jbtype->getSimpleList(); + if (!empty($types)) { + $children = array(); + foreach ($types as $alias => $type) { + $children['type-' . $alias] = array( + 'name' => $type, + 'url' => $router->admin(array('controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => array('0' => $alias))), + ); + } + + $menuItems['item-config']['children'] = $children; + } + + if ($dispatched) { + $menuItems['sep-3'] = 'divider'; + + $menuItems['jbzoo-admin'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), + 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), + 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), + 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), + ), + ), + ); + + $menuItems['jbzoo-import'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDARD'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), + ), + ), + ); + + $menuItems['jbzoo-export'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), + ), + 'types' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), + ), + 'yandexyml' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDARD'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), + ), + 'zoobackup' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), + ), + ), + ); + + $menuItems['sep-4'] = 'divider'; + + $menuItems['jbzoo-info'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_INFO'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), + ), + 'server' => array( + 'name' => 'Get Last JBZoo', + 'url' => 'https://github.com/JBZoo/JBZoo', + 'target' => '_blank', + ), + ) + ); + } + + $menuItems['jbzoo-support'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), + 'url' => 'http://forum.jbzoo.com/', + 'target' => '_blank', + ); + + $this->app->jbassets->addVar('JBAdminItems', array( + 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), + 'items' => $menuItems, + )); + } + + /** + * Get group name + * @return string + */ + private function _getGroup() + { + return $this->_group; + } + + /** + * Register new path in system + * @param string $path + * @param string $pathName + * @return mixed + */ + private function _addPath($path, $pathName) + { + if ($fullPath = $this->app->path->path($path)) { + return $this->app->path->register($fullPath, $pathName); + } + + return null; + } +} diff --git a/patches/2.2.8/media/zoo/applications/jbuniversal/framework/jbzoo.php b/patches/2.2.8/media/zoo/applications/jbuniversal/framework/jbzoo.php index f83d9f6..2f32825 100644 --- a/patches/2.2.8/media/zoo/applications/jbuniversal/framework/jbzoo.php +++ b/patches/2.2.8/media/zoo/applications/jbuniversal/framework/jbzoo.php @@ -1 +1,642 @@ - */ // no direct access defined('_JEXEC') or die('Restricted access'); /** * Class JBZoo */ class JBZoo { /** * @var Application */ public $app = null; /** * App group name * @var string */ private $_group = JBZOO_APP_GROUP; /** * Init JBZoo application * @static * @return JBZoo */ public static function init() { static $jbzoo; if (!isset($jbzoo)) { $jbzoo = new self(); } return $jbzoo; } /** * Initialization JBZoo App */ private function __construct() { $this->app = App::getInstance('zoo'); $this->_initPaths(); $this->_initClasses(); $this->_initEvents(); $this->_initAssets(); } /** * Add directory path */ private function _initPaths() { $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); $this->_addPath('jbapp:framework', 'jbzoo'); $this->_addPath('jbapp:assets', 'jbassets'); $this->_addPath('jbassets:zoo', 'assets'); $this->_addPath('jbapp:config', 'jbconfig'); $this->_addPath('jbzoo:elements', 'jbelements'); $this->_addPath('jbapp:cart-elements', 'cart-elements'); $this->_addPath('jbapp:types', 'jbtypes'); $this->_addPath('jbzoo:helpers', 'helpers'); $this->_addPath('jbzoo:helpers-std', 'helpers'); $this->_addPath('helpers:fields', 'fields'); $this->_addPath('jbzoo:tables', 'tables'); $this->_addPath('jbzoo:classes-std', 'classes'); $this->_addPath('jbzoo:render', 'renderer'); $this->_addPath('jbzoo:views', 'jbviews'); $this->_addPath('jbapp:config', 'jbxml'); $this->_addPath('jbviews:', 'partials'); $this->_addPath('jbapp:joomla/elements', 'fields'); $this->_addPath('jbapp:templates', 'jbtmpl'); $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); $this->_addPath('modules:mod_jbzoo_currency', 'mod_jbzoo_currency'); $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); if ($this->app->jbenv->isSite()) { $this->_addPath('jbzoo:controllers', 'controllers'); } require $this->app->path->path('jbzoo:controllers/base.php'); JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); } /** * Include models classes */ private function _initClasses() { jimport('joomla.html.parameter.element'); $this->app->loader->register('AppValidator', 'classes:validator.php'); // defines define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); define('ZOO_TABLE_JBZOO_ORDER', '#__zoo_jbzoo_orders'); $frmwork = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework'; $clsPath = $frmwork . '/classes'; $modPath = $frmwork . '/models'; $filPath = $frmwork . '/render/filter'; $evtPath = $frmwork . '/events'; $classList = array( 'JBDatabaseQuery' => $clsPath . '/database/JBDatabaseQuery.php', 'JBDatabaseQueryElement' => $clsPath . '/database/JBDatabaseQueryElement.php', 'JBCartOrder' => $clsPath . '/cart/jborder.php', 'JBCart' => $clsPath . '/cart/jbcart.php', 'JBCartValue' => $clsPath . '/cart/jbvalue.php', 'JBCartVariant' => $clsPath . '/cart/jbvariant.php', 'JBCartVariantList' => $clsPath . '/cart/jbvariantlist.php', 'JBTemplate' => $clsPath . '/jbtemplate.php', // models 'JBModel' => $modPath . '/jbmodel.php', 'JBModelConfig' => $modPath . '/jbmodel.config.php', 'JBModelElement' => $modPath . '/jbmodel.element.php', 'JBModelAutoComplete' => $modPath . '/jbmodel.autocomplete.php', 'JBModelElementCountry' => $modPath . '/jbmodel.element.country.php', 'JBModelElementDate' => $modPath . '/jbmodel.element.date.php', 'JBModelElementItemDate' => $modPath . '/jbmodel.element.itemdate.php', 'JBModelElementItemauthor' => $modPath . '/jbmodel.element.itemauthor.php', 'JBModelElementItemCategory' => $modPath . '/jbmodel.element.itemcategory.php', 'JBModelElementItemCreated' => $modPath . '/jbmodel.element.itemcreated.php', 'JBModelElementItemFrontpage' => $modPath . '/jbmodel.element.itemfrontpage.php', 'JBModelElementItemModified' => $modPath . '/jbmodel.element.itemmodified.php', 'JBModelElementItemName' => $modPath . '/jbmodel.element.itemname.php', 'JBModelElementItemPublish_down' => $modPath . '/jbmodel.element.itempublish_down.php', 'JBModelElementItemPublish_up' => $modPath . '/jbmodel.element.itempublish_up.php', 'JBModelElementItemTag' => $modPath . '/jbmodel.element.itemtag.php', 'JBModelElementJBImage' => $modPath . '/jbmodel.element.jbimage.php', 'JBModelElementJBSelectCascade' => $modPath . '/jbmodel.element.jbselectcascade.php', 'JBModelElementRange' => $modPath . '/jbmodel.element.range.php', 'JBModelElementRating' => $modPath . '/jbmodel.element.rating.php', 'JBModelElementJBPrice' => $modPath . '/jbmodel.element.jbprice.php', 'JBModelElementJBPricePlain' => $modPath . '/jbmodel.element.jbprice.plain.php', 'JBModelElementJBPriceCalc' => $modPath . '/jbmodel.element.jbprice.calc.php', 'JBModelElementJBComments' => $modPath . '/jbmodel.element.jbcomments.php', 'JBModelElementTextarea' => $modPath . '/jbmodel.element.textarea.php', 'JBModelFavorite' => $modPath . '/jbmodel.favorite.php', 'JBModelFilter' => $modPath . '/jbmodel.filter.php', 'JBModelItem' => $modPath . '/jbmodel.item.php', 'JBModelApp' => $modPath . '/jbmodel.app.php', 'JBModelCategory' => $modPath . '/jbmodel.category.php', 'JBModelOrder' => $modPath . '/jbmodel.order.php', 'JBModelRelated' => $modPath . '/jbmodel.related.php', 'JBModelSearchindex' => $modPath . '/jbmodel.searchindex.php', 'JBModelValues' => $modPath . '/jbmodel.values.php', 'JBModelSku' => $modPath . '/jbmodel.sku.php', // filter 'JBFilterElement' => $filPath . '/element.php', 'JBFilterElementAuthor' => $filPath . '/element.author.php', 'JBFilterElementAuthorCheckbox' => $filPath . '/element.author.checkbox.php', 'JBFilterElementAuthorRadio' => $filPath . '/element.author.radio.php', 'JBFilterElementAuthorSelect' => $filPath . '/element.author.select.php', 'JBFilterElementAuthorChosen' => $filPath . '/element.author.select.chosen.php', 'JBFilterElementAuthorText' => $filPath . '/element.author.text.php', 'JBFilterElementCategory' => $filPath . '/element.category.php', 'JBFilterElementCategoryChosen' => $filPath . '/element.category.chosen.php', 'JBFilterElementCategoryHidden' => $filPath . '/element.category.hidden.php', 'JBFilterElementCheckbox' => $filPath . '/element.checkbox.php', 'JBFilterElementCountry' => $filPath . '/element.country.php', 'JBFilterElementCountryCheckbox' => $filPath . '/element.country.checkbox.php', 'JBFilterElementCountryRadio' => $filPath . '/element.country.radio.php', 'JBFilterElementCountrySelect' => $filPath . '/element.country.select.php', 'JBFilterElementCountryChosen' => $filPath . '/element.country.select.chosen.php', 'JBFilterElementDate' => $filPath . '/element.date.php', 'JBFilterElementDateRange' => $filPath . '/element.date.range.php', 'JBFilterElementFrontpage' => $filPath . '/element.frontpage.php', 'JBFilterElementFrontpageJqueryUI' => $filPath . '/element.frontpage.jqueryui.php', 'JBFilterElementHidden' => $filPath . '/element.hidden.php', 'JBFilterElementImageexists' => $filPath . '/element.imageexists.php', 'JBFilterElementImageexistsJqueryui' => $filPath . '/element.imageexists.jqueryui.php', 'JBFilterElementJBColor' => $filPath . '/element.jbcolor.php', 'JBFilterElementJBPriceCalc' => $filPath . '/element.jbpricecalc.php', 'JBFilterElementJBPricePlain' => $filPath . '/element.jbpriceplain.php', 'JBFilterElementJbselectcascade' => $filPath . '/element.jbselectcascade.php', 'JBFilterElementJqueryui' => $filPath . '/element.jqueryui.php', 'JBFilterElementName' => $filPath . '/element.name.php', 'JBFilterElementNameCheckbox' => $filPath . '/element.name.checkbox.php', 'JBFilterElementNameRadio' => $filPath . '/element.name.radio.php', 'JBFilterElementNameSelect' => $filPath . '/element.name.select.php', 'JBFilterElementNameChosen' => $filPath . '/element.name.select.chosen.php', 'JBFilterElementRadio' => $filPath . '/element.radio.php', 'JBFilterElementRating' => $filPath . '/element.rating.php', 'JBFilterElementRatingRanges' => $filPath . '/element.rating.ranges.php', 'JBFilterElementRatingSlider' => $filPath . '/element.rating.slider.php', 'JBFilterElementSelect' => $filPath . '/element.select.php', 'JBFilterElementSelectChosen' => $filPath . '/element.select.chosen.php', 'JBFilterElementSlider' => $filPath . '/element.slider.php', 'JBFilterElementTag' => $filPath . '/element.tag.php', 'JBFilterElementTagCheckbox' => $filPath . '/element.tag.checkbox.php', 'JBFilterElementTagRadio' => $filPath . '/element.tag.radio.php', 'JBFilterElementTagSelect' => $filPath . '/element.tag.select.php', 'JBFilterElementTagSelectChosen' => $filPath . '/element.tag.select.chosen.php', 'JBFilterElementText' => $filPath . '/element.text.php', 'JBFilterElementTextRange' => $filPath . '/element.text.range.php', // events 'JBZooSystemPlugin' => $evtPath . '/jsystem.php', 'JBEvent' => $evtPath . '/jbevent.php', 'JBEventApplication' => $evtPath . '/jbevent.application.php', 'JBEventBasket' => $evtPath . '/jbevent.basket.php', 'JBEventCategory' => $evtPath . '/jbevent.category.php', 'JBEventComment' => $evtPath . '/jbevent.comment.php', 'JBEventElement' => $evtPath . '/jbevent.element.php', 'JBEventItem' => $evtPath . '/jbevent.item.php', 'JBEventJBZoo' => $evtPath . '/jbevent.jbzoo.php', 'JBEventLayout' => $evtPath . '/jbevent.layout.php', 'JBEventSubmission' => $evtPath . '/jbevent.submission.php', 'JBEventTag' => $evtPath . '/jbevent.tag.php', 'JBEventType' => $evtPath . '/jbevent.type.php', ); foreach ($classList as $className => $path) { JLoader::register($className, $path); } } /** * Get domain name * @param bool $isAny * @return string */ static function getDomain($isAny = false) { if (defined('STDIN') || php_sapi_name() == "cli") { return 'console'; } $domain = ''; if (function_exists('apache_request_headers')) { $headers = apache_request_headers(); $domain = isset($headers['Host']) ? $headers['Host'] : ''; } if ($isAny && !$domain) { $domain = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''; } $domain = preg_replace('#^www\.#', '', $domain); list($domain) = explode(':', $domain); return $domain; } /** * Load lang files */ private function _initLanguages() { $lang = JFactory::getLanguage(); $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); } /** * Register and connect events */ private function _initEvents() { $event = $this->app->event; $dispatcher = $event->dispatcher; $event->register('JBEventApplication'); $dispatcher->connect('application:init', array('JBEventApplication', 'init')); $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); $event->register('JBEventCategory'); $dispatcher->connect('category:init', array('JBEventCategory', 'init')); $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); $event->register('JBEventItem'); $dispatcher->connect('item:init', array('JBEventItem', 'init')); $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); $event->register('JBEventComment'); $dispatcher->connect('comment:init', array('JBEventComment', 'init')); $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); $event->register('JBEventSubmission'); $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); $event->register('JBEventElement'); $dispatcher->connect('element:download', array('JBEventElement', 'download')); $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); $event->register('JBEventLayout'); $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); $event->register('JBEventTag'); $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); $event->register('JBEventType'); $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); $dispatcher->connect('type:copied', array('JBEventType', 'copied')); $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); $event->register('JBEventJBZoo'); $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); $event->register('JBEventBasket'); $dispatcher->connect('basket:beforeSave', array('JBEventBasket', 'beforeSave')); $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); $dispatcher->connect('basket:afterSave', array('JBEventBasket', 'afterSave')); $dispatcher->connect('basket:updated', array('JBEventBasket', 'updated')); $dispatcher->connect('basket:addItem', array('JBEventBasket', 'addItem')); $dispatcher->connect('basket:updateItem', array('JBEventBasket', 'updateItem')); $dispatcher->connect('basket:changeQuantity', array('JBEventBasket', 'changeQuantity')); $dispatcher->connect('basket:removeItem', array('JBEventBasket', 'removeItem')); $dispatcher->connect('basket:removeItems', array('JBEventBasket', 'removeItems')); $dispatcher->connect('basket:recount', array('JBEventBasket', 'recount')); $dispatcher->connect('basket:orderStatus', array('JBEventBasket', 'orderStatus')); $dispatcher->connect('basket:paymentStatus', array('JBEventBasket', 'paymentStatus')); $dispatcher->connect('basket:shippingStatus', array('JBEventBasket', 'shippingStatus')); $dispatcher->connect('basket:paymentSuccess', array('JBEventBasket', 'paymentSuccess')); $dispatcher->connect('basket:paymentFail', array('JBEventBasket', 'paymentFail')); $dispatcher->connect('basket:paymentCallback', array('JBEventBasket', 'paymentCallback')); } /** * Init assets for admin path */ private function _initAssets() { if (!$this->app->jbenv->isSite() && !$this->app->jbrequest->isAjax()) { $this->app->jbassets->admin(); $this->_initLanguages(); $this->_initAdminMenu(); } } /** * Get hash * @param $string * @return string */ static public function getHash($string) { return ''; } /** * Init Admin menu */ private function _initAdminMenu() { $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); if (!$config->get('adminmenu_show', 1)) { return false; } $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); $appList = JBModelApp::model()->getSimpleList(); $findJBZooApp = false; $dispatched = false; foreach ($appList as $app) { if ($app->application_group == JBZOO_APP_GROUP) { $findJBZooApp = true; if ($curApp == $app->id) { $dispatched = true; } } } if (!$findJBZooApp) { return false; } $router = $this->app->jbrouter; $menuItems = array(); if (!empty($appList)) { foreach ($appList as $app) { $menuItems['app-' . $app->alias] = array( 'name' => $app->name, 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), 'children' => array( 'add-item' => array( 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')), ), 'sep-1' => 'divider', 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')), ), 'frontpage' => array( 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')), ), 'comments' => array( 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')), ), 'sep-1' => 'divider', 'config' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')), ), ), ); } } $menuItems['sep-1'] = 'divider'; if ($dispatched) { if ((int)JBModelConfig::model()->get('enable', 1, 'cart.config')) { $menuItems['orders'] = array( 'name' => JText::_('JBZOO_ADMINMENU_ORDERS'), 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jborder')), 'children' => array( 'cart-configs' => array( 'name' => JText::_('JBZOO_ADMINMENU_CART_CONFIG'), 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jbcart')), ), ), ); $menuItems['sep-2'] = 'divider'; } } $menuItems['item-config'] = array( 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), ); $types = $this->app->jbtype->getSimpleList(); if (!empty($types)) { $children = array(); foreach ($types as $alias => $type) { $children['type-' . $alias] = array( 'name' => $type, 'url' => $router->admin(array('controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => array('0' => $alias))), ); } $menuItems['item-config']['children'] = $children; } if ($dispatched) { $menuItems['sep-3'] = 'divider'; $menuItems['jbzoo-admin'] = array( 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), ), ), ); $menuItems['jbzoo-import'] = array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDARD'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), ), ), ); $menuItems['jbzoo-export'] = array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), ), 'types' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), ), 'yandexyml' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDARD'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), ), 'zoobackup' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), ), ), ); $menuItems['sep-4'] = 'divider'; $menuItems['jbzoo-info'] = array( 'name' => JText::_('JBZOO_ADMINMENU_INFO'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), ), 'server' => array( 'name' => 'Get Last JBZoo', 'url' => 'https://github.com/JBZoo/JBZoo', 'target' => '_blank', ), ) ); } $menuItems['jbzoo-support'] = array( 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), 'url' => 'http://forum.jbzoo.com/', 'target' => '_blank', ); $this->app->jbassets->addVar('JBAdminItems', array( 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), 'items' => $menuItems, )); } /** * Get group name * @return string */ private function _getGroup() { return $this->_group; } /** * Register new path in system * @param string $path * @param string $pathName * @return mixed */ private function _addPath($path, $pathName) { if ($fullPath = $this->app->path->path($path)) { return $this->app->path->register($fullPath, $pathName); } return null; } } \ No newline at end of file + + */ + +// no direct access +defined('_JEXEC') or die('Restricted access'); + +/** + * Class JBZoo + */ +class JBZoo +{ + /** + * @var Application + */ + public $app = null; + + /** + * App group name + * @var string + */ + private $_group = JBZOO_APP_GROUP; + + /** + * Init JBZoo application + * @static + * @return JBZoo + */ + public static function init() + { + static $jbzoo; + + if (!isset($jbzoo)) { + $jbzoo = new self(); + } + + return $jbzoo; + } + + /** + * Initialization JBZoo App + */ + private function __construct() + { + $this->app = App::getInstance('zoo'); + + $this->_initPaths(); + $this->_initClasses(); + $this->_initEvents(); + $this->_initAssets(); + } + + /** + * Add directory path + */ + private function _initPaths() + { + $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); + $this->_addPath('jbapp:framework', 'jbzoo'); + $this->_addPath('jbapp:assets', 'jbassets'); + $this->_addPath('jbassets:zoo', 'assets'); + $this->_addPath('jbapp:config', 'jbconfig'); + $this->_addPath('jbzoo:elements', 'jbelements'); + $this->_addPath('jbapp:cart-elements', 'cart-elements'); + $this->_addPath('jbapp:types', 'jbtypes'); + + $this->_addPath('jbzoo:helpers', 'helpers'); + $this->_addPath('jbzoo:helpers-std', 'helpers'); + $this->_addPath('helpers:fields', 'fields'); + + $this->_addPath('jbzoo:tables', 'tables'); + $this->_addPath('jbzoo:classes-std', 'classes'); + $this->_addPath('jbzoo:render', 'renderer'); + $this->_addPath('jbzoo:views', 'jbviews'); + $this->_addPath('jbapp:config', 'jbxml'); + $this->_addPath('jbviews:', 'partials'); + $this->_addPath('jbapp:joomla/elements', 'fields'); + $this->_addPath('jbapp:templates', 'jbtmpl'); + + $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); + $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); + $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); + $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); + $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); + $this->_addPath('modules:mod_jbzoo_currency', 'mod_jbzoo_currency'); + + $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); + + if ($this->app->jbenv->isSite()) { + $this->_addPath('jbzoo:controllers', 'controllers'); + } + + require $this->app->path->path('jbzoo:controllers/base.php'); + + JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); + } + + /** + * Include models classes + */ + private function _initClasses() + { + jimport('joomla.html.parameter.element'); + + $this->app->loader->register('AppValidator', 'classes:validator.php'); + + // defines + define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); + define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); + define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); + define('ZOO_TABLE_JBZOO_ORDER', '#__zoo_jbzoo_orders'); + + $frmwork = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework'; + $clsPath = $frmwork . '/classes'; + $modPath = $frmwork . '/models'; + $filPath = $frmwork . '/render/filter'; + $evtPath = $frmwork . '/events'; + + $classList = array( + 'JBDatabaseQuery' => $clsPath . '/database/JBDatabaseQuery.php', + 'JBDatabaseQueryElement' => $clsPath . '/database/JBDatabaseQueryElement.php', + 'JBCartOrder' => $clsPath . '/cart/jborder.php', + 'JBCart' => $clsPath . '/cart/jbcart.php', + 'JBCartValue' => $clsPath . '/cart/jbvalue.php', + 'JBCartVariant' => $clsPath . '/cart/jbvariant.php', + 'JBCartVariantList' => $clsPath . '/cart/jbvariantlist.php', + 'JBTemplate' => $clsPath . '/jbtemplate.php', + + // models + 'JBModel' => $modPath . '/jbmodel.php', + 'JBModelConfig' => $modPath . '/jbmodel.config.php', + 'JBModelElement' => $modPath . '/jbmodel.element.php', + 'JBModelAutoComplete' => $modPath . '/jbmodel.autocomplete.php', + 'JBModelElementCountry' => $modPath . '/jbmodel.element.country.php', + 'JBModelElementDate' => $modPath . '/jbmodel.element.date.php', + 'JBModelElementItemDate' => $modPath . '/jbmodel.element.itemdate.php', + 'JBModelElementItemauthor' => $modPath . '/jbmodel.element.itemauthor.php', + 'JBModelElementItemCategory' => $modPath . '/jbmodel.element.itemcategory.php', + 'JBModelElementItemCreated' => $modPath . '/jbmodel.element.itemcreated.php', + 'JBModelElementItemFrontpage' => $modPath . '/jbmodel.element.itemfrontpage.php', + 'JBModelElementItemModified' => $modPath . '/jbmodel.element.itemmodified.php', + 'JBModelElementItemName' => $modPath . '/jbmodel.element.itemname.php', + 'JBModelElementItemPublish_down' => $modPath . '/jbmodel.element.itempublish_down.php', + 'JBModelElementItemPublish_up' => $modPath . '/jbmodel.element.itempublish_up.php', + 'JBModelElementItemTag' => $modPath . '/jbmodel.element.itemtag.php', + 'JBModelElementJBImage' => $modPath . '/jbmodel.element.jbimage.php', + 'JBModelElementJBSelectCascade' => $modPath . '/jbmodel.element.jbselectcascade.php', + 'JBModelElementRange' => $modPath . '/jbmodel.element.range.php', + 'JBModelElementRating' => $modPath . '/jbmodel.element.rating.php', + 'JBModelElementJBPrice' => $modPath . '/jbmodel.element.jbprice.php', + 'JBModelElementJBPricePlain' => $modPath . '/jbmodel.element.jbprice.plain.php', + 'JBModelElementJBPriceCalc' => $modPath . '/jbmodel.element.jbprice.calc.php', + 'JBModelElementJBComments' => $modPath . '/jbmodel.element.jbcomments.php', + 'JBModelElementTextarea' => $modPath . '/jbmodel.element.textarea.php', + 'JBModelFavorite' => $modPath . '/jbmodel.favorite.php', + 'JBModelFilter' => $modPath . '/jbmodel.filter.php', + 'JBModelItem' => $modPath . '/jbmodel.item.php', + 'JBModelApp' => $modPath . '/jbmodel.app.php', + 'JBModelCategory' => $modPath . '/jbmodel.category.php', + 'JBModelOrder' => $modPath . '/jbmodel.order.php', + 'JBModelRelated' => $modPath . '/jbmodel.related.php', + 'JBModelSearchindex' => $modPath . '/jbmodel.searchindex.php', + 'JBModelValues' => $modPath . '/jbmodel.values.php', + 'JBModelSku' => $modPath . '/jbmodel.sku.php', + + // filter + 'JBFilterElement' => $filPath . '/element.php', + 'JBFilterElementAuthor' => $filPath . '/element.author.php', + 'JBFilterElementAuthorCheckbox' => $filPath . '/element.author.checkbox.php', + 'JBFilterElementAuthorRadio' => $filPath . '/element.author.radio.php', + 'JBFilterElementAuthorSelect' => $filPath . '/element.author.select.php', + 'JBFilterElementAuthorChosen' => $filPath . '/element.author.select.chosen.php', + 'JBFilterElementAuthorText' => $filPath . '/element.author.text.php', + 'JBFilterElementCategory' => $filPath . '/element.category.php', + 'JBFilterElementCategoryChosen' => $filPath . '/element.category.chosen.php', + 'JBFilterElementCategoryHidden' => $filPath . '/element.category.hidden.php', + 'JBFilterElementCheckbox' => $filPath . '/element.checkbox.php', + 'JBFilterElementCountry' => $filPath . '/element.country.php', + 'JBFilterElementCountryCheckbox' => $filPath . '/element.country.checkbox.php', + 'JBFilterElementCountryRadio' => $filPath . '/element.country.radio.php', + 'JBFilterElementCountrySelect' => $filPath . '/element.country.select.php', + 'JBFilterElementCountryChosen' => $filPath . '/element.country.select.chosen.php', + 'JBFilterElementDate' => $filPath . '/element.date.php', + 'JBFilterElementDateRange' => $filPath . '/element.date.range.php', + 'JBFilterElementFrontpage' => $filPath . '/element.frontpage.php', + 'JBFilterElementFrontpageJqueryUI' => $filPath . '/element.frontpage.jqueryui.php', + 'JBFilterElementHidden' => $filPath . '/element.hidden.php', + 'JBFilterElementImageexists' => $filPath . '/element.imageexists.php', + 'JBFilterElementImageexistsJqueryui' => $filPath . '/element.imageexists.jqueryui.php', + 'JBFilterElementJBColor' => $filPath . '/element.jbcolor.php', + 'JBFilterElementJBPriceCalc' => $filPath . '/element.jbpricecalc.php', + 'JBFilterElementJBPricePlain' => $filPath . '/element.jbpriceplain.php', + 'JBFilterElementJbselectcascade' => $filPath . '/element.jbselectcascade.php', + 'JBFilterElementJqueryui' => $filPath . '/element.jqueryui.php', + 'JBFilterElementName' => $filPath . '/element.name.php', + 'JBFilterElementNameCheckbox' => $filPath . '/element.name.checkbox.php', + 'JBFilterElementNameRadio' => $filPath . '/element.name.radio.php', + 'JBFilterElementNameSelect' => $filPath . '/element.name.select.php', + 'JBFilterElementNameChosen' => $filPath . '/element.name.select.chosen.php', + 'JBFilterElementRadio' => $filPath . '/element.radio.php', + 'JBFilterElementRating' => $filPath . '/element.rating.php', + 'JBFilterElementRatingRanges' => $filPath . '/element.rating.ranges.php', + 'JBFilterElementRatingSlider' => $filPath . '/element.rating.slider.php', + 'JBFilterElementSelect' => $filPath . '/element.select.php', + 'JBFilterElementSelectChosen' => $filPath . '/element.select.chosen.php', + 'JBFilterElementSlider' => $filPath . '/element.slider.php', + 'JBFilterElementTag' => $filPath . '/element.tag.php', + 'JBFilterElementTagCheckbox' => $filPath . '/element.tag.checkbox.php', + 'JBFilterElementTagRadio' => $filPath . '/element.tag.radio.php', + 'JBFilterElementTagSelect' => $filPath . '/element.tag.select.php', + 'JBFilterElementTagSelectChosen' => $filPath . '/element.tag.select.chosen.php', + 'JBFilterElementText' => $filPath . '/element.text.php', + 'JBFilterElementTextRange' => $filPath . '/element.text.range.php', + + // events + 'JBZooSystemPlugin' => $evtPath . '/jsystem.php', + 'JBEvent' => $evtPath . '/jbevent.php', + 'JBEventApplication' => $evtPath . '/jbevent.application.php', + 'JBEventBasket' => $evtPath . '/jbevent.basket.php', + 'JBEventCategory' => $evtPath . '/jbevent.category.php', + 'JBEventComment' => $evtPath . '/jbevent.comment.php', + 'JBEventElement' => $evtPath . '/jbevent.element.php', + 'JBEventItem' => $evtPath . '/jbevent.item.php', + 'JBEventJBZoo' => $evtPath . '/jbevent.jbzoo.php', + 'JBEventLayout' => $evtPath . '/jbevent.layout.php', + 'JBEventSubmission' => $evtPath . '/jbevent.submission.php', + 'JBEventTag' => $evtPath . '/jbevent.tag.php', + 'JBEventType' => $evtPath . '/jbevent.type.php', + ); + + foreach ($classList as $className => $path) { + JLoader::register($className, $path); + } + } + + /** + * Get domain name + * @param bool $isAny + * @return string + */ + static function getDomain($isAny = false) + { + if (defined('STDIN') || php_sapi_name() == "cli") { + return 'console'; + } + + $domain = ''; + if (function_exists('apache_request_headers')) { + $headers = apache_request_headers(); + $domain = isset($headers['Host']) ? $headers['Host'] : ''; + } + + if ($isAny && !$domain) { + $domain = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''; + } + + $domain = preg_replace('#^www\.#', '', $domain); + list($domain) = explode(':', $domain); + + return $domain; + } + + /** + * Load lang files + */ + private function _initLanguages() + { + $lang = JFactory::getLanguage(); + $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); + } + + /** + * Register and connect events + */ + private function _initEvents() + { + $event = $this->app->event; + $dispatcher = $event->dispatcher; + + $event->register('JBEventApplication'); + $dispatcher->connect('application:init', array('JBEventApplication', 'init')); + $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); + $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); + $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); + $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); + $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); + $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); + $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); + $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); + + $event->register('JBEventCategory'); + $dispatcher->connect('category:init', array('JBEventCategory', 'init')); + $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); + $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); + $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); + + $event->register('JBEventItem'); + $dispatcher->connect('item:init', array('JBEventItem', 'init')); + $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); + $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); + $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); + $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); + $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); + $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); + $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); + $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); + $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); + + $event->register('JBEventComment'); + $dispatcher->connect('comment:init', array('JBEventComment', 'init')); + $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); + $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); + $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); + + $event->register('JBEventSubmission'); + $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); + $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); + $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); + $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); + + $event->register('JBEventElement'); + $dispatcher->connect('element:download', array('JBEventElement', 'download')); + $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); + $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); + $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); + $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); + $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); + $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); + $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); + $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); + $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); + + $event->register('JBEventLayout'); + $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); + + $event->register('JBEventTag'); + $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); + $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); + + $event->register('JBEventType'); + $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); + $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); + $dispatcher->connect('type:copied', array('JBEventType', 'copied')); + $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); + $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); + $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); + $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); + + $event->register('JBEventJBZoo'); + $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); + $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); + + $event->register('JBEventBasket'); + $dispatcher->connect('basket:beforeSave', array('JBEventBasket', 'beforeSave')); + $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); + $dispatcher->connect('basket:afterSave', array('JBEventBasket', 'afterSave')); + $dispatcher->connect('basket:updated', array('JBEventBasket', 'updated')); + + $dispatcher->connect('basket:addItem', array('JBEventBasket', 'addItem')); + $dispatcher->connect('basket:updateItem', array('JBEventBasket', 'updateItem')); + $dispatcher->connect('basket:changeQuantity', array('JBEventBasket', 'changeQuantity')); + $dispatcher->connect('basket:removeItem', array('JBEventBasket', 'removeItem')); + $dispatcher->connect('basket:removeItems', array('JBEventBasket', 'removeItems')); + $dispatcher->connect('basket:recount', array('JBEventBasket', 'recount')); + + $dispatcher->connect('basket:orderStatus', array('JBEventBasket', 'orderStatus')); + $dispatcher->connect('basket:paymentStatus', array('JBEventBasket', 'paymentStatus')); + $dispatcher->connect('basket:shippingStatus', array('JBEventBasket', 'shippingStatus')); + + $dispatcher->connect('basket:paymentSuccess', array('JBEventBasket', 'paymentSuccess')); + $dispatcher->connect('basket:paymentFail', array('JBEventBasket', 'paymentFail')); + $dispatcher->connect('basket:paymentCallback', array('JBEventBasket', 'paymentCallback')); + } + + /** + * Init assets for admin path + */ + private function _initAssets() + { + if (!$this->app->jbenv->isSite() && !$this->app->jbrequest->isAjax()) { + $this->app->jbassets->admin(); + $this->_initLanguages(); + $this->_initAdminMenu(); + } + } + + /** + * Get hash + * @param $string + * @return string + */ + static public function getHash($string) + { + return ''; + } + + /** + * Init Admin menu + */ + private function _initAdminMenu() + { + $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); + if (!$config->get('adminmenu_show', 1)) { + return false; + } + + $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); + + $appList = JBModelApp::model()->getSimpleList(); + + $findJBZooApp = false; + $dispatched = false; + foreach ($appList as $app) { + if ($app->application_group == JBZOO_APP_GROUP) { + $findJBZooApp = true; + if ($curApp == $app->id) { + $dispatched = true; + } + } + } + + if (!$findJBZooApp) { + return false; + } + + $router = $this->app->jbrouter; + + $menuItems = array(); + + if (!empty($appList)) { + foreach ($appList as $app) { + + $menuItems['app-' . $app->alias] = array( + 'name' => $app->name, + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), + 'children' => array( + 'add-item' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')), + ), + 'sep-1' => 'divider', + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')), + ), + 'frontpage' => array( + 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')), + ), + 'comments' => array( + 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')), + ), + 'sep-1' => 'divider', + 'config' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')), + ), + ), + ); + } + } + + $menuItems['sep-1'] = 'divider'; + + if ($dispatched) { + if ((int)JBModelConfig::model()->get('enable', 1, 'cart.config')) { + $menuItems['orders'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_ORDERS'), + 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jborder')), + 'children' => array( + 'cart-configs' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CART_CONFIG'), + 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jbcart')), + ), + ), + ); + + $menuItems['sep-2'] = 'divider'; + } + } + + $menuItems['item-config'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), + 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), + ); + + $types = $this->app->jbtype->getSimpleList(); + if (!empty($types)) { + $children = array(); + foreach ($types as $alias => $type) { + $children['type-' . $alias] = array( + 'name' => $type, + 'url' => $router->admin(array('controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => array('0' => $alias))), + ); + } + + $menuItems['item-config']['children'] = $children; + } + + if ($dispatched) { + $menuItems['sep-3'] = 'divider'; + + $menuItems['jbzoo-admin'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), + 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), + 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), + 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), + ), + ), + ); + + $menuItems['jbzoo-import'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDARD'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), + ), + ), + ); + + $menuItems['jbzoo-export'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), + ), + 'types' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), + ), + 'yandexyml' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDARD'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), + ), + 'zoobackup' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), + ), + ), + ); + + $menuItems['sep-4'] = 'divider'; + + $menuItems['jbzoo-info'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_INFO'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), + ), + 'server' => array( + 'name' => 'Get Last JBZoo', + 'url' => 'https://github.com/JBZoo/JBZoo', + 'target' => '_blank', + ), + ) + ); + } + + $menuItems['jbzoo-support'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), + 'url' => 'http://forum.jbzoo.com/', + 'target' => '_blank', + ); + + $this->app->jbassets->addVar('JBAdminItems', array( + 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), + 'items' => $menuItems, + )); + } + + /** + * Get group name + * @return string + */ + private function _getGroup() + { + return $this->_group; + } + + /** + * Register new path in system + * @param string $path + * @param string $pathName + * @return mixed + */ + private function _addPath($path, $pathName) + { + if ($fullPath = $this->app->path->path($path)) { + return $this->app->path->register($fullPath, $pathName); + } + + return null; + } +} diff --git a/patches/2.2.9/media/zoo/applications/jbuniversal/framework/jbzoo.php b/patches/2.2.9/media/zoo/applications/jbuniversal/framework/jbzoo.php index d655948..89f9baa 100644 --- a/patches/2.2.9/media/zoo/applications/jbuniversal/framework/jbzoo.php +++ b/patches/2.2.9/media/zoo/applications/jbuniversal/framework/jbzoo.php @@ -1 +1,657 @@ - */ // no direct access defined('_JEXEC') or die('Restricted access'); /** * Class JBZoo */ class JBZoo { /** * @var Application */ public $app = null; /** * App group name * @var string */ private $_group = JBZOO_APP_GROUP; /** * Init JBZoo application * @static * @return JBZoo */ public static function init() { static $jbzoo; if (!isset($jbzoo)) { $jbzoo = new self(); } return $jbzoo; } /** * Initialization JBZoo App */ private function __construct() { $this->app = App::getInstance('zoo'); $this->_initPaths(); $this->_initClasses(); $this->_initEvents(); $this->_initAssets(); } /** * Add directory path */ private function _initPaths() { $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); $this->_addPath('jbapp:framework', 'jbzoo'); $this->_addPath('jbapp:assets', 'jbassets'); $this->_addPath('jbassets:zoo', 'assets'); $this->_addPath('jbapp:config', 'jbconfig'); $this->_addPath('jbzoo:elements', 'jbelements'); $this->_addPath('jbapp:cart-elements', 'cart-elements'); $this->_addPath('jbapp:types', 'jbtypes'); $this->_addPath('jbzoo:helpers', 'helpers'); $this->_addPath('jbzoo:helpers-std', 'helpers'); $this->_addPath('helpers:fields', 'fields'); $this->_addPath('jbzoo:tables', 'tables'); $this->_addPath('jbzoo:classes-std', 'classes'); $this->_addPath('jbzoo:render', 'renderer'); $this->_addPath('jbzoo:views', 'jbviews'); $this->_addPath('jbapp:config', 'jbxml'); $this->_addPath('jbviews:', 'partials'); $this->_addPath('jbapp:joomla/elements', 'fields'); $this->_addPath('jbapp:templates', 'jbtmpl'); $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); $this->_addPath('modules:mod_jbzoo_currency', 'mod_jbzoo_currency'); $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); if ($this->app->jbenv->isSite()) { $this->_addPath('jbzoo:controllers', 'controllers'); } require $this->app->path->path('jbzoo:controllers/base.php'); JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); } /** * Include models classes */ private function _initClasses() { jimport('joomla.html.parameter.element'); $this->app->loader->register('AppValidator', 'classes:validator.php'); // defines define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); define('ZOO_TABLE_JBZOO_ORDER', '#__zoo_jbzoo_orders'); $frmwork = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework'; $clsPath = $frmwork . '/classes'; $modPath = $frmwork . '/models'; $filPath = $frmwork . '/render/filter'; $evtPath = $frmwork . '/events'; $classList = array( 'JBDatabaseQuery' => $clsPath . '/database/JBDatabaseQuery.php', 'JBDatabaseQueryElement' => $clsPath . '/database/JBDatabaseQueryElement.php', 'JBCartOrder' => $clsPath . '/cart/jborder.php', 'JBCart' => $clsPath . '/cart/jbcart.php', 'JBCartValue' => $clsPath . '/cart/jbvalue.php', 'JBCartVariant' => $clsPath . '/cart/jbvariant.php', 'JBCartVariantList' => $clsPath . '/cart/jbvariantlist.php', 'JBTemplate' => $clsPath . '/jbtemplate.php', // models 'JBModel' => $modPath . '/jbmodel.php', 'JBModelConfig' => $modPath . '/jbmodel.config.php', 'JBModelElement' => $modPath . '/jbmodel.element.php', 'JBModelAutoComplete' => $modPath . '/jbmodel.autocomplete.php', 'JBModelElementCountry' => $modPath . '/jbmodel.element.country.php', 'JBModelElementDate' => $modPath . '/jbmodel.element.date.php', 'JBModelElementItemDate' => $modPath . '/jbmodel.element.itemdate.php', 'JBModelElementItemauthor' => $modPath . '/jbmodel.element.itemauthor.php', 'JBModelElementItemCategory' => $modPath . '/jbmodel.element.itemcategory.php', 'JBModelElementItemCreated' => $modPath . '/jbmodel.element.itemcreated.php', 'JBModelElementItemFrontpage' => $modPath . '/jbmodel.element.itemfrontpage.php', 'JBModelElementItemModified' => $modPath . '/jbmodel.element.itemmodified.php', 'JBModelElementItemName' => $modPath . '/jbmodel.element.itemname.php', 'JBModelElementItemPublish_down' => $modPath . '/jbmodel.element.itempublish_down.php', 'JBModelElementItemPublish_up' => $modPath . '/jbmodel.element.itempublish_up.php', 'JBModelElementItemTag' => $modPath . '/jbmodel.element.itemtag.php', 'JBModelElementJBImage' => $modPath . '/jbmodel.element.jbimage.php', 'JBModelElementJBSelectCascade' => $modPath . '/jbmodel.element.jbselectcascade.php', 'JBModelElementRange' => $modPath . '/jbmodel.element.range.php', 'JBModelElementRating' => $modPath . '/jbmodel.element.rating.php', 'JBModelElementJBPrice' => $modPath . '/jbmodel.element.jbprice.php', 'JBModelElementJBPricePlain' => $modPath . '/jbmodel.element.jbprice.plain.php', 'JBModelElementJBPriceCalc' => $modPath . '/jbmodel.element.jbprice.calc.php', 'JBModelElementJBComments' => $modPath . '/jbmodel.element.jbcomments.php', 'JBModelElementTextarea' => $modPath . '/jbmodel.element.textarea.php', 'JBModelFavorite' => $modPath . '/jbmodel.favorite.php', 'JBModelFilter' => $modPath . '/jbmodel.filter.php', 'JBModelItem' => $modPath . '/jbmodel.item.php', 'JBModelApp' => $modPath . '/jbmodel.app.php', 'JBModelCategory' => $modPath . '/jbmodel.category.php', 'JBModelOrder' => $modPath . '/jbmodel.order.php', 'JBModelRelated' => $modPath . '/jbmodel.related.php', 'JBModelSearchindex' => $modPath . '/jbmodel.searchindex.php', 'JBModelValues' => $modPath . '/jbmodel.values.php', 'JBModelSku' => $modPath . '/jbmodel.sku.php', // filter 'JBFilterElement' => $filPath . '/element.php', 'JBFilterElementAuthor' => $filPath . '/element.author.php', 'JBFilterElementAuthorCheckbox' => $filPath . '/element.author.checkbox.php', 'JBFilterElementAuthorRadio' => $filPath . '/element.author.radio.php', 'JBFilterElementAuthorSelect' => $filPath . '/element.author.select.php', 'JBFilterElementAuthorChosen' => $filPath . '/element.author.select.chosen.php', 'JBFilterElementAuthorText' => $filPath . '/element.author.text.php', 'JBFilterElementCategory' => $filPath . '/element.category.php', 'JBFilterElementCategoryChosen' => $filPath . '/element.category.chosen.php', 'JBFilterElementCategoryHidden' => $filPath . '/element.category.hidden.php', 'JBFilterElementCheckbox' => $filPath . '/element.checkbox.php', 'JBFilterElementCountry' => $filPath . '/element.country.php', 'JBFilterElementCountryCheckbox' => $filPath . '/element.country.checkbox.php', 'JBFilterElementCountryRadio' => $filPath . '/element.country.radio.php', 'JBFilterElementCountrySelect' => $filPath . '/element.country.select.php', 'JBFilterElementCountryChosen' => $filPath . '/element.country.select.chosen.php', 'JBFilterElementDate' => $filPath . '/element.date.php', 'JBFilterElementDateRange' => $filPath . '/element.date.range.php', 'JBFilterElementFrontpage' => $filPath . '/element.frontpage.php', 'JBFilterElementFrontpageJqueryUI' => $filPath . '/element.frontpage.jqueryui.php', 'JBFilterElementHidden' => $filPath . '/element.hidden.php', 'JBFilterElementImageexists' => $filPath . '/element.imageexists.php', 'JBFilterElementImageexistsJqueryui' => $filPath . '/element.imageexists.jqueryui.php', 'JBFilterElementJBColor' => $filPath . '/element.jbcolor.php', 'JBFilterElementJBPriceCalc' => $filPath . '/element.jbpricecalc.php', 'JBFilterElementJBPricePlain' => $filPath . '/element.jbpriceplain.php', 'JBFilterElementJbselectcascade' => $filPath . '/element.jbselectcascade.php', 'JBFilterElementJqueryui' => $filPath . '/element.jqueryui.php', 'JBFilterElementName' => $filPath . '/element.name.php', 'JBFilterElementNameCheckbox' => $filPath . '/element.name.checkbox.php', 'JBFilterElementNameRadio' => $filPath . '/element.name.radio.php', 'JBFilterElementNameSelect' => $filPath . '/element.name.select.php', 'JBFilterElementNameChosen' => $filPath . '/element.name.select.chosen.php', 'JBFilterElementRadio' => $filPath . '/element.radio.php', 'JBFilterElementRating' => $filPath . '/element.rating.php', 'JBFilterElementRatingRanges' => $filPath . '/element.rating.ranges.php', 'JBFilterElementRatingSlider' => $filPath . '/element.rating.slider.php', 'JBFilterElementSelect' => $filPath . '/element.select.php', 'JBFilterElementSelectChosen' => $filPath . '/element.select.chosen.php', 'JBFilterElementSlider' => $filPath . '/element.slider.php', 'JBFilterElementTag' => $filPath . '/element.tag.php', 'JBFilterElementTagCheckbox' => $filPath . '/element.tag.checkbox.php', 'JBFilterElementTagRadio' => $filPath . '/element.tag.radio.php', 'JBFilterElementTagSelect' => $filPath . '/element.tag.select.php', 'JBFilterElementTagSelectChosen' => $filPath . '/element.tag.select.chosen.php', 'JBFilterElementText' => $filPath . '/element.text.php', 'JBFilterElementTextRange' => $filPath . '/element.text.range.php', // events 'JBZooSystemPlugin' => $evtPath . '/jsystem.php', 'JBEvent' => $evtPath . '/jbevent.php', 'JBEventApplication' => $evtPath . '/jbevent.application.php', 'JBEventBasket' => $evtPath . '/jbevent.basket.php', 'JBEventCategory' => $evtPath . '/jbevent.category.php', 'JBEventComment' => $evtPath . '/jbevent.comment.php', 'JBEventElement' => $evtPath . '/jbevent.element.php', 'JBEventItem' => $evtPath . '/jbevent.item.php', 'JBEventJBZoo' => $evtPath . '/jbevent.jbzoo.php', 'JBEventLayout' => $evtPath . '/jbevent.layout.php', 'JBEventSubmission' => $evtPath . '/jbevent.submission.php', 'JBEventTag' => $evtPath . '/jbevent.tag.php', 'JBEventType' => $evtPath . '/jbevent.type.php', ); foreach ($classList as $className => $path) { JLoader::register($className, $path); } } /** * Get domain name * @param bool $isAny * @return string */ static function getDomain($isAny = false) { if (defined('STDIN') || php_sapi_name() == "cli") { return 'console'; } $domain = ''; if (function_exists('apache_request_headers')) { $headers = apache_request_headers(); $domain = isset($headers['Host']) ? $headers['Host'] : ''; } if ($isAny && !$domain) { $domain = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''; } $domain = preg_replace('#^www\.#', '', $domain); list($domain) = explode(':', $domain); return $domain; } /** * Load lang files */ private function _initLanguages() { $lang = JFactory::getLanguage(); $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); } /** * Register and connect events */ private function _initEvents() { $event = $this->app->event; $dispatcher = $event->dispatcher; $event->register('JBEventApplication'); $dispatcher->connect('application:init', array('JBEventApplication', 'init')); $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); $event->register('JBEventCategory'); $dispatcher->connect('category:init', array('JBEventCategory', 'init')); $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); $event->register('JBEventItem'); $dispatcher->connect('item:init', array('JBEventItem', 'init')); $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); $event->register('JBEventComment'); $dispatcher->connect('comment:init', array('JBEventComment', 'init')); $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); $event->register('JBEventSubmission'); $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); $event->register('JBEventElement'); $dispatcher->connect('element:download', array('JBEventElement', 'download')); $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); $event->register('JBEventLayout'); $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); $event->register('JBEventTag'); $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); $event->register('JBEventType'); $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); $dispatcher->connect('type:copied', array('JBEventType', 'copied')); $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); $event->register('JBEventJBZoo'); $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); $event->register('JBEventBasket'); $dispatcher->connect('basket:beforeSave', array('JBEventBasket', 'beforeSave')); $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); $dispatcher->connect('basket:afterSave', array('JBEventBasket', 'afterSave')); $dispatcher->connect('basket:updated', array('JBEventBasket', 'updated')); $dispatcher->connect('basket:addItem', array('JBEventBasket', 'addItem')); $dispatcher->connect('basket:updateItem', array('JBEventBasket', 'updateItem')); $dispatcher->connect('basket:changeQuantity', array('JBEventBasket', 'changeQuantity')); $dispatcher->connect('basket:removeItem', array('JBEventBasket', 'removeItem')); $dispatcher->connect('basket:removeItems', array('JBEventBasket', 'removeItems')); $dispatcher->connect('basket:recount', array('JBEventBasket', 'recount')); $dispatcher->connect('basket:orderStatus', array('JBEventBasket', 'orderStatus')); $dispatcher->connect('basket:paymentStatus', array('JBEventBasket', 'paymentStatus')); $dispatcher->connect('basket:shippingStatus', array('JBEventBasket', 'shippingStatus')); $dispatcher->connect('basket:paymentSuccess', array('JBEventBasket', 'paymentSuccess')); $dispatcher->connect('basket:paymentFail', array('JBEventBasket', 'paymentFail')); $dispatcher->connect('basket:paymentCallback', array('JBEventBasket', 'paymentCallback')); } /** * Init assets for admin path */ private function _initAssets() { if (!$this->app->jbenv->isSite() && !$this->app->jbrequest->isAjax()) { $this->app->jbassets->admin(); $this->_initLanguages(); $this->_initAdminMenu(); } } /** * Get hash * @param $string * @return string */ static public function getHash($string) { return ''; } /** * Init Admin menu */ private function _initAdminMenu() { $isNotJ35 = version_compare(JVERSION, '3.6', '<='); if ($isNotJ35) { $this->app->jbassets->addVar('JBAdminItems', array( 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), 'items' => $this->getAdminMenu(), )); } } /** * Init Admin menu */ public function getAdminMenu() { $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); if (!$config->get('adminmenu_show', 1)) { return false; } $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); $appList = JBModelApp::model()->getSimpleList(); $findJBZooApp = false; $dispatched = false; foreach ($appList as $app) { if ($app->application_group == JBZOO_APP_GROUP) { $findJBZooApp = true; if ($curApp == $app->id) { $dispatched = true; } } } if (!$findJBZooApp) { return false; } $router = $this->app->jbrouter; $menuItems = array(); if (!empty($appList)) { foreach ($appList as $app) { $menuItems['app-' . $app->alias] = array( 'name' => $app->name, 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), 'children' => array( 'add-item' => array( 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')), ), 'sep-1' => 'divider', 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')), ), 'frontpage' => array( 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')), ), 'comments' => array( 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')), ), 'sep-1' => 'divider', 'config' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')), ), ), ); } } $menuItems['sep-1'] = 'divider'; if ($dispatched) { if ((int)JBModelConfig::model()->get('enable', 1, 'cart.config')) { $menuItems['orders'] = array( 'name' => JText::_('JBZOO_ADMINMENU_ORDERS'), 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jborder')), 'children' => array( 'cart-configs' => array( 'name' => JText::_('JBZOO_ADMINMENU_CART_CONFIG'), 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jbcart')), ), ), ); $menuItems['sep-2'] = 'divider'; } } $menuItems['item-config'] = array( 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), ); $types = $this->app->jbtype->getSimpleList(); if (!empty($types)) { $children = array(); foreach ($types as $alias => $type) { $children['type-' . $alias] = array( 'name' => $type, 'url' => $router->admin(array('controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => array('0' => $alias))), ); } $menuItems['item-config']['children'] = $children; } if ($dispatched) { $menuItems['sep-3'] = 'divider'; $menuItems['jbzoo-admin'] = array( 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), ), ), ); $menuItems['jbzoo-import'] = array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDARD'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), ), ), ); $menuItems['jbzoo-export'] = array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), ), 'types' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), ), 'yandexyml' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDARD'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), ), 'zoobackup' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), ), ), ); $menuItems['sep-4'] = 'divider'; $menuItems['jbzoo-info'] = array( 'name' => JText::_('JBZOO_ADMINMENU_INFO'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), ), 'server' => array( 'name' => 'Get Last JBZoo', 'url' => 'https://github.com/JBZoo/JBZoo', 'target' => '_blank', ), ), ); } $menuItems['jbzoo-support'] = array( 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), 'url' => 'http://forum.jbzoo.com/', 'target' => '_blank', ); $this->app->jbassets->addVar('JBAdminItems', array( 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), 'items' => $menuItems, )); } /** * Get group name * @return string */ private function _getGroup() { return $this->_group; } /** * Register new path in system * @param string $path * @param string $pathName * @return mixed */ private function _addPath($path, $pathName) { if ($fullPath = $this->app->path->path($path)) { return $this->app->path->register($fullPath, $pathName); } return null; } } \ No newline at end of file + + */ + +// no direct access +defined('_JEXEC') or die('Restricted access'); + +/** + * Class JBZoo + */ +class JBZoo +{ + /** + * @var Application + */ + public $app = null; + + /** + * App group name + * @var string + */ + private $_group = JBZOO_APP_GROUP; + + /** + * Init JBZoo application + * @static + * @return JBZoo + */ + public static function init() + { + static $jbzoo; + + if (!isset($jbzoo)) { + $jbzoo = new self(); + } + + return $jbzoo; + } + + /** + * Initialization JBZoo App + */ + private function __construct() + { + $this->app = App::getInstance('zoo'); + + $this->_initPaths(); + $this->_initClasses(); + $this->_initEvents(); + $this->_initAssets(); + } + + /** + * Add directory path + */ + private function _initPaths() + { + $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); + $this->_addPath('jbapp:framework', 'jbzoo'); + $this->_addPath('jbapp:assets', 'jbassets'); + $this->_addPath('jbassets:zoo', 'assets'); + $this->_addPath('jbapp:config', 'jbconfig'); + $this->_addPath('jbzoo:elements', 'jbelements'); + $this->_addPath('jbapp:cart-elements', 'cart-elements'); + $this->_addPath('jbapp:types', 'jbtypes'); + + $this->_addPath('jbzoo:helpers', 'helpers'); + $this->_addPath('jbzoo:helpers-std', 'helpers'); + $this->_addPath('helpers:fields', 'fields'); + + $this->_addPath('jbzoo:tables', 'tables'); + $this->_addPath('jbzoo:classes-std', 'classes'); + $this->_addPath('jbzoo:render', 'renderer'); + $this->_addPath('jbzoo:views', 'jbviews'); + $this->_addPath('jbapp:config', 'jbxml'); + $this->_addPath('jbviews:', 'partials'); + $this->_addPath('jbapp:joomla/elements', 'fields'); + $this->_addPath('jbapp:templates', 'jbtmpl'); + + $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); + $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); + $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); + $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); + $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); + $this->_addPath('modules:mod_jbzoo_currency', 'mod_jbzoo_currency'); + + $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); + + if ($this->app->jbenv->isSite()) { + $this->_addPath('jbzoo:controllers', 'controllers'); + } + + require $this->app->path->path('jbzoo:controllers/base.php'); + + JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); + } + + /** + * Include models classes + */ + private function _initClasses() + { + jimport('joomla.html.parameter.element'); + + $this->app->loader->register('AppValidator', 'classes:validator.php'); + + // defines + define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); + define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); + define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); + define('ZOO_TABLE_JBZOO_ORDER', '#__zoo_jbzoo_orders'); + + $frmwork = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework'; + $clsPath = $frmwork . '/classes'; + $modPath = $frmwork . '/models'; + $filPath = $frmwork . '/render/filter'; + $evtPath = $frmwork . '/events'; + + $classList = array( + 'JBDatabaseQuery' => $clsPath . '/database/JBDatabaseQuery.php', + 'JBDatabaseQueryElement' => $clsPath . '/database/JBDatabaseQueryElement.php', + 'JBCartOrder' => $clsPath . '/cart/jborder.php', + 'JBCart' => $clsPath . '/cart/jbcart.php', + 'JBCartValue' => $clsPath . '/cart/jbvalue.php', + 'JBCartVariant' => $clsPath . '/cart/jbvariant.php', + 'JBCartVariantList' => $clsPath . '/cart/jbvariantlist.php', + 'JBTemplate' => $clsPath . '/jbtemplate.php', + + // models + 'JBModel' => $modPath . '/jbmodel.php', + 'JBModelConfig' => $modPath . '/jbmodel.config.php', + 'JBModelElement' => $modPath . '/jbmodel.element.php', + 'JBModelAutoComplete' => $modPath . '/jbmodel.autocomplete.php', + 'JBModelElementCountry' => $modPath . '/jbmodel.element.country.php', + 'JBModelElementDate' => $modPath . '/jbmodel.element.date.php', + 'JBModelElementItemDate' => $modPath . '/jbmodel.element.itemdate.php', + 'JBModelElementItemauthor' => $modPath . '/jbmodel.element.itemauthor.php', + 'JBModelElementItemCategory' => $modPath . '/jbmodel.element.itemcategory.php', + 'JBModelElementItemCreated' => $modPath . '/jbmodel.element.itemcreated.php', + 'JBModelElementItemFrontpage' => $modPath . '/jbmodel.element.itemfrontpage.php', + 'JBModelElementItemModified' => $modPath . '/jbmodel.element.itemmodified.php', + 'JBModelElementItemName' => $modPath . '/jbmodel.element.itemname.php', + 'JBModelElementItemPublish_down' => $modPath . '/jbmodel.element.itempublish_down.php', + 'JBModelElementItemPublish_up' => $modPath . '/jbmodel.element.itempublish_up.php', + 'JBModelElementItemTag' => $modPath . '/jbmodel.element.itemtag.php', + 'JBModelElementJBImage' => $modPath . '/jbmodel.element.jbimage.php', + 'JBModelElementJBSelectCascade' => $modPath . '/jbmodel.element.jbselectcascade.php', + 'JBModelElementRange' => $modPath . '/jbmodel.element.range.php', + 'JBModelElementRating' => $modPath . '/jbmodel.element.rating.php', + 'JBModelElementJBPrice' => $modPath . '/jbmodel.element.jbprice.php', + 'JBModelElementJBPricePlain' => $modPath . '/jbmodel.element.jbprice.plain.php', + 'JBModelElementJBPriceCalc' => $modPath . '/jbmodel.element.jbprice.calc.php', + 'JBModelElementJBComments' => $modPath . '/jbmodel.element.jbcomments.php', + 'JBModelElementTextarea' => $modPath . '/jbmodel.element.textarea.php', + 'JBModelFavorite' => $modPath . '/jbmodel.favorite.php', + 'JBModelFilter' => $modPath . '/jbmodel.filter.php', + 'JBModelItem' => $modPath . '/jbmodel.item.php', + 'JBModelApp' => $modPath . '/jbmodel.app.php', + 'JBModelCategory' => $modPath . '/jbmodel.category.php', + 'JBModelOrder' => $modPath . '/jbmodel.order.php', + 'JBModelRelated' => $modPath . '/jbmodel.related.php', + 'JBModelSearchindex' => $modPath . '/jbmodel.searchindex.php', + 'JBModelValues' => $modPath . '/jbmodel.values.php', + 'JBModelSku' => $modPath . '/jbmodel.sku.php', + + // filter + 'JBFilterElement' => $filPath . '/element.php', + 'JBFilterElementAuthor' => $filPath . '/element.author.php', + 'JBFilterElementAuthorCheckbox' => $filPath . '/element.author.checkbox.php', + 'JBFilterElementAuthorRadio' => $filPath . '/element.author.radio.php', + 'JBFilterElementAuthorSelect' => $filPath . '/element.author.select.php', + 'JBFilterElementAuthorChosen' => $filPath . '/element.author.select.chosen.php', + 'JBFilterElementAuthorText' => $filPath . '/element.author.text.php', + 'JBFilterElementCategory' => $filPath . '/element.category.php', + 'JBFilterElementCategoryChosen' => $filPath . '/element.category.chosen.php', + 'JBFilterElementCategoryHidden' => $filPath . '/element.category.hidden.php', + 'JBFilterElementCheckbox' => $filPath . '/element.checkbox.php', + 'JBFilterElementCountry' => $filPath . '/element.country.php', + 'JBFilterElementCountryCheckbox' => $filPath . '/element.country.checkbox.php', + 'JBFilterElementCountryRadio' => $filPath . '/element.country.radio.php', + 'JBFilterElementCountrySelect' => $filPath . '/element.country.select.php', + 'JBFilterElementCountryChosen' => $filPath . '/element.country.select.chosen.php', + 'JBFilterElementDate' => $filPath . '/element.date.php', + 'JBFilterElementDateRange' => $filPath . '/element.date.range.php', + 'JBFilterElementFrontpage' => $filPath . '/element.frontpage.php', + 'JBFilterElementFrontpageJqueryUI' => $filPath . '/element.frontpage.jqueryui.php', + 'JBFilterElementHidden' => $filPath . '/element.hidden.php', + 'JBFilterElementImageexists' => $filPath . '/element.imageexists.php', + 'JBFilterElementImageexistsJqueryui' => $filPath . '/element.imageexists.jqueryui.php', + 'JBFilterElementJBColor' => $filPath . '/element.jbcolor.php', + 'JBFilterElementJBPriceCalc' => $filPath . '/element.jbpricecalc.php', + 'JBFilterElementJBPricePlain' => $filPath . '/element.jbpriceplain.php', + 'JBFilterElementJbselectcascade' => $filPath . '/element.jbselectcascade.php', + 'JBFilterElementJqueryui' => $filPath . '/element.jqueryui.php', + 'JBFilterElementName' => $filPath . '/element.name.php', + 'JBFilterElementNameCheckbox' => $filPath . '/element.name.checkbox.php', + 'JBFilterElementNameRadio' => $filPath . '/element.name.radio.php', + 'JBFilterElementNameSelect' => $filPath . '/element.name.select.php', + 'JBFilterElementNameChosen' => $filPath . '/element.name.select.chosen.php', + 'JBFilterElementRadio' => $filPath . '/element.radio.php', + 'JBFilterElementRating' => $filPath . '/element.rating.php', + 'JBFilterElementRatingRanges' => $filPath . '/element.rating.ranges.php', + 'JBFilterElementRatingSlider' => $filPath . '/element.rating.slider.php', + 'JBFilterElementSelect' => $filPath . '/element.select.php', + 'JBFilterElementSelectChosen' => $filPath . '/element.select.chosen.php', + 'JBFilterElementSlider' => $filPath . '/element.slider.php', + 'JBFilterElementTag' => $filPath . '/element.tag.php', + 'JBFilterElementTagCheckbox' => $filPath . '/element.tag.checkbox.php', + 'JBFilterElementTagRadio' => $filPath . '/element.tag.radio.php', + 'JBFilterElementTagSelect' => $filPath . '/element.tag.select.php', + 'JBFilterElementTagSelectChosen' => $filPath . '/element.tag.select.chosen.php', + 'JBFilterElementText' => $filPath . '/element.text.php', + 'JBFilterElementTextRange' => $filPath . '/element.text.range.php', + + // events + 'JBZooSystemPlugin' => $evtPath . '/jsystem.php', + 'JBEvent' => $evtPath . '/jbevent.php', + 'JBEventApplication' => $evtPath . '/jbevent.application.php', + 'JBEventBasket' => $evtPath . '/jbevent.basket.php', + 'JBEventCategory' => $evtPath . '/jbevent.category.php', + 'JBEventComment' => $evtPath . '/jbevent.comment.php', + 'JBEventElement' => $evtPath . '/jbevent.element.php', + 'JBEventItem' => $evtPath . '/jbevent.item.php', + 'JBEventJBZoo' => $evtPath . '/jbevent.jbzoo.php', + 'JBEventLayout' => $evtPath . '/jbevent.layout.php', + 'JBEventSubmission' => $evtPath . '/jbevent.submission.php', + 'JBEventTag' => $evtPath . '/jbevent.tag.php', + 'JBEventType' => $evtPath . '/jbevent.type.php', + ); + + foreach ($classList as $className => $path) { + JLoader::register($className, $path); + } + } + + /** + * Get domain name + * @param bool $isAny + * @return string + */ + static function getDomain($isAny = false) + { + if (defined('STDIN') || php_sapi_name() == "cli") { + return 'console'; + } + + $domain = ''; + if (function_exists('apache_request_headers')) { + $headers = apache_request_headers(); + $domain = isset($headers['Host']) ? $headers['Host'] : ''; + } + + if ($isAny && !$domain) { + $domain = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''; + } + + $domain = preg_replace('#^www\.#', '', $domain); + list($domain) = explode(':', $domain); + + return $domain; + } + + /** + * Load lang files + */ + private function _initLanguages() + { + $lang = JFactory::getLanguage(); + $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); + } + + /** + * Register and connect events + */ + private function _initEvents() + { + $event = $this->app->event; + $dispatcher = $event->dispatcher; + + $event->register('JBEventApplication'); + $dispatcher->connect('application:init', array('JBEventApplication', 'init')); + $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); + $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); + $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); + $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); + $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); + $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); + $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); + $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); + + $event->register('JBEventCategory'); + $dispatcher->connect('category:init', array('JBEventCategory', 'init')); + $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); + $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); + $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); + + $event->register('JBEventItem'); + $dispatcher->connect('item:init', array('JBEventItem', 'init')); + $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); + $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); + $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); + $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); + $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); + $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); + $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); + $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); + $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); + + $event->register('JBEventComment'); + $dispatcher->connect('comment:init', array('JBEventComment', 'init')); + $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); + $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); + $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); + + $event->register('JBEventSubmission'); + $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); + $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); + $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); + $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); + + $event->register('JBEventElement'); + $dispatcher->connect('element:download', array('JBEventElement', 'download')); + $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); + $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); + $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); + $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); + $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); + $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); + $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); + $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); + $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); + + $event->register('JBEventLayout'); + $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); + + $event->register('JBEventTag'); + $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); + $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); + + $event->register('JBEventType'); + $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); + $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); + $dispatcher->connect('type:copied', array('JBEventType', 'copied')); + $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); + $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); + $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); + $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); + + $event->register('JBEventJBZoo'); + $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); + $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); + + $event->register('JBEventBasket'); + $dispatcher->connect('basket:beforeSave', array('JBEventBasket', 'beforeSave')); + $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); + $dispatcher->connect('basket:afterSave', array('JBEventBasket', 'afterSave')); + $dispatcher->connect('basket:updated', array('JBEventBasket', 'updated')); + + $dispatcher->connect('basket:addItem', array('JBEventBasket', 'addItem')); + $dispatcher->connect('basket:updateItem', array('JBEventBasket', 'updateItem')); + $dispatcher->connect('basket:changeQuantity', array('JBEventBasket', 'changeQuantity')); + $dispatcher->connect('basket:removeItem', array('JBEventBasket', 'removeItem')); + $dispatcher->connect('basket:removeItems', array('JBEventBasket', 'removeItems')); + $dispatcher->connect('basket:recount', array('JBEventBasket', 'recount')); + + $dispatcher->connect('basket:orderStatus', array('JBEventBasket', 'orderStatus')); + $dispatcher->connect('basket:paymentStatus', array('JBEventBasket', 'paymentStatus')); + $dispatcher->connect('basket:shippingStatus', array('JBEventBasket', 'shippingStatus')); + + $dispatcher->connect('basket:paymentSuccess', array('JBEventBasket', 'paymentSuccess')); + $dispatcher->connect('basket:paymentFail', array('JBEventBasket', 'paymentFail')); + $dispatcher->connect('basket:paymentCallback', array('JBEventBasket', 'paymentCallback')); + } + + /** + * Init assets for admin path + */ + private function _initAssets() + { + if (!$this->app->jbenv->isSite() && !$this->app->jbrequest->isAjax()) { + $this->app->jbassets->admin(); + $this->_initLanguages(); + $this->_initAdminMenu(); + } + } + + /** + * Get hash + * @param $string + * @return string + */ + static public function getHash($string) + { + return ''; + } + + /** + * Init Admin menu + */ + private function _initAdminMenu() + { + $isNotJ35 = version_compare(JVERSION, '3.6', '<='); + + if ($isNotJ35) { + $this->app->jbassets->addVar('JBAdminItems', array( + 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), + 'items' => $this->getAdminMenu(), + )); + } + } + + /** + * Init Admin menu + */ + public function getAdminMenu() + { + $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); + if (!$config->get('adminmenu_show', 1)) { + return false; + } + + $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); + + $appList = JBModelApp::model()->getSimpleList(); + + $findJBZooApp = false; + $dispatched = false; + foreach ($appList as $app) { + if ($app->application_group == JBZOO_APP_GROUP) { + $findJBZooApp = true; + if ($curApp == $app->id) { + $dispatched = true; + } + } + } + + if (!$findJBZooApp) { + return false; + } + + $router = $this->app->jbrouter; + + $menuItems = array(); + + if (!empty($appList)) { + foreach ($appList as $app) { + + $menuItems['app-' . $app->alias] = array( + 'name' => $app->name, + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), + 'children' => array( + 'add-item' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')), + ), + 'sep-1' => 'divider', + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')), + ), + 'frontpage' => array( + 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')), + ), + 'comments' => array( + 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')), + ), + 'sep-1' => 'divider', + 'config' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')), + ), + ), + ); + } + } + + $menuItems['sep-1'] = 'divider'; + + if ($dispatched) { + if ((int)JBModelConfig::model()->get('enable', 1, 'cart.config')) { + $menuItems['orders'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_ORDERS'), + 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jborder')), + 'children' => array( + 'cart-configs' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CART_CONFIG'), + 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jbcart')), + ), + ), + ); + + $menuItems['sep-2'] = 'divider'; + } + } + + $menuItems['item-config'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), + 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), + ); + + $types = $this->app->jbtype->getSimpleList(); + if (!empty($types)) { + $children = array(); + foreach ($types as $alias => $type) { + $children['type-' . $alias] = array( + 'name' => $type, + 'url' => $router->admin(array('controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => array('0' => $alias))), + ); + } + + $menuItems['item-config']['children'] = $children; + } + + if ($dispatched) { + $menuItems['sep-3'] = 'divider'; + + $menuItems['jbzoo-admin'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), + 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), + 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), + 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), + ), + ), + ); + + $menuItems['jbzoo-import'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDARD'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), + ), + ), + ); + + $menuItems['jbzoo-export'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), + ), + 'types' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), + ), + 'yandexyml' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDARD'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), + ), + 'zoobackup' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), + ), + ), + ); + + $menuItems['sep-4'] = 'divider'; + + $menuItems['jbzoo-info'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_INFO'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), + ), + 'server' => array( + 'name' => 'Get Last JBZoo', + 'url' => 'https://github.com/JBZoo/JBZoo', + 'target' => '_blank', + ), + ), + ); + } + + $menuItems['jbzoo-support'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), + 'url' => 'http://forum.jbzoo.com/', + 'target' => '_blank', + ); + + $this->app->jbassets->addVar('JBAdminItems', array( + 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), + 'items' => $menuItems, + )); + } + + /** + * Get group name + * @return string + */ + private function _getGroup() + { + return $this->_group; + } + + /** + * Register new path in system + * @param string $path + * @param string $pathName + * @return mixed + */ + private function _addPath($path, $pathName) + { + if ($fullPath = $this->app->path->path($path)) { + return $this->app->path->register($fullPath, $pathName); + } + + return null; + } +} diff --git a/patches/2.3.0/media/zoo/applications/jbuniversal/framework/jbzoo.php b/patches/2.3.0/media/zoo/applications/jbuniversal/framework/jbzoo.php index a669c02..76f8ca4 100644 --- a/patches/2.3.0/media/zoo/applications/jbuniversal/framework/jbzoo.php +++ b/patches/2.3.0/media/zoo/applications/jbuniversal/framework/jbzoo.php @@ -1 +1,652 @@ - */ // no direct access defined('_JEXEC') or die('Restricted access'); /** * Class JBZoo */ class JBZoo { /** * @var Application */ public $app = null; /** * App group name * @var string */ private $_group = JBZOO_APP_GROUP; /** * Init JBZoo application * @static * @return JBZoo */ public static function init() { static $jbzoo; if (!isset($jbzoo)) { $jbzoo = new self(); } return $jbzoo; } /** * Initialization JBZoo App */ private function __construct() { $this->app = App::getInstance('zoo'); $this->_initPaths(); $this->_initClasses(); $this->_initEvents(); $this->_initAssets(); } /** * Add directory path */ private function _initPaths() { $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); $this->_addPath('jbapp:framework', 'jbzoo'); $this->_addPath('jbapp:assets', 'jbassets'); $this->_addPath('jbassets:zoo', 'assets'); $this->_addPath('jbapp:config', 'jbconfig'); $this->_addPath('jbzoo:elements', 'jbelements'); $this->_addPath('jbapp:cart-elements', 'cart-elements'); $this->_addPath('jbapp:types', 'jbtypes'); $this->_addPath('jbzoo:helpers', 'helpers'); $this->_addPath('jbzoo:helpers-std', 'helpers'); $this->_addPath('helpers:fields', 'fields'); $this->_addPath('jbzoo:tables', 'tables'); $this->_addPath('jbzoo:classes-std', 'classes'); $this->_addPath('jbzoo:render', 'renderer'); $this->_addPath('jbzoo:views', 'jbviews'); $this->_addPath('jbapp:config', 'jbxml'); $this->_addPath('jbviews:', 'partials'); $this->_addPath('jbapp:joomla/elements', 'fields'); $this->_addPath('jbapp:templates', 'jbtmpl'); $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); $this->_addPath('modules:mod_jbzoo_currency', 'mod_jbzoo_currency'); $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); if ($this->app->jbenv->isSite()) { $this->_addPath('jbzoo:controllers', 'controllers'); } require $this->app->path->path('jbzoo:controllers/base.php'); JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); } /** * Include models classes */ private function _initClasses() { jimport('joomla.html.parameter.element'); $this->app->loader->register('AppValidator', 'classes:validator.php'); // defines define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); define('ZOO_TABLE_JBZOO_ORDER', '#__zoo_jbzoo_orders'); $frmwork = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework'; $clsPath = $frmwork . '/classes'; $modPath = $frmwork . '/models'; $filPath = $frmwork . '/render/filter'; $evtPath = $frmwork . '/events'; $classList = array( 'JBDatabaseQuery' => $clsPath . '/database/JBDatabaseQuery.php', 'JBDatabaseQueryElement' => $clsPath . '/database/JBDatabaseQueryElement.php', 'JBCartOrder' => $clsPath . '/cart/jborder.php', 'JBCart' => $clsPath . '/cart/jbcart.php', 'JBCartValue' => $clsPath . '/cart/jbvalue.php', 'JBCartVariant' => $clsPath . '/cart/jbvariant.php', 'JBCartVariantList' => $clsPath . '/cart/jbvariantlist.php', 'JBTemplate' => $clsPath . '/jbtemplate.php', // models 'JBModel' => $modPath . '/jbmodel.php', 'JBModelConfig' => $modPath . '/jbmodel.config.php', 'JBModelElement' => $modPath . '/jbmodel.element.php', 'JBModelAutoComplete' => $modPath . '/jbmodel.autocomplete.php', 'JBModelElementCountry' => $modPath . '/jbmodel.element.country.php', 'JBModelElementDate' => $modPath . '/jbmodel.element.date.php', 'JBModelElementItemDate' => $modPath . '/jbmodel.element.itemdate.php', 'JBModelElementItemauthor' => $modPath . '/jbmodel.element.itemauthor.php', 'JBModelElementItemCategory' => $modPath . '/jbmodel.element.itemcategory.php', 'JBModelElementItemCreated' => $modPath . '/jbmodel.element.itemcreated.php', 'JBModelElementItemFrontpage' => $modPath . '/jbmodel.element.itemfrontpage.php', 'JBModelElementItemModified' => $modPath . '/jbmodel.element.itemmodified.php', 'JBModelElementItemName' => $modPath . '/jbmodel.element.itemname.php', 'JBModelElementItemPublish_down' => $modPath . '/jbmodel.element.itempublish_down.php', 'JBModelElementItemPublish_up' => $modPath . '/jbmodel.element.itempublish_up.php', 'JBModelElementItemTag' => $modPath . '/jbmodel.element.itemtag.php', 'JBModelElementJBImage' => $modPath . '/jbmodel.element.jbimage.php', 'JBModelElementJBSelectCascade' => $modPath . '/jbmodel.element.jbselectcascade.php', 'JBModelElementRange' => $modPath . '/jbmodel.element.range.php', 'JBModelElementRating' => $modPath . '/jbmodel.element.rating.php', 'JBModelElementJBPrice' => $modPath . '/jbmodel.element.jbprice.php', 'JBModelElementJBPricePlain' => $modPath . '/jbmodel.element.jbprice.plain.php', 'JBModelElementJBPriceCalc' => $modPath . '/jbmodel.element.jbprice.calc.php', 'JBModelElementJBComments' => $modPath . '/jbmodel.element.jbcomments.php', 'JBModelElementTextarea' => $modPath . '/jbmodel.element.textarea.php', 'JBModelFavorite' => $modPath . '/jbmodel.favorite.php', 'JBModelFilter' => $modPath . '/jbmodel.filter.php', 'JBModelItem' => $modPath . '/jbmodel.item.php', 'JBModelApp' => $modPath . '/jbmodel.app.php', 'JBModelCategory' => $modPath . '/jbmodel.category.php', 'JBModelOrder' => $modPath . '/jbmodel.order.php', 'JBModelRelated' => $modPath . '/jbmodel.related.php', 'JBModelSearchindex' => $modPath . '/jbmodel.searchindex.php', 'JBModelValues' => $modPath . '/jbmodel.values.php', 'JBModelSku' => $modPath . '/jbmodel.sku.php', // filter 'JBFilterElement' => $filPath . '/element.php', 'JBFilterElementAuthor' => $filPath . '/element.author.php', 'JBFilterElementAuthorCheckbox' => $filPath . '/element.author.checkbox.php', 'JBFilterElementAuthorRadio' => $filPath . '/element.author.radio.php', 'JBFilterElementAuthorSelect' => $filPath . '/element.author.select.php', 'JBFilterElementAuthorChosen' => $filPath . '/element.author.select.chosen.php', 'JBFilterElementAuthorText' => $filPath . '/element.author.text.php', 'JBFilterElementCategory' => $filPath . '/element.category.php', 'JBFilterElementCategoryChosen' => $filPath . '/element.category.chosen.php', 'JBFilterElementCategoryHidden' => $filPath . '/element.category.hidden.php', 'JBFilterElementCheckbox' => $filPath . '/element.checkbox.php', 'JBFilterElementCountry' => $filPath . '/element.country.php', 'JBFilterElementCountryCheckbox' => $filPath . '/element.country.checkbox.php', 'JBFilterElementCountryRadio' => $filPath . '/element.country.radio.php', 'JBFilterElementCountrySelect' => $filPath . '/element.country.select.php', 'JBFilterElementCountryChosen' => $filPath . '/element.country.select.chosen.php', 'JBFilterElementDate' => $filPath . '/element.date.php', 'JBFilterElementDateRange' => $filPath . '/element.date.range.php', 'JBFilterElementFrontpage' => $filPath . '/element.frontpage.php', 'JBFilterElementFrontpageJqueryUI' => $filPath . '/element.frontpage.jqueryui.php', 'JBFilterElementHidden' => $filPath . '/element.hidden.php', 'JBFilterElementImageexists' => $filPath . '/element.imageexists.php', 'JBFilterElementImageexistsJqueryui' => $filPath . '/element.imageexists.jqueryui.php', 'JBFilterElementJBColor' => $filPath . '/element.jbcolor.php', 'JBFilterElementJBPriceCalc' => $filPath . '/element.jbpricecalc.php', 'JBFilterElementJBPricePlain' => $filPath . '/element.jbpriceplain.php', 'JBFilterElementJbselectcascade' => $filPath . '/element.jbselectcascade.php', 'JBFilterElementJqueryui' => $filPath . '/element.jqueryui.php', 'JBFilterElementName' => $filPath . '/element.name.php', 'JBFilterElementNameCheckbox' => $filPath . '/element.name.checkbox.php', 'JBFilterElementNameRadio' => $filPath . '/element.name.radio.php', 'JBFilterElementNameSelect' => $filPath . '/element.name.select.php', 'JBFilterElementNameChosen' => $filPath . '/element.name.select.chosen.php', 'JBFilterElementRadio' => $filPath . '/element.radio.php', 'JBFilterElementRating' => $filPath . '/element.rating.php', 'JBFilterElementRatingRanges' => $filPath . '/element.rating.ranges.php', 'JBFilterElementRatingSlider' => $filPath . '/element.rating.slider.php', 'JBFilterElementSelect' => $filPath . '/element.select.php', 'JBFilterElementSelectChosen' => $filPath . '/element.select.chosen.php', 'JBFilterElementSlider' => $filPath . '/element.slider.php', 'JBFilterElementTag' => $filPath . '/element.tag.php', 'JBFilterElementTagCheckbox' => $filPath . '/element.tag.checkbox.php', 'JBFilterElementTagRadio' => $filPath . '/element.tag.radio.php', 'JBFilterElementTagSelect' => $filPath . '/element.tag.select.php', 'JBFilterElementTagSelectChosen' => $filPath . '/element.tag.select.chosen.php', 'JBFilterElementText' => $filPath . '/element.text.php', 'JBFilterElementTextRange' => $filPath . '/element.text.range.php', // events 'JBZooSystemPlugin' => $evtPath . '/jsystem.php', 'JBEvent' => $evtPath . '/jbevent.php', 'JBEventApplication' => $evtPath . '/jbevent.application.php', 'JBEventBasket' => $evtPath . '/jbevent.basket.php', 'JBEventCategory' => $evtPath . '/jbevent.category.php', 'JBEventComment' => $evtPath . '/jbevent.comment.php', 'JBEventElement' => $evtPath . '/jbevent.element.php', 'JBEventItem' => $evtPath . '/jbevent.item.php', 'JBEventJBZoo' => $evtPath . '/jbevent.jbzoo.php', 'JBEventLayout' => $evtPath . '/jbevent.layout.php', 'JBEventSubmission' => $evtPath . '/jbevent.submission.php', 'JBEventTag' => $evtPath . '/jbevent.tag.php', 'JBEventType' => $evtPath . '/jbevent.type.php', ); foreach ($classList as $className => $path) { JLoader::register($className, $path); } } /** * Get domain name * @param bool $isAny * @return string */ static function getDomain($isAny = false) { if (defined('STDIN') || php_sapi_name() == "cli") { return 'console'; } $domain = ''; if (function_exists('apache_request_headers')) { $headers = apache_request_headers(); $domain = isset($headers['Host']) ? $headers['Host'] : ''; } if ($isAny && !$domain) { $domain = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''; } $domain = preg_replace('#^www\.#', '', $domain); list($domain) = explode(':', $domain); return $domain; } /** * Load lang files */ private function _initLanguages() { $lang = JFactory::getLanguage(); $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); } /** * Register and connect events */ private function _initEvents() { $event = $this->app->event; $dispatcher = $event->dispatcher; $event->register('JBEventApplication'); $dispatcher->connect('application:init', array('JBEventApplication', 'init')); $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); $event->register('JBEventCategory'); $dispatcher->connect('category:init', array('JBEventCategory', 'init')); $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); $event->register('JBEventItem'); $dispatcher->connect('item:init', array('JBEventItem', 'init')); $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); $event->register('JBEventComment'); $dispatcher->connect('comment:init', array('JBEventComment', 'init')); $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); $event->register('JBEventSubmission'); $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); $event->register('JBEventElement'); $dispatcher->connect('element:download', array('JBEventElement', 'download')); $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); $event->register('JBEventLayout'); $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); $event->register('JBEventTag'); $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); $event->register('JBEventType'); $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); $dispatcher->connect('type:copied', array('JBEventType', 'copied')); $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); $event->register('JBEventJBZoo'); $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); $event->register('JBEventBasket'); $dispatcher->connect('basket:beforeSave', array('JBEventBasket', 'beforeSave')); $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); $dispatcher->connect('basket:afterSave', array('JBEventBasket', 'afterSave')); $dispatcher->connect('basket:updated', array('JBEventBasket', 'updated')); $dispatcher->connect('basket:addItem', array('JBEventBasket', 'addItem')); $dispatcher->connect('basket:updateItem', array('JBEventBasket', 'updateItem')); $dispatcher->connect('basket:changeQuantity', array('JBEventBasket', 'changeQuantity')); $dispatcher->connect('basket:removeItem', array('JBEventBasket', 'removeItem')); $dispatcher->connect('basket:removeItems', array('JBEventBasket', 'removeItems')); $dispatcher->connect('basket:recount', array('JBEventBasket', 'recount')); $dispatcher->connect('basket:orderStatus', array('JBEventBasket', 'orderStatus')); $dispatcher->connect('basket:paymentStatus', array('JBEventBasket', 'paymentStatus')); $dispatcher->connect('basket:shippingStatus', array('JBEventBasket', 'shippingStatus')); $dispatcher->connect('basket:paymentSuccess', array('JBEventBasket', 'paymentSuccess')); $dispatcher->connect('basket:paymentFail', array('JBEventBasket', 'paymentFail')); $dispatcher->connect('basket:paymentCallback', array('JBEventBasket', 'paymentCallback')); } /** * Init assets for admin path */ private function _initAssets() { if (!$this->app->jbenv->isSite() && !$this->app->jbrequest->isAjax()) { $this->app->jbassets->admin(); $this->_initLanguages(); $this->_initAdminMenu(); } } /** * Get hash * @param $string * @return string */ static public function getHash($string) { return ''; } /** * Init Admin menu */ private function _initAdminMenu() { $isNotJ35 = version_compare(JVERSION, '3.6', '<='); if ($isNotJ35) { $this->app->jbassets->addVar('JBAdminItems', array( 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), 'items' => $this->getAdminMenu(), )); } } /** * Init Admin menu */ public function getAdminMenu() { $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); if (!$config->get('adminmenu_show', 1)) { return false; } $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); $appList = JBModelApp::model()->getSimpleList(); $findJBZooApp = false; $dispatched = false; foreach ($appList as $app) { if ($app->application_group == JBZOO_APP_GROUP) { $findJBZooApp = true; if ($curApp == $app->id) { $dispatched = true; } } } if (!$findJBZooApp) { return false; } $router = $this->app->jbrouter; $menuItems = array(); if (!empty($appList)) { foreach ($appList as $app) { $menuItems['app-' . $app->alias] = array( 'name' => $app->name, 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), 'children' => array( 'add-item' => array( 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')), ), 'sep-1' => 'divider', 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')), ), 'frontpage' => array( 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')), ), 'comments' => array( 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')), ), 'sep-1' => 'divider', 'config' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')), ), ), ); } } $menuItems['sep-1'] = 'divider'; if ($dispatched) { if ((int)JBModelConfig::model()->get('enable', 1, 'cart.config')) { $menuItems['orders'] = array( 'name' => JText::_('JBZOO_ADMINMENU_ORDERS'), 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jborder')), 'children' => array( 'cart-configs' => array( 'name' => JText::_('JBZOO_ADMINMENU_CART_CONFIG'), 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jbcart')), ), ), ); $menuItems['sep-2'] = 'divider'; } } $menuItems['item-config'] = array( 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), ); $types = $this->app->jbtype->getSimpleList(); if (!empty($types)) { $children = array(); foreach ($types as $alias => $type) { $children['type-' . $alias] = array( 'name' => $type, 'url' => $router->admin(array('controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => array('0' => $alias))), ); } $menuItems['item-config']['children'] = $children; } if ($dispatched) { $menuItems['sep-3'] = 'divider'; $menuItems['jbzoo-admin'] = array( 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), ), ), ); $menuItems['jbzoo-import'] = array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDARD'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), ), ), ); $menuItems['jbzoo-export'] = array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), ), 'types' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), ), 'yandexyml' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDARD'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), ), 'zoobackup' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), ), ), ); $menuItems['sep-4'] = 'divider'; $menuItems['jbzoo-info'] = array( 'name' => JText::_('JBZOO_ADMINMENU_INFO'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), ), 'server' => array( 'name' => 'Get Last JBZoo', 'url' => 'https://github.com/JBZoo/JBZoo', 'target' => '_blank', ), ), ); } $menuItems['jbzoo-support'] = array( 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), 'url' => 'http://forum.jbzoo.com/', 'target' => '_blank', ); } /** * Get group name * @return string */ private function _getGroup() { return $this->_group; } /** * Register new path in system * @param string $path * @param string $pathName * @return mixed */ private function _addPath($path, $pathName) { if ($fullPath = $this->app->path->path($path)) { return $this->app->path->register($fullPath, $pathName); } return null; } } \ No newline at end of file + + */ + +// no direct access +defined('_JEXEC') or die('Restricted access'); + +/** + * Class JBZoo + */ +class JBZoo +{ + /** + * @var Application + */ + public $app = null; + + /** + * App group name + * @var string + */ + private $_group = JBZOO_APP_GROUP; + + /** + * Init JBZoo application + * @static + * @return JBZoo + */ + public static function init() + { + static $jbzoo; + + if (!isset($jbzoo)) { + $jbzoo = new self(); + } + + return $jbzoo; + } + + /** + * Initialization JBZoo App + */ + private function __construct() + { + $this->app = App::getInstance('zoo'); + + $this->_initPaths(); + $this->_initClasses(); + $this->_initEvents(); + $this->_initAssets(); + } + + /** + * Add directory path + */ + private function _initPaths() + { + $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); + $this->_addPath('jbapp:framework', 'jbzoo'); + $this->_addPath('jbapp:assets', 'jbassets'); + $this->_addPath('jbassets:zoo', 'assets'); + $this->_addPath('jbapp:config', 'jbconfig'); + $this->_addPath('jbzoo:elements', 'jbelements'); + $this->_addPath('jbapp:cart-elements', 'cart-elements'); + $this->_addPath('jbapp:types', 'jbtypes'); + + $this->_addPath('jbzoo:helpers', 'helpers'); + $this->_addPath('jbzoo:helpers-std', 'helpers'); + $this->_addPath('helpers:fields', 'fields'); + + $this->_addPath('jbzoo:tables', 'tables'); + $this->_addPath('jbzoo:classes-std', 'classes'); + $this->_addPath('jbzoo:render', 'renderer'); + $this->_addPath('jbzoo:views', 'jbviews'); + $this->_addPath('jbapp:config', 'jbxml'); + $this->_addPath('jbviews:', 'partials'); + $this->_addPath('jbapp:joomla/elements', 'fields'); + $this->_addPath('jbapp:templates', 'jbtmpl'); + + $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); + $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); + $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); + $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); + $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); + $this->_addPath('modules:mod_jbzoo_currency', 'mod_jbzoo_currency'); + + $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); + + if ($this->app->jbenv->isSite()) { + $this->_addPath('jbzoo:controllers', 'controllers'); + } + + require $this->app->path->path('jbzoo:controllers/base.php'); + + JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); + } + + /** + * Include models classes + */ + private function _initClasses() + { + jimport('joomla.html.parameter.element'); + + $this->app->loader->register('AppValidator', 'classes:validator.php'); + + // defines + define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); + define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); + define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); + define('ZOO_TABLE_JBZOO_ORDER', '#__zoo_jbzoo_orders'); + + $frmwork = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework'; + $clsPath = $frmwork . '/classes'; + $modPath = $frmwork . '/models'; + $filPath = $frmwork . '/render/filter'; + $evtPath = $frmwork . '/events'; + + $classList = array( + 'JBDatabaseQuery' => $clsPath . '/database/JBDatabaseQuery.php', + 'JBDatabaseQueryElement' => $clsPath . '/database/JBDatabaseQueryElement.php', + 'JBCartOrder' => $clsPath . '/cart/jborder.php', + 'JBCart' => $clsPath . '/cart/jbcart.php', + 'JBCartValue' => $clsPath . '/cart/jbvalue.php', + 'JBCartVariant' => $clsPath . '/cart/jbvariant.php', + 'JBCartVariantList' => $clsPath . '/cart/jbvariantlist.php', + 'JBTemplate' => $clsPath . '/jbtemplate.php', + + // models + 'JBModel' => $modPath . '/jbmodel.php', + 'JBModelConfig' => $modPath . '/jbmodel.config.php', + 'JBModelElement' => $modPath . '/jbmodel.element.php', + 'JBModelAutoComplete' => $modPath . '/jbmodel.autocomplete.php', + 'JBModelElementCountry' => $modPath . '/jbmodel.element.country.php', + 'JBModelElementDate' => $modPath . '/jbmodel.element.date.php', + 'JBModelElementItemDate' => $modPath . '/jbmodel.element.itemdate.php', + 'JBModelElementItemauthor' => $modPath . '/jbmodel.element.itemauthor.php', + 'JBModelElementItemCategory' => $modPath . '/jbmodel.element.itemcategory.php', + 'JBModelElementItemCreated' => $modPath . '/jbmodel.element.itemcreated.php', + 'JBModelElementItemFrontpage' => $modPath . '/jbmodel.element.itemfrontpage.php', + 'JBModelElementItemModified' => $modPath . '/jbmodel.element.itemmodified.php', + 'JBModelElementItemName' => $modPath . '/jbmodel.element.itemname.php', + 'JBModelElementItemPublish_down' => $modPath . '/jbmodel.element.itempublish_down.php', + 'JBModelElementItemPublish_up' => $modPath . '/jbmodel.element.itempublish_up.php', + 'JBModelElementItemTag' => $modPath . '/jbmodel.element.itemtag.php', + 'JBModelElementJBImage' => $modPath . '/jbmodel.element.jbimage.php', + 'JBModelElementJBSelectCascade' => $modPath . '/jbmodel.element.jbselectcascade.php', + 'JBModelElementRange' => $modPath . '/jbmodel.element.range.php', + 'JBModelElementRating' => $modPath . '/jbmodel.element.rating.php', + 'JBModelElementJBPrice' => $modPath . '/jbmodel.element.jbprice.php', + 'JBModelElementJBPricePlain' => $modPath . '/jbmodel.element.jbprice.plain.php', + 'JBModelElementJBPriceCalc' => $modPath . '/jbmodel.element.jbprice.calc.php', + 'JBModelElementJBComments' => $modPath . '/jbmodel.element.jbcomments.php', + 'JBModelElementTextarea' => $modPath . '/jbmodel.element.textarea.php', + 'JBModelFavorite' => $modPath . '/jbmodel.favorite.php', + 'JBModelFilter' => $modPath . '/jbmodel.filter.php', + 'JBModelItem' => $modPath . '/jbmodel.item.php', + 'JBModelApp' => $modPath . '/jbmodel.app.php', + 'JBModelCategory' => $modPath . '/jbmodel.category.php', + 'JBModelOrder' => $modPath . '/jbmodel.order.php', + 'JBModelRelated' => $modPath . '/jbmodel.related.php', + 'JBModelSearchindex' => $modPath . '/jbmodel.searchindex.php', + 'JBModelValues' => $modPath . '/jbmodel.values.php', + 'JBModelSku' => $modPath . '/jbmodel.sku.php', + + // filter + 'JBFilterElement' => $filPath . '/element.php', + 'JBFilterElementAuthor' => $filPath . '/element.author.php', + 'JBFilterElementAuthorCheckbox' => $filPath . '/element.author.checkbox.php', + 'JBFilterElementAuthorRadio' => $filPath . '/element.author.radio.php', + 'JBFilterElementAuthorSelect' => $filPath . '/element.author.select.php', + 'JBFilterElementAuthorChosen' => $filPath . '/element.author.select.chosen.php', + 'JBFilterElementAuthorText' => $filPath . '/element.author.text.php', + 'JBFilterElementCategory' => $filPath . '/element.category.php', + 'JBFilterElementCategoryChosen' => $filPath . '/element.category.chosen.php', + 'JBFilterElementCategoryHidden' => $filPath . '/element.category.hidden.php', + 'JBFilterElementCheckbox' => $filPath . '/element.checkbox.php', + 'JBFilterElementCountry' => $filPath . '/element.country.php', + 'JBFilterElementCountryCheckbox' => $filPath . '/element.country.checkbox.php', + 'JBFilterElementCountryRadio' => $filPath . '/element.country.radio.php', + 'JBFilterElementCountrySelect' => $filPath . '/element.country.select.php', + 'JBFilterElementCountryChosen' => $filPath . '/element.country.select.chosen.php', + 'JBFilterElementDate' => $filPath . '/element.date.php', + 'JBFilterElementDateRange' => $filPath . '/element.date.range.php', + 'JBFilterElementFrontpage' => $filPath . '/element.frontpage.php', + 'JBFilterElementFrontpageJqueryUI' => $filPath . '/element.frontpage.jqueryui.php', + 'JBFilterElementHidden' => $filPath . '/element.hidden.php', + 'JBFilterElementImageexists' => $filPath . '/element.imageexists.php', + 'JBFilterElementImageexistsJqueryui' => $filPath . '/element.imageexists.jqueryui.php', + 'JBFilterElementJBColor' => $filPath . '/element.jbcolor.php', + 'JBFilterElementJBPriceCalc' => $filPath . '/element.jbpricecalc.php', + 'JBFilterElementJBPricePlain' => $filPath . '/element.jbpriceplain.php', + 'JBFilterElementJbselectcascade' => $filPath . '/element.jbselectcascade.php', + 'JBFilterElementJqueryui' => $filPath . '/element.jqueryui.php', + 'JBFilterElementName' => $filPath . '/element.name.php', + 'JBFilterElementNameCheckbox' => $filPath . '/element.name.checkbox.php', + 'JBFilterElementNameRadio' => $filPath . '/element.name.radio.php', + 'JBFilterElementNameSelect' => $filPath . '/element.name.select.php', + 'JBFilterElementNameChosen' => $filPath . '/element.name.select.chosen.php', + 'JBFilterElementRadio' => $filPath . '/element.radio.php', + 'JBFilterElementRating' => $filPath . '/element.rating.php', + 'JBFilterElementRatingRanges' => $filPath . '/element.rating.ranges.php', + 'JBFilterElementRatingSlider' => $filPath . '/element.rating.slider.php', + 'JBFilterElementSelect' => $filPath . '/element.select.php', + 'JBFilterElementSelectChosen' => $filPath . '/element.select.chosen.php', + 'JBFilterElementSlider' => $filPath . '/element.slider.php', + 'JBFilterElementTag' => $filPath . '/element.tag.php', + 'JBFilterElementTagCheckbox' => $filPath . '/element.tag.checkbox.php', + 'JBFilterElementTagRadio' => $filPath . '/element.tag.radio.php', + 'JBFilterElementTagSelect' => $filPath . '/element.tag.select.php', + 'JBFilterElementTagSelectChosen' => $filPath . '/element.tag.select.chosen.php', + 'JBFilterElementText' => $filPath . '/element.text.php', + 'JBFilterElementTextRange' => $filPath . '/element.text.range.php', + + // events + 'JBZooSystemPlugin' => $evtPath . '/jsystem.php', + 'JBEvent' => $evtPath . '/jbevent.php', + 'JBEventApplication' => $evtPath . '/jbevent.application.php', + 'JBEventBasket' => $evtPath . '/jbevent.basket.php', + 'JBEventCategory' => $evtPath . '/jbevent.category.php', + 'JBEventComment' => $evtPath . '/jbevent.comment.php', + 'JBEventElement' => $evtPath . '/jbevent.element.php', + 'JBEventItem' => $evtPath . '/jbevent.item.php', + 'JBEventJBZoo' => $evtPath . '/jbevent.jbzoo.php', + 'JBEventLayout' => $evtPath . '/jbevent.layout.php', + 'JBEventSubmission' => $evtPath . '/jbevent.submission.php', + 'JBEventTag' => $evtPath . '/jbevent.tag.php', + 'JBEventType' => $evtPath . '/jbevent.type.php', + ); + + foreach ($classList as $className => $path) { + JLoader::register($className, $path); + } + } + + /** + * Get domain name + * @param bool $isAny + * @return string + */ + static function getDomain($isAny = false) + { + if (defined('STDIN') || php_sapi_name() == "cli") { + return 'console'; + } + + $domain = ''; + if (function_exists('apache_request_headers')) { + $headers = apache_request_headers(); + $domain = isset($headers['Host']) ? $headers['Host'] : ''; + } + + if ($isAny && !$domain) { + $domain = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''; + } + + $domain = preg_replace('#^www\.#', '', $domain); + list($domain) = explode(':', $domain); + + return $domain; + } + + /** + * Load lang files + */ + private function _initLanguages() + { + $lang = JFactory::getLanguage(); + $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); + } + + /** + * Register and connect events + */ + private function _initEvents() + { + $event = $this->app->event; + $dispatcher = $event->dispatcher; + + $event->register('JBEventApplication'); + $dispatcher->connect('application:init', array('JBEventApplication', 'init')); + $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); + $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); + $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); + $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); + $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); + $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); + $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); + $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); + + $event->register('JBEventCategory'); + $dispatcher->connect('category:init', array('JBEventCategory', 'init')); + $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); + $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); + $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); + + $event->register('JBEventItem'); + $dispatcher->connect('item:init', array('JBEventItem', 'init')); + $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); + $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); + $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); + $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); + $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); + $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); + $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); + $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); + $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); + + $event->register('JBEventComment'); + $dispatcher->connect('comment:init', array('JBEventComment', 'init')); + $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); + $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); + $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); + + $event->register('JBEventSubmission'); + $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); + $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); + $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); + $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); + + $event->register('JBEventElement'); + $dispatcher->connect('element:download', array('JBEventElement', 'download')); + $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); + $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); + $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); + $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); + $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); + $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); + $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); + $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); + $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); + + $event->register('JBEventLayout'); + $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); + + $event->register('JBEventTag'); + $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); + $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); + + $event->register('JBEventType'); + $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); + $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); + $dispatcher->connect('type:copied', array('JBEventType', 'copied')); + $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); + $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); + $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); + $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); + + $event->register('JBEventJBZoo'); + $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); + $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); + + $event->register('JBEventBasket'); + $dispatcher->connect('basket:beforeSave', array('JBEventBasket', 'beforeSave')); + $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); + $dispatcher->connect('basket:afterSave', array('JBEventBasket', 'afterSave')); + $dispatcher->connect('basket:updated', array('JBEventBasket', 'updated')); + + $dispatcher->connect('basket:addItem', array('JBEventBasket', 'addItem')); + $dispatcher->connect('basket:updateItem', array('JBEventBasket', 'updateItem')); + $dispatcher->connect('basket:changeQuantity', array('JBEventBasket', 'changeQuantity')); + $dispatcher->connect('basket:removeItem', array('JBEventBasket', 'removeItem')); + $dispatcher->connect('basket:removeItems', array('JBEventBasket', 'removeItems')); + $dispatcher->connect('basket:recount', array('JBEventBasket', 'recount')); + + $dispatcher->connect('basket:orderStatus', array('JBEventBasket', 'orderStatus')); + $dispatcher->connect('basket:paymentStatus', array('JBEventBasket', 'paymentStatus')); + $dispatcher->connect('basket:shippingStatus', array('JBEventBasket', 'shippingStatus')); + + $dispatcher->connect('basket:paymentSuccess', array('JBEventBasket', 'paymentSuccess')); + $dispatcher->connect('basket:paymentFail', array('JBEventBasket', 'paymentFail')); + $dispatcher->connect('basket:paymentCallback', array('JBEventBasket', 'paymentCallback')); + } + + /** + * Init assets for admin path + */ + private function _initAssets() + { + if (!$this->app->jbenv->isSite() && !$this->app->jbrequest->isAjax()) { + $this->app->jbassets->admin(); + $this->_initLanguages(); + $this->_initAdminMenu(); + } + } + + /** + * Get hash + * @param $string + * @return string + */ + static public function getHash($string) + { + return ''; + } + + /** + * Init Admin menu + */ + private function _initAdminMenu() + { + $isNotJ35 = version_compare(JVERSION, '3.6', '<='); + + if ($isNotJ35) { + $this->app->jbassets->addVar('JBAdminItems', array( + 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), + 'items' => $this->getAdminMenu(), + )); + } + } + + /** + * Init Admin menu + */ + public function getAdminMenu() + { + $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); + if (!$config->get('adminmenu_show', 1)) { + return false; + } + + $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); + + $appList = JBModelApp::model()->getSimpleList(); + + $findJBZooApp = false; + $dispatched = false; + foreach ($appList as $app) { + if ($app->application_group == JBZOO_APP_GROUP) { + $findJBZooApp = true; + if ($curApp == $app->id) { + $dispatched = true; + } + } + } + + if (!$findJBZooApp) { + return false; + } + + $router = $this->app->jbrouter; + + $menuItems = array(); + + if (!empty($appList)) { + foreach ($appList as $app) { + + $menuItems['app-' . $app->alias] = array( + 'name' => $app->name, + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), + 'children' => array( + 'add-item' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')), + ), + 'sep-1' => 'divider', + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')), + ), + 'frontpage' => array( + 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')), + ), + 'comments' => array( + 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')), + ), + 'sep-1' => 'divider', + 'config' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')), + ), + ), + ); + } + } + + $menuItems['sep-1'] = 'divider'; + + if ($dispatched) { + if ((int)JBModelConfig::model()->get('enable', 1, 'cart.config')) { + $menuItems['orders'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_ORDERS'), + 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jborder')), + 'children' => array( + 'cart-configs' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CART_CONFIG'), + 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jbcart')), + ), + ), + ); + + $menuItems['sep-2'] = 'divider'; + } + } + + $menuItems['item-config'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), + 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), + ); + + $types = $this->app->jbtype->getSimpleList(); + if (!empty($types)) { + $children = array(); + foreach ($types as $alias => $type) { + $children['type-' . $alias] = array( + 'name' => $type, + 'url' => $router->admin(array('controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => array('0' => $alias))), + ); + } + + $menuItems['item-config']['children'] = $children; + } + + if ($dispatched) { + $menuItems['sep-3'] = 'divider'; + + $menuItems['jbzoo-admin'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), + 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), + 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), + 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), + ), + ), + ); + + $menuItems['jbzoo-import'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDARD'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), + ), + ), + ); + + $menuItems['jbzoo-export'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), + ), + 'types' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), + ), + 'yandexyml' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDARD'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), + ), + 'zoobackup' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), + ), + ), + ); + + $menuItems['sep-4'] = 'divider'; + + $menuItems['jbzoo-info'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_INFO'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), + ), + 'server' => array( + 'name' => 'Get Last JBZoo', + 'url' => 'https://github.com/JBZoo/JBZoo', + 'target' => '_blank', + ), + ), + ); + } + + $menuItems['jbzoo-support'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), + 'url' => 'http://forum.jbzoo.com/', + 'target' => '_blank', + ); + } + + /** + * Get group name + * @return string + */ + private function _getGroup() + { + return $this->_group; + } + + /** + * Register new path in system + * @param string $path + * @param string $pathName + * @return mixed + */ + private function _addPath($path, $pathName) + { + if ($fullPath = $this->app->path->path($path)) { + return $this->app->path->register($fullPath, $pathName); + } + + return null; + } +} diff --git a/patches/2.3.1/media/zoo/applications/jbuniversal/framework/jbzoo.php b/patches/2.3.1/media/zoo/applications/jbuniversal/framework/jbzoo.php index a669c02..76f8ca4 100644 --- a/patches/2.3.1/media/zoo/applications/jbuniversal/framework/jbzoo.php +++ b/patches/2.3.1/media/zoo/applications/jbuniversal/framework/jbzoo.php @@ -1 +1,652 @@ - */ // no direct access defined('_JEXEC') or die('Restricted access'); /** * Class JBZoo */ class JBZoo { /** * @var Application */ public $app = null; /** * App group name * @var string */ private $_group = JBZOO_APP_GROUP; /** * Init JBZoo application * @static * @return JBZoo */ public static function init() { static $jbzoo; if (!isset($jbzoo)) { $jbzoo = new self(); } return $jbzoo; } /** * Initialization JBZoo App */ private function __construct() { $this->app = App::getInstance('zoo'); $this->_initPaths(); $this->_initClasses(); $this->_initEvents(); $this->_initAssets(); } /** * Add directory path */ private function _initPaths() { $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); $this->_addPath('jbapp:framework', 'jbzoo'); $this->_addPath('jbapp:assets', 'jbassets'); $this->_addPath('jbassets:zoo', 'assets'); $this->_addPath('jbapp:config', 'jbconfig'); $this->_addPath('jbzoo:elements', 'jbelements'); $this->_addPath('jbapp:cart-elements', 'cart-elements'); $this->_addPath('jbapp:types', 'jbtypes'); $this->_addPath('jbzoo:helpers', 'helpers'); $this->_addPath('jbzoo:helpers-std', 'helpers'); $this->_addPath('helpers:fields', 'fields'); $this->_addPath('jbzoo:tables', 'tables'); $this->_addPath('jbzoo:classes-std', 'classes'); $this->_addPath('jbzoo:render', 'renderer'); $this->_addPath('jbzoo:views', 'jbviews'); $this->_addPath('jbapp:config', 'jbxml'); $this->_addPath('jbviews:', 'partials'); $this->_addPath('jbapp:joomla/elements', 'fields'); $this->_addPath('jbapp:templates', 'jbtmpl'); $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); $this->_addPath('modules:mod_jbzoo_currency', 'mod_jbzoo_currency'); $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); if ($this->app->jbenv->isSite()) { $this->_addPath('jbzoo:controllers', 'controllers'); } require $this->app->path->path('jbzoo:controllers/base.php'); JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); } /** * Include models classes */ private function _initClasses() { jimport('joomla.html.parameter.element'); $this->app->loader->register('AppValidator', 'classes:validator.php'); // defines define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); define('ZOO_TABLE_JBZOO_ORDER', '#__zoo_jbzoo_orders'); $frmwork = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework'; $clsPath = $frmwork . '/classes'; $modPath = $frmwork . '/models'; $filPath = $frmwork . '/render/filter'; $evtPath = $frmwork . '/events'; $classList = array( 'JBDatabaseQuery' => $clsPath . '/database/JBDatabaseQuery.php', 'JBDatabaseQueryElement' => $clsPath . '/database/JBDatabaseQueryElement.php', 'JBCartOrder' => $clsPath . '/cart/jborder.php', 'JBCart' => $clsPath . '/cart/jbcart.php', 'JBCartValue' => $clsPath . '/cart/jbvalue.php', 'JBCartVariant' => $clsPath . '/cart/jbvariant.php', 'JBCartVariantList' => $clsPath . '/cart/jbvariantlist.php', 'JBTemplate' => $clsPath . '/jbtemplate.php', // models 'JBModel' => $modPath . '/jbmodel.php', 'JBModelConfig' => $modPath . '/jbmodel.config.php', 'JBModelElement' => $modPath . '/jbmodel.element.php', 'JBModelAutoComplete' => $modPath . '/jbmodel.autocomplete.php', 'JBModelElementCountry' => $modPath . '/jbmodel.element.country.php', 'JBModelElementDate' => $modPath . '/jbmodel.element.date.php', 'JBModelElementItemDate' => $modPath . '/jbmodel.element.itemdate.php', 'JBModelElementItemauthor' => $modPath . '/jbmodel.element.itemauthor.php', 'JBModelElementItemCategory' => $modPath . '/jbmodel.element.itemcategory.php', 'JBModelElementItemCreated' => $modPath . '/jbmodel.element.itemcreated.php', 'JBModelElementItemFrontpage' => $modPath . '/jbmodel.element.itemfrontpage.php', 'JBModelElementItemModified' => $modPath . '/jbmodel.element.itemmodified.php', 'JBModelElementItemName' => $modPath . '/jbmodel.element.itemname.php', 'JBModelElementItemPublish_down' => $modPath . '/jbmodel.element.itempublish_down.php', 'JBModelElementItemPublish_up' => $modPath . '/jbmodel.element.itempublish_up.php', 'JBModelElementItemTag' => $modPath . '/jbmodel.element.itemtag.php', 'JBModelElementJBImage' => $modPath . '/jbmodel.element.jbimage.php', 'JBModelElementJBSelectCascade' => $modPath . '/jbmodel.element.jbselectcascade.php', 'JBModelElementRange' => $modPath . '/jbmodel.element.range.php', 'JBModelElementRating' => $modPath . '/jbmodel.element.rating.php', 'JBModelElementJBPrice' => $modPath . '/jbmodel.element.jbprice.php', 'JBModelElementJBPricePlain' => $modPath . '/jbmodel.element.jbprice.plain.php', 'JBModelElementJBPriceCalc' => $modPath . '/jbmodel.element.jbprice.calc.php', 'JBModelElementJBComments' => $modPath . '/jbmodel.element.jbcomments.php', 'JBModelElementTextarea' => $modPath . '/jbmodel.element.textarea.php', 'JBModelFavorite' => $modPath . '/jbmodel.favorite.php', 'JBModelFilter' => $modPath . '/jbmodel.filter.php', 'JBModelItem' => $modPath . '/jbmodel.item.php', 'JBModelApp' => $modPath . '/jbmodel.app.php', 'JBModelCategory' => $modPath . '/jbmodel.category.php', 'JBModelOrder' => $modPath . '/jbmodel.order.php', 'JBModelRelated' => $modPath . '/jbmodel.related.php', 'JBModelSearchindex' => $modPath . '/jbmodel.searchindex.php', 'JBModelValues' => $modPath . '/jbmodel.values.php', 'JBModelSku' => $modPath . '/jbmodel.sku.php', // filter 'JBFilterElement' => $filPath . '/element.php', 'JBFilterElementAuthor' => $filPath . '/element.author.php', 'JBFilterElementAuthorCheckbox' => $filPath . '/element.author.checkbox.php', 'JBFilterElementAuthorRadio' => $filPath . '/element.author.radio.php', 'JBFilterElementAuthorSelect' => $filPath . '/element.author.select.php', 'JBFilterElementAuthorChosen' => $filPath . '/element.author.select.chosen.php', 'JBFilterElementAuthorText' => $filPath . '/element.author.text.php', 'JBFilterElementCategory' => $filPath . '/element.category.php', 'JBFilterElementCategoryChosen' => $filPath . '/element.category.chosen.php', 'JBFilterElementCategoryHidden' => $filPath . '/element.category.hidden.php', 'JBFilterElementCheckbox' => $filPath . '/element.checkbox.php', 'JBFilterElementCountry' => $filPath . '/element.country.php', 'JBFilterElementCountryCheckbox' => $filPath . '/element.country.checkbox.php', 'JBFilterElementCountryRadio' => $filPath . '/element.country.radio.php', 'JBFilterElementCountrySelect' => $filPath . '/element.country.select.php', 'JBFilterElementCountryChosen' => $filPath . '/element.country.select.chosen.php', 'JBFilterElementDate' => $filPath . '/element.date.php', 'JBFilterElementDateRange' => $filPath . '/element.date.range.php', 'JBFilterElementFrontpage' => $filPath . '/element.frontpage.php', 'JBFilterElementFrontpageJqueryUI' => $filPath . '/element.frontpage.jqueryui.php', 'JBFilterElementHidden' => $filPath . '/element.hidden.php', 'JBFilterElementImageexists' => $filPath . '/element.imageexists.php', 'JBFilterElementImageexistsJqueryui' => $filPath . '/element.imageexists.jqueryui.php', 'JBFilterElementJBColor' => $filPath . '/element.jbcolor.php', 'JBFilterElementJBPriceCalc' => $filPath . '/element.jbpricecalc.php', 'JBFilterElementJBPricePlain' => $filPath . '/element.jbpriceplain.php', 'JBFilterElementJbselectcascade' => $filPath . '/element.jbselectcascade.php', 'JBFilterElementJqueryui' => $filPath . '/element.jqueryui.php', 'JBFilterElementName' => $filPath . '/element.name.php', 'JBFilterElementNameCheckbox' => $filPath . '/element.name.checkbox.php', 'JBFilterElementNameRadio' => $filPath . '/element.name.radio.php', 'JBFilterElementNameSelect' => $filPath . '/element.name.select.php', 'JBFilterElementNameChosen' => $filPath . '/element.name.select.chosen.php', 'JBFilterElementRadio' => $filPath . '/element.radio.php', 'JBFilterElementRating' => $filPath . '/element.rating.php', 'JBFilterElementRatingRanges' => $filPath . '/element.rating.ranges.php', 'JBFilterElementRatingSlider' => $filPath . '/element.rating.slider.php', 'JBFilterElementSelect' => $filPath . '/element.select.php', 'JBFilterElementSelectChosen' => $filPath . '/element.select.chosen.php', 'JBFilterElementSlider' => $filPath . '/element.slider.php', 'JBFilterElementTag' => $filPath . '/element.tag.php', 'JBFilterElementTagCheckbox' => $filPath . '/element.tag.checkbox.php', 'JBFilterElementTagRadio' => $filPath . '/element.tag.radio.php', 'JBFilterElementTagSelect' => $filPath . '/element.tag.select.php', 'JBFilterElementTagSelectChosen' => $filPath . '/element.tag.select.chosen.php', 'JBFilterElementText' => $filPath . '/element.text.php', 'JBFilterElementTextRange' => $filPath . '/element.text.range.php', // events 'JBZooSystemPlugin' => $evtPath . '/jsystem.php', 'JBEvent' => $evtPath . '/jbevent.php', 'JBEventApplication' => $evtPath . '/jbevent.application.php', 'JBEventBasket' => $evtPath . '/jbevent.basket.php', 'JBEventCategory' => $evtPath . '/jbevent.category.php', 'JBEventComment' => $evtPath . '/jbevent.comment.php', 'JBEventElement' => $evtPath . '/jbevent.element.php', 'JBEventItem' => $evtPath . '/jbevent.item.php', 'JBEventJBZoo' => $evtPath . '/jbevent.jbzoo.php', 'JBEventLayout' => $evtPath . '/jbevent.layout.php', 'JBEventSubmission' => $evtPath . '/jbevent.submission.php', 'JBEventTag' => $evtPath . '/jbevent.tag.php', 'JBEventType' => $evtPath . '/jbevent.type.php', ); foreach ($classList as $className => $path) { JLoader::register($className, $path); } } /** * Get domain name * @param bool $isAny * @return string */ static function getDomain($isAny = false) { if (defined('STDIN') || php_sapi_name() == "cli") { return 'console'; } $domain = ''; if (function_exists('apache_request_headers')) { $headers = apache_request_headers(); $domain = isset($headers['Host']) ? $headers['Host'] : ''; } if ($isAny && !$domain) { $domain = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''; } $domain = preg_replace('#^www\.#', '', $domain); list($domain) = explode(':', $domain); return $domain; } /** * Load lang files */ private function _initLanguages() { $lang = JFactory::getLanguage(); $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); } /** * Register and connect events */ private function _initEvents() { $event = $this->app->event; $dispatcher = $event->dispatcher; $event->register('JBEventApplication'); $dispatcher->connect('application:init', array('JBEventApplication', 'init')); $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); $event->register('JBEventCategory'); $dispatcher->connect('category:init', array('JBEventCategory', 'init')); $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); $event->register('JBEventItem'); $dispatcher->connect('item:init', array('JBEventItem', 'init')); $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); $event->register('JBEventComment'); $dispatcher->connect('comment:init', array('JBEventComment', 'init')); $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); $event->register('JBEventSubmission'); $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); $event->register('JBEventElement'); $dispatcher->connect('element:download', array('JBEventElement', 'download')); $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); $event->register('JBEventLayout'); $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); $event->register('JBEventTag'); $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); $event->register('JBEventType'); $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); $dispatcher->connect('type:copied', array('JBEventType', 'copied')); $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); $event->register('JBEventJBZoo'); $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); $event->register('JBEventBasket'); $dispatcher->connect('basket:beforeSave', array('JBEventBasket', 'beforeSave')); $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); $dispatcher->connect('basket:afterSave', array('JBEventBasket', 'afterSave')); $dispatcher->connect('basket:updated', array('JBEventBasket', 'updated')); $dispatcher->connect('basket:addItem', array('JBEventBasket', 'addItem')); $dispatcher->connect('basket:updateItem', array('JBEventBasket', 'updateItem')); $dispatcher->connect('basket:changeQuantity', array('JBEventBasket', 'changeQuantity')); $dispatcher->connect('basket:removeItem', array('JBEventBasket', 'removeItem')); $dispatcher->connect('basket:removeItems', array('JBEventBasket', 'removeItems')); $dispatcher->connect('basket:recount', array('JBEventBasket', 'recount')); $dispatcher->connect('basket:orderStatus', array('JBEventBasket', 'orderStatus')); $dispatcher->connect('basket:paymentStatus', array('JBEventBasket', 'paymentStatus')); $dispatcher->connect('basket:shippingStatus', array('JBEventBasket', 'shippingStatus')); $dispatcher->connect('basket:paymentSuccess', array('JBEventBasket', 'paymentSuccess')); $dispatcher->connect('basket:paymentFail', array('JBEventBasket', 'paymentFail')); $dispatcher->connect('basket:paymentCallback', array('JBEventBasket', 'paymentCallback')); } /** * Init assets for admin path */ private function _initAssets() { if (!$this->app->jbenv->isSite() && !$this->app->jbrequest->isAjax()) { $this->app->jbassets->admin(); $this->_initLanguages(); $this->_initAdminMenu(); } } /** * Get hash * @param $string * @return string */ static public function getHash($string) { return ''; } /** * Init Admin menu */ private function _initAdminMenu() { $isNotJ35 = version_compare(JVERSION, '3.6', '<='); if ($isNotJ35) { $this->app->jbassets->addVar('JBAdminItems', array( 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), 'items' => $this->getAdminMenu(), )); } } /** * Init Admin menu */ public function getAdminMenu() { $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); if (!$config->get('adminmenu_show', 1)) { return false; } $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); $appList = JBModelApp::model()->getSimpleList(); $findJBZooApp = false; $dispatched = false; foreach ($appList as $app) { if ($app->application_group == JBZOO_APP_GROUP) { $findJBZooApp = true; if ($curApp == $app->id) { $dispatched = true; } } } if (!$findJBZooApp) { return false; } $router = $this->app->jbrouter; $menuItems = array(); if (!empty($appList)) { foreach ($appList as $app) { $menuItems['app-' . $app->alias] = array( 'name' => $app->name, 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), 'children' => array( 'add-item' => array( 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')), ), 'sep-1' => 'divider', 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')), ), 'frontpage' => array( 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')), ), 'comments' => array( 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')), ), 'sep-1' => 'divider', 'config' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')), ), ), ); } } $menuItems['sep-1'] = 'divider'; if ($dispatched) { if ((int)JBModelConfig::model()->get('enable', 1, 'cart.config')) { $menuItems['orders'] = array( 'name' => JText::_('JBZOO_ADMINMENU_ORDERS'), 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jborder')), 'children' => array( 'cart-configs' => array( 'name' => JText::_('JBZOO_ADMINMENU_CART_CONFIG'), 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jbcart')), ), ), ); $menuItems['sep-2'] = 'divider'; } } $menuItems['item-config'] = array( 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), ); $types = $this->app->jbtype->getSimpleList(); if (!empty($types)) { $children = array(); foreach ($types as $alias => $type) { $children['type-' . $alias] = array( 'name' => $type, 'url' => $router->admin(array('controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => array('0' => $alias))), ); } $menuItems['item-config']['children'] = $children; } if ($dispatched) { $menuItems['sep-3'] = 'divider'; $menuItems['jbzoo-admin'] = array( 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), ), ), ); $menuItems['jbzoo-import'] = array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDARD'), 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), ), ), ); $menuItems['jbzoo-export'] = array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), 'children' => array( 'items' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), ), 'categories' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), ), 'types' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), ), 'yandexyml' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), ), 'stdandart' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDARD'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), ), 'zoobackup' => array( 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), ), ), ); $menuItems['sep-4'] = 'divider'; $menuItems['jbzoo-info'] = array( 'name' => JText::_('JBZOO_ADMINMENU_INFO'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), 'children' => array( 'performance' => array( 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), ), 'systemreport' => array( 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), ), 'server' => array( 'name' => 'Get Last JBZoo', 'url' => 'https://github.com/JBZoo/JBZoo', 'target' => '_blank', ), ), ); } $menuItems['jbzoo-support'] = array( 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), 'url' => 'http://forum.jbzoo.com/', 'target' => '_blank', ); } /** * Get group name * @return string */ private function _getGroup() { return $this->_group; } /** * Register new path in system * @param string $path * @param string $pathName * @return mixed */ private function _addPath($path, $pathName) { if ($fullPath = $this->app->path->path($path)) { return $this->app->path->register($fullPath, $pathName); } return null; } } \ No newline at end of file + + */ + +// no direct access +defined('_JEXEC') or die('Restricted access'); + +/** + * Class JBZoo + */ +class JBZoo +{ + /** + * @var Application + */ + public $app = null; + + /** + * App group name + * @var string + */ + private $_group = JBZOO_APP_GROUP; + + /** + * Init JBZoo application + * @static + * @return JBZoo + */ + public static function init() + { + static $jbzoo; + + if (!isset($jbzoo)) { + $jbzoo = new self(); + } + + return $jbzoo; + } + + /** + * Initialization JBZoo App + */ + private function __construct() + { + $this->app = App::getInstance('zoo'); + + $this->_initPaths(); + $this->_initClasses(); + $this->_initEvents(); + $this->_initAssets(); + } + + /** + * Add directory path + */ + private function _initPaths() + { + $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); + $this->_addPath('jbapp:framework', 'jbzoo'); + $this->_addPath('jbapp:assets', 'jbassets'); + $this->_addPath('jbassets:zoo', 'assets'); + $this->_addPath('jbapp:config', 'jbconfig'); + $this->_addPath('jbzoo:elements', 'jbelements'); + $this->_addPath('jbapp:cart-elements', 'cart-elements'); + $this->_addPath('jbapp:types', 'jbtypes'); + + $this->_addPath('jbzoo:helpers', 'helpers'); + $this->_addPath('jbzoo:helpers-std', 'helpers'); + $this->_addPath('helpers:fields', 'fields'); + + $this->_addPath('jbzoo:tables', 'tables'); + $this->_addPath('jbzoo:classes-std', 'classes'); + $this->_addPath('jbzoo:render', 'renderer'); + $this->_addPath('jbzoo:views', 'jbviews'); + $this->_addPath('jbapp:config', 'jbxml'); + $this->_addPath('jbviews:', 'partials'); + $this->_addPath('jbapp:joomla/elements', 'fields'); + $this->_addPath('jbapp:templates', 'jbtmpl'); + + $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); + $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); + $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); + $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); + $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); + $this->_addPath('modules:mod_jbzoo_currency', 'mod_jbzoo_currency'); + + $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); + + if ($this->app->jbenv->isSite()) { + $this->_addPath('jbzoo:controllers', 'controllers'); + } + + require $this->app->path->path('jbzoo:controllers/base.php'); + + JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); + } + + /** + * Include models classes + */ + private function _initClasses() + { + jimport('joomla.html.parameter.element'); + + $this->app->loader->register('AppValidator', 'classes:validator.php'); + + // defines + define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); + define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); + define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); + define('ZOO_TABLE_JBZOO_ORDER', '#__zoo_jbzoo_orders'); + + $frmwork = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework'; + $clsPath = $frmwork . '/classes'; + $modPath = $frmwork . '/models'; + $filPath = $frmwork . '/render/filter'; + $evtPath = $frmwork . '/events'; + + $classList = array( + 'JBDatabaseQuery' => $clsPath . '/database/JBDatabaseQuery.php', + 'JBDatabaseQueryElement' => $clsPath . '/database/JBDatabaseQueryElement.php', + 'JBCartOrder' => $clsPath . '/cart/jborder.php', + 'JBCart' => $clsPath . '/cart/jbcart.php', + 'JBCartValue' => $clsPath . '/cart/jbvalue.php', + 'JBCartVariant' => $clsPath . '/cart/jbvariant.php', + 'JBCartVariantList' => $clsPath . '/cart/jbvariantlist.php', + 'JBTemplate' => $clsPath . '/jbtemplate.php', + + // models + 'JBModel' => $modPath . '/jbmodel.php', + 'JBModelConfig' => $modPath . '/jbmodel.config.php', + 'JBModelElement' => $modPath . '/jbmodel.element.php', + 'JBModelAutoComplete' => $modPath . '/jbmodel.autocomplete.php', + 'JBModelElementCountry' => $modPath . '/jbmodel.element.country.php', + 'JBModelElementDate' => $modPath . '/jbmodel.element.date.php', + 'JBModelElementItemDate' => $modPath . '/jbmodel.element.itemdate.php', + 'JBModelElementItemauthor' => $modPath . '/jbmodel.element.itemauthor.php', + 'JBModelElementItemCategory' => $modPath . '/jbmodel.element.itemcategory.php', + 'JBModelElementItemCreated' => $modPath . '/jbmodel.element.itemcreated.php', + 'JBModelElementItemFrontpage' => $modPath . '/jbmodel.element.itemfrontpage.php', + 'JBModelElementItemModified' => $modPath . '/jbmodel.element.itemmodified.php', + 'JBModelElementItemName' => $modPath . '/jbmodel.element.itemname.php', + 'JBModelElementItemPublish_down' => $modPath . '/jbmodel.element.itempublish_down.php', + 'JBModelElementItemPublish_up' => $modPath . '/jbmodel.element.itempublish_up.php', + 'JBModelElementItemTag' => $modPath . '/jbmodel.element.itemtag.php', + 'JBModelElementJBImage' => $modPath . '/jbmodel.element.jbimage.php', + 'JBModelElementJBSelectCascade' => $modPath . '/jbmodel.element.jbselectcascade.php', + 'JBModelElementRange' => $modPath . '/jbmodel.element.range.php', + 'JBModelElementRating' => $modPath . '/jbmodel.element.rating.php', + 'JBModelElementJBPrice' => $modPath . '/jbmodel.element.jbprice.php', + 'JBModelElementJBPricePlain' => $modPath . '/jbmodel.element.jbprice.plain.php', + 'JBModelElementJBPriceCalc' => $modPath . '/jbmodel.element.jbprice.calc.php', + 'JBModelElementJBComments' => $modPath . '/jbmodel.element.jbcomments.php', + 'JBModelElementTextarea' => $modPath . '/jbmodel.element.textarea.php', + 'JBModelFavorite' => $modPath . '/jbmodel.favorite.php', + 'JBModelFilter' => $modPath . '/jbmodel.filter.php', + 'JBModelItem' => $modPath . '/jbmodel.item.php', + 'JBModelApp' => $modPath . '/jbmodel.app.php', + 'JBModelCategory' => $modPath . '/jbmodel.category.php', + 'JBModelOrder' => $modPath . '/jbmodel.order.php', + 'JBModelRelated' => $modPath . '/jbmodel.related.php', + 'JBModelSearchindex' => $modPath . '/jbmodel.searchindex.php', + 'JBModelValues' => $modPath . '/jbmodel.values.php', + 'JBModelSku' => $modPath . '/jbmodel.sku.php', + + // filter + 'JBFilterElement' => $filPath . '/element.php', + 'JBFilterElementAuthor' => $filPath . '/element.author.php', + 'JBFilterElementAuthorCheckbox' => $filPath . '/element.author.checkbox.php', + 'JBFilterElementAuthorRadio' => $filPath . '/element.author.radio.php', + 'JBFilterElementAuthorSelect' => $filPath . '/element.author.select.php', + 'JBFilterElementAuthorChosen' => $filPath . '/element.author.select.chosen.php', + 'JBFilterElementAuthorText' => $filPath . '/element.author.text.php', + 'JBFilterElementCategory' => $filPath . '/element.category.php', + 'JBFilterElementCategoryChosen' => $filPath . '/element.category.chosen.php', + 'JBFilterElementCategoryHidden' => $filPath . '/element.category.hidden.php', + 'JBFilterElementCheckbox' => $filPath . '/element.checkbox.php', + 'JBFilterElementCountry' => $filPath . '/element.country.php', + 'JBFilterElementCountryCheckbox' => $filPath . '/element.country.checkbox.php', + 'JBFilterElementCountryRadio' => $filPath . '/element.country.radio.php', + 'JBFilterElementCountrySelect' => $filPath . '/element.country.select.php', + 'JBFilterElementCountryChosen' => $filPath . '/element.country.select.chosen.php', + 'JBFilterElementDate' => $filPath . '/element.date.php', + 'JBFilterElementDateRange' => $filPath . '/element.date.range.php', + 'JBFilterElementFrontpage' => $filPath . '/element.frontpage.php', + 'JBFilterElementFrontpageJqueryUI' => $filPath . '/element.frontpage.jqueryui.php', + 'JBFilterElementHidden' => $filPath . '/element.hidden.php', + 'JBFilterElementImageexists' => $filPath . '/element.imageexists.php', + 'JBFilterElementImageexistsJqueryui' => $filPath . '/element.imageexists.jqueryui.php', + 'JBFilterElementJBColor' => $filPath . '/element.jbcolor.php', + 'JBFilterElementJBPriceCalc' => $filPath . '/element.jbpricecalc.php', + 'JBFilterElementJBPricePlain' => $filPath . '/element.jbpriceplain.php', + 'JBFilterElementJbselectcascade' => $filPath . '/element.jbselectcascade.php', + 'JBFilterElementJqueryui' => $filPath . '/element.jqueryui.php', + 'JBFilterElementName' => $filPath . '/element.name.php', + 'JBFilterElementNameCheckbox' => $filPath . '/element.name.checkbox.php', + 'JBFilterElementNameRadio' => $filPath . '/element.name.radio.php', + 'JBFilterElementNameSelect' => $filPath . '/element.name.select.php', + 'JBFilterElementNameChosen' => $filPath . '/element.name.select.chosen.php', + 'JBFilterElementRadio' => $filPath . '/element.radio.php', + 'JBFilterElementRating' => $filPath . '/element.rating.php', + 'JBFilterElementRatingRanges' => $filPath . '/element.rating.ranges.php', + 'JBFilterElementRatingSlider' => $filPath . '/element.rating.slider.php', + 'JBFilterElementSelect' => $filPath . '/element.select.php', + 'JBFilterElementSelectChosen' => $filPath . '/element.select.chosen.php', + 'JBFilterElementSlider' => $filPath . '/element.slider.php', + 'JBFilterElementTag' => $filPath . '/element.tag.php', + 'JBFilterElementTagCheckbox' => $filPath . '/element.tag.checkbox.php', + 'JBFilterElementTagRadio' => $filPath . '/element.tag.radio.php', + 'JBFilterElementTagSelect' => $filPath . '/element.tag.select.php', + 'JBFilterElementTagSelectChosen' => $filPath . '/element.tag.select.chosen.php', + 'JBFilterElementText' => $filPath . '/element.text.php', + 'JBFilterElementTextRange' => $filPath . '/element.text.range.php', + + // events + 'JBZooSystemPlugin' => $evtPath . '/jsystem.php', + 'JBEvent' => $evtPath . '/jbevent.php', + 'JBEventApplication' => $evtPath . '/jbevent.application.php', + 'JBEventBasket' => $evtPath . '/jbevent.basket.php', + 'JBEventCategory' => $evtPath . '/jbevent.category.php', + 'JBEventComment' => $evtPath . '/jbevent.comment.php', + 'JBEventElement' => $evtPath . '/jbevent.element.php', + 'JBEventItem' => $evtPath . '/jbevent.item.php', + 'JBEventJBZoo' => $evtPath . '/jbevent.jbzoo.php', + 'JBEventLayout' => $evtPath . '/jbevent.layout.php', + 'JBEventSubmission' => $evtPath . '/jbevent.submission.php', + 'JBEventTag' => $evtPath . '/jbevent.tag.php', + 'JBEventType' => $evtPath . '/jbevent.type.php', + ); + + foreach ($classList as $className => $path) { + JLoader::register($className, $path); + } + } + + /** + * Get domain name + * @param bool $isAny + * @return string + */ + static function getDomain($isAny = false) + { + if (defined('STDIN') || php_sapi_name() == "cli") { + return 'console'; + } + + $domain = ''; + if (function_exists('apache_request_headers')) { + $headers = apache_request_headers(); + $domain = isset($headers['Host']) ? $headers['Host'] : ''; + } + + if ($isAny && !$domain) { + $domain = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''; + } + + $domain = preg_replace('#^www\.#', '', $domain); + list($domain) = explode(':', $domain); + + return $domain; + } + + /** + * Load lang files + */ + private function _initLanguages() + { + $lang = JFactory::getLanguage(); + $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); + } + + /** + * Register and connect events + */ + private function _initEvents() + { + $event = $this->app->event; + $dispatcher = $event->dispatcher; + + $event->register('JBEventApplication'); + $dispatcher->connect('application:init', array('JBEventApplication', 'init')); + $dispatcher->connect('application:saved', array('JBEventApplication', 'saved')); + $dispatcher->connect('application:deleted', array('JBEventApplication', 'deleted')); + $dispatcher->connect('application:addmenuitems', array('JBEventApplication', 'addmenuitems')); + $dispatcher->connect('application:installed', array('JBEventApplication', 'installed')); + $dispatcher->connect('application:configparams', array('JBEventApplication', 'configparams')); + $dispatcher->connect('application:sefbuildroute', array('JBEventApplication', 'sefbuildroute')); + $dispatcher->connect('application:sefparseroute', array('JBEventApplication', 'sefparseroute')); + $dispatcher->connect('application:sh404sef', array('JBEventApplication', 'sh404sef')); + + $event->register('JBEventCategory'); + $dispatcher->connect('category:init', array('JBEventCategory', 'init')); + $dispatcher->connect('category:saved', array('JBEventCategory', 'saved')); + $dispatcher->connect('category:deleted', array('JBEventCategory', 'deleted')); + $dispatcher->connect('category:stateChanged', array('JBEventCategory', 'stateChanged')); + + $event->register('JBEventItem'); + $dispatcher->connect('item:init', array('JBEventItem', 'init')); + $dispatcher->connect('item:saved', array('JBEventItem', 'saved')); + $dispatcher->connect('item:deleted', array('JBEventItem', 'deleted')); + $dispatcher->connect('item:stateChanged', array('JBEventItem', 'stateChanged')); + $dispatcher->connect('item:beforedisplay', array('JBEventItem', 'beforeDisplay')); + $dispatcher->connect('item:afterdisplay', array('JBEventItem', 'afterDisplay')); + $dispatcher->connect('item:orderquery', array('JBEventItem', 'orderQuery')); + $dispatcher->connect('item:beforeSaveCategoryRelations', array('JBEventItem', 'beforeSaveCategoryRelations')); + $dispatcher->connect('item:beforeRenderLayout', array('JBEventItem', 'beforeRenderLayout')); + $dispatcher->connect('item:afterRenderLayout', array('JBEventItem', 'afterRenderLayout')); + + $event->register('JBEventComment'); + $dispatcher->connect('comment:init', array('JBEventComment', 'init')); + $dispatcher->connect('comment:saved', array('JBEventComment', 'saved')); + $dispatcher->connect('comment:deleted', array('JBEventComment', 'deleted')); + $dispatcher->connect('comment:stateChanged', array('JBEventComment', 'stateChanged')); + + $event->register('JBEventSubmission'); + $dispatcher->connect('submission:init', array('JBEventSubmission', 'init')); + $dispatcher->connect('submission:saved', array('JBEventSubmission', 'saved')); + $dispatcher->connect('submission:deleted', array('JBEventSubmission', 'deleted')); + $dispatcher->connect('submission:beforesave', array('JBEventSubmission', 'beforeSave')); + + $event->register('JBEventElement'); + $dispatcher->connect('element:download', array('JBEventElement', 'download')); + $dispatcher->connect('element:configform', array('JBEventElement', 'configForm')); + $dispatcher->connect('element:configparams', array('JBEventElement', 'configParams')); + $dispatcher->connect('element:configxml', array('JBEventElement', 'configXML')); + $dispatcher->connect('element:afterdisplay', array('JBEventElement', 'afterDisplay')); + $dispatcher->connect('element:beforedisplay', array('JBEventElement', 'beforeDisplay')); + $dispatcher->connect('element:aftersubmissiondisplay', array('JBEventElement', 'afterSubmissionDisplay')); + $dispatcher->connect('element:beforesubmissiondisplay', array('JBEventElement', 'beforeSubmissionDisplay')); + $dispatcher->connect('element:beforeedit', array('JBEventElement', 'beforeEdit')); + $dispatcher->connect('element:afteredit', array('JBEventElement', 'afterEdit')); + + $event->register('JBEventLayout'); + $dispatcher->connect('layout:init', array('JBEventLayout', 'init')); + + $event->register('JBEventTag'); + $dispatcher->connect('tag:saved', array('JBEventTag', 'saved')); + $dispatcher->connect('tag:deleted', array('JBEventTag', 'deleted')); + + $event->register('JBEventType'); + $dispatcher->connect('type:beforesave', array('JBEventType', 'beforesave')); + $dispatcher->connect('type:aftersave', array('JBEventType', 'aftersave')); + $dispatcher->connect('type:copied', array('JBEventType', 'copied')); + $dispatcher->connect('type:deleted', array('JBEventType', 'deleted')); + $dispatcher->connect('type:editdisplay', array('JBEventType', 'editDisplay')); + $dispatcher->connect('type:coreconfig', array('JBEventType', 'coreconfig')); + $dispatcher->connect('type:assignelements', array('JBEventType', 'assignelements')); + + $event->register('JBEventJBZoo'); + $dispatcher->connect('jbzoo:beforeInit', array('JBEventJBZoo', 'beforeInit')); + $dispatcher->notify($event->create($this, 'jbzoo:beforeInit')); + + $event->register('JBEventBasket'); + $dispatcher->connect('basket:beforeSave', array('JBEventBasket', 'beforeSave')); + $dispatcher->connect('basket:saved', array('JBEventBasket', 'saved')); + $dispatcher->connect('basket:afterSave', array('JBEventBasket', 'afterSave')); + $dispatcher->connect('basket:updated', array('JBEventBasket', 'updated')); + + $dispatcher->connect('basket:addItem', array('JBEventBasket', 'addItem')); + $dispatcher->connect('basket:updateItem', array('JBEventBasket', 'updateItem')); + $dispatcher->connect('basket:changeQuantity', array('JBEventBasket', 'changeQuantity')); + $dispatcher->connect('basket:removeItem', array('JBEventBasket', 'removeItem')); + $dispatcher->connect('basket:removeItems', array('JBEventBasket', 'removeItems')); + $dispatcher->connect('basket:recount', array('JBEventBasket', 'recount')); + + $dispatcher->connect('basket:orderStatus', array('JBEventBasket', 'orderStatus')); + $dispatcher->connect('basket:paymentStatus', array('JBEventBasket', 'paymentStatus')); + $dispatcher->connect('basket:shippingStatus', array('JBEventBasket', 'shippingStatus')); + + $dispatcher->connect('basket:paymentSuccess', array('JBEventBasket', 'paymentSuccess')); + $dispatcher->connect('basket:paymentFail', array('JBEventBasket', 'paymentFail')); + $dispatcher->connect('basket:paymentCallback', array('JBEventBasket', 'paymentCallback')); + } + + /** + * Init assets for admin path + */ + private function _initAssets() + { + if (!$this->app->jbenv->isSite() && !$this->app->jbrequest->isAjax()) { + $this->app->jbassets->admin(); + $this->_initLanguages(); + $this->_initAdminMenu(); + } + } + + /** + * Get hash + * @param $string + * @return string + */ + static public function getHash($string) + { + return ''; + } + + /** + * Init Admin menu + */ + private function _initAdminMenu() + { + $isNotJ35 = version_compare(JVERSION, '3.6', '<='); + + if ($isNotJ35) { + $this->app->jbassets->addVar('JBAdminItems', array( + 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), + 'items' => $this->getAdminMenu(), + )); + } + } + + /** + * Init Admin menu + */ + public function getAdminMenu() + { + $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); + if (!$config->get('adminmenu_show', 1)) { + return false; + } + + $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); + + $appList = JBModelApp::model()->getSimpleList(); + + $findJBZooApp = false; + $dispatched = false; + foreach ($appList as $app) { + if ($app->application_group == JBZOO_APP_GROUP) { + $findJBZooApp = true; + if ($curApp == $app->id) { + $dispatched = true; + } + } + } + + if (!$findJBZooApp) { + return false; + } + + $router = $this->app->jbrouter; + + $menuItems = array(); + + if (!empty($appList)) { + foreach ($appList as $app) { + + $menuItems['app-' . $app->alias] = array( + 'name' => $app->name, + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item')), + 'children' => array( + 'add-item' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => 'add')), + ), + 'sep-1' => 'divider', + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'item', 'task' => '')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'category', 'task' => '')), + ), + 'frontpage' => array( + 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '')), + ), + 'comments' => array( + 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'comment', 'task' => '')), + ), + 'sep-1' => 'divider', + 'config' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), + 'url' => $router->admin(array('changeapp' => $app->id, 'controller' => 'configuration', 'task' => '')), + ), + ), + ); + } + } + + $menuItems['sep-1'] = 'divider'; + + if ($dispatched) { + if ((int)JBModelConfig::model()->get('enable', 1, 'cart.config')) { + $menuItems['orders'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_ORDERS'), + 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jborder')), + 'children' => array( + 'cart-configs' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CART_CONFIG'), + 'url' => $this->app->jbrouter->admin(array('task' => 'index', 'controller' => 'jbcart')), + ), + ), + ); + + $menuItems['sep-2'] = 'divider'; + } + } + + $menuItems['item-config'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), + 'url' => $this->app->jbrouter->admin(array('task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager')), + ); + + $types = $this->app->jbtype->getSimpleList(); + if (!empty($types)) { + $children = array(); + foreach ($types as $alias => $type) { + $children['type-' . $alias] = array( + 'name' => $type, + 'url' => $router->admin(array('controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => array('0' => $alias))), + ); + } + + $menuItems['item-config']['children'] = $children; + } + + if ($dispatched) { + $menuItems['sep-3'] = 'divider'; + + $menuItems['jbzoo-admin'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), + 'url' => $router->admin(array('controller' => 'jbindex', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), + 'url' => $router->admin(array('controller' => 'jbtools', 'task' => 'index')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), + 'url' => $router->admin(array('controller' => 'jbconfig', 'task' => 'index')), + ), + ), + ); + + $menuItems['jbzoo-import'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'categories')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDARD'), + 'url' => $router->admin(array('controller' => 'jbimport', 'task' => 'standart')), + ), + ), + ); + + $menuItems['jbzoo-export'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'index')), + 'children' => array( + 'items' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'items')), + ), + 'categories' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'categories')), + ), + 'types' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'types')), + ), + 'yandexyml' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'yandexyml')), + ), + 'stdandart' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDARD'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'standart')), + ), + 'zoobackup' => array( + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), + 'url' => $router->admin(array('controller' => 'jbexport', 'task' => 'zoobackup')), + ), + ), + ); + + $menuItems['sep-4'] = 'divider'; + + $menuItems['jbzoo-info'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_INFO'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'index')), + 'children' => array( + 'performance' => array( + 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'performance')), + ), + 'systemreport' => array( + 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), + 'url' => $router->admin(array('controller' => 'jbinfo', 'task' => 'systemreport')), + ), + 'server' => array( + 'name' => 'Get Last JBZoo', + 'url' => 'https://github.com/JBZoo/JBZoo', + 'target' => '_blank', + ), + ), + ); + } + + $menuItems['jbzoo-support'] = array( + 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), + 'url' => 'http://forum.jbzoo.com/', + 'target' => '_blank', + ); + } + + /** + * Get group name + * @return string + */ + private function _getGroup() + { + return $this->_group; + } + + /** + * Register new path in system + * @param string $path + * @param string $pathName + * @return mixed + */ + private function _addPath($path, $pathName) + { + if ($fullPath = $this->app->path->path($path)) { + return $this->app->path->register($fullPath, $pathName); + } + + return null; + } +} diff --git a/patches/2.3.2_and_later/media/zoo/applications/jbuniversal/framework/jbzoo.php b/patches/2.3.2_and_later/media/zoo/applications/jbuniversal/framework/jbzoo.php index f77a9de..242860e 100644 --- a/patches/2.3.2_and_later/media/zoo/applications/jbuniversal/framework/jbzoo.php +++ b/patches/2.3.2_and_later/media/zoo/applications/jbuniversal/framework/jbzoo.php @@ -1 +1,671 @@ - */ // no direct access defined('_JEXEC') or die('Restricted access'); /** * Class JBZoo */ class JBZoo { /** * @var Application */ public $app; /** * App group name * @var string */ private $_group = JBZOO_APP_GROUP; /** * Init JBZoo application * @static * @return JBZoo */ public static function init() { static $jbzoo; if ($jbzoo === null) { $jbzoo = new self(); } return $jbzoo; } /** * Initialization JBZoo App */ private function __construct() { $this->app = App::getInstance('zoo'); $this->_initPaths(); $this->_initClasses(); $this->_initEvents(); $this->_initAssets(); } /** * Add directory path */ private function _initPaths() { $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); $this->_addPath('jbapp:framework', 'jbzoo'); $this->_addPath('jbapp:assets', 'jbassets'); $this->_addPath('jbassets:zoo', 'assets'); $this->_addPath('jbapp:config', 'jbconfig'); $this->_addPath('jbzoo:elements', 'jbelements'); $this->_addPath('jbapp:cart-elements', 'cart-elements'); $this->_addPath('jbapp:types', 'jbtypes'); $this->_addPath('jbzoo:helpers', 'helpers'); $this->_addPath('jbzoo:helpers-std', 'helpers'); $this->_addPath('helpers:fields', 'fields'); $this->_addPath('jbzoo:tables', 'tables'); $this->_addPath('jbzoo:classes-std', 'classes'); $this->_addPath('jbzoo:render', 'renderer'); $this->_addPath('jbzoo:views', 'jbviews'); $this->_addPath('jbapp:config', 'jbxml'); $this->_addPath('jbviews:', 'partials'); $this->_addPath('jbapp:joomla/elements', 'fields'); $this->_addPath('jbapp:templates', 'jbtmpl'); $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); $this->_addPath('modules:mod_jbzoo_currency', 'mod_jbzoo_currency'); $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); if ($this->app->jbenv->isSite()) { $this->_addPath('jbzoo:controllers', 'controllers'); } require $this->app->path->path('jbzoo:controllers/base.php'); JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); } /** * Include models classes */ private function _initClasses() { jimport('joomla.html.parameter.element'); $this->app->loader->register('AppValidator', 'classes:validator.php'); // defines define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); define('ZOO_TABLE_JBZOO_ORDER', '#__zoo_jbzoo_orders'); $frameworkPath = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework'; $clsPath = $frameworkPath . '/classes'; $modPath = $frameworkPath . '/models'; $filPath = $frameworkPath . '/render/filter'; $evtPath = $frameworkPath . '/events'; $classList = [ 'JBDatabaseQuery' => $clsPath . '/database/JBDatabaseQuery.php', 'JBDatabaseQueryElement' => $clsPath . '/database/JBDatabaseQueryElement.php', 'JBCartOrder' => $clsPath . '/cart/jborder.php', 'JBCart' => $clsPath . '/cart/jbcart.php', 'JBCartValue' => $clsPath . '/cart/jbvalue.php', 'JBCartVariant' => $clsPath . '/cart/jbvariant.php', 'JBCartVariantList' => $clsPath . '/cart/jbvariantlist.php', 'JBTemplate' => $clsPath . '/jbtemplate.php', // models 'JBModel' => $modPath . '/jbmodel.php', 'JBModelConfig' => $modPath . '/jbmodel.config.php', 'JBModelElement' => $modPath . '/jbmodel.element.php', 'JBModelAutoComplete' => $modPath . '/jbmodel.autocomplete.php', 'JBModelElementCountry' => $modPath . '/jbmodel.element.country.php', 'JBModelElementDate' => $modPath . '/jbmodel.element.date.php', 'JBModelElementItemDate' => $modPath . '/jbmodel.element.itemdate.php', 'JBModelElementItemauthor' => $modPath . '/jbmodel.element.itemauthor.php', 'JBModelElementItemCategory' => $modPath . '/jbmodel.element.itemcategory.php', 'JBModelElementItemCreated' => $modPath . '/jbmodel.element.itemcreated.php', 'JBModelElementItemFrontpage' => $modPath . '/jbmodel.element.itemfrontpage.php', 'JBModelElementItemModified' => $modPath . '/jbmodel.element.itemmodified.php', 'JBModelElementItemName' => $modPath . '/jbmodel.element.itemname.php', 'JBModelElementItemPublish_down' => $modPath . '/jbmodel.element.itempublish_down.php', 'JBModelElementItemPublish_up' => $modPath . '/jbmodel.element.itempublish_up.php', 'JBModelElementItemTag' => $modPath . '/jbmodel.element.itemtag.php', 'JBModelElementJBImage' => $modPath . '/jbmodel.element.jbimage.php', 'JBModelElementJBSelectCascade' => $modPath . '/jbmodel.element.jbselectcascade.php', 'JBModelElementRange' => $modPath . '/jbmodel.element.range.php', 'JBModelElementRating' => $modPath . '/jbmodel.element.rating.php', 'JBModelElementJBPrice' => $modPath . '/jbmodel.element.jbprice.php', 'JBModelElementJBPricePlain' => $modPath . '/jbmodel.element.jbprice.plain.php', 'JBModelElementJBPriceCalc' => $modPath . '/jbmodel.element.jbprice.calc.php', 'JBModelElementJBComments' => $modPath . '/jbmodel.element.jbcomments.php', 'JBModelElementTextarea' => $modPath . '/jbmodel.element.textarea.php', 'JBModelFavorite' => $modPath . '/jbmodel.favorite.php', 'JBModelFilter' => $modPath . '/jbmodel.filter.php', 'JBModelItem' => $modPath . '/jbmodel.item.php', 'JBModelApp' => $modPath . '/jbmodel.app.php', 'JBModelCategory' => $modPath . '/jbmodel.category.php', 'JBModelOrder' => $modPath . '/jbmodel.order.php', 'JBModelRelated' => $modPath . '/jbmodel.related.php', 'JBModelSearchindex' => $modPath . '/jbmodel.searchindex.php', 'JBModelValues' => $modPath . '/jbmodel.values.php', 'JBModelSku' => $modPath . '/jbmodel.sku.php', // filter 'JBFilterElement' => $filPath . '/element.php', 'JBFilterElementAuthor' => $filPath . '/element.author.php', 'JBFilterElementAuthorCheckbox' => $filPath . '/element.author.checkbox.php', 'JBFilterElementAuthorRadio' => $filPath . '/element.author.radio.php', 'JBFilterElementAuthorSelect' => $filPath . '/element.author.select.php', 'JBFilterElementAuthorChosen' => $filPath . '/element.author.select.chosen.php', 'JBFilterElementAuthorText' => $filPath . '/element.author.text.php', 'JBFilterElementCategory' => $filPath . '/element.category.php', 'JBFilterElementCategoryChosen' => $filPath . '/element.category.chosen.php', 'JBFilterElementCategoryHidden' => $filPath . '/element.category.hidden.php', 'JBFilterElementCheckbox' => $filPath . '/element.checkbox.php', 'JBFilterElementCountry' => $filPath . '/element.country.php', 'JBFilterElementCountryCheckbox' => $filPath . '/element.country.checkbox.php', 'JBFilterElementCountryRadio' => $filPath . '/element.country.radio.php', 'JBFilterElementCountrySelect' => $filPath . '/element.country.select.php', 'JBFilterElementCountryChosen' => $filPath . '/element.country.select.chosen.php', 'JBFilterElementDate' => $filPath . '/element.date.php', 'JBFilterElementDateRange' => $filPath . '/element.date.range.php', 'JBFilterElementFrontpage' => $filPath . '/element.frontpage.php', 'JBFilterElementFrontpageJqueryUI' => $filPath . '/element.frontpage.jqueryui.php', 'JBFilterElementHidden' => $filPath . '/element.hidden.php', 'JBFilterElementImageexists' => $filPath . '/element.imageexists.php', 'JBFilterElementImageexistsJqueryui' => $filPath . '/element.imageexists.jqueryui.php', 'JBFilterElementJBColor' => $filPath . '/element.jbcolor.php', 'JBFilterElementJBPriceCalc' => $filPath . '/element.jbpricecalc.php', 'JBFilterElementJBPricePlain' => $filPath . '/element.jbpriceplain.php', 'JBFilterElementJbselectcascade' => $filPath . '/element.jbselectcascade.php', 'JBFilterElementJqueryui' => $filPath . '/element.jqueryui.php', 'JBFilterElementName' => $filPath . '/element.name.php', 'JBFilterElementNameCheckbox' => $filPath . '/element.name.checkbox.php', 'JBFilterElementNameRadio' => $filPath . '/element.name.radio.php', 'JBFilterElementNameSelect' => $filPath . '/element.name.select.php', 'JBFilterElementNameChosen' => $filPath . '/element.name.select.chosen.php', 'JBFilterElementRadio' => $filPath . '/element.radio.php', 'JBFilterElementRating' => $filPath . '/element.rating.php', 'JBFilterElementRatingRanges' => $filPath . '/element.rating.ranges.php', 'JBFilterElementRatingSlider' => $filPath . '/element.rating.slider.php', 'JBFilterElementSelect' => $filPath . '/element.select.php', 'JBFilterElementSelectChosen' => $filPath . '/element.select.chosen.php', 'JBFilterElementSlider' => $filPath . '/element.slider.php', 'JBFilterElementTag' => $filPath . '/element.tag.php', 'JBFilterElementTagCheckbox' => $filPath . '/element.tag.checkbox.php', 'JBFilterElementTagRadio' => $filPath . '/element.tag.radio.php', 'JBFilterElementTagSelect' => $filPath . '/element.tag.select.php', 'JBFilterElementTagSelectChosen' => $filPath . '/element.tag.select.chosen.php', 'JBFilterElementText' => $filPath . '/element.text.php', 'JBFilterElementTextRange' => $filPath . '/element.text.range.php', // events 'JBZooSystemPlugin' => $evtPath . '/jsystem.php', 'JBEvent' => $evtPath . '/jbevent.php', 'JBEventApplication' => $evtPath . '/jbevent.application.php', 'JBEventBasket' => $evtPath . '/jbevent.basket.php', 'JBEventCategory' => $evtPath . '/jbevent.category.php', 'JBEventComment' => $evtPath . '/jbevent.comment.php', 'JBEventElement' => $evtPath . '/jbevent.element.php', 'JBEventItem' => $evtPath . '/jbevent.item.php', 'JBEventJBZoo' => $evtPath . '/jbevent.jbzoo.php', 'JBEventLayout' => $evtPath . '/jbevent.layout.php', 'JBEventSubmission' => $evtPath . '/jbevent.submission.php', 'JBEventTag' => $evtPath . '/jbevent.tag.php', 'JBEventType' => $evtPath . '/jbevent.type.php', ]; foreach ($classList as $className => $path) { JLoader::register($className, $path); } } /** * Get domain name * @param bool $isAny * @return string */ static function getDomain($isAny = false) { if (defined('STDIN') || PHP_SAPI === 'cli') { return 'console'; } $domain = ''; if (function_exists('apache_request_headers')) { $headers = apache_request_headers(); $domain = isset($headers['Host']) ? $headers['Host'] : ''; } if ($isAny && !$domain) { $domain = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''; } $domain = preg_replace('#^www\.#', '', $domain); list($domain) = explode(':', $domain); return $domain; } /** * Load lang files */ private function _initLanguages() { $lang = JFactory::getLanguage(); $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); } /** * Register and connect events */ private function _initEvents() { /** @var EventHelper $event */ /** @var AppEventDispatcher $dispatcher */ $event = $this->app->event; $dispatcher = $event->dispatcher; $event->register('JBEventApplication'); $dispatcher->connect('application:init', ['JBEventApplication', 'init']); $dispatcher->connect('application:saved', ['JBEventApplication', 'saved']); $dispatcher->connect('application:deleted', ['JBEventApplication', 'deleted']); $dispatcher->connect('application:addmenuitems', ['JBEventApplication', 'addmenuitems']); $dispatcher->connect('application:installed', ['JBEventApplication', 'installed']); $dispatcher->connect('application:configparams', ['JBEventApplication', 'configparams']); $dispatcher->connect('application:sefbuildroute', ['JBEventApplication', 'sefbuildroute']); $dispatcher->connect('application:sefparseroute', ['JBEventApplication', 'sefparseroute']); $dispatcher->connect('application:sh404sef', ['JBEventApplication', 'sh404sef']); $event->register('JBEventCategory'); $dispatcher->connect('category:init', ['JBEventCategory', 'init']); $dispatcher->connect('category:saved', ['JBEventCategory', 'saved']); $dispatcher->connect('category:deleted', ['JBEventCategory', 'deleted']); $dispatcher->connect('category:stateChanged', ['JBEventCategory', 'stateChanged']); $event->register('JBEventItem'); $dispatcher->connect('item:init', ['JBEventItem', 'init']); $dispatcher->connect('item:saved', ['JBEventItem', 'saved']); $dispatcher->connect('item:deleted', ['JBEventItem', 'deleted']); $dispatcher->connect('item:stateChanged', ['JBEventItem', 'stateChanged']); $dispatcher->connect('item:beforedisplay', ['JBEventItem', 'beforeDisplay']); $dispatcher->connect('item:afterdisplay', ['JBEventItem', 'afterDisplay']); $dispatcher->connect('item:orderquery', ['JBEventItem', 'orderQuery']); $dispatcher->connect('item:beforeSaveCategoryRelations', ['JBEventItem', 'beforeSaveCategoryRelations']); $dispatcher->connect('item:beforeRenderLayout', ['JBEventItem', 'beforeRenderLayout']); $dispatcher->connect('item:afterRenderLayout', ['JBEventItem', 'afterRenderLayout']); $event->register('JBEventComment'); $dispatcher->connect('comment:init', ['JBEventComment', 'init']); $dispatcher->connect('comment:saved', ['JBEventComment', 'saved']); $dispatcher->connect('comment:deleted', ['JBEventComment', 'deleted']); $dispatcher->connect('comment:stateChanged', ['JBEventComment', 'stateChanged']); $event->register('JBEventSubmission'); $dispatcher->connect('submission:init', ['JBEventSubmission', 'init']); $dispatcher->connect('submission:saved', ['JBEventSubmission', 'saved']); $dispatcher->connect('submission:deleted', ['JBEventSubmission', 'deleted']); $dispatcher->connect('submission:beforesave', ['JBEventSubmission', 'beforeSave']); $event->register('JBEventElement'); $dispatcher->connect('element:download', ['JBEventElement', 'download']); $dispatcher->connect('element:configform', ['JBEventElement', 'configForm']); $dispatcher->connect('element:configparams', ['JBEventElement', 'configParams']); $dispatcher->connect('element:configxml', ['JBEventElement', 'configXML']); $dispatcher->connect('element:afterdisplay', ['JBEventElement', 'afterDisplay']); $dispatcher->connect('element:beforedisplay', ['JBEventElement', 'beforeDisplay']); $dispatcher->connect('element:aftersubmissiondisplay', ['JBEventElement', 'afterSubmissionDisplay']); $dispatcher->connect('element:beforesubmissiondisplay', ['JBEventElement', 'beforeSubmissionDisplay']); $dispatcher->connect('element:beforeedit', ['JBEventElement', 'beforeEdit']); $dispatcher->connect('element:afteredit', ['JBEventElement', 'afterEdit']); $event->register('JBEventLayout'); $dispatcher->connect('layout:init', ['JBEventLayout', 'init']); $event->register('JBEventTag'); $dispatcher->connect('tag:saved', ['JBEventTag', 'saved']); $dispatcher->connect('tag:deleted', ['JBEventTag', 'deleted']); $event->register('JBEventType'); $dispatcher->connect('type:beforesave', ['JBEventType', 'beforesave']); $dispatcher->connect('type:aftersave', ['JBEventType', 'aftersave']); $dispatcher->connect('type:copied', ['JBEventType', 'copied']); $dispatcher->connect('type:deleted', ['JBEventType', 'deleted']); $dispatcher->connect('type:editdisplay', ['JBEventType', 'editDisplay']); $dispatcher->connect('type:coreconfig', ['JBEventType', 'coreconfig']); $dispatcher->connect('type:assignelements', ['JBEventType', 'assignelements']); $event->register('JBEventJBZoo'); $dispatcher->connect('jbzoo:beforeInit', ['JBEventJBZoo', 'beforeInit']); $dispatcher->notify($event::create($this, 'jbzoo:beforeInit')); $event->register('JBEventBasket'); $dispatcher->connect('basket:beforeSave', ['JBEventBasket', 'beforeSave']); $dispatcher->connect('basket:saved', ['JBEventBasket', 'saved']); $dispatcher->connect('basket:afterSave', ['JBEventBasket', 'afterSave']); $dispatcher->connect('basket:updated', ['JBEventBasket', 'updated']); $dispatcher->connect('basket:addItem', ['JBEventBasket', 'addItem']); $dispatcher->connect('basket:updateItem', ['JBEventBasket', 'updateItem']); $dispatcher->connect('basket:changeQuantity', ['JBEventBasket', 'changeQuantity']); $dispatcher->connect('basket:removeItem', ['JBEventBasket', 'removeItem']); $dispatcher->connect('basket:removeItems', ['JBEventBasket', 'removeItems']); $dispatcher->connect('basket:recount', ['JBEventBasket', 'recount']); $dispatcher->connect('basket:orderStatus', ['JBEventBasket', 'orderStatus']); $dispatcher->connect('basket:paymentStatus', ['JBEventBasket', 'paymentStatus']); $dispatcher->connect('basket:shippingStatus', ['JBEventBasket', 'shippingStatus']); $dispatcher->connect('basket:paymentSuccess', ['JBEventBasket', 'paymentSuccess']); $dispatcher->connect('basket:paymentFail', ['JBEventBasket', 'paymentFail']); $dispatcher->connect('basket:paymentCallback', ['JBEventBasket', 'paymentCallback']); } /** * Init assets for admin path */ private function _initAssets() { if (!$this->app->jbenv->isSite() && !$this->app->jbrequest->isAjax()) { $this->app->jbassets->admin(); $this->_initLanguages(); $this->_initAdminMenu(); } } /** * Init Admin menu */ private function _initAdminMenu() { $isNotJ35 = version_compare(JVERSION, '3.6', '<='); if ($isNotJ35) { $this->app->jbassets->addVar('JBAdminItems', [ 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), 'items' => $this->getAdminMenu(), ]); } } /** * Init Admin menu */ public function getAdminMenu() { $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); if (!$config->get('adminmenu_show', 1)) { return false; } $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); $appList = JBModelApp::model()->getSimpleList(); $findJBZooApp = false; $dispatched = false; foreach ($appList as $app) { if ($app->application_group === JBZOO_APP_GROUP) { $findJBZooApp = true; if ($curApp === $app->id) { $dispatched = true; } } } if (!$findJBZooApp) { return false; } /** @var JBRouterHelper $router */ $router = $this->app->jbrouter; $menuItems = []; if (!empty($appList)) { foreach ($appList as $app) { $menuItems['app-' . $app->alias] = [ 'name' => $app->name, 'url' => $router->admin(['changeapp' => $app->id, 'controller' => 'item']), 'children' => [ 'add-item' => [ 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), 'url' => $router->admin([ 'changeapp' => $app->id, 'controller' => 'item', 'task' => 'add' ]), ], 'sep-1' => 'divider', 'items' => [ 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), 'url' => $router->admin(['changeapp' => $app->id, 'controller' => 'item', 'task' => '']), ], 'categories' => [ 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), 'url' => $router->admin([ 'changeapp' => $app->id, 'controller' => 'category', 'task' => '' ]), ], 'frontpage' => [ 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), 'url' => $router->admin([ 'changeapp' => $app->id, 'controller' => 'frontpage', 'task' => '' ]), ], 'comments' => [ 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), 'url' => $router->admin([ 'changeapp' => $app->id, 'controller' => 'comment', 'task' => '' ]), ], 'sep-2' => 'divider', 'config' => [ 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), 'url' => $router->admin([ 'changeapp' => $app->id, 'controller' => 'configuration', 'task' => '' ]), ], ], ]; } } $menuItems['sep-1'] = 'divider'; if ($dispatched) { if ((int)JBModelConfig::model()->get('enable', 1, 'cart.config')) { $menuItems['orders'] = [ 'name' => JText::_('JBZOO_ADMINMENU_ORDERS'), 'url' => $this->app->jbrouter->admin(['task' => 'index', 'controller' => 'jborder']), 'children' => [ 'cart-configs' => [ 'name' => JText::_('JBZOO_ADMINMENU_CART_CONFIG'), 'url' => $this->app->jbrouter->admin(['task' => 'index', 'controller' => 'jbcart']), ], ], ]; $menuItems['sep-2'] = 'divider'; } } $menuItems['item-config'] = [ 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), 'url' => $this->app->jbrouter->admin([ 'task' => 'types', 'group' => 'jbuniversal', 'controller' => 'manager' ]), ]; $types = $this->app->jbtype->getSimpleList(); if (!empty($types)) { $children = []; foreach ($types as $alias => $type) { $children['type-' . $alias] = [ 'name' => $type, 'url' => $router->admin([ 'controller' => 'manager', 'group' => 'jbuniversal', 'task' => 'editelements', 'cid' => ['0' => $alias] ]), ]; } $menuItems['item-config']['children'] = $children; } if ($dispatched) { $menuItems['sep-3'] = 'divider'; $menuItems['jbzoo-admin'] = [ 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), 'url' => $router->admin(['controller' => 'jbindex', 'task' => 'index']), 'children' => [ 'performance' => [ 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), 'url' => $router->admin(['controller' => 'jbtools', 'task' => 'index']), ], 'systemreport' => [ 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), 'url' => $router->admin(['controller' => 'jbconfig', 'task' => 'index']), ], ], ]; $menuItems['jbzoo-import'] = [ 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), 'url' => $router->admin(['controller' => 'jbimport', 'task' => 'index']), 'children' => [ 'items' => [ 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), 'url' => $router->admin(['controller' => 'jbimport', 'task' => 'items']), ], 'categories' => [ 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), 'url' => $router->admin(['controller' => 'jbimport', 'task' => 'categories']), ], 'stdandart' => [ 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDARD'), 'url' => $router->admin(['controller' => 'jbimport', 'task' => 'standart']), ], ], ]; $menuItems['jbzoo-export'] = [ 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'index']), 'children' => [ 'items' => [ 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'items']), ], 'categories' => [ 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'categories']), ], 'types' => [ 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'types']), ], 'yandexyml' => [ 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'yandexyml']), ], 'stdandart' => [ 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDARD'), 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'standart']), ], 'zoobackup' => [ 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'zoobackup']), ], ], ]; $menuItems['sep-4'] = 'divider'; $menuItems['jbzoo-info'] = [ 'name' => JText::_('JBZOO_ADMINMENU_INFO'), 'url' => $router->admin(['controller' => 'jbinfo', 'task' => 'index']), 'children' => [ 'performance' => [ 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), 'url' => $router->admin(['controller' => 'jbinfo', 'task' => 'performance']), ], 'systemreport' => [ 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), 'url' => $router->admin(['controller' => 'jbinfo', 'task' => 'systemreport']), ], ], ]; } $menuItems['jbzoo-support'] = [ 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), 'url' => 'http://forum.jbzoo.com/', 'target' => '_blank', ]; return $menuItems; } /** * Get group name * @return string */ private function _getGroup() { return $this->_group; } /** * Register new path in system * @param string $path * @param string $pathName * @return mixed */ private function _addPath($path, $pathName) { if ($fullPath = $this->app->path->path($path)) { return $this->app->path->register($fullPath, $pathName); } return null; } } \ No newline at end of file + + */ + +// no direct access +defined('_JEXEC') or die('Restricted access'); + +/** + * Class JBZoo + */ +class JBZoo +{ + /** + * @var Application + */ + public $app; + + /** + * App group name + * @var string + */ + private $_group = JBZOO_APP_GROUP; + + /** + * Init JBZoo application + * @static + * @return JBZoo + */ + public static function init() + { + static $jbzoo; + + if ($jbzoo === null) { + $jbzoo = new self(); + } + + return $jbzoo; + } + + /** + * Initialization JBZoo App + */ + private function __construct() + { + $this->app = App::getInstance('zoo'); + + $this->_initPaths(); + $this->_initClasses(); + $this->_initEvents(); + $this->_initAssets(); + } + + /** + * Add directory path + */ + private function _initPaths() + { + $this->_addPath('applications:' . $this->_getGroup(), 'jbapp'); + $this->_addPath('jbapp:framework', 'jbzoo'); + $this->_addPath('jbapp:assets', 'jbassets'); + $this->_addPath('jbassets:zoo', 'assets'); + $this->_addPath('jbapp:config', 'jbconfig'); + $this->_addPath('jbzoo:elements', 'jbelements'); + $this->_addPath('jbapp:cart-elements', 'cart-elements'); + $this->_addPath('jbapp:types', 'jbtypes'); + + $this->_addPath('jbzoo:helpers', 'helpers'); + $this->_addPath('jbzoo:helpers-std', 'helpers'); + $this->_addPath('helpers:fields', 'fields'); + + $this->_addPath('jbzoo:tables', 'tables'); + $this->_addPath('jbzoo:classes-std', 'classes'); + $this->_addPath('jbzoo:render', 'renderer'); + $this->_addPath('jbzoo:views', 'jbviews'); + $this->_addPath('jbapp:config', 'jbxml'); + $this->_addPath('jbviews:', 'partials'); + $this->_addPath('jbapp:joomla/elements', 'fields'); + $this->_addPath('jbapp:templates', 'jbtmpl'); + + $this->_addPath('modules:mod_jbzoo_search', 'mod_jbzoo_search'); + $this->_addPath('modules:mod_jbzoo_props', 'mod_jbzoo_props'); + $this->_addPath('modules:mod_jbzoo_basket', 'mod_jbzoo_basket'); + $this->_addPath('modules:mod_jbzoo_category', 'mod_jbzoo_category'); + $this->_addPath('modules:mod_jbzoo_item', 'mod_jbzoo_item'); + $this->_addPath('modules:mod_jbzoo_currency', 'mod_jbzoo_currency'); + + $this->_addPath('plugins:/system/jbzoo', 'plugin_jbzoo'); + + if ($this->app->jbenv->isSite()) { + $this->_addPath('jbzoo:controllers', 'controllers'); + } + + require $this->app->path->path('jbzoo:controllers/base.php'); + + JLoader::register('AppView', $this->app->path->path('classes:view.php'), true); + } + + /** + * Include models classes + */ + private function _initClasses() + { + jimport('joomla.html.parameter.element'); + + $this->app->loader->register('AppValidator', 'classes:validator.php'); + + // defines + define('ZOO_TABLE_JBZOO_SKU', '#__zoo_jbzoo_sku'); + define('ZOO_TABLE_JBZOO_FAVORITE', '#__zoo_jbzoo_favorite'); + define('ZOO_TABLE_JBZOO_CONFIG', '#__zoo_jbzoo_config'); + define('ZOO_TABLE_JBZOO_ORDER', '#__zoo_jbzoo_orders'); + + $frameworkPath = JPATH_SITE . '/media/zoo/applications/jbuniversal/framework'; + $clsPath = $frameworkPath . '/classes'; + $modPath = $frameworkPath . '/models'; + $filPath = $frameworkPath . '/render/filter'; + $evtPath = $frameworkPath . '/events'; + + $classList = [ + 'JBDatabaseQuery' => $clsPath . '/database/JBDatabaseQuery.php', + 'JBDatabaseQueryElement' => $clsPath . '/database/JBDatabaseQueryElement.php', + 'JBCartOrder' => $clsPath . '/cart/jborder.php', + 'JBCart' => $clsPath . '/cart/jbcart.php', + 'JBCartValue' => $clsPath . '/cart/jbvalue.php', + 'JBCartVariant' => $clsPath . '/cart/jbvariant.php', + 'JBCartVariantList' => $clsPath . '/cart/jbvariantlist.php', + 'JBTemplate' => $clsPath . '/jbtemplate.php', + + // models + 'JBModel' => $modPath . '/jbmodel.php', + 'JBModelConfig' => $modPath . '/jbmodel.config.php', + 'JBModelElement' => $modPath . '/jbmodel.element.php', + 'JBModelAutoComplete' => $modPath . '/jbmodel.autocomplete.php', + 'JBModelElementCountry' => $modPath . '/jbmodel.element.country.php', + 'JBModelElementDate' => $modPath . '/jbmodel.element.date.php', + 'JBModelElementItemDate' => $modPath . '/jbmodel.element.itemdate.php', + 'JBModelElementItemauthor' => $modPath . '/jbmodel.element.itemauthor.php', + 'JBModelElementItemCategory' => $modPath . '/jbmodel.element.itemcategory.php', + 'JBModelElementItemCreated' => $modPath . '/jbmodel.element.itemcreated.php', + 'JBModelElementItemFrontpage' => $modPath . '/jbmodel.element.itemfrontpage.php', + 'JBModelElementItemModified' => $modPath . '/jbmodel.element.itemmodified.php', + 'JBModelElementItemName' => $modPath . '/jbmodel.element.itemname.php', + 'JBModelElementItemPublish_down' => $modPath . '/jbmodel.element.itempublish_down.php', + 'JBModelElementItemPublish_up' => $modPath . '/jbmodel.element.itempublish_up.php', + 'JBModelElementItemTag' => $modPath . '/jbmodel.element.itemtag.php', + 'JBModelElementJBImage' => $modPath . '/jbmodel.element.jbimage.php', + 'JBModelElementJBSelectCascade' => $modPath . '/jbmodel.element.jbselectcascade.php', + 'JBModelElementRange' => $modPath . '/jbmodel.element.range.php', + 'JBModelElementRating' => $modPath . '/jbmodel.element.rating.php', + 'JBModelElementJBPrice' => $modPath . '/jbmodel.element.jbprice.php', + 'JBModelElementJBPricePlain' => $modPath . '/jbmodel.element.jbprice.plain.php', + 'JBModelElementJBPriceCalc' => $modPath . '/jbmodel.element.jbprice.calc.php', + 'JBModelElementJBComments' => $modPath . '/jbmodel.element.jbcomments.php', + 'JBModelElementTextarea' => $modPath . '/jbmodel.element.textarea.php', + 'JBModelFavorite' => $modPath . '/jbmodel.favorite.php', + 'JBModelFilter' => $modPath . '/jbmodel.filter.php', + 'JBModelItem' => $modPath . '/jbmodel.item.php', + 'JBModelApp' => $modPath . '/jbmodel.app.php', + 'JBModelCategory' => $modPath . '/jbmodel.category.php', + 'JBModelOrder' => $modPath . '/jbmodel.order.php', + 'JBModelRelated' => $modPath . '/jbmodel.related.php', + 'JBModelSearchindex' => $modPath . '/jbmodel.searchindex.php', + 'JBModelValues' => $modPath . '/jbmodel.values.php', + 'JBModelSku' => $modPath . '/jbmodel.sku.php', + + // filter + 'JBFilterElement' => $filPath . '/element.php', + 'JBFilterElementAuthor' => $filPath . '/element.author.php', + 'JBFilterElementAuthorCheckbox' => $filPath . '/element.author.checkbox.php', + 'JBFilterElementAuthorRadio' => $filPath . '/element.author.radio.php', + 'JBFilterElementAuthorSelect' => $filPath . '/element.author.select.php', + 'JBFilterElementAuthorChosen' => $filPath . '/element.author.select.chosen.php', + 'JBFilterElementAuthorText' => $filPath . '/element.author.text.php', + 'JBFilterElementCategory' => $filPath . '/element.category.php', + 'JBFilterElementCategoryChosen' => $filPath . '/element.category.chosen.php', + 'JBFilterElementCategoryHidden' => $filPath . '/element.category.hidden.php', + 'JBFilterElementCheckbox' => $filPath . '/element.checkbox.php', + 'JBFilterElementCountry' => $filPath . '/element.country.php', + 'JBFilterElementCountryCheckbox' => $filPath . '/element.country.checkbox.php', + 'JBFilterElementCountryRadio' => $filPath . '/element.country.radio.php', + 'JBFilterElementCountrySelect' => $filPath . '/element.country.select.php', + 'JBFilterElementCountryChosen' => $filPath . '/element.country.select.chosen.php', + 'JBFilterElementDate' => $filPath . '/element.date.php', + 'JBFilterElementDateRange' => $filPath . '/element.date.range.php', + 'JBFilterElementFrontpage' => $filPath . '/element.frontpage.php', + 'JBFilterElementFrontpageJqueryUI' => $filPath . '/element.frontpage.jqueryui.php', + 'JBFilterElementHidden' => $filPath . '/element.hidden.php', + 'JBFilterElementImageexists' => $filPath . '/element.imageexists.php', + 'JBFilterElementImageexistsJqueryui' => $filPath . '/element.imageexists.jqueryui.php', + 'JBFilterElementJBColor' => $filPath . '/element.jbcolor.php', + 'JBFilterElementJBPriceCalc' => $filPath . '/element.jbpricecalc.php', + 'JBFilterElementJBPricePlain' => $filPath . '/element.jbpriceplain.php', + 'JBFilterElementJbselectcascade' => $filPath . '/element.jbselectcascade.php', + 'JBFilterElementJqueryui' => $filPath . '/element.jqueryui.php', + 'JBFilterElementName' => $filPath . '/element.name.php', + 'JBFilterElementNameCheckbox' => $filPath . '/element.name.checkbox.php', + 'JBFilterElementNameRadio' => $filPath . '/element.name.radio.php', + 'JBFilterElementNameSelect' => $filPath . '/element.name.select.php', + 'JBFilterElementNameChosen' => $filPath . '/element.name.select.chosen.php', + 'JBFilterElementRadio' => $filPath . '/element.radio.php', + 'JBFilterElementRating' => $filPath . '/element.rating.php', + 'JBFilterElementRatingRanges' => $filPath . '/element.rating.ranges.php', + 'JBFilterElementRatingSlider' => $filPath . '/element.rating.slider.php', + 'JBFilterElementSelect' => $filPath . '/element.select.php', + 'JBFilterElementSelectChosen' => $filPath . '/element.select.chosen.php', + 'JBFilterElementSlider' => $filPath . '/element.slider.php', + 'JBFilterElementTag' => $filPath . '/element.tag.php', + 'JBFilterElementTagCheckbox' => $filPath . '/element.tag.checkbox.php', + 'JBFilterElementTagRadio' => $filPath . '/element.tag.radio.php', + 'JBFilterElementTagSelect' => $filPath . '/element.tag.select.php', + 'JBFilterElementTagSelectChosen' => $filPath . '/element.tag.select.chosen.php', + 'JBFilterElementText' => $filPath . '/element.text.php', + 'JBFilterElementTextRange' => $filPath . '/element.text.range.php', + + // events + 'JBZooSystemPlugin' => $evtPath . '/jsystem.php', + 'JBEvent' => $evtPath . '/jbevent.php', + 'JBEventApplication' => $evtPath . '/jbevent.application.php', + 'JBEventBasket' => $evtPath . '/jbevent.basket.php', + 'JBEventCategory' => $evtPath . '/jbevent.category.php', + 'JBEventComment' => $evtPath . '/jbevent.comment.php', + 'JBEventElement' => $evtPath . '/jbevent.element.php', + 'JBEventItem' => $evtPath . '/jbevent.item.php', + 'JBEventJBZoo' => $evtPath . '/jbevent.jbzoo.php', + 'JBEventLayout' => $evtPath . '/jbevent.layout.php', + 'JBEventSubmission' => $evtPath . '/jbevent.submission.php', + 'JBEventTag' => $evtPath . '/jbevent.tag.php', + 'JBEventType' => $evtPath . '/jbevent.type.php', + ]; + + foreach ($classList as $className => $path) { + JLoader::register($className, $path); + } + } + + /** + * Get domain name + * @param bool $isAny + * @return string + */ + static function getDomain($isAny = false) + { + if (defined('STDIN') || PHP_SAPI === 'cli') { + return 'console'; + } + + $domain = ''; + if (function_exists('apache_request_headers')) { + $headers = apache_request_headers(); + $domain = isset($headers['Host']) ? $headers['Host'] : ''; + } + + if ($isAny && !$domain) { + $domain = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''; + } + + $domain = preg_replace('#^www\.#', '', $domain); + list($domain) = explode(':', $domain); + + return $domain; + } + + /** + * Load lang files + */ + private function _initLanguages() + { + $lang = JFactory::getLanguage(); + $lang->load('com_jbzoo', $this->app->path->path('jbapp:'), null, true); + } + + /** + * Register and connect events + */ + private function _initEvents() + { + /** @var EventHelper $event */ + /** @var AppEventDispatcher $dispatcher */ + $event = $this->app->event; + $dispatcher = $event->dispatcher; + + $event->register('JBEventApplication'); + $dispatcher->connect('application:init', ['JBEventApplication', 'init']); + $dispatcher->connect('application:saved', ['JBEventApplication', 'saved']); + $dispatcher->connect('application:deleted', ['JBEventApplication', 'deleted']); + $dispatcher->connect('application:addmenuitems', ['JBEventApplication', 'addmenuitems']); + $dispatcher->connect('application:installed', ['JBEventApplication', 'installed']); + $dispatcher->connect('application:configparams', ['JBEventApplication', 'configparams']); + $dispatcher->connect('application:sefbuildroute', ['JBEventApplication', 'sefbuildroute']); + $dispatcher->connect('application:sefparseroute', ['JBEventApplication', 'sefparseroute']); + $dispatcher->connect('application:sh404sef', ['JBEventApplication', 'sh404sef']); + + $event->register('JBEventCategory'); + $dispatcher->connect('category:init', ['JBEventCategory', 'init']); + $dispatcher->connect('category:saved', ['JBEventCategory', 'saved']); + $dispatcher->connect('category:deleted', ['JBEventCategory', 'deleted']); + $dispatcher->connect('category:stateChanged', ['JBEventCategory', 'stateChanged']); + + $event->register('JBEventItem'); + $dispatcher->connect('item:init', ['JBEventItem', 'init']); + $dispatcher->connect('item:saved', ['JBEventItem', 'saved']); + $dispatcher->connect('item:deleted', ['JBEventItem', 'deleted']); + $dispatcher->connect('item:stateChanged', ['JBEventItem', 'stateChanged']); + $dispatcher->connect('item:beforedisplay', ['JBEventItem', 'beforeDisplay']); + $dispatcher->connect('item:afterdisplay', ['JBEventItem', 'afterDisplay']); + $dispatcher->connect('item:orderquery', ['JBEventItem', 'orderQuery']); + $dispatcher->connect('item:beforeSaveCategoryRelations', ['JBEventItem', 'beforeSaveCategoryRelations']); + $dispatcher->connect('item:beforeRenderLayout', ['JBEventItem', 'beforeRenderLayout']); + $dispatcher->connect('item:afterRenderLayout', ['JBEventItem', 'afterRenderLayout']); + + $event->register('JBEventComment'); + $dispatcher->connect('comment:init', ['JBEventComment', 'init']); + $dispatcher->connect('comment:saved', ['JBEventComment', 'saved']); + $dispatcher->connect('comment:deleted', ['JBEventComment', 'deleted']); + $dispatcher->connect('comment:stateChanged', ['JBEventComment', 'stateChanged']); + + $event->register('JBEventSubmission'); + $dispatcher->connect('submission:init', ['JBEventSubmission', 'init']); + $dispatcher->connect('submission:saved', ['JBEventSubmission', 'saved']); + $dispatcher->connect('submission:deleted', ['JBEventSubmission', 'deleted']); + $dispatcher->connect('submission:beforesave', ['JBEventSubmission', 'beforeSave']); + + $event->register('JBEventElement'); + $dispatcher->connect('element:download', ['JBEventElement', 'download']); + $dispatcher->connect('element:configform', ['JBEventElement', 'configForm']); + $dispatcher->connect('element:configparams', ['JBEventElement', 'configParams']); + $dispatcher->connect('element:configxml', ['JBEventElement', 'configXML']); + $dispatcher->connect('element:afterdisplay', ['JBEventElement', 'afterDisplay']); + $dispatcher->connect('element:beforedisplay', ['JBEventElement', 'beforeDisplay']); + $dispatcher->connect('element:aftersubmissiondisplay', ['JBEventElement', 'afterSubmissionDisplay']); + $dispatcher->connect('element:beforesubmissiondisplay', ['JBEventElement', 'beforeSubmissionDisplay']); + $dispatcher->connect('element:beforeedit', ['JBEventElement', 'beforeEdit']); + $dispatcher->connect('element:afteredit', ['JBEventElement', 'afterEdit']); + + $event->register('JBEventLayout'); + $dispatcher->connect('layout:init', ['JBEventLayout', 'init']); + + $event->register('JBEventTag'); + $dispatcher->connect('tag:saved', ['JBEventTag', 'saved']); + $dispatcher->connect('tag:deleted', ['JBEventTag', 'deleted']); + + $event->register('JBEventType'); + $dispatcher->connect('type:beforesave', ['JBEventType', 'beforesave']); + $dispatcher->connect('type:aftersave', ['JBEventType', 'aftersave']); + $dispatcher->connect('type:copied', ['JBEventType', 'copied']); + $dispatcher->connect('type:deleted', ['JBEventType', 'deleted']); + $dispatcher->connect('type:editdisplay', ['JBEventType', 'editDisplay']); + $dispatcher->connect('type:coreconfig', ['JBEventType', 'coreconfig']); + $dispatcher->connect('type:assignelements', ['JBEventType', 'assignelements']); + + $event->register('JBEventJBZoo'); + $dispatcher->connect('jbzoo:beforeInit', ['JBEventJBZoo', 'beforeInit']); + $dispatcher->notify($event::create($this, 'jbzoo:beforeInit')); + + $event->register('JBEventBasket'); + $dispatcher->connect('basket:beforeSave', ['JBEventBasket', 'beforeSave']); + $dispatcher->connect('basket:saved', ['JBEventBasket', 'saved']); + $dispatcher->connect('basket:afterSave', ['JBEventBasket', 'afterSave']); + $dispatcher->connect('basket:updated', ['JBEventBasket', 'updated']); + + $dispatcher->connect('basket:addItem', ['JBEventBasket', 'addItem']); + $dispatcher->connect('basket:updateItem', ['JBEventBasket', 'updateItem']); + $dispatcher->connect('basket:changeQuantity', ['JBEventBasket', 'changeQuantity']); + $dispatcher->connect('basket:removeItem', ['JBEventBasket', 'removeItem']); + $dispatcher->connect('basket:removeItems', ['JBEventBasket', 'removeItems']); + $dispatcher->connect('basket:recount', ['JBEventBasket', 'recount']); + + $dispatcher->connect('basket:orderStatus', ['JBEventBasket', 'orderStatus']); + $dispatcher->connect('basket:paymentStatus', ['JBEventBasket', 'paymentStatus']); + $dispatcher->connect('basket:shippingStatus', ['JBEventBasket', 'shippingStatus']); + + $dispatcher->connect('basket:paymentSuccess', ['JBEventBasket', 'paymentSuccess']); + $dispatcher->connect('basket:paymentFail', ['JBEventBasket', 'paymentFail']); + $dispatcher->connect('basket:paymentCallback', ['JBEventBasket', 'paymentCallback']); + } + + /** + * Init assets for admin path + */ + private function _initAssets() + { + if (!$this->app->jbenv->isSite() && !$this->app->jbrequest->isAjax()) { + $this->app->jbassets->admin(); + $this->_initLanguages(); + $this->_initAdminMenu(); + } + } + + /** + * Init Admin menu + */ + private function _initAdminMenu() + { + $isNotJ35 = version_compare(JVERSION, '3.6', '<='); + + if ($isNotJ35) { + $this->app->jbassets->addVar('JBAdminItems', [ + 'name' => JText::_('JBZOO_ADMINMENU_CAPTION'), + 'items' => $this->getAdminMenu(), + ]); + } + } + + /** + * Init Admin menu + */ + public function getAdminMenu() + { + $config = JBModelConfig::model()->getGroup('config.custom', $this->app->jbconfig->getList()); + if (!$config->get('adminmenu_show', 1)) { + return false; + } + + $curApp = $this->app->system->application->getUserState('com_zooapplication', 0); + + $appList = JBModelApp::model()->getSimpleList(); + + $findJBZooApp = false; + $dispatched = false; + foreach ($appList as $app) { + if ($app->application_group === JBZOO_APP_GROUP) { + $findJBZooApp = true; + if ($curApp === $app->id) { + $dispatched = true; + } + } + } + + if (!$findJBZooApp) { + return false; + } + + /** @var JBRouterHelper $router */ + $router = $this->app->jbrouter; + + $menuItems = []; + + if (!empty($appList)) { + foreach ($appList as $app) { + + $menuItems['app-' . $app->alias] = [ + 'name' => $app->name, + 'url' => $router->admin(['changeapp' => $app->id, 'controller' => 'item']), + 'children' => [ + 'add-item' => [ + 'name' => JText::_('JBZOO_ADMINMENU_ADD_ITEM'), + 'url' => $router->admin([ + 'changeapp' => $app->id, + 'controller' => 'item', + 'task' => 'add' + ]), + ], + 'sep-1' => 'divider', + 'items' => [ + 'name' => JText::_('JBZOO_ADMINMENU_ITEMS'), + 'url' => $router->admin(['changeapp' => $app->id, 'controller' => 'item', 'task' => '']), + ], + 'categories' => [ + 'name' => JText::_('JBZOO_ADMINMENU_CATEGORIES'), + 'url' => $router->admin([ + 'changeapp' => $app->id, + 'controller' => 'category', + 'task' => '' + ]), + ], + 'frontpage' => [ + 'name' => JText::_('JBZOO_ADMINMENU_FRONTPAGE'), + 'url' => $router->admin([ + 'changeapp' => $app->id, + 'controller' => 'frontpage', + 'task' => '' + ]), + ], + 'comments' => [ + 'name' => JText::_('JBZOO_ADMINMENU_COMMENTS'), + 'url' => $router->admin([ + 'changeapp' => $app->id, + 'controller' => 'comment', + 'task' => '' + ]), + ], + 'sep-2' => 'divider', + 'config' => [ + 'name' => JText::_('JBZOO_ADMINMENU_CONFIG'), + 'url' => $router->admin([ + 'changeapp' => $app->id, + 'controller' => 'configuration', + 'task' => '' + ]), + ], + ], + ]; + } + } + + $menuItems['sep-1'] = 'divider'; + + if ($dispatched) { + if ((int)JBModelConfig::model()->get('enable', 1, 'cart.config')) { + $menuItems['orders'] = [ + 'name' => JText::_('JBZOO_ADMINMENU_ORDERS'), + 'url' => $this->app->jbrouter->admin(['task' => 'index', 'controller' => 'jborder']), + 'children' => [ + 'cart-configs' => [ + 'name' => JText::_('JBZOO_ADMINMENU_CART_CONFIG'), + 'url' => $this->app->jbrouter->admin(['task' => 'index', 'controller' => 'jbcart']), + ], + ], + ]; + + $menuItems['sep-2'] = 'divider'; + } + } + + $menuItems['item-config'] = [ + 'name' => JText::_('JBZOO_ADMINMENU_MAINCONFIG'), + 'url' => $this->app->jbrouter->admin([ + 'task' => 'types', + 'group' => 'jbuniversal', + 'controller' => 'manager' + ]), + ]; + + $types = $this->app->jbtype->getSimpleList(); + if (!empty($types)) { + $children = []; + foreach ($types as $alias => $type) { + $children['type-' . $alias] = [ + 'name' => $type, + 'url' => $router->admin([ + 'controller' => 'manager', + 'group' => 'jbuniversal', + 'task' => 'editelements', + 'cid' => ['0' => $alias] + ]), + ]; + } + + $menuItems['item-config']['children'] = $children; + } + + if ($dispatched) { + $menuItems['sep-3'] = 'divider'; + + $menuItems['jbzoo-admin'] = [ + 'name' => JText::_('JBZOO_ADMINMENU_JBZOOPAGE'), + 'url' => $router->admin(['controller' => 'jbindex', 'task' => 'index']), + 'children' => [ + 'performance' => [ + 'name' => JText::_('JBZOO_ADMINMENU_TOOLS'), + 'url' => $router->admin(['controller' => 'jbtools', 'task' => 'index']), + ], + 'systemreport' => [ + 'name' => JText::_('JBZOO_ADMINMENU_CONFIGS'), + 'url' => $router->admin(['controller' => 'jbconfig', 'task' => 'index']), + ], + ], + ]; + + $menuItems['jbzoo-import'] = [ + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT'), + 'url' => $router->admin(['controller' => 'jbimport', 'task' => 'index']), + 'children' => [ + 'items' => [ + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_ITEMS'), + 'url' => $router->admin(['controller' => 'jbimport', 'task' => 'items']), + ], + 'categories' => [ + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_CATEGORIES'), + 'url' => $router->admin(['controller' => 'jbimport', 'task' => 'categories']), + ], + 'stdandart' => [ + 'name' => JText::_('JBZOO_ADMINMENU_IMPORT_STANDARD'), + 'url' => $router->admin(['controller' => 'jbimport', 'task' => 'standart']), + ], + ], + ]; + + $menuItems['jbzoo-export'] = [ + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT'), + 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'index']), + 'children' => [ + 'items' => [ + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ITEMS'), + 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'items']), + ], + 'categories' => [ + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_CATEGORIES'), + 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'categories']), + ], + 'types' => [ + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_TYPES'), + 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'types']), + ], + 'yandexyml' => [ + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_YANDEXYML'), + 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'yandexyml']), + ], + 'stdandart' => [ + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_STANDARD'), + 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'standart']), + ], + 'zoobackup' => [ + 'name' => JText::_('JBZOO_ADMINMENU_EXPORT_ZOOBACKUP'), + 'url' => $router->admin(['controller' => 'jbexport', 'task' => 'zoobackup']), + ], + ], + ]; + + $menuItems['sep-4'] = 'divider'; + + $menuItems['jbzoo-info'] = [ + 'name' => JText::_('JBZOO_ADMINMENU_INFO'), + 'url' => $router->admin(['controller' => 'jbinfo', 'task' => 'index']), + 'children' => [ + 'performance' => [ + 'name' => JText::_('JBZOO_ADMINMENU_PERFORMANCE'), + 'url' => $router->admin(['controller' => 'jbinfo', 'task' => 'performance']), + ], + 'systemreport' => [ + 'name' => JText::_('JBZOO_ADMINMENU_SYSTEMREPORT'), + 'url' => $router->admin(['controller' => 'jbinfo', 'task' => 'systemreport']), + ], + ], + ]; + } + + $menuItems['jbzoo-support'] = [ + 'name' => JText::_('JBZOO_ADMINMENU_SUPPORT'), + 'url' => 'http://forum.jbzoo.com/', + 'target' => '_blank', + ]; + + return $menuItems; + } + + /** + * Get group name + * @return string + */ + private function _getGroup() + { + return $this->_group; + } + + /** + * Register new path in system + * @param string $path + * @param string $pathName + * @return mixed + */ + private function _addPath($path, $pathName) + { + if ($fullPath = $this->app->path->path($path)) { + return $this->app->path->register($fullPath, $pathName); + } + + return null; + } +}