diff --git a/admin-dev/tabs/AdminLanguages.php b/admin-dev/tabs/AdminLanguages.php deleted file mode 100644 index 8fdef1dbf..000000000 --- a/admin-dev/tabs/AdminLanguages.php +++ /dev/null @@ -1,450 +0,0 @@ - -* @copyright 2007-2011 PrestaShop SA -* @version Release: $Revision: 7310 $ -* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -class AdminLanguages extends AdminTab -{ - public function __construct() - { - $this->table = 'lang'; - $this->className = 'Language'; - $this->lang = false; - $this->edit = true; - $this->delete = true; - - $this->fieldImageSettings = array(array('name' => 'flag', 'dir' => 'l'), array('name' => 'no-picture', 'dir' => 'p')); - - $this->fieldsDisplay = array( - 'id_lang' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), - 'flag' => array('title' => $this->l('Logo'), 'align' => 'center', 'image' => 'l', 'orderby' => false, 'search' => false), - 'name' => array('title' => $this->l('Name'), 'width' => 120), - 'iso_code' => array('title' => $this->l('ISO code'), 'width' => 70, 'align' => 'center'), - 'language_code' => array('title' => $this->l('Language code'), 'width' => 70, 'align' => 'center'), - 'date_format_lite' => array('title' => $this->l('Date format')), - 'date_format_full' => array('title' => $this->l('Date format (full)')), - 'active' => array('title' => $this->l('Enabled'), 'align' => 'center', 'active' => 'status', 'type' => 'bool'), - ); - - $this->optionsList = array( - 'general' => array( - 'title' => $this->l('Languages options'), - 'fields' => array( - 'PS_LANG_DEFAULT' => array('title' => $this->l('Default language:'), 'desc' => $this->l('The default language used in shop'), 'cast' => 'intval', 'type' => 'select', 'identifier' => 'id_lang', 'list' => Language::getlanguages(false)), - ), - ), - ); - - parent::__construct(); - } - - /** - * Copy a no-product image - * - * @param string $language Language iso_code for no-picture image filename - */ - public function copyNoPictureImage($language) - { - if (isset($_FILES['no-picture']) and $_FILES['no-picture']['error'] === 0) - if ($error = checkImage($_FILES['no-picture'], Tools::getMaxUploadSize())) - $this->_errors[] = $error; - else - { - if (!$tmpName = tempnam(_PS_TMP_IMG_DIR_, 'PS') OR !move_uploaded_file($_FILES['no-picture']['tmp_name'], $tmpName)) - return false; - if (!imageResize($tmpName, _PS_IMG_DIR_.'p/'.$language.'.jpg')) - $this->_errors[] = Tools::displayError('An error occurred while copying no-picture image to your product folder.'); - if (!imageResize($tmpName, _PS_IMG_DIR_.'c/'.$language.'.jpg')) - $this->_errors[] = Tools::displayError('An error occurred while copying no-picture image to your category folder.'); - if (!imageResize($tmpName, _PS_IMG_DIR_.'m/'.$language.'.jpg')) - $this->_errors[] = Tools::displayError('An error occurred while copying no-picture image to your manufacturer folder'); - else - { - $imagesTypes = ImageType::getImagesTypes('products'); - foreach ($imagesTypes AS $k => $imageType) - { - if (!imageResize($tmpName, _PS_IMG_DIR_.'p/'.$language.'-default-'.stripslashes($imageType['name']).'.jpg', $imageType['width'], $imageType['height'])) - $this->_errors[] = Tools::displayError('An error occurred while resizing no-picture image to your product directory.'); - if (!imageResize($tmpName, _PS_IMG_DIR_.'c/'.$language.'-default-'.stripslashes($imageType['name']).'.jpg', $imageType['width'], $imageType['height'])) - $this->_errors[] = Tools::displayError('An error occurred while resizing no-picture image to your category directory.'); - if (!imageResize($tmpName, _PS_IMG_DIR_.'m/'.$language.'-default-'.stripslashes($imageType['name']).'.jpg', $imageType['width'], $imageType['height'])) - $this->_errors[] = Tools::displayError('An error occurred while resizing no-picture image to your manufacturer directory.'); - } - } - unlink($tmpName); - } - } - - /** - * deleteNoPictureImages will delete all default image created for the language id_language - * - * @param string $id_language - * @return boolean true if no error - */ - private function deleteNoPictureImages($id_language) - { - $language = Language::getIsoById($id_language); - $imagesTypes = ImageType::getImagesTypes('products'); - $dirs = array(_PS_PROD_IMG_DIR_, _PS_CAT_IMG_DIR_, _PS_MANU_IMG_DIR_, _PS_SUPP_IMG_DIR_, _PS_MANU_IMG_DIR_); - foreach ($dirs AS $dir) - { - foreach ($imagesTypes AS $k => $imageType) - if (file_exists($dir.$language.'-default-'.stripslashes($imageType['name']).'.jpg')) - if (!unlink($dir.$language.'-default-'.stripslashes($imageType['name']).'.jpg')) - $this->_errors[] = Tools::displayError('An error occurred during image deletion.'); - - if (file_exists($dir.$language.'.jpg')) - if (!unlink($dir.$language.'.jpg')) - $this->_errors[] = Tools::displayError('An error occurred during image deletion.'); - } - - return !sizeof($this->_errors) ? true : false; - } - - protected function copyFromPost(&$object, $table) - { - if($object->id AND ($object->iso_code != $_POST['iso_code'])) - if(Validate::isLanguageIsoCode($_POST['iso_code'])) - $object->moveToIso($_POST['iso_code']); - parent::copyFromPost($object, $table); - } - - public function postProcess() - { - if (isset($_GET['delete'.$this->table])) - { - if ($this->tabAccess['delete'] === '1') - { - if (Validate::isLoadedObject($object = $this->loadObject()) AND isset($this->fieldImageSettings)) - { - // English is needed by the system (ex. translations) - if ($object->id == Language::getIdByIso('en')) - $this->_errors[] = $this->l('You cannot delete the English language as it is a system requirement, you can only deactivate it.'); - if ($object->id == Configuration::get('PS_LANG_DEFAULT')) - $this->_errors[] = $this->l('you cannot delete the default language'); - elseif ($object->id == clan) - $this->_errors[] = $this->l('You cannot delete the language currently in use. Please change languages before deleting.'); - elseif ($this->deleteNoPictureImages((int)(Tools::getValue('id_lang'))) AND $object->delete()) - Tools::redirectAdmin(self::$currentIndex.'&conf=1'.'&token='.$this->token); - } - 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(Tools::getValue('submitDel'.$this->table) AND isset($_POST[$this->table.'Box'])) - { - if ($this->tabAccess['delete'] === '1') - { - if (in_array(Configuration::get('PS_LANG_DEFAULT'), $_POST[$this->table.'Box'])) - $this->_errors[] = $this->l('you cannot delete the default language'); - elseif (in_array($this->context->language->id, $_POST[$this->table.'Box'])) - $this->_errors[] = $this->l('you cannot delete the language currently in use, please change languages before deleting'); - else - { - foreach ($_POST[$this->table.'Box'] AS $language) - $this->deleteNoPictureImages($language); - parent::postProcess(); - } - } - else - $this->_errors[] = Tools::displayError('You do not have permission to delete here.'); - } - elseif (Tools::isSubmit('submitAddlang')) - { - /* New language */ - if ((int)(Tools::getValue('id_'.$this->table)) == 0) - { - if ($this->tabAccess['add'] === '1') - { - if (isset($_POST['iso_code']) AND !empty($_POST['iso_code']) AND Validate::isLanguageIsoCode(Tools::getValue('iso_code')) AND Language::getIdByIso($_POST['iso_code'])) - $this->_errors[] = Tools::displayError('This ISO code is already linked to another language.'); - if ((!empty($_FILES['no-picture']['tmp_name']) OR !empty($_FILES['flag']['tmp_name'])) AND Validate::isLanguageIsoCode(Tools::getValue('iso_code'))) - { - if ($_FILES['no-picture']['error'] == UPLOAD_ERR_OK) - $this->copyNoPictureImage(strtolower(Tools::getValue('iso_code'))); - // class AdminTab deal with every $_FILES content, don't do that for no-picture - unset($_FILES['no-picture']); - parent::postProcess(); - } - else - { - $this->validateRules(); - $this->_errors[] = Tools::displayError('Flag and No-Picture image fields are required.'); - } - } - else - $this->_errors[] = Tools::displayError('You do not have permission to add here.'); - } - /* Language edition */ - else - { - if ($this->tabAccess['edit'] === '1') - { - if (( isset($_FILES['no-picture']) AND !$_FILES['no-picture']['error'] OR isset($_FILES['flag']) AND !$_FILES['flag']['error']) - AND Validate::isLanguageIsoCode(Tools::getValue('iso_code'))) - { - if ($_FILES['no-picture']['error'] == UPLOAD_ERR_OK) - $this->copyNoPictureImage(strtolower(Tools::getValue('iso_code'))); - // class AdminTab deal with every $_FILES content, don't do that for no-picture - unset($_FILES['no-picture']); - parent::postProcess(); - } - - if (!Validate::isLoadedObject($object = $this->loadObject())) - die(Tools::displayError()); - if ((int)($object->id) == (int)(Configuration::get('PS_LANG_DEFAULT')) AND (int)($_POST['active']) != (int)($object->active)) - $this->_errors[] = Tools::displayError('You cannot change the status of the default language.'); - else - parent::postProcess(); - - $this->validateRules(); - } - else - $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); - } - } - elseif (isset($_GET['status']) AND isset($_GET['id_lang'])) - { - if ($this->tabAccess['edit'] === '1') - { - if (!Validate::isLoadedObject($object = $this->loadObject())) - die(Tools::displayError()); - if ((int)($object->id) == (int)(Configuration::get('PS_LANG_DEFAULT'))) - $this->_errors[] = Tools::displayError('You cannot change the status of the default language.'); - else - return parent::postProcess(); - } - else - $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); - } - else - return parent::postProcess(); - } - - public function beforeUpdateOptions() - { - $lang = new Language((int)Tools::getValue('PS_LANG_DEFAULT')); - if (!$lang->active) - $this->_errors[] = Tools::displayError('You cannot set this language as default language because it\'s disabled'); - } - - public function displayList() - { - $this->displayWarning($this->l('When you delete a language, all related translations in the database will be deleted.')); - parent::displayList(); - $languages = Language::getLanguages(false); - } - - public function displayListContent($token=NULL) - { - $irow = 0; - if ($this->_list) - - foreach ($this->_list AS $tr) - { - $id = $tr[$this->identifier]; - if ($tr['active']) - { - $active['title'] = "Enabled"; - $active['img'] = "enabled"; - if (!Language::checkFilesWithIsoCode($tr['iso_code'])) - { - $active['title'] = "Warning, some translations files are missing for that iso-code"; - $active['img'] = "warning"; - } - } - else - { - $active['title'] = "Disabled"; - $active['img'] = "disabled"; - } - echo 'colorOnBackground) ? 'style="background-color: '.$tr['color'].'"' : '').'>'; - echo ''; - - foreach ($this->fieldsDisplay AS $key => $params) - { - $tmp = explode('!', $key); - $key = isset($tmp[1]) ? $tmp[1] : $tmp[0]; - echo ''; - if (isset($params['active']) AND isset($tr[$key])) - echo 'active'; - elseif (isset($params['image'])) - echo cacheImage(_PS_IMG_DIR_.$params['image'].'/'.$id.(isset($tr['id_image']) ? '-'.(int)($tr['id_image']) : '').'.'.$this->imageType, $this->table.'_mini_'.$id.'.'.$this->imageType, 45, $this->imageType); - elseif (isset($tr[$key])) - echo $tr[$key]; - else - echo '--'; - ''; - } - if ($this->edit OR $this->delete OR ($this->view AND $this->view !== 'noActionColumn')) - { - echo ''; - if ($this->edit) - echo ' - - '.$this->l('Edit').''; - if ($this->delete) - echo ' - - '.$this->l('Delete').''; - echo ''; - } - echo ''; - } - } - - public function displayForm($isMainTab = true) - { - parent::displayForm(); - - if (!($obj = $this->loadObject(true))) - return; - - echo ' - - -
- '.($obj->id ? '' : '').' -
'.$this->l('Languages').' - - -
- * -
- -
- * -

'.$this->l('2-letter ISO code (e.g., fr, en, de)').'

-
- -
- * -

'.$this->l('Full language code (e.g., en-us, pt-br)').'

-
- -
- * -

'.$this->l('Date format, lite (e.g., Y-m-d, d/m/Y)').'

-
- -
- * -

'.$this->l('Date format, full (e.g., Y-m-d H:i:s, d/m/Y H:i)').'

-
- -
- * -

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

-
- -
- * -

'.$this->l('Image displayed when "no picture found"').'

-
- -
- getFieldValue($obj, 'is_rtl')) ? 'checked="checked" ' : '').'/> - - getFieldValue($obj, 'is_rtl')) ? 'checked="checked" ' : '').'/> - -

'.$this->l('To active if this language is a right to left language').' '.$this->l('(Experimental: your theme must be compliant with RTL language)').'

-
- -
- id OR $this->getFieldValue($obj, 'active')) ? 'checked="checked" ' : '').'/> - - getFieldValue($obj, 'active') AND $obj->id) ? 'checked="checked" ' : '').'/> - -

