* @copyright 2007-2011 PrestaShop SA * @version Release: $Revision: 9015 $ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * International Registered Trademark & Property of PrestaShop SA */ class AdminCategories extends AdminTab { protected $maxImageSize = 3000000; /** @var object Category() instance for navigation*/ private $_category; public function __construct() { global $cookie; $this->table = 'category'; $this->className = 'Category'; $this->lang = true; $this->edit = true; $this->view = true; $this->delete = true; $this->fieldImageSettings = array('name' => 'image', 'dir' => 'c'); $this->fieldsDisplay = array( 'id_category' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 30), 'name' => array('title' => $this->l('Name'), 'width' => 100, 'small_title' => true), 'description' => array('title' => $this->l('Description'), 'width' => 500, 'maxlength' => 90, 'orderby' => false), 'position' => array('title' => $this->l('Position'), 'width' => 40,'filter_key' => 'position', 'align' => 'center', 'position' => 'position'), 'active' => array('title' => $this->l('Displayed'), 'active' => 'status', 'align' => 'center', 'type' => 'bool', 'orderby' => false)); $this->_category = AdminCatalog::getCurrentCategory(); $this->_filter = 'AND `id_parent` = '.(int)($this->_category->id); $this->_select = 'position '; if ($this->_category->id == 1) { $this->_orderBy = 'id_category'; $this->_orderWay = 'DESC'; } parent::__construct(); } public function displayListContent($token = NULL) { global $currentIndex, $cookie; if ($this->_category->id_parent == 1) { $sub_categories = array(); foreach ($this->_list as $key => $category_one) { $subcategories = Category::getChildren($category_one['id_category'], $cookie->id_lang); if ($subcategories) { foreach ($subcategories as $subcat) { if(!is_array($this->_list[$key]['childs'])) { $this->_list[$key]['childs'] = array(); } $category_tmp = new Category($subcat['id_category'], $cookie->id_lang); $this->_list[$key]['childs'][] = get_object_vars($category_tmp); } } } $currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT')); $id_category = 1; // default categ $irow = 0; if ($this->_list AND isset($this->fieldsDisplay['position'])) { $positions = array_map(create_function('$elem', 'return (int)($elem[\'position\']);'), $this->_list); sort($positions); } if ($this->_list) { $isCms = false; if (preg_match('/cms/Ui', $this->identifier)) $isCms = true; $keyToGet = 'id_'.($isCms ? 'cms_' : '').'category'.(in_array($this->identifier, array('id_category', 'id_cms_category')) ? '_parent' : ''); foreach ($this->_list AS $tr) { $id = $tr[$this->identifier]; echo 'identifier,$this->identifiersDnd) ? ' id="tr_'.(($id_category = (int)(Tools::getValue('id_'.($isCms ? 'cms_' : '').'category', '1'))) ? $id_category : '').'_'.$id.'_'.$tr['position'].'"' : '').($irow++ % 2 ? ' class="alt_row"' : '').' '.((isset($tr['color']) AND $this->colorOnBackground) ? 'style="background-color: '.$tr['color'].'"' : '').'> '; if ($this->delete AND (!isset($this->_listSkipDelete) OR !in_array($id, $this->_listSkipDelete))) echo ''; echo ''; foreach ($this->fieldsDisplay AS $key => $params) { $tmp = explode('!', $key); $key = isset($tmp[1]) ? $tmp[1] : $tmp[0]; echo ' noLink) OR !$this->noLink)) echo ' onclick="document.location = \''.$currentIndex.'&'.$this->identifier.'='.$id.($this->view? '&view' : '&update').$this->table.'&token='.($token!=NULL ? $token : $this->token).'\'">'.(isset($params['prefix']) ? $params['prefix'] : ''); else echo '>'; if (isset($params['active']) AND isset($tr[$key])) $this->_displayEnableLink($token, $id, $tr[$key], $params['active'], Tools::getValue('id_category'), Tools::getValue('id_product')); elseif (isset($params['activeVisu']) AND isset($tr[$key])) echo ''.($tr[$key] ? $this->l('Enabled') : $this->l('Disabled')).''; elseif (isset($params['position'])) { if ($this->_orderBy == 'position' AND $this->_orderWay != 'DESC') { echo ' '.$this->l('Down').''; echo ' '.$this->l('Up').''; } else echo (int)($tr[$key] + 1); } elseif (isset($params['image'])) { // item_id is the product id in a product image context, else it is the image id. $item_id = isset($params['image_id']) ? $tr[$params['image_id']] : $id; // If it's a product image if (isset($tr['id_image'])) { $image = new Image((int)$tr['id_image']); $path_to_image = _PS_IMG_DIR_.$params['image'].'/'.$image->getExistingImgPath().'.'.$this->imageType; }else $path_to_image = _PS_IMG_DIR_.$params['image'].'/'.$item_id.(isset($tr['id_image']) ? '-'.(int)($tr['id_image']) : '').'.'.$this->imageType; echo cacheImage($path_to_image, $this->table.'_mini_'.$item_id.'.'.$this->imageType, 45, $this->imageType); } elseif (isset($params['icon']) AND (isset($params['icon'][$tr[$key]]) OR isset($params['icon']['default']))) echo ''.$tr[$key]).''; elseif (isset($params['price'])) echo Tools::displayPrice($tr[$key], (isset($params['currency']) ? Currency::getCurrencyInstance((int)($tr['id_currency'])) : $currency), false); elseif (isset($params['float'])) echo rtrim(rtrim($tr[$key], '0'), '.'); elseif (isset($params['type']) AND $params['type'] == 'date') echo Tools::displayDate($tr[$key], (int)$cookie->id_lang); elseif (isset($params['type']) AND $params['type'] == 'datetime') echo Tools::displayDate($tr[$key], (int)$cookie->id_lang, true); elseif (isset($tr[$key])) { $echo = ($key == 'price' ? round($tr[$key], 2) : isset($params['maxlength']) ? Tools::substr($tr[$key], 0, $params['maxlength']).'...' : $tr[$key]); echo isset($params['callback']) ? call_user_func_array(array($this->className, $params['callback']), array($echo, $tr)) : $echo; } else echo '--'; echo (isset($params['suffix']) ? $params['suffix'] : ''). ''; } if ($this->edit OR $this->delete OR ($this->view AND $this->view !== 'noActionColumn')) { echo ''; if ($this->view) $this->_displayViewLink($token, $id); if ($this->edit) $this->_displayEditLink($token, $id); if ($this->delete AND (!isset($this->_listSkipDelete) OR !in_array($id, $this->_listSkipDelete))) $this->_displayDeleteLink($token, $id); if ($this->duplicate) $this->_displayDuplicate($token, $id); echo ''; } echo ''; if ($tr['childs']) { foreach ($tr['childs'] as $key => $child) { $id = $child['id_category']; echo ''; echo '-'; echo ''.$child['id_category'].''; echo '-- '.$child['name'].''; if ($this->edit OR $this->delete OR ($this->view AND $this->view !== 'noActionColumn')) { echo ''; if ($this->view) $this->_displayViewLink($token, $id); if ($this->edit) $this->_displayEditLink($token, $id); if ($this->delete AND (!isset($this->_listSkipDelete) OR !in_array($id, $this->_listSkipDelete))) $this->_displayDeleteLink($token, $id); if ($this->duplicate) $this->_displayDuplicate($token, $id); echo ''; } echo ''; } } } } } else { $currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT')); $id_category = 1; // default categ $irow = 0; if ($this->_list AND isset($this->fieldsDisplay['position'])) { $positions = array_map(create_function('$elem', 'return (int)($elem[\'position\']);'), $this->_list); sort($positions); } if ($this->_list) { $isCms = false; $ids_categories = array_map(function($elem) { return $elem['id_category']; }, $this->_list); $small_titles = array(); foreach (Db::getInstance()->executeS(' SELECT ex.`value`, ps.`id_category` FROM `'._DB_PREFIX_.'privatesale_extrafield_sale` ex LEFT JOIN `'._DB_PREFIX_.'privatesale` ps on ex.`id_sale` = ps.`id_sale` LEFT JOIN `'._DB_PREFIX_.'category` c on c.`id_category` = ps.`id_category` WHERE ex.`id_field` = 1 AND ex.`id_lang` = '. (int) $cookie->id_lang.' AND c.`id_category` IN ('.implode(',', $ids_categories).') ') as $key => $data) { $small_titles[(int) $data['id_category']] = $data['value']; } if (preg_match('/cms/Ui', $this->identifier)) $isCms = true; $keyToGet = 'id_'.($isCms ? 'cms_' : '').'category'.(in_array($this->identifier, array('id_category', 'id_cms_category')) ? '_parent' : ''); foreach ($this->_list AS $tr) { $id = $tr[$this->identifier]; echo 'identifier,$this->identifiersDnd) ? ' id="tr_'.(($id_category = (int)(Tools::getValue('id_'.($isCms ? 'cms_' : '').'category', '1'))) ? $id_category : '').'_'.$id.'_'.$tr['position'].'"' : '').($irow++ % 2 ? ' class="alt_row"' : '').' '.((isset($tr['color']) AND $this->colorOnBackground) ? 'style="background-color: '.$tr['color'].'"' : '').'> '; if ($this->delete AND (!isset($this->_listSkipDelete) OR !in_array($id, $this->_listSkipDelete))) echo ''; echo ''; foreach ($this->fieldsDisplay AS $key => $params) { $tmp = explode('!', $key); $key = isset($tmp[1]) ? $tmp[1] : $tmp[0]; echo ' noLink) OR !$this->noLink)) echo ' onclick="document.location = \''.$currentIndex.'&'.$this->identifier.'='.$id.($this->view? '&view' : '&update').$this->table.'&token='.($token!=NULL ? $token : $this->token).'\'">'.(isset($params['prefix']) ? $params['prefix'] : ''); else echo '>'; if (isset($params['active']) AND isset($tr[$key])) $this->_displayEnableLink($token, $id, $tr[$key], $params['active'], Tools::getValue('id_category'), Tools::getValue('id_product')); elseif (isset($params['activeVisu']) AND isset($tr[$key])) echo ''.($tr[$key] ? $this->l('Enabled') : $this->l('Disabled')).''; elseif (isset($params['position'])) { if ($this->_orderBy == 'position' AND $this->_orderWay != 'DESC') { echo ' '.$this->l('Down').''; echo ' '.$this->l('Up').''; } else echo (int)($tr[$key] + 1); } elseif (isset($params['image'])) { // item_id is the product id in a product image context, else it is the image id. $item_id = isset($params['image_id']) ? $tr[$params['image_id']] : $id; // If it's a product image if (isset($tr['id_image'])) { $image = new Image((int)$tr['id_image']); $path_to_image = _PS_IMG_DIR_.$params['image'].'/'.$image->getExistingImgPath().'.'.$this->imageType; }else $path_to_image = _PS_IMG_DIR_.$params['image'].'/'.$item_id.(isset($tr['id_image']) ? '-'.(int)($tr['id_image']) : '').'.'.$this->imageType; echo cacheImage($path_to_image, $this->table.'_mini_'.$item_id.'.'.$this->imageType, 45, $this->imageType); } elseif (isset($params['icon']) AND (isset($params['icon'][$tr[$key]]) OR isset($params['icon']['default']))) echo ''.$tr[$key]).''; elseif (isset($params['price'])) echo Tools::displayPrice($tr[$key], (isset($params['currency']) ? Currency::getCurrencyInstance((int)($tr['id_currency'])) : $currency), false); elseif (isset($params['float'])) echo rtrim(rtrim($tr[$key], '0'), '.'); elseif (isset($params['type']) AND $params['type'] == 'date') echo Tools::displayDate($tr[$key], (int)$cookie->id_lang); elseif (isset($params['type']) AND $params['type'] == 'datetime') echo Tools::displayDate($tr[$key], (int)$cookie->id_lang, true); elseif (isset($tr[$key])) { $echo = ($key == 'price' ? round($tr[$key], 2) : isset($params['maxlength']) ? Tools::substr($tr[$key], 0, $params['maxlength']).'...' : $tr[$key]); if(isset($params['small_title']) && isset($small_titles[(int) $tr['id_category']]) ) { $echo .= ' - ' . $small_titles[(int) $tr['id_category']]. ''; } echo isset($params['callback']) ? call_user_func_array(array($this->className, $params['callback']), array($echo, $tr)) : $echo; } else echo '--'; echo (isset($params['suffix']) ? $params['suffix'] : ''). ''; } if ($this->edit OR $this->delete OR ($this->view AND $this->view !== 'noActionColumn')) { echo ''; if ($this->view) $this->_displayViewLink($token, $id); if ($this->edit) $this->_displayEditLink($token, $id); if ($this->delete AND (!isset($this->_listSkipDelete) OR !in_array($id, $this->_listSkipDelete))) $this->_displayDeleteLink($token, $id); if ($this->duplicate) $this->_displayDuplicate($token, $id); echo ''; } echo ''; } } } } public function displayList($token = NULL) { global $currentIndex; /* Display list header (filtering, pagination and column names) */ $this->displayListHeader($token); if (!sizeof($this->_list)) echo ''.$this->l('No items found').''; /* Show the content of the table */ $this->displayListContent($token); /* Close list table and submit button */ $this->displayListFooter($token); } public function display($token = NULL) { global $currentIndex, $cookie; $this->getList((int)($cookie->id_lang), !$cookie->__get($this->table.'Orderby') ? 'position' : NULL, !$cookie->__get($this->table.'Orderway') ? 'ASC' : NULL); echo '

'.(!$this->_listTotal ? ($this->l('There are no subcategories')) : ($this->_listTotal.' '.($this->_listTotal > 1 ? $this->l('subcategories') : $this->l('subcategory')))).' '.$this->l('in category').' "'.stripslashes($this->_category->getName()).'"

'; // if ($this->tabAccess['add'] === '1') // echo ' '.$this->l('Add a new subcategory').''; echo '
'; /** * @Override regenerateEntireNTree */ echo '
' . $this->l('Regenerate NTree') . '
'; $this->displayList($token); echo '
'; } public function postProcess($token = NULL) { global $cookie, $currentIndex; $this->tabAccess = Profile::getProfileAccess($cookie->profile, $this->id); /** * @Override regenerate Ntree */ if (Tools::isSubmit('regenerateTree')){ Category::regenerateEntireNtree(); } if (Tools::isSubmit('submitAdd'.$this->table)) { if ($id_category = (int)(Tools::getValue('id_category'))) { if (!Category::checkBeforeMove($id_category, (int)(Tools::getValue('id_parent')))) { $this->_errors[] = Tools::displayError('Category cannot be moved here'); return false; } } } // @Override Antadis /* Delete Image Thumb */ elseif (isset($_GET['deleteImageThumb']) && isset($_GET['id_lang'])) { if (Validate::isLoadedObject($object = $this->loadObject())) { $this->deleteImageThumb($object,$_GET['id_lang']); Tools::redirectAdmin($currentIndex.'&updatecategory&token='.Tools::getValue('token').'&id_category='.(int)($object->id)); } } // @EndOverride Antadis /* Delete object */ elseif (isset($_GET['delete'.$this->table])) { if ($this->tabAccess['delete'] === '1') { if (Validate::isLoadedObject($object = $this->loadObject()) AND isset($this->fieldImageSettings)) { // check if request at least one object with noZeroObject if (isset($object->noZeroObject) AND sizeof($taxes = call_user_func(array($this->className, $object->noZeroObject))) <= 1) $this->_errors[] = Tools::displayError('You need at least one object.').' '.$this->table.'
'.Tools::displayError('You cannot delete all of the items.'); else { if ($this->deleted) { // @Override Antadis foreach (Language::getLanguages(FALSE) as $language) { $this->deleteImageThumb($object, $language['id_lang']); } // @End Antadis $object->deleteImage(); $object->deleted = 1; if ($object->update()) Tools::redirectAdmin($currentIndex.'&conf=1&token='.Tools::getValue('token').'&id_category='.(int)($object->id_parent)); } elseif ($object->delete()) Tools::redirectAdmin($currentIndex.'&conf=1&token='.Tools::getValue('token').'&id_category='.(int)($object->id_parent)); $this->_errors[] = Tools::displayError('An error occurred during deletion.'); } } else $this->_errors[] = Tools::displayError('An error occurred while deleting object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); } else $this->_errors[] = Tools::displayError('You do not have permission to delete here.'); } elseif (isset($_GET['position'])) { if ($this->tabAccess['edit'] !== '1') $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); elseif (!Validate::isLoadedObject($object = new Category((int)(Tools::getValue($this->identifier, Tools::getValue('id_category_to_move', 1)))))) $this->_errors[] = Tools::displayError('An error occurred while updating status for object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); if (!$object->updatePosition((int)(Tools::getValue('way')), (int)(Tools::getValue('position')))) $this->_errors[] = Tools::displayError('Failed to update the position.'); else Tools::redirectAdmin($currentIndex.'&'.$this->table.'Orderby=position&'.$this->table.'Orderway=asc&conf=5'.(($id_category = (int)(Tools::getValue($this->identifier, Tools::getValue('id_category_parent', 1)))) ? ('&'.$this->identifier.'='.$id_category) : '').'&token='.Tools::getAdminTokenLite('AdminCatalog')); } /* Delete multiple objects */ elseif (Tools::getValue('submitDel'.$this->table)) { if ($this->tabAccess['delete'] === '1') { if (isset($_POST[$this->table.'Box'])) { $category = new Category(); $result = true; $result = $category->deleteSelection(Tools::getValue($this->table.'Box')); if ($result) { $category->cleanPositions((int)(Tools::getValue('id_category'))); Tools::redirectAdmin($currentIndex.'&conf=2&token='.Tools::getAdminTokenLite('AdminCatalog').'&id_category='.(int)(Tools::getValue('id_category'))); } $this->_errors[] = Tools::displayError('An error occurred while deleting selection.'); } else $this->_errors[] = Tools::displayError('You must select at least one element to delete.'); } else $this->_errors[] = Tools::displayError('You do not have permission to delete here.'); return; } parent::postProcess(); } protected function postImage($id) { // @Override Antadis if($id_category = (int)(Tools::getValue('id_category'))) { foreach (Language::getLanguages(FALSE) as $language) { $id_lang = (int)$language['id_lang']; if($id_lang == 3 && (!isset($_FILES['image_thumb_'.$id_lang]) || $_FILES['image_thumb_'.$id_lang]['name'] == '') && (isset($_FILES['image_thumb_2']) && $_FILES['image_thumb_2']['name'] != '') ){ if(!copy($_FILES['image_thumb_2']['tmp_name'], _PS_CAT_IMG_DIR_.$id_category.'_thumb_vp_'.$id_lang.'.jpg')) { echo $this->displayError($this->l('An error occured during the image upload.')); } } elseif(isset($_FILES['image_thumb_'.$id_lang]) && $_FILES['image_thumb_'.$id_lang]['name'] != '') { if(!copy($_FILES['image_thumb_'.$id_lang]['tmp_name'], _PS_CAT_IMG_DIR_.$id_category.'_thumb_vp_'.$id_lang.'.jpg')) { echo $this->displayError($this->l('An error occured during the image upload.')); } } } } // @End Antadis $ret = parent::postImage($id); if (($id_category = (int)(Tools::getValue('id_category'))) AND isset($_FILES) AND sizeof($_FILES) AND $_FILES['image']['name'] != NULL AND file_exists(_PS_CAT_IMG_DIR_.$id_category.'.jpg')) { $imagesTypes = ImageType::getImagesTypes('categories'); foreach ($imagesTypes AS $k => $imageType) imageResize(_PS_CAT_IMG_DIR_.$id_category.'.jpg', _PS_CAT_IMG_DIR_.$id_category.'-'.stripslashes($imageType['name']).'.jpg', (int)($imageType['width']), (int)($imageType['height'])); } return $ret; } // @Adding Antadis public function deleteImageThumb($object, $id_lang) { if(file_exists(_PS_ROOT_DIR_.'/img/c/'.$object->id.'_thumb_vp_'.(int)$id_lang.'.jpg')) { unlink(_PS_ROOT_DIR_.'/img/c/'.$object->id.'_thumb_vp_'.(int)$id_lang.'.jpg'); } } // @End Antadis public function displayForm($token = NULL) { global $currentIndex, $cookie; parent::displayForm(); if (!($obj = $this->loadObject(true))) return; $active = $this->getFieldValue($obj, 'active'); $customer_groups = $obj->getGroups(); echo '
'.($obj->id ? '' : '').'
'.$this->l('Category').'
'; foreach ($this->_languages AS $language) echo '
id) ? ' onkeyup="copy2friendlyURLCategory();"' : '').' /> * '.$this->l('Invalid characters:').' <>;=#{} 
'; if(Module::isInstalled('categoryfamily')) { // ADD category require_once '..'._MODULE_DIR_.'categoryfamily/models/CategoryFamily.php'; echo ''; if (!empty($obj->id)) { $data = CategoryFamilyCore::loadAssociations($obj->id, $cookie->id_lang); echo '

