Talal Abderrazzak Posted October 7, 2015 Share Posted October 7, 2015 Bonjour à tous, Je souhaite créer un formulaire pour modifier un produit, pour faire j'ai créer une page pour les champs à modifier dont le code est le suivant: <div id="manageProduct"> <div id="adminHome"> {if isset($confirmation) && $confirmation} <p class="alert alert-success"> {l s="Vous avez términé le process d'ajout de votre création, elle apparaitera désormais bientôt dans notre galerie." mod="admincreation"} </p> {/if} {include file="$tpl_dir./errors.tpl"} </div> <div id="addProduct" class="bootstrap" style=""> <div style="color:#e8767a;"><h1 class="page-subheading"> Modifier votre création </h1> </div> <div class="box"> <form action="{$link->getModuleLink('admincreation', 'editproduct')|escape:'html'}?action=update" method="post" enctype='multipart/form-data' class="std" > </div> <div id=""> <div class="required form-group"> <label for="product_name" class="">Titre :</label></br> <input type="text" onkeypress="refuserToucheEntree(event);" id="product_name" name="product_name" class="is_required validate form-control" > </div> <script type="text/javascript"> {literal} function refuserToucheEntree(event) { // Compatibilité IE / Firefox if(!event && window.event) { event = window.event; } // IE if(event.keyCode == 13) { event.returnValue = false; event.cancelBubble = true; } // DOM if(event.which == 13) { event.preventDefault(); event.stopPropagation(); } } {/literal} </script> <div class="form-group"> <label class="control-label">Catégories :</label> {foreach from=$data.subcategories item=subcategory} <select id="category-{$subcategory.id_category}" name="category-{$subcategory.id_category}" class="is_required validate form-control" required="true" style="width: auto"> {foreach from=$subcategory.children item=child} <option id="cat-{$child.id_category}" value="{$child.id_category}">{$child.name}</option> {/foreach} </select> {/foreach} </div> <script type="text/javascript"> {literal} /*$().ready(function() { $('#addProductForm').submit(function() { var categories = []; $('#categories-treeview input:checked').each(function(i) { categories[i] = $(this).val(); }); $(this).find('#categories_id').val(JSON.stringify(categories)); }); });*/ {/literal} </script> {foreach from=$data.features item=feature} <div class="form-group"> <label class="control-label">{$feature.name} :</label> <ul id="ul_features_{$feature.id_feature}" class="col-lg-12 col-md-12 ul_features"> {foreach from=$feature.featureValues item=value} <li> <div class="radio"> <label for="id_feature_{$value.id_feature_value}"> <input type="radio" value="{$value.id_feature_value}_{$feature.id_feature}" id="id_feature_{$value.id_feature_value}" name="feature_{$feature.id_feature}_value" /> {$value.value} </label> </div> </li> {/foreach} </ul> </div> {/foreach} <div class="form-group"> <label for="colorpicker" class="">Couleur dominante:</label> <input type="hidden" name="product_color" id="product_color" value="none" /> <select name="colorpicker"> {foreach from=$data.attributes.colors item=attribute} <option color="{$attribute.color}" value="{$attribute.id_attribute}" {if $smarty.foreach.attribute.iteration == 1}selected{/if} >{$attribute.name}</option> {/foreach} </select> <script type="text/javascript"> {literal} $('select[name="colorpicker"]').simplecolorpicker({ picker: true }).on('change', function() { $('input#product_color').val($('select[name="colorpicker"]').val()); }); {/literal} </script> </div> <div class="form-group"> <script type="text/javascript"> {literal} $().ready(function() { var input_id = 'product_keywords'; $('#' + input_id).tagify({addTagPrompt: 'Ajouter un mot-clé'}); //console.log($('#'+input_id).tagify()); $('#addProductForm').submit(function() { $(this).find('#' + input_id).val($('#' + input_id).tagify('serialize')); }); }); {/literal} </script> <label for="product_name" class=""> Mot-clés : </label> <p>Important : Ajoutez au moins 5 Mots-clés. Appuyez sur Entrée après chaque mot-clé</p> <input type="text" id="product_keywords" name="product_keywords" value="" class="form-control tagify updateCurrentText" placeholder="Ajouter un mot-clé"> <p>La description n'est pas obligatoire, toutefois et pour une meilleure visibilité de votre création, celle-ci pourra être utile. </p> </div> <div class="form-group" > <label for="product_description" class="control-label">Description :</label></br> <textarea style=" height: 91px;" class="required form-control" name="product_description" id="product_description"></textarea> </div> <button type="submit" class="btn btn-default button button-medium submitConditions" name="submit_form"><span>Continuer</span></button> <!--<span class="btn btn-default button button-medium suiv4">Continuer</span>--> </div> <!-- Your HTML Form Content --> </form> </div> <!-- <ul class="footer_links clearfix"> <li><a title="Retour" href="#" class="btn btn-default button button-small"><span><i class="icon-chevron-left"></i> Retour</span></a></li> </ul>--> </div> Mon contrôleur est le suivant (juste pour essayer j'ai créer une requête sql pour mettre à jour le nom du produit) <?php class AdminCreationEditProduct1ModuleFrontController extends ModuleFrontController { public $auth = true; public $ssl = true; private $done_traitement = true; public function init() { parent::init(); $this->customer = $this->context->customer; } public function postProcess() { if (Tools::isSubmit('action')) { $action = Tools::getValue('action'); $product_id = Tools::getValue('id'); if ($action == 'update' && $product_id) { //$product_id = Tools::getValue('id'); global $cookie; if (!isset($cookie->id_customer)) { $this->errors[] = Tools::displayError('Aucun client loggé.'); } else { $lang_id = $this->context->language->id; $product_id = Tools::getValue('id'); $product_name = Tools::getValue('product_name'); /*$product_keywords = Tools::getValue('product_keywords'); $home_categories = Category::getHomeCategories($lang_id); $categories = array(); foreach ($home_categories as $home_category) { $category_name = 'category-' . $home_category['id_category']; if (isset($_REQUEST[$category_name])) $categories[] = Tools::getValue('category-' . $home_category['id_category']); } $product_color = Tools::getValue('product_color');*/ $update_name=' UPDATE `'._DB_PREFIX_.'product` SET product_name=.'$product_name; $results = Db::getInstance()->Execute($update_name); } } } } } ?> Je sais que je fais des bêtises. Merci de me guider Link to comment Share on other sites More sharing options...
Prestashop Studio Posted October 7, 2015 Share Posted October 7, 2015 (edited) Dans ton contrôleur, je te déconseil de modifier un produit ou toutes autres entités via requêtes SQL.Ils est préférable d'utilité les objets:Exemple$product = new Product(1);$product->name = "toto" ;$product->save(); Edited October 8, 2015 by Prestashop Studio (see edit history) Link to comment Share on other sites More sharing options...
Talal Abderrazzak Posted October 8, 2015 Author Share Posted October 8, 2015 Bonjour Merci pour votre réponse mais est ce que c'est déja bien ce que j'ai fait? Link to comment Share on other sites More sharing options...
Prestashop Studio Posted October 8, 2015 Share Posted October 8, 2015 Dans les grandes lignes cela semble correct, juste évite de modifier ton produit via requêtes (les validateurs ne seront pas gérés) Link to comment Share on other sites More sharing options...
Talal Abderrazzak Posted October 8, 2015 Author Share Posted October 8, 2015 D'accord merci, Une autre question s'ils vous plait par rapport à l'id du produit, je souhaite le transmettre en arguments vers mon contrôleur Comment le récupérer tout d'abord puis le transmettre? Merci d'avance Link to comment Share on other sites More sharing options...
coeos.pro Posted October 8, 2015 Share Posted October 8, 2015 sur les versions récentes on n'utilise plus global, mais context $update_name=' UPDATE `'._DB_PREFIX_.'product` SET product_name=.'$product_name;$results = Db::getInstance()->Execute($update_name); 1- $product_name n'est pas protégé, il faut utiliser pSQL($product_name) 2- privilégie les bonnes pratiques : https://www.prestashop.com/blog/fr/les-bonnes-pratiques-de-la-classe-db-sur-prestashop-1-5/ utilise Db::getInstance()->update sinon suit les conseils de Prestashop Studio Link to comment Share on other sites More sharing options...
Talal Abderrazzak Posted October 8, 2015 Author Share Posted October 8, 2015 Merci coeos.pro pour les conseils, je me demande comment faire pour récupérer l'ID d'un produit en cours et le transmettre au controlleur Merci d'avance Link to comment Share on other sites More sharing options...
coeos.pro Posted October 8, 2015 Share Posted October 8, 2015 ça dépend , tu es où ? BO, FO... Link to comment Share on other sites More sharing options...
Talal Abderrazzak Posted October 8, 2015 Author Share Posted October 8, 2015 Je suis en FO Link to comment Share on other sites More sharing options...
Talal Abderrazzak Posted October 8, 2015 Author Share Posted October 8, 2015 C'est ce que j'ai fait en fait mais ça ne marche pas Link to comment Share on other sites More sharing options...
coeos.pro Posted October 8, 2015 Share Posted October 8, 2015 tout simplement: $id_product = (int)Tools::getValue('id_product'); Link to comment Share on other sites More sharing options...
coeos.pro Posted October 8, 2015 Share Posted October 8, 2015 (edited) tu n'es pas sur une page produit ? Edited October 8, 2015 by coeos.pro (see edit history) Link to comment Share on other sites More sharing options...
Talal Abderrazzak Posted October 8, 2015 Author Share Posted October 8, 2015 Oui justement Je suis sur une page que j'ai créer et ça ne fait référence à aucun produit (désolé de ne pas être spécifique) Link to comment Share on other sites More sharing options...
Talal Abderrazzak Posted October 8, 2015 Author Share Posted October 8, 2015 Juste pour vous mettre en contexte: Quand je clique sur le bouton Modifier ça ma redirige vers la page de mon formulaire à ce moment là je peux voir mon ID en URL . (des images en joint à ce message) Link to comment Share on other sites More sharing options...
Talal Abderrazzak Posted October 8, 2015 Author Share Posted October 8, 2015 Une solution avec smarty peut être Link to comment Share on other sites More sharing options...
Talal Abderrazzak Posted October 8, 2015 Author Share Posted October 8, 2015 Quand je valide mon formulaire mon ID ne passe pas en URL Link to comment Share on other sites More sharing options...
coeos.pro Posted October 8, 2015 Share Posted October 8, 2015 si c'est id dans l'url il faut utiliser : $id_product = (int)Tools::getValue('id'); Link to comment Share on other sites More sharing options...
coeos.pro Posted October 8, 2015 Share Posted October 8, 2015 en smarty c'est {$smarty.get.id} Link to comment Share on other sites More sharing options...
Talal Abderrazzak Posted October 8, 2015 Author Share Posted October 8, 2015 Oh mon Dieu, Merci beaucoup coeos.pro Link to comment Share on other sites More sharing options...
Talal Abderrazzak Posted October 9, 2015 Author Share Posted October 9, 2015 Bonjour, Si je veux suivre les recommandations de Prestashop Studio comment faire "un update" La méthode suivante permet de faire l'ajout $product_color = Tools::getValue('product_color'); if ($product_color != 'none' && trim($product_color) != '') { $attributes = array(); $attributes[0] = $product_color; $id_product_attribute = $product->addAttribute(0, 0, 0, 0, array(), '', '', 0); $combination = new Combination((int) $id_product_attribute); $combination->setAttributes($attributes); } Link to comment Share on other sites More sharing options...
Prestashop Studio Posted October 9, 2015 Share Posted October 9, 2015 Que veux-tu mettre à jour exactement? Ajouter une déclinaison à un produit? Link to comment Share on other sites More sharing options...
Talal Abderrazzak Posted October 9, 2015 Author Share Posted October 9, 2015 Je veux modifier la couleur et la catégorie Link to comment Share on other sites More sharing options...
Talal Abderrazzak Posted October 9, 2015 Author Share Posted October 9, 2015 C'est quoi l'équivalent de cette ligne pour update? $id_product_attribute = $product->addAttribute(0, 0, 0, 0, array(), '', '', 0); Link to comment Share on other sites More sharing options...
Talal Abderrazzak Posted October 12, 2015 Author Share Posted October 12, 2015 Bonjour, Je reviens vers vous afin de m'aider à résoudre ce problème voila à quoi je suis arrivé pour le moment: <?php class AdminCreationEditProduct1ModuleFrontController extends ModuleFrontController { public $auth = true; public $ssl = true; private $done_traitement = true; public function init() { parent::init(); $this->customer = $this->context->customer; } public function postProcess() { if (Tools::isSubmit('action')) { global $cookie; if (!isset($cookie->id_customer)) { $this->errors[] = Tools::displayError('Aucun client loggé.'); } else { $action = Tools::getValue('action'); $product_id = Tools::getValue('id'); if ($action == 'update') { $product = new Product((int) $product_id); $lang_id = $this->context->language->id; $product_name = Tools::getValue('product_name'); $product_keywords = Tools::getValue('product_keywords'); // recuperation de la catégorie $home_categories = Category::getHomeCategories($lang_id); $product_description = Tools::getValue('product_description'); $categories = array(); foreach ($home_categories as $home_category) { $category_name = 'category-' . $home_category['id_category']; if (isset($_REQUEST[$category_name])) $categories[] = Tools::getValue('category-' . $home_category['id_category']); } $languages = Language::getLanguages(); foreach ($languages as $lang) { $product->name[$lang['id_lang']] = $product_name; $product->description[$lang['id_lang']] = $product_description; } $product_color = Tools::getValue('product_color'); if ($product_color != 'none' && trim($product_color) != '') { $attributes = array(); $attributes[0] = $product_color; $id_product_attribute = $product->addAttribute(0, 0, 0, 0, array(), '', '', 0); $combination = new Combination((int) $id_product_attribute); $combination->setAttributes($attributes); } $product->color = $product_color; $product->keywords = $product_keywords; $product->save(); } else { $this->errors[] = Tools::displayError('Pas d action update.'); } } } else { $this->errors[] = Tools::displayError('Pas d action.'); } } } ?> Ce contrôleur permet modifier uniquement le nom et le produit par contre je ne suis pas arriver à modifier les champs catégories, styles, couleurs et mots clés Merci d'avance 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