'.$this->l('Allow or disallow this language to be selected by the customer').'

-
-

'.$this->l('Check if a language pack is available for this ISO code...').'

'; - if (Shop::isFeatureActive()) - { - echo '
'; - $this->displayAssoShop(); - echo '
'; - } - echo ' -
- -
-
* '.$this->l('Required field').'
-
-
'; - - if ($obj->id AND !$obj->checkFiles()) - { - echo ' -

-
'.$this->l('Warning').' -

'.$this->l('This language is NOT complete and cannot be used in the Front or Back Office because some files are missing.').'

-
- -
'; - $files = Language::getFilesList($obj->iso_code, _THEME_NAME_, false, false, 'tr', true); - $this->displayFilesList($files); - echo ' -

- -
'; - $files = Language::getFilesList($obj->iso_code, _THEME_NAME_, false, false, 'theme', true); - $this->displayFilesList($files); - echo ' -

- -
'; - $files = Language::getFilesList($obj->iso_code, _THEME_NAME_, false, false, 'mail', true); - $this->displayFilesList($files); - echo ' -
-
-
'.$this->l('Missing files are marked in red').'
-
'; - } - } - - public function displayFilesList($files) - { - foreach ($files as $key => $file) - { - if (!file_exists($key)) - echo ''; - echo $key; - if (!file_exists($key)) - echo ''; - echo '
'; - } - } -} - - diff --git a/admin-dev/themes/template/languages/form.tpl b/admin-dev/themes/template/languages/form.tpl new file mode 100644 index 000000000..4d9ef7a63 --- /dev/null +++ b/admin-dev/themes/template/languages/form.tpl @@ -0,0 +1,331 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 8971 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{if $firstCall} + + + +{/if} +{if isset($fields.title)}