'; echo $data; } // ADD CATEGORY else { $familles = CategoryFamilyCore::getParentFamily($cookie->id_lang); echo '

'; } } echo '

'; // Translations are not automatic for the moment ;) $trads = array( 'Home' => $this->l('Home'), 'selected' => $this->l('selected'), 'Collapse All' => $this->l('Collapse All'), 'Expand All' => $this->l('Expand All'), 'Toggle' => 'Masquer/Voir', ); echo Helper::renderAdminCategorieTree($trads, array(isset($obj->id_parent) ? $obj->id_parent : Tools::getValue('id_parent', 1)), 'id_parent', true); echo '
'; foreach ($this->_languages AS $language){ $data = htmlentities($this->getFieldValue($obj, 'description', (int)($language['id_lang'])), ENT_COMPAT, 'UTF-8'); if(empty($data)) $data = date('Y') . '-' . date('m'); echo '
'; } echo '

'; echo $this->displayImage($obj->id, _PS_IMG_DIR_.'c/'.$obj->id.'.jpg', 350, NULL, Tools::getAdminToken('AdminCatalog'.(int)(Tab::getIdFromClassName('AdminCatalog')).(int)($cookie->id_employee)), true); echo '

'.$this->l('Upload category logo from your computer').'


'; // @Override Antadis echo '
'; foreach($this->_languages as $language) { echo '
'; if(file_exists(_PS_ROOT_DIR_.'/img/c/'.$obj->id.'_thumb_vp_'.$language['id_lang'].'.jpg')) { echo ''; } echo '
'; } echo '

