jd440 Posted August 24, 2013 Share Posted August 24, 2013 (edited) Bonjour à tous. Je souhaite pouvoir définir manuellement aussi bien les nom que les attributs alt des images produits. Si je n'ai eu aucun soucis du coté Front je but du coté BO. Je ne comprend absolument pas ou et comment /admin/index.php?controller=AdminProducts&id_product=370&updateproduct Se passe? Ou et comment se réalise l'update de la table? Si quelqu'un à une idée. Merci Edited August 27, 2013 by jd440 (see edit history) Link to comment Share on other sites More sharing options...
indesign47 Posted August 24, 2013 Share Posted August 24, 2013 (edited) Bonsoir jd440, /admin/index.php?controller=AdminProducts&id_product=370&updateproduct Lors de la modification d'un produit , c'est l'adminTab (AdminProductsController.php) qui est appelé (dossier prestashp/controllers/admin/AdminProductsController.php) L'update est réalisé par la function public function processUpdate() Edited August 24, 2013 by indesign (see edit history) Link to comment Share on other sites More sharing options...
jd440 Posted August 24, 2013 Author Share Posted August 24, 2013 Merci. C'est bien là que je regardais, mais dans 5000Lignes j'ai du passer 50fois devant la fonction? Il ne reste plus qu'a. sachant que je dois enregistrer pour chaque image, dans la table ps_image_lang un champ legend et name. Pas simple Il n'y a plus qu'a décortiquer tout cela et se creuser la tete. Merci encore Link to comment Share on other sites More sharing options...
jd440 Posted August 24, 2013 Author Share Posted August 24, 2013 (edited) d'accord donc sauf erreur de ma part il faut: Ajouter dans public function processUpdate() if ($this->isTabSubmitted('SeoImages')) $this->processSeoImages(); puis créer une fonction: public function processSeoImages() { if (Validate::isLoadedObject($product = new Product((int)Tools::getValue('id_product')))) { // add new objects $languages = Language::getLanguages(false); foreach ($_POST as $key => $val) { if (preg_match('/^alt_([0-9]+)_value/i', $key, $match)) { if ($val) $product->addAltToDB($match[1], $val); } } } else $this->errors[] = Tools::displayError('probleme'); } Et enfin créer: $product->addAltToDB($match[1], $val); sur le modèle de $product->addFeatureToDB($match[1], $val); mais là je vois pas ou cela se passe? Edited August 24, 2013 by jd440 (see edit history) Link to comment Share on other sites More sharing options...
Effesesteania Posted August 24, 2013 Share Posted August 24, 2013 Предлагаю вашему вниманю новый сайт игр онлайн Link to comment Share on other sites More sharing options...
indesign47 Posted August 24, 2013 Share Posted August 24, 2013 (edited) Ton cheminement semble être le bon. L'appel de la function, la function, et l'enregistrement. $product->addFeatureToDB($match[1], $val); j'avoue aussi ne pas avoir trouvé. Edited August 24, 2013 by indesign (see edit history) Link to comment Share on other sites More sharing options...
indesign47 Posted August 24, 2013 Share Posted August 24, 2013 jette un œil, dans le controller admin (AdminFeaturesController.php) public function processUpdate() { $object = parent::processUpdate(); if (Tools::isSubmit('submitAdd'.$this->table.'AndStay') && !count($this->errors)) $this->redirect_after = self::$currentIndex.'&'.$this->identifier.'=&conf=3&update'.$this->table.'&token='.$this->token; return $object; } Link to comment Share on other sites More sharing options...
jd440 Posted August 24, 2013 Author Share Posted August 24, 2013 (edited) j'ai trouvé!! $product->addFeatureToDB($match[1], $val) Est dans la class Product, public function addFeaturesToDB($id_feature, $id_value, $cust = 0) { if ($cust) { $row = array('id_feature' => (int)$id_feature, 'custom' => 1); Db::getInstance()->insert('feature_value', $row); $id_value = Db::getInstance()->Insert_ID(); } $row = array('id_feature' => (int)$id_feature, 'id_product' => (int)$this->id, 'id_feature_value' => (int)$id_value); Db::getInstance()->insert('feature_product', $row); SpecificPriceRule::applyAllRules(array((int)$this->id)); if ($id_value) return ($id_value); } Du coup ca n'as rien à faire la puisque je modifie l'image, mais je me demande à à faire l'update directement dans public function processUpdate() { //if ($this->isTabSubmitted('SeoImages')){ $this->processSeoImages(); } /** * enregistrement SEOIMAGE dans DB **/ public function processSeoImages() { $languages = Language::getLanguages(false); foreach ($_POST as $key => $val) { if (preg_match('/^alt_([0-9]+)_([0-9]+)/i', $key, $match)) { if ($val) Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'image_lang` SET `legend` = \''.$val.'\' WHERE `id_image` = '.$match[1].' AND `id_lang` = '.$match[2]); } if (preg_match('/^name_([0-9]+)_([0-9]+)/i', $key, $match)) { if ($val) Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'image_lang` SET `name` = \''.$val.'\' WHERE `id_image` = '.$match[1].' AND `id_lang` = '.$match[2]); } } } Edited August 25, 2013 by jd440 (see edit history) Link to comment Share on other sites More sharing options...
jd440 Posted August 25, 2013 Author Share Posted August 25, 2013 (edited) Afin de faire quelque chose de propre je suis en train de tout passer en ovveride, afin notamment de parer à tout risque de supprression en cas d'update du core. Mais je me pose deux questions. dans la fonction processUpdate j'appel la fonction processSeoImages 1 - dans l'override suis je obliger de recopier toute la fonction processUpdate???? public function processUpdate() { //if ($this->isTabSubmitted('SeoImages')) $this->processSeoImages(); [...] } 2 - je suis surpris car je me suis inspiré du core comme: if ($this->isTabSubmitted('Features')) $this->processFeatures(); hors si je controle ma tabsubmitted il n'y a pas d'appel à la fonction processSeoImages pourtant j'ai bien en haut de la tab SeoImages: <input name="submitted_tabs[]" value="SeoÌmages" type="hidden"> Edited August 25, 2013 by jd440 (see edit history) Link to comment Share on other sites More sharing options...
indesign47 Posted August 25, 2013 Share Posted August 25, 2013 (edited) Afin de faire quelque chose de propre je suis en train de tout passer en override, afin notamment de parer à tout risque de suppression en cas d'update du core. En effet, c'est la bonne méthode. • Normalement, il n'est pas nécessaire d'inclure toute la fonction. • La function processSeoImages doit être incluse dans l'override mais pas dans l'admin de base (si présent) • Il faut, peut-être pour retourner les valeur à l'Admin de base quelque chose comme AdminController::postProcess(); (à vérifier) PS : je viens de voir que tu avais modifié le précédent post, donc mon commentaire n'est peut-être plus d'actualité ? Edited August 25, 2013 by indesign (see edit history) Link to comment Share on other sites More sharing options...
jd440 Posted August 25, 2013 Author Share Posted August 25, 2013 (edited) Merci quand même, Ca avance. Il ne me reste plus qu'a réussir à ajouter une fonction javascript qui permet de créer un adresse seofriendly, en s'insiprant de updateFriendlyURL inclus dans admin.js Si j'ajoute dans admin.js: function updateFriendlyURLIMAGE(id_image) { id_image_selected = id_image; var link = $('#name_' + id_image_selected + '_'+ id_language); if (link[0]) { link.val(str2url($('#name_' + id_image_selected + '_'+ id_language).val(), 'UTF-8')); } } avec sur le input: <input size="30" type="text" id="{$input_name}_{$image_id}_{$language.id_lang}" name="{$input_name}_{$image_id}_{$language.id_lang}" value="{$input_value[$language.id_lang]|htmlentitiesUTF8|default:''}" onkeyup="if (isArrowKey(event)) return ;updateFriendlyURLIMAGE({$image_id});"/> Le problème est comment et ou l'ajouter? car il n'y a pas de ovverride en js? Du coup il me reste la solution: Ajouter dans l'override: public function postProcess() { [...] $this->addJS(array( _PS_JS_DIR_.'productTabsManager.js', _PS_JS_DIR_.'admin-products.js', _PS_JS_DIR_.'attributesBack.js', _PS_JS_DIR_.'price.js', _PS_JS_DIR_.'tiny_mce/tiny_mce.js', _PS_JS_DIR_.'tinymce.inc.js', _PS_JS_DIR_.'fileuploader.js', _PS_JS_DIR_.'admin-dnd.js', _PS_JS_DIR_.'jquery/plugins/treeview-categories/jquery.treeview-categories.js', _PS_JS_DIR_.'jquery/plugins/treeview-categories/jquery.treeview-categories.async.js', _PS_JS_DIR_.'jquery/plugins/treeview-categories/jquery.treeview-categories.edit.js', _PS_JS_DIR_.'admin-categories-tree.js', _PS_JS_DIR_.'jquery/ui/jquery.ui.progressbar.min.js', _PS_JS_DIR_.'jquery/plugins/timepicker/jquery-ui-timepicker-addon.js', _PS_JS_DIR_.'admin-override.js' )); [...] } } Avec dans admin-override.js: var ajax_running_timeout = null; if (!id_language) var id_language = Number(1); function str2url(str, encoding, ucfirst) { str = str.toUpperCase(); str = str.toLowerCase(); if (PS_ALLOW_ACCENTED_CHARS_URL) str = str.replace(/[^a-z0-9\s\'\:\/\[\]-]\\u00A1-\\uFFFF/g,''); else { str = str.replace(/[\u0105\u0104\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5]/g,'a'); str = str.replace(/[\u00E7\u010D\u0107\u0106]/g,'c'); str = str.replace(/[\u010F]/g,'d'); str = str.replace(/[\u00E8\u00E9\u00EA\u00EB\u011B\u0119\u0118\u0117]/g,'e'); str = str.replace(/[\u00EC\u00ED\u00EE\u00EF\u012F]/g,'i'); str = str.replace(/[\u0142\u0141]/g,'l'); str = str.replace(/[\u00F1\u0148]/g,'n'); str = str.replace(/[\u00F2\u00F3\u00F4\u00F5\u00F6\u00F8\u00D3]/g,'o'); str = str.replace(/[\u0159]/g,'r'); str = str.replace(/[\u015B\u015A\u0161]/g,'s'); str = str.replace(/[\u00DF]/g,'ss'); str = str.replace(/[\u0165]/g,'t'); str = str.replace(/[\u00F9\u00FA\u00FB\u00FC\u016F\u016B\u0173]/g,'u'); str = str.replace(/[\u00FD\u00FF]/g,'y'); str = str.replace(/[\u017C\u017A\u017B\u0179\u017E]/g,'z'); str = str.replace(/[\u00E6]/g,'ae'); str = str.replace(/[\u0153]/g,'oe'); str = str.replace(/[\u013E\u013A]/g,'l'); str = str.replace(/[\u0155]/g,'r'); str = str.replace(/[^a-z0-9\s\'\:\/\[\]-]/g,''); } str = str.replace(/[\u0028\u0029\u0021\u003F\u002E\u0026\u005E\u007E\u002B\u002A\u002F\u003A\u003B\u003C\u003D\u003E]/g, ''); str = str.replace(/[\s\'\:\/\[\]-]+/g, ' '); // Add special char not used for url rewrite str = str.replace(/[ ]/g, '-'); str = str.replace(/[\/\\"'|,;]*/g, ''); if (ucfirst == 1) { var first_char = str.charAt(0); str = first_char.toUpperCase()+str.slice(1); } return str; } function updateFriendlyURLIMAGE(id_image) { id_image_selected = id_image; var link = $('#name_' + id_image_selected + '_'+ id_language); if (link[0]) { link.val(str2url($('#name_' + id_image_selected + '_'+ id_language).val(), 'UTF-8')); } } Edited August 25, 2013 by jd440 (see edit history) Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now