{$fields.title}

{/if} +
+ {if $form_id} + + {/if} +
+ {foreach $fields as $key => $field} + {if $key == 'legend'} + + {if isset($field.image)}{$field.title}{/if} + {$field.title} + + {elseif $key == 'input'} + {foreach $field as $input} + {if $input.name == 'id_state'} +
+ {/if} + {if isset($input.label)} + + {/if} + {if $input.type == 'hidden'} + + {else} +
+ {if $input.type == 'text'} + {if isset($input.lang) && isset($input.attributeLang)} + {foreach $languages as $language} +
+ + {if isset($input.hint)}{$input.hint} {/if} +
+ {/foreach} + {if count($languages) > 1} +
+ +
+
+ {l s='Choose language:'}

+ {foreach $languages as $language} + {$language.name} + {/foreach} +
+ {/if} + {else} + + {if isset($input.hint)}{$input.hint} {/if} + {/if} + {elseif $input.type == 'select'} + {if isset($input.options.query) && !$input.options.query && isset($input.empty_message)} + {$input.empty_message} + {$input.required = false} + {$input.p = null} + {else} + + {if isset($input.hint)}{$input.hint} {/if} + {/if} + {elseif $input.type == 'radio'} + {foreach $input.values as $value} + + + {if isset($input.br) && $input.br}
{/if} + {/foreach} + {elseif $input.type == 'textarea'} + {if isset($input.lang) && isset($input.attributeLang)} + {foreach $languages as $language} +
+ +
+ {/foreach} + {if count($languages) > 1} +
+ +
+
+ {l s='Choose language:'}