'; // echo ' //
'; // if(file_exists(_PS_ROOT_DIR_.'/img/c/'.$obj->id.'_thumb_vp.jpg')) { // echo '
// //

// // Supprimer Supprimer //
'; // } // echo '
//

'.$this->l('Upload logo from your computer').'

//
//

'; // @EndOverride Antadis echo '
'; foreach ($this->_languages AS $language) echo '
'.$this->l('Forbidden characters:').' <>;=#{} 
'; echo '

'; foreach ($this->_languages AS $language) echo '
'.$this->l('Forbidden characters:').' <>;=#{} 
'; echo '

'; foreach ($this->_languages AS $language) echo '
'.$this->l('Forbidden characters:').' <>;=#{} 
'; echo '

'; foreach ($this->_languages AS $language) echo '
* '.$this->l('Only letters and the minus (-) character are allowed').' 
'; echo '

'; $groups = Group::getGroups((int)($cookie->id_lang)); if (sizeof($groups)) { echo ' '; $irow = 0; foreach ($groups AS $group) echo ' '; echo '
id) ? 'checked="checked" ' : '').' /> '.$this->l('ID').' '.$this->l('Group name').'
id))) ? 'checked="checked" ' : '').'/> '.$group['id_group'].'

'.$this->l('Mark all groups you want to give access to this category').'

'; } else echo '

'.$this->l('No group created').'

'; echo '
 
* '.$this->l('Required field').'

'; } }