+ {foreach $languages as $language} + {$language.name} + {/foreach} +
+ {/if} + {else} + + {/if} + {elseif $input.type == 'checkbox'} + {foreach $input.values.query as $value} + {assign var=id_checkbox value=$input.name|cat:'_'|cat:$value[$input.values.id]} + +
+ {/foreach} + {elseif $input.type == 'file'} + + + {elseif $input.type == 'password'} + + {elseif $input.type == 'special'} +

{$input.text}

+ {elseif $input.type == 'group'} + {assign var=groups value=$input.values} + {include file='form_group.tpl'} + {elseif $input.type == 'shop' OR $input.type == 'group_shop'} + {include file='form_shop.tpl'} + {elseif $input.type == 'asso_shop' && isset($asso_shop) && $asso_shop} + +
+ {$asso_shop} +
+ {/if} + {if isset($input.required) && $input.required} *{/if} + {if isset($input.p)} +

+ {if is_array($input.p)} + {foreach $input.p as $p} + {if is_array($p)} + {$p.text}
+ {else} + {$p}
+ {/if} + {/foreach} + {else} + {$input.p} + {/if} +

+ {/if} + {if isset($languages)}
{/if} +
+ {/if} + {if $input.name == 'id_state'} +
+ {/if} + {/foreach} + {elseif $key == 'submit'} +
+ +
+ {/if} + {/foreach} + {if $required_fields} +
* {l s ='Required field'}
+ {/if} +
+
+ +{if isset($fields['new'])} +

+
+ {foreach $fields['new'] as $key => $field} + {if $key == 'legend'} + + {if isset($field.image)}{$field.title}{/if} + {$field.title} + +

{l s='This language is NOT complete and cannot be used in the Front or Back Office because some files are missing.'}

+
+ {elseif $key == 'list_files'} + {foreach $field as $list} + +
+ {foreach $list.files as $key => $file} + {if !file_exists($key)} + + {/if} + {$key} + {if !file_exists($key)} + + {/if} +
+ {/foreach} +
+
+ {/foreach} + {/if} + {/foreach} +
+
{l s='Missing files are marked in red'}
+
+{/if} +

+{if $firstCall && !$no_back} + {if $back} + {l s='Back'} + {else} + {l s='Back to list'} + {/if} +
+{/if} diff --git a/classes/AdminController.php b/classes/AdminController.php index 62a0c4df8..3f8c770ee 100644 --- a/classes/AdminController.php +++ b/classes/AdminController.php @@ -1111,6 +1111,7 @@ class AdminControllerCore extends Controller $helper->shopLinkType = $this->shopLinkType; $helper->identifier = $this->identifier; $helper->token = $this->token; + $helper->specificConfirmDelete = $this->specificConfirmDelete; $helper->imageType = $this->imageType; $helper->no_add = isset($this->no_add) ? $this->no_add : false; $helper->no_link = $this->list_no_link; diff --git a/classes/HelperList.php b/classes/HelperList.php index b2cafa7e3..56ccb0555 100644 --- a/classes/HelperList.php +++ b/classes/HelperList.php @@ -401,7 +401,7 @@ class HelperListCore extends Helper $this->context->smarty->assign(array( 'href' => $this->currentIndex.'&'.$this->identifier.'='.$id.'&delete'.$this->table.'&token='.($token != null ? $token : $this->token), - 'confirm' => self::$cache_lang['DeleteItem'].$id.' ?'.(!is_null($this->specificConfirmDelete) ? '\r'.$this->specificConfirmDelete : ''), + 'confirm' => (!is_null($this->specificConfirmDelete) ? '\r'.$this->specificConfirmDelete : self::$cache_lang['DeleteItem'].$id.' ? '), 'action' => self::$cache_lang['Delete'], )); diff --git a/controllers/admin/AdminLanguagesController.php b/controllers/admin/AdminLanguagesController.php new file mode 100644 index 000000000..1a4f040be --- /dev/null +++ b/controllers/admin/AdminLanguagesController.php @@ -0,0 +1,499 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 8971 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AdminLanguagesControllerCore extends AdminController +{ + public function __construct() + { + $this->table = 'lang'; + $this->className = 'Language'; + $this->lang = false; + $this->deleted = false; + + $this->requiredDatabase = true; + + $this->context = Context::getContext(); + + $this->fieldImageSettings = array( + array( + 'name' => 'flag', + 'dir' => 'l' + ), + array( + 'name' => 'no-picture', + 'dir' => 'p' + ) + ); + + $this->fieldsDisplay = array( + 'id_lang' => array( + 'title' => $this->l('ID'), + 'align' => 'center', + 'width' => 25 + ), + 'flag' => array( + 'title' => $this->l('Logo'), + 'align' => 'center', + 'image' => 'l', + 'orderby' => false, + 'search' => false + ), + 'name' => array( + 'title' => $this->l('Name'), + 'width' => 120 + ), + 'iso_code' => array( + 'title' => $this->l('ISO code'), + 'width' => 70, + 'align' => 'center' + ), + 'language_code' => array( + 'title' => $this->l('Language code'), + 'width' => 70, + 'align' => 'center' + ), + 'date_format_lite' => array( + 'title' => $this->l('Date format') + ), + 'date_format_full' => array( + 'title' => $this->l('Date format (full)') + ), + 'active' => array( + 'title' => $this->l('Enabled'), + 'align' => 'center', + 'active' => 'status', + 'type' => 'bool' + ) + ); + + $this->options = array( + 'general' => array( + 'title' => $this->l('Languages options'), + 'fields' => array( + 'PS_LANG_DEFAULT' => array( + 'title' => $this->l('Default language:'), + 'desc' => $this->l('The default language used in shop'), + 'cast' => 'intval', + 'type' => 'select', + 'identifier' => 'id_lang', + 'list' => Language::getlanguages(false) + ) + ), + 'submit' => array() + ) + ); + + parent::__construct(); + } + + public function initList() + { + $this->addRowAction('edit'); + $this->addRowAction('delete'); + + $this->bulk_actions = array('delete' => array('text' => $this->l('Delete selected'), 'confirm' => $this->l('Delete selected items?'))); + $this->specificConfirmDelete = $this->l('When you delete a language, ALL RELATED TRANSLATIONS IN THE DATABASE WILL BE DELETED, are you sure you want to delete this language?', __CLASS__, true, false); + + $this->displayWarning($this->l('When you delete a language, all related translations in the database will be deleted.')); + return parent::initList(); + } + + public function initForm() + { + $this->fields_form = array( + 'legend' => array( + 'title' => $this->l('Languages'), + 'image' => '../img/admin/world.gif' + ), + 'input' => array( + array( + 'type' => 'hidden', + 'name' => 'ps_version' + ), + array( + 'type' => 'text', + 'label' => $this->l('Name:'), + 'name' => 'name', + 'size' => 8, + 'maxlength' => 32, + 'required' => true + ), + array( + 'type' => 'text', + 'label' => $this->l('ISO code:'), + 'name' => 'iso_code', + 'required' => true, + 'size' => 4, + 'maxlength' => 2, + 'p' => $this->l('2-letter ISO code (e.g., fr, en, de)') + ), + array( + 'type' => 'text', + 'label' => $this->l('Language code:'), + 'name' => 'language_code', + 'required' => true, + 'size' => 10, + 'maxlength' => 5, + 'p' => $this->l('Full language code (e.g., en-us, pt-br)') + ), + array( + 'type' => 'text', + 'label' => $this->l('Date format:'), + 'name' => 'date_format_lite', + 'required' => true, + 'size' => 15, + 'p' => $this->l('Date format, lite (e.g., Y-m-d, d/m/Y)') + ), + array( + 'type' => 'text', + 'label' => $this->l('Date format (full):'), + 'name' => 'date_format_full', + 'required' => true, + 'size' => 25, + 'p' => $this->l('Date format, full (e.g., Y-m-d H:i:s, d/m/Y H:i)') + ), + array( + 'type' => 'file', + 'label' => $this->l('Flag:'), + 'name' => 'flag', + 'required' => true, + 'p' => $this->l('Upload country flag from your computer') + ), + array( + 'type' => 'file', + 'label' => $this->l('"No-picture" image:'), + 'name' => 'no-picture', + 'required' => true, + 'p' => $this->l('Image displayed when "no picture found"') + ), + array( + 'type' => 'radio', + 'label' => $this->l('Is RTL language:'), + 'name' => 'is_rtl', + 'required' => false, + 'class' => 't', + 'is_bool' => true, + 'values' => array( + array( + 'id' => 'is_rtl_on', + 'value' => 1, + 'label' => $this->l('Enabled') + ), + array( + 'id' => 'active_off', + 'value' => 0, + 'label' => $this->l('Disabled') + ) + ), + 'p' => $this->l('To active if this language is a right to left language').' '. + $this->l('(Experimental: your theme must be compliant with RTL language)') + ), + array( + 'type' => 'radio', + 'label' => $this->l('Status:'), + 'name' => 'active', + 'required' => false, + 'class' => 't', + 'is_bool' => true, + 'values' => array( + array( + 'id' => 'active_on', + 'value' => 1, + 'label' => $this->l('Enabled') + ), + array( + 'id' => 'active_off', + 'value' => 0, + 'label' => $this->l('Disabled') + ) + ), + 'p' => $this->l('Allow or disallow this language to be selected by the customer') + ), + array( + 'type' => 'special', + 'name' => 'resultCheckLangPack', + 'text' => $this->l('Check if a language pack is available for this ISO code...'), + 'img' => 'ajax-loader.gif' + ) + ) + ); + + if (Shop::isFeatureActive()) + { + $this->fields_form['input'][] = array( + 'type' => 'shop', + 'label' => $this->l('Shop association:'), + 'name' => 'checkBoxShopAsso', + 'values' => Shop::getTree() + ); + } + + $this->fields_form['submit'] = array( + 'title' => $this->l(' Save '), + 'class' => 'button' + ); + + if (!($obj = $this->loadObject(true))) + return; + + if ($obj->id && !$obj->checkFiles()) + { + $this->fields_form['new'] = array( + 'legend' => array( + 'title' => $this->l('Warning'), + 'image' => '../img/admin/warning.gif' + ), + 'list_files' => array( + array( + 'label' => $this->l('Translations files:'), + 'files' => Language::getFilesList($obj->iso_code, _THEME_NAME_, false, false, 'tr', true) + ), + array( + 'label' => $this->l('Theme files:'), + 'files' => Language::getFilesList($obj->iso_code, _THEME_NAME_, false, false, 'theme', true) + ), + array( + 'label' => $this->l('Mail files:'), + 'files' => Language::getFilesList($obj->iso_code, _THEME_NAME_, false, false, 'mail', true) + ) + ) + ); + } + + $this->fields_value = array( + 'ps_version' => _PS_VERSION_ + ); + + //Added values of object Shop + if ($obj->id) + { + $assos = array(); + $sql = 'SELECT `id_shop`, `'.pSQL($this->identifier).'` + FROM `'._DB_PREFIX_.pSQL($this->table).'_shop` + WHERE `'.pSQL($this->identifier).'` = '.(int)$obj->id; + foreach (Db::getInstance()->executeS($sql) as $row) + $this->fields_value['shop'][$row['id_shop']][] = $row[$this->identifier]; + } + + return parent::initForm(); + } + + public function postProcess() + { + if (isset($_GET['delete'.$this->table])) + { + if ($this->tabAccess['delete'] === '1') + { + if (Validate::isLoadedObject($object = $this->loadObject()) && isset($this->fieldImageSettings)) + { + // English is needed by the system (ex. translations) + if ($object->id == Language::getIdByIso('en')) + $this->_errors[] = $this->l('You cannot delete the English language as it is a system requirement, you can only deactivate it.'); + if ($object->id == Configuration::get('PS_LANG_DEFAULT')) + $this->_errors[] = $this->l('you cannot delete the default language'); + else if ($object->id == $this->context->language->id) + $this->_errors[] = $this->l('You cannot delete the language currently in use. Please change languages before deleting.'); + else if ($this->deleteNoPictureImages((int)Tools::getValue('id_lang')) && $object->delete()) + Tools::redirectAdmin(self::$currentIndex.'&conf=1'.'&token='.$this->token); + } + 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.'); + } + else if (Tools::getValue('submitDel'.$this->table) && isset($_POST[$this->table.'Box'])) + { + if ($this->tabAccess['delete'] === '1') + { + if (in_array(Configuration::get('PS_LANG_DEFAULT'), $_POST[$this->table.'Box'])) + $this->_errors[] = $this->l('you cannot delete the default language'); + else if (in_array($this->context->language->id, $_POST[$this->table.'Box'])) + $this->_errors[] = $this->l('you cannot delete the language currently in use, please change languages before deleting'); + else + { + foreach ($_POST[$this->table.'Box'] as $language) + $this->deleteNoPictureImages($language); + parent::postProcess(); + } + } + else + $this->_errors[] = Tools::displayError('You do not have permission to delete here.'); + } + else if (Tools::isSubmit('submitAddlang')) + { + /* New language */ + if ((int)Tools::getValue('id_'.$this->table) == 0) + { + if ($this->tabAccess['add'] === '1') + { + if (isset($_POST['iso_code']) && !empty($_POST['iso_code']) && Validate::isLanguageIsoCode(Tools::getValue('iso_code')) && Language::getIdByIso($_POST['iso_code'])) + $this->_errors[] = Tools::displayError('This ISO code is already linked to another language.'); + if ((!empty($_FILES['no-picture']['tmp_name']) || !empty($_FILES['flag']['tmp_name'])) && Validate::isLanguageIsoCode(Tools::getValue('iso_code'))) + { + if ($_FILES['no-picture']['error'] == UPLOAD_ERR_OK) + $this->copyNoPictureImage(strtolower(Tools::getValue('iso_code'))); + // class AdminTab deal with every $_FILES content, don't do that for no-picture + unset($_FILES['no-picture']); + parent::postProcess(); + } + else + { + $this->validateRules(); + $this->_errors[] = Tools::displayError('Flag and No-Picture image fields are required.'); + } + } + else + $this->_errors[] = Tools::displayError('You do not have permission to add here.'); + } + /* Language edition */ + else + { + if ($this->tabAccess['edit'] === '1') + { + if (( isset($_FILES['no-picture']) && !$_FILES['no-picture']['error'] || isset($_FILES['flag']) && !$_FILES['flag']['error']) + && Validate::isLanguageIsoCode(Tools::getValue('iso_code'))) + { + if ($_FILES['no-picture']['error'] == UPLOAD_ERR_OK) + $this->copyNoPictureImage(strtolower(Tools::getValue('iso_code'))); + // class AdminTab deal with every $_FILES content, don't do that for no-picture + unset($_FILES['no-picture']); + parent::postProcess(); + } + + if (!Validate::isLoadedObject($object = $this->loadObject())) + $this->_errors[] = Tools::displayError('An error occurred while updating status for object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); + if ((int)$object->id == (int)Configuration::get('PS_LANG_DEFAULT') && (int)$_POST['active'] != (int)$object->active) + $this->_errors[] = Tools::displayError('You cannot change the status of the default language.'); + else + parent::postProcess(); + + $this->validateRules(); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + } + } + else if (isset($_GET['status'.$this->table]) && isset($_GET['id_lang'])) + { + if ($this->tabAccess['edit'] === '1') + { + if (!Validate::isLoadedObject($object = $this->loadObject())) + $this->_errors[] = Tools::displayError('An error occurred while updating status for object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); + if ((int)$object->id == (int)Configuration::get('PS_LANG_DEFAULT')) + $this->_errors[] = Tools::displayError('You cannot change the status of the default language.'); + else + return parent::postProcess(); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + } + else + return parent::postProcess(); + } + + /** + * Copy a no-product image + * + * @param string $language Language iso_code for no-picture image filename + */ + public function copyNoPictureImage($language) + { + if (isset($_FILES['no-picture']) && $_FILES['no-picture']['error'] === 0) + if ($error = checkImage($_FILES['no-picture'], Tools::getMaxUploadSize())) + $this->_errors[] = $error; + else + { + if (!$tmp_name = tempnam(_PS_TMP_IMG_DIR_, 'PS') || !move_uploaded_file($_FILES['no-picture']['tmp_name'], $tmp_name)) + return false; + if (!imageResize($tmp_name, _PS_IMG_DIR_.'p/'.$language.'.jpg')) + $this->_errors[] = Tools::displayError('An error occurred while copying no-picture image to your product folder.'); + if (!imageResize($tmp_name, _PS_IMG_DIR_.'c/'.$language.'.jpg')) + $this->_errors[] = Tools::displayError('An error occurred while copying no-picture image to your category folder.'); + if (!imageResize($tmp_name, _PS_IMG_DIR_.'m/'.$language.'.jpg')) + $this->_errors[] = Tools::displayError('An error occurred while copying no-picture image to your manufacturer folder'); + else + { + $images_types = ImageType::getImagesTypes('products'); + foreach ($images_types as $k => $image_type) + { + if (!imageResize($tmp_name, _PS_IMG_DIR_.'p/'.$language.'-default-'.stripslashes($image_type['name']).'.jpg', $image_type['width'], $image_type['height'])) + $this->_errors[] = Tools::displayError('An error occurred while resizing no-picture image to your product directory.'); + if (!imageResize($tmp_name, _PS_IMG_DIR_.'c/'.$language.'-default-'.stripslashes($image_type['name']).'.jpg', $image_type['width'], $image_type['height'])) + $this->_errors[] = Tools::displayError('An error occurred while resizing no-picture image to your category directory.'); + if (!imageResize($tmp_name, _PS_IMG_DIR_.'m/'.$language.'-default-'.stripslashes($image_type['name']).'.jpg', $image_type['width'], $image_type['height'])) + $this->_errors[] = Tools::displayError('An error occurred while resizing no-picture image to your manufacturer directory.'); + } + } + unlink($tmp_name); + } + } + + /** + * deleteNoPictureImages will delete all default image created for the language id_language + * + * @param string $id_language + * @return boolean true if no error + */ + private function deleteNoPictureImages($id_language) + { + $language = Language::getIsoById($id_language); + $images_types = ImageType::getImagesTypes('products'); + $dirs = array(_PS_PROD_IMG_DIR_, _PS_CAT_IMG_DIR_, _PS_MANU_IMG_DIR_, _PS_SUPP_IMG_DIR_, _PS_MANU_IMG_DIR_); + foreach ($dirs as $dir) + { + foreach ($images_types as $k => $image_type) + if (file_exists($dir.$language.'-default-'.stripslashes($image_type['name']).'.jpg')) + if (!unlink($dir.$language.'-default-'.stripslashes($image_type['name']).'.jpg')) + $this->_errors[] = Tools::displayError('An error occurred during image deletion.'); + + if (file_exists($dir.$language.'.jpg')) + if (!unlink($dir.$language.'.jpg')) + $this->_errors[] = Tools::displayError('An error occurred during image deletion.'); + } + + return !count($this->_errors) ? true : false; + } + + protected function copyFromPost(&$object, $table) + { + if ($object->id && ($object->iso_code != $_POST['iso_code'])) + if (Validate::isLanguageIsoCode($_POST['iso_code'])) + $object->moveToIso($_POST['iso_code']); + parent::copyFromPost($object, $table); + } + + public function beforeUpdateOptions() + { + $lang = new Language((int)Tools::getValue('PS_LANG_DEFAULT')); + if (!$lang->active) + $this->_errors[] = Tools::displayError('You cannot set this language as default language because it\'s disabled'); + } +} + +