J. Danse Posted September 16, 2012 Share Posted September 16, 2012 (edited) Bonjour tout le monde, Voici un canvas de module compatible 1.5. Il me reste à implémenter deux trois trucs mais vous pouvez l’analyser et le modifier selon vos besoins ! [Version 1.4] [Version 1.5] Version GIThub https://github.com/P...e-Prestashop-15 Edit, mise à jour du 17.09.2012 Une nouvelle version du module est disponible sur ce post. Edit, mise à jour du 19.09.2012 Une nouvelle version du module est disponible sur ce post. Edit, mise à jour du 03.10.2012 Une nouvelle version du module est disponible. Edit, mise à jour du 23.12.2012 Une nouvelle version (1.5) du module est disponible. Edited December 23, 2012 by J. Danse (see edit history) 6 Link to comment Share on other sites More sharing options...
doekia Posted September 16, 2012 Share Posted September 16, 2012 Très propre, excellent! Link to comment Share on other sites More sharing options...
J. Danse Posted September 16, 2012 Author Share Posted September 16, 2012 Avec plaisir. Il resta à implémenter les mises à jours suivant le nouvel API, par exemple... Link to comment Share on other sites More sharing options...
doekia Posted September 16, 2012 Share Posted September 16, 2012 Oui enfin pourquoi pas. Moi j'aurais ajouté cela dans l'install *supprimé* code mal écrit et retiré Car ce proto de module est strictement à partir de la 1.5 Link to comment Share on other sites More sharing options...
J. Danse Posted September 16, 2012 Author Share Posted September 16, 2012 Aussi, oui. C'est vrai que j'ai mis un exemple de module typiquement exclusif 1.5... Mais pourquoi pas, oui ! Link to comment Share on other sites More sharing options...
doekia Posted September 17, 2012 Share Posted September 17, 2012 Oublie mon code... il suffit de mettre celà dans le constructeur: $this->ps_versions_compliancy['min'] = '1.5.0.17'; Link to comment Share on other sites More sharing options...
J. Danse Posted September 17, 2012 Author Share Posted September 17, 2012 Aussi, oui. Mais ton code permet d'avoir une version mix, éventuellement Link to comment Share on other sites More sharing options...
doekia Posted September 17, 2012 Share Posted September 17, 2012 En fait ... pas vraiment car mon code ne fonctionnait pas parfaitement... et ton sujet c'est bien template de module 1.5 non ? :-) Link to comment Share on other sites More sharing options...
J. Danse Posted September 17, 2012 Author Share Posted September 17, 2012 Oui Link to comment Share on other sites More sharing options...
belew Posted September 17, 2012 Share Posted September 17, 2012 Merci beaucoup aucun module natif de proposé une architecture aussi complete 2 Link to comment Share on other sites More sharing options...
Matt75 Posted September 17, 2012 Share Posted September 17, 2012 Salut, Je tiens à vous remercier pour la mise à disposition de ce canvas très utile. Je m'intéresse à Prestashop depuis une petite semaine seulement, je me suis basé sur votre canvas pour développer un module mais il me manque un exemple pour l'insertion des données récupérées via le formulaire dans l'administration avec le controller. J'ai bien vu qu'il fallait se servir de la fonction add() de ObjectModel mais je n'ai aucune idée de la meilleure syntaxe à adopter ni où placer mon code dans le controller. Je n'ai pas trouver de module de base ayant un controller admin... Cordialement 1 Link to comment Share on other sites More sharing options...
J. Danse Posted September 17, 2012 Author Share Posted September 17, 2012 Voici une version mise à jour avec, notamment: Les fichiers d'upgrade ; La version de comptabilité de PrestaShop ; Un postProcess() dans l'Admin Controller. 1 Link to comment Share on other sites More sharing options...
Matt75 Posted September 17, 2012 Share Posted September 17, 2012 Bonsoir, Merci pour cette mise à jour, j'ai réussi à faire l'ajout, la modification et la suppression depuis l'admin Demain je m'occuperai de l'affichage dans le front, j'ai tout ce qu'il me faut pour le réaliser. Cordialement Link to comment Share on other sites More sharing options...
J. Danse Posted September 17, 2012 Author Share Posted September 17, 2012 Avec plaisir ! Si vous avez le moindre soucis, n'hésitez pas ! Link to comment Share on other sites More sharing options...
J. Danse Posted September 19, 2012 Author Share Posted September 19, 2012 Une mise à jour intégrant ceci: http://www.prestashop.com/forums/index.php?/topic/189016-questions-sur-la-creation-de-modules-mvc/page__view__findpost__p__934100 2 Link to comment Share on other sites More sharing options...
DrÿSs' Posted September 20, 2012 Share Posted September 20, 2012 (edited) Salut ! Très bonne idée ce Canvas. Par contre, après avoir installé le module, si je clique sur "Configurer", j'ai l'erreur suivante : Notice: Undefined variable: errors in F:\Dev\www\prestashop\1.5.0.17\modules\example\example.php on line 121 Edited September 20, 2012 by DrÿSs' (see edit history) Link to comment Share on other sites More sharing options...
J. Danse Posted September 20, 2012 Author Share Posted September 20, 2012 Erreur corrigée et fichier mis à jour Link to comment Share on other sites More sharing options...
DrÿSs' Posted September 20, 2012 Share Posted September 20, 2012 URL du nouveau fichier ? Link to comment Share on other sites More sharing options...
J. Danse Posted September 20, 2012 Author Share Posted September 20, 2012 Mis à jour dans le premier post, Link to comment Share on other sites More sharing options...
DrÿSs' Posted September 20, 2012 Share Posted September 20, 2012 Oki Par contre j'ai du mal à comprendre comment la variable $errors peut être SET : if (isset($errors) && count($errors)) $output .= $this->displayError(implode('<br />', $errors)); et if(isset($errors)) $this->context->smarty->assign('errors', $errors); Non seulement elle n'est remplie nul part dans le fichier, mais comme ce n'est pas une variable globale, on ne pourra jamais accéder à son contenu Ça devrait pas être un membre de la classe du module ($this->errors) ? Link to comment Share on other sites More sharing options...
J. Danse Posted September 20, 2012 Author Share Posted September 20, 2012 Pour être franc, c'est tout à fait exact. En fait, dans un ancien module, j'avais configuré le postProcess et les erreurs... Mais ce n'est pas le cas ici. Je vais revoir cette partie là, Link to comment Share on other sites More sharing options...
DrÿSs' Posted September 20, 2012 Share Posted September 20, 2012 Ouaip, après c'est à nous de remplir la variable errors dans l'implémentation du canvas ! Généralement j'utilise $this->errors, ça permet de se "trimballer" les erreurs d'une méthode à l'autre Link to comment Share on other sites More sharing options...
J. Danse Posted September 20, 2012 Author Share Posted September 20, 2012 Généralement, aussi ! Mais oubli de ma part Link to comment Share on other sites More sharing options...
DrÿSs' Posted September 20, 2012 Share Posted September 20, 2012 Dans le renderForm de AdminExampleController, il manque la propriété "size" pour le champs "date". Du coup, ça pète un notice. Il faudrait avoir : array( 'type' => 'date', 'name' => 'exampledate', 'size' => 40 ) Link to comment Share on other sites More sharing options...
Gueshino95 Posted October 3, 2012 Share Posted October 3, 2012 Bonjour, Est-il possible de faire que lorsque l'on clique sur une entrée du tableau on puisse générez des entrée enfant ? ou accédez au entrée enfant de ce dernier ? Car je bloque sur ce point ^^ Cordialement Link to comment Share on other sites More sharing options...
J. Danse Posted October 3, 2012 Author Share Posted October 3, 2012 Comme pour les catégories, (ou les onglets du back-office), c'est ça ? Link to comment Share on other sites More sharing options...
Gueshino95 Posted October 3, 2012 Share Posted October 3, 2012 Exactement ! .. Link to comment Share on other sites More sharing options...
J. Danse Posted October 3, 2012 Author Share Posted October 3, 2012 Je rajoute ça 1 Link to comment Share on other sites More sharing options...
Gueshino95 Posted October 3, 2012 Share Posted October 3, 2012 Je rajoute ça Un grand merci ! Link to comment Share on other sites More sharing options...
J. Danse Posted October 3, 2012 Author Share Posted October 3, 2012 C'est ajouté. Evidemment, il faut modifier la méthode ajaxProcessDetails pour réaliser la requête souhaitée. Le paramètre id est passé, et est donc utilisable. Link to comment Share on other sites More sharing options...
galerien Posted October 7, 2012 Share Posted October 7, 2012 Dans le fichier example.php, il manque pour être propre avec la table PS_TAB à supprimer le menu racine. Remplacer la ligne // Uninstall Tabs $tab = new Tab((int)Tab::getIdFromClassName('AdminExample')); $tab->delete(); par // Uninstall Tabs $tab = new Tab((int)Tab::getIdFromClassName('AdminExample')); $tab->delete(); $tab = new Tab((int)Tab::getIdFromClassName('AdminMainExample')); $tab->delete(); Link to comment Share on other sites More sharing options...
J. Danse Posted October 8, 2012 Author Share Posted October 8, 2012 Merci galerien ! Je vais mettre cela à jour dans le module, je le publierais dès que possible avec les nouveautés @Belenos: Dès que j'ai un peu de temps, pour le moment, je développé un peu sous la 1.5 (dont des modules exemples afin de les intégrer dans l'IDE lui-même !) 1 Link to comment Share on other sites More sharing options...
Prestaspirit Posted October 13, 2012 Share Posted October 13, 2012 Salut J.danse, Dans la methode postProcess() du controller de l'administration tu peut utiliser le code suivant qui est plus propre et gère toutes les données envoyés : public function postProcess() { if (Tools::isSubmit('submitAdd'.$this->table)) { // Create Object ExampleData $obj = new ExampleData(); // Copy From Post $this->copyFromPost($obj, 'example_data'); // Save object if (!$obj->save()) $this->errors[] = Tools::displayError('An error has occurred: Can\'t save the current object'); else Tools::redirectAdmin(self::$currentIndex.'&conf=4&token='.$this->token); } } 1 Link to comment Share on other sites More sharing options...
J. Danse Posted October 13, 2012 Author Share Posted October 13, 2012 On va modifier ça ! Link to comment Share on other sites More sharing options...
doekia Posted October 13, 2012 Share Posted October 13, 2012 // Copy From Post $this->copyFromPost($obj, 'example_data'); Franchement, la methode copyFromPost est la méthode la plus moisie que la team ait inventé. De plus elle casse totalement le modèle / vue / controlleur. Enfin, je dis ça, je dis rien hein Link to comment Share on other sites More sharing options...
Prestaspirit Posted October 13, 2012 Share Posted October 13, 2012 Franchement, la methode copyFromPost est la méthode la plus moisie que la team ait inventé. De plus elle casse totalement le modèle / vue / controlleur. Enfin, je dis ça, je dis rien hein J'adore !!!!! Toutes les remarques sans fondement sont tellement plus constructives et intelligentes ! Je crois effectivement que t'aurait mieux fait de rien dire, à moins que tu pense sincèrement que le code utilisé dans ce canevas soit plus approprié que la méthode copyFromPost() native à Prestashop !? Methode copyFromPost : /** * Copy datas from $_POST to object * * @param object &$object Object * @param string $table Object table */ protected function copyFromPost(&$object, $table) { /* Classical fields */ foreach ($_POST as $key => $value) if (key_exists($key, $object) && $key != 'id_'.$table) { /* Do not take care of password field if empty */ if ($key == 'passwd' && Tools::getValue('id_'.$table) && empty($value)) continue; /* Automatically encrypt password in MD5 */ if ($key == 'passwd' && !empty($value)) $value = Tools::encrypt($value); $object->{$key} = $value; } /* Multilingual fields */ $rules = call_user_func(array(get_class($object), 'getValidationRules'), get_class($object)); if (count($rules['validateLang'])) { $languages = Language::getLanguages(false); foreach ($languages as $language) foreach (array_keys($rules['validateLang']) as $field) if (isset($_POST[$field.'_'.(int)$language['id_lang']])) $object->{$field}[(int)$language['id_lang']] = $_POST[$field.'_'.(int)$language['id_lang']]; } } Code du canevas : $exemple_data->exampledate = array(); $languages = Language::getLanguages(false); foreach ($languages as $language) $exemple_data->name[$language['id_lang']] = Tools::getValue('name_'.$language['id_lang']); On remarquera que le code du canevas fait à plusieurs quelques points près la même chose que la méthode, de plus je vois vraiment pas en quoi cette méthode casse le modèle MVC toute la partie traitement est bien géré par le controller qui renvoi les éléments traités au modèle pour enregistrement, ensuite selon le retour du modèle on affiche un message. Link to comment Share on other sites More sharing options...
doekia Posted October 13, 2012 Share Posted October 13, 2012 Toutes les remarques sans fondement sont tellement plus constructives et intelligentes ! ?? Est-ce vraiment à l'objet d'aller lire la variable post? ?? Si j'ai besoin de réutiliser en dehors d'un accès FO/BO la fonctionnalité, je dois bourrer ma variable post? ?? Je dois alors deviner le noms des champs présent dans le BO pour mettre à jour mon objet ?? Je dois reproduire toutes les choses du formulaire du BO sans rien omettre On parle bien de modèle MVC? Suis-je vraiment sans fondement? Ote moi d'un doute, dans le cas ou un problème survient dans le copyFromPost... que doit faire cette méthode? Générer une exception? Envoyer une alerte html? Et si je voulais utiliser la fonctionnalité depuis un ajax? ... Au final on remarque vite que pour faire les choses comme il faut nous n'avons d'autre choix que de dupliquer le traitement pour ajax/html/processing donc maintenir au moins 3 branches qui font les mêmes fonctionnalité. C'est en ça que la solution est moisie. Link to comment Share on other sites More sharing options...
Prestaspirit Posted October 14, 2012 Share Posted October 14, 2012 Merci d'avoir pris la peine d'étayer tes propos ceux-ci dits je ne suis pas vraiment d'accord avec toi ! ?? Est-ce vraiment à l'objet d'aller lire la variable post? Tout dépend de qu'elle objet on parle, ici il s'agit bien de l'objet du controller et non pas de l'objet du model qui va faire le traitement de la variable post, l'objet du model est juste passé en argument de la méthode copyFromPost pour pouvoir valider et assigner les données au champs de la table conformément à ce qui est attendu par les autres méthodes (save, update, add). Étant donné qu'on n'est pas sur un framework avec une gestion poussée des requêtes comme sur cakephp ou symfony par exemple je vois pas le problème à créer une méthode dans le controller principal pour gérer les posts ?? Si j'ai besoin de réutiliser en dehors d'un accès FO/BO la fonctionnalité, je dois bourrer ma variable post? ?? Je dois alors deviner le noms des champs présent dans le BO pour mettre à jour mon objet ?? Je dois reproduire toutes les choses du formulaire du BO sans rien omettre Hors sujet, cette méthode n'est dispo que pour les controllers admin, ceci explique peut être cela! On parle bien de modèle MVC? Suis-je vraiment sans fondement? oui et ..... oui Ote moi d'un doute, dans le cas ou un problème survient dans le copyFromPost... que doit faire cette méthode? Générer une exception? Envoyer une alerte html? Et si je voulais utiliser la fonctionnalité depuis un ajax? ... Au final on remarque vite que pour faire les choses comme il faut nous n'avons d'autre choix que de dupliquer le traitement pour ajax/html/processing donc maintenir au moins 3 branches qui font les mêmes fonctionnalité. C'est en ça que la solution est moisie. De quelle erreur parle tu? La seule erreur qui peut y avoir c'est si tu passes un objet controller au lieu d'un objet model en paramètre de la fonction qui provoquera une erreur sur la fonction call_user_func() parce que cette objet ne dispose pas de méthode getValidationRules, je t'accorde qu'il aurait pu créer une exception pour checker ce point, sur ce coup il ce sont peut être dit qu'un développeur comprendrait tout de suite sont erreur. Pour fini cette méthode est complètement utilisable en ajax, encore une fois tu expose des problèmes ou toi seul les vois sans donner d'exemple concret, je crois que tu a un gros problème de compréhension du code. Link to comment Share on other sites More sharing options...
doekia Posted October 14, 2012 Share Posted October 14, 2012 Sauf que copyFromPost ne fait pas que copier les données. Il lance les hooks (before, update, afer), retourne en erreur , ajoute l'objet sous-jacent à la bdd (même si tu ne fait pas submit), Renvoi les headers de redirect... Cette approche fait omettre de nombreuses méthodes OO qui manquent a nombre d'objets (model). Le controller doit copier from post soit, mais ensuite lancer des validation qui existent sur l'objet. c'est à l'objet de traiter sa validation... Pour finir en ajax, nous somme presque toujours en json. Le retour d'erreur ici ne fera que provoquer des XHR: Techical error... Pas pratique, ni informatif Sur ce, rendons ce topic à J. Danse :-) Link to comment Share on other sites More sharing options...
Prestaspirit Posted October 14, 2012 Share Posted October 14, 2012 Sauf que copyFromPost ne fait pas que copier les données. Il lance les hooks (before, update, afer), retourne en erreur , ajoute l'objet sous-jacent à la bdd (même si tu ne fait pas submit), Renvoi les headers de redirect... Mais bien sur, elle ma même fait le café sucrette l'autre jour... Cette approche fait omettre de nombreuses méthodes OO qui manquent a nombre d'objets (model). Le controller doit copier from post soit, mais ensuite lancer des validation qui existent sur l'objet. c'est à l'objet de traiter sa validation... Pour finir en ajax, nous somme presque toujours en json. Le retour d'erreur ici ne fera que provoquer des XHR: Techical error... Pas pratique, ni informatif Tu es un commercial hors pair, franchement je t'embauche quand tu veut ! (c'est une vrai proposition!) Sur ce, rendons ce topic à J. Danse :-) On à enfin trouvé un terrain d'entente ;-) Link to comment Share on other sites More sharing options...
delete Posted October 18, 2012 Share Posted October 18, 2012 Perso, je paye pour ce genre d'information. Pour ceux qui ne sont pas contents : moi ça me semble parfait Merci J. Danse. 2 Link to comment Share on other sites More sharing options...
J. Danse Posted October 23, 2012 Author Share Posted October 23, 2012 Bon, Je coulais, comme proposé, le mettre sur un répertoire SVN. Mais, ... ça m'énerve déjà, je ne parviens pas à le faire. Si quelqu'un est disposé à le faire... Link to comment Share on other sites More sharing options...
Prestaspirit Posted October 23, 2012 Share Posted October 23, 2012 Bon, Je coulais, comme proposé, le mettre sur un répertoire SVN. Mais, ... ça m'énerve déjà, je ne parviens pas à le faire. Si quelqu'un est disposé à le faire... Salut J.Danse, Pourquoi tu le met pas directement sur github? c'est gratuit pour un dépôt open source comme le tiens. Je veux bien le faire à ta place mais ce seras sur mon compte github et pas sur le tiens, vaut mieux que tu créer un compte et que tu mette le dépôt dessus. Si tu es sur windows tu peut utiliser le logiciel github:windows => http://windows.github.com/ N'hésite pas à me contacter sur skype au besoin. Franck Link to comment Share on other sites More sharing options...
J. Danse Posted October 23, 2012 Author Share Posted October 23, 2012 C'est justement ce que je voulais faire: un compte GIT (ou un truc du même nom, mais qui fait la même chose quoi !). Je sais pas pourquoi mes logiciels ne fonctionnent pas avec le compte crée (enfin, si je sais: parce que je ne sais pas comment on fait, mais bon ). Donc voilà. PS: Je viens d'essayer... Beau logiciel, mais à part m'énerver à faire des erreurs, il ne fait rien pour moi. Je te laisse donc le soin de le faire si tu veux, Link to comment Share on other sites More sharing options...
doekia Posted October 23, 2012 Share Posted October 23, 2012 TortoiseSVN -> SVN ou TortoiseGit -> Git Je t'ai MP Link to comment Share on other sites More sharing options...
Prestaspirit Posted October 23, 2012 Share Posted October 23, 2012 ...... Je te laisse donc le soin de le faire si tu veux, C'est fait => https://github.com/P...e-Prestashop-15 Met peut être le lien dans le premier post pour que ceux qu'il veulent forker puisse voir le lien de suite. 1 Link to comment Share on other sites More sharing options...
J. Danse Posted October 23, 2012 Author Share Posted October 23, 2012 Voilà donc ! Amusez vous bien ! Link to comment Share on other sites More sharing options...
J. Danse Posted October 23, 2012 Author Share Posted October 23, 2012 Parce que ce n'est pas obligatoire pour être compatible. C'est juste une mauvaise utilisation de l'architecture présentée. Peut-être à termes, ... Link to comment Share on other sites More sharing options...
Matt75 Posted October 23, 2012 Share Posted October 23, 2012 Belenos, Il y a quelques modules présents dans Prestashop 1.5.x qui implémente cette architecture MVC: bankwire mailalerts loyalty cheque cashondelivery Cordialement Link to comment Share on other sites More sharing options...
vmulot Posted October 29, 2012 Share Posted October 29, 2012 (edited) Bonjour, je me suis basé sur le canvas qui est ma fois for pratique ! J'ai cependant un petit soucis, et je pense que je dois pas avoir les yeux en face des trous. Edit: Dans la liste, la suppression, ne supprime pas... (pourtant l'id est bien dans les paramètres de l'url) =>autant pour moi pour la suppression, c'est ok, me manquait la bonne méthode et l'édition, ne me charge pas les données (pareil l'id est bien fournit) => du coup je pense que c'est la même chose que pour la suppression. Par contre que je fais "add" il ne me créé pas un nouvel id, il update le premier enregistrement... une petite idée d'où cela pourrait provenir ? merci ! Edited October 29, 2012 by vmulot (see edit history) Link to comment Share on other sites More sharing options...
Prestaspirit Posted October 29, 2012 Share Posted October 29, 2012 Bonjour, Si l'id est passé en paramètre alors il update, sinon il insert. Il faut tester l’existence de l'id pour être sur. Link to comment Share on other sites More sharing options...
vmulot Posted October 29, 2012 Share Posted October 29, 2012 (edited) Merci pour ta réponse. Pour que l'édit et le delete fonctionne sur la liste, j'ai rajouter dans le postProcess le test if(Tools::isSubmit('delete'.$this->table)) etc etc. C'est juste que je sortais d'un truc fait avec CakePhp et que c'est beaucoup plus automatique Edit, ok j'ai vraiment pas les yeux en face des trous j'avais mal écrit mon $this->className = dans le construct de mon admin controller, donc forcément... Merci Prestaspirit, ça m'a permis de trouver mon erreur Edited October 29, 2012 by vmulot (see edit history) Link to comment Share on other sites More sharing options...
Prestaspirit Posted October 29, 2012 Share Posted October 29, 2012 Je t'en prie ! Prestashop commence réellement à ce rapprocher de cake avec la version 1.5, tout ou presque est automagic maintenant, par exemple pour supprimer et éditer tu peut aussi indiquer l'action comme ceci: $this->action = 'delete'; Le controller devrait comprendre sans problème, ont peut aussi créer nos propres actions comme ça: $this->action = 'delete_item'; et ensuite créer une méthode processDeleteItem() et faire ce qu'on veux dedans, j'ai testé dans les controllers admin mais dans les controllers du front ça doit être le même principe Link to comment Share on other sites More sharing options...
vmulot Posted October 29, 2012 Share Posted October 29, 2012 Je pensais avoir résolu mon problème, mais je me rend compte finalement, que ce coup-ci l'édition, n'update pas, mais créé un nouvel enregistrement... je vais y arriver un jour ! comment utilises tu le $this->action ? dans le postProcess en fonction du submit ? Link to comment Share on other sites More sharing options...
Matt75 Posted October 29, 2012 Share Posted October 29, 2012 Bonjour, Voici mon postProcess() qui fonctionne pour l'ajout, modification et suppression. public function postProcess() { if ($this->action == 'save') { $id = (int)(Tools::getValue('id_'.$this->table)); /* Object update */ if (isset($id) && !empty($id)) { $object = new $this->className($id); if (Validate::isLoadedObject($object)) { $this->copyFromPost($object, $this->table); $result = $object->update(false, false); if (!$result) $this->errors[] = Tools::displayError('An error occurred while updating object.').' <b>'.$this->table.'</b>'; else Tools::redirectAdmin(self::$currentIndex.'&id_'.$this->table.'='.$object->id.'&conf=4'.'&token='.$this->token); } else $this->errors[] = Tools::displayError('An error occurred while updating object.').' <b>'.$this->table.'</b> '.Tools::displayError('(cannot load object)'); } /* Object creation */ else { $object = new $this->className(); $this->copyFromPost($object, $this->table); if (!$object->add()) $this->errors[] = Tools::displayError('An error occurred while creating object.').' <b>'.$this->table.'</b>'; else Tools::redirectAdmin(self::$currentIndex.'&id_'.$this->table.'='.$object->id.'&conf=3'.'&token='.$this->token); } } else parent::postProcess(); } Cordialement Link to comment Share on other sites More sharing options...
DrÿSs' Posted October 29, 2012 Share Posted October 29, 2012 Pourquoi dupliquer la méthode postProcess() qui existe déjà dans la classe mère AdminController ? Il n'y a aucune méthode postProcess() à déclarer dans un contrôleur admin, à part si on veut la surcharger pour y ajouter/changer le comportement de la classe mère. Link to comment Share on other sites More sharing options...
Matt75 Posted October 29, 2012 Share Posted October 29, 2012 Exact, dans mon cas j'ai retiré les lignes spécifiques à mon module avant de fournir mon code, je ne sais pas si vmulot a besoin, comme moi de surcharger la méthode postProcess(). Link to comment Share on other sites More sharing options...
vmulot Posted October 29, 2012 Share Posted October 29, 2012 Il me pose un problème avec l'id_shop, c'est pour cela que j'avais tout de même surchargé le postProcess. j'ai du encore passer à côté de qq chose alors ou récupère tu cet id_shop du coup ? par avance merci Link to comment Share on other sites More sharing options...
DrÿSs' Posted October 29, 2012 Share Posted October 29, 2012 @Matt75: je te déconseille de dupliquer le code de la méthode de la classe mère postProcess(). Non seulement c'est pas très propre (doublon de lignes de code dans deux fichiers), et en plus cela pourrait t’empêcher de bénéficier des mises à jour/corrections de bugs de la classe mère si tu met à jour ta boutique. Je privilégierais plutôt le rappel de la classe mère avec un parent::postProcess(), puis l'ajout de ton comportement spécifique (ou inversement dans l'ordre d’exécution). Link to comment Share on other sites More sharing options...
Matt75 Posted October 29, 2012 Share Posted October 29, 2012 @Matt75: je te déconseille de dupliquer le code de la méthode de la classe mère postProcess(). Non seulement c'est pas très propre (doublon de lignes de code dans deux fichiers), et en plus cela pourrait t’empêcher de bénéficier des mises à jour/corrections de bugs de la classe mère si tu met à jour ta boutique. Je privilégierais plutôt le rappel de la classe mère avec un parent::postProcess(), puis l'ajout de ton comportement spécifique (ou inversement dans l'ordre d’exécution). Effectivement, je viens de faire la correction dans mon code Link to comment Share on other sites More sharing options...
DrÿSs' Posted October 29, 2012 Share Posted October 29, 2012 (edited) @vmulot : normalement c'est géré là aussi par la classe mère AdminController. Tu dois le préciser dans la classe de ton objet, lors des définitions. Exemple avec la classe Product : class ProductCore extends ObjectModel { [...] public static $definition = array( 'table' => 'product', 'primary' => 'id_product', 'multilang' => true, 'multilang_shop' => true, La table SQL liée à cette classe doit bien sûr supporter une colone id_shop. Edited October 29, 2012 by DrÿSs' (see edit history) Link to comment Share on other sites More sharing options...
vmulot Posted October 29, 2012 Share Posted October 29, 2012 j'ai peut-être mal fait mes tables SQL alors, parce que j'avais bien le 'multilang'=>true mais quand je rajoute 'multilang_shop'=> true j'ai une erreur (il ne trouve pas id_shop dans la table de langue). j'ai fais une table ps_monmodule('id_monmodule','id_shop') et une table ps_monmodule_lang('id_monmodule','id_lang','champ1','champ2') j'avais repris ça d'un autre module, quelle serait la bonne chose à faire du coup ? parce que si je rajoute le id_shop dans la ps_monmodule_lang, ma premiere table n'auras plus que l'id, c'est un peu bizarre non ? Link to comment Share on other sites More sharing options...
DrÿSs' Posted October 29, 2012 Share Posted October 29, 2012 (edited) Autant pour moi, le multilang_shop permet d'activer un multilang différent par shop. Il te faudrait donc un id_shop dans ta table de langue. Bref c'est pas ce que tu demandais initialement. Je n'ai pas encore testé le multishop sur une classe/contrôleur, je regarde ça Edited October 29, 2012 by DrÿSs' (see edit history) Link to comment Share on other sites More sharing options...
DrÿSs' Posted October 29, 2012 Share Posted October 29, 2012 As-tu activé le multishop dans ta boutique ? (Préférences > Générales) Link to comment Share on other sites More sharing options...
DrÿSs' Posted October 29, 2012 Share Posted October 29, 2012 (edited) Il faut activer le multiboutique avec au moins deux boutiques. Ensuite, dans la classe (modèle), il faut préciser pour chaque champ s'il est multishop (dans les définitions) : public static $definition = array( 'table' => 'product', 'primary' => 'id_product', 'fields' => array( 'id_category_default' => array('type' => self::TYPE_INT, 'shop' => true, 'validate' => 'isUnsignedId')) ); Et enfin il faut avoir une table "product_shop" associée (pour la classe Product dans notre exemple), avec comme colonne id_product / id_shop / id_category_default / champs_2 / champs_3 / etc. Au final, tout devrait se faire automatiquement via le contrôleur d'admin. Edited October 29, 2012 by DrÿSs' (see edit history) Link to comment Share on other sites More sharing options...
vmulot Posted October 29, 2012 Share Posted October 29, 2012 Ok, donc si je n'ai pas besoin du multishop, je vire mon id_shop. Si je veux développer un module "multibootique complient" je regarderais ça. Merci encore pour l'aide ! Link to comment Share on other sites More sharing options...
DrÿSs' Posted October 29, 2012 Share Posted October 29, 2012 Ouip c'est bien cela ! Je suis pas très fan du système multiboutique, on a pas de vrai séparation du contenu sur les produits par exemple, ça se limite au caractéristiques qui peuvent changer. Link to comment Share on other sites More sharing options...
luger95 Posted November 5, 2012 Share Posted November 5, 2012 Bonjour, J'ai suivit cette super arboresense, afin de créer mon module, cependant, lorsque j'ajoute l'administration à mon menu admin, j'ai le droit à une super erreur que je n'arrive pas à corriger : Le contrôleur adminmenuconceptcontroller est manquant ou non valable. Or mon fichier possède bien le classe en question. monsite/modules/menuconcept/controllers/admin/AdminMenuConceptController.php Possédant donc la class => AdminMenuConceptController extends ModuleAdminController J'ai tout essayé, lors de la déclaration du module dans Administration->Menus->Créez J'ai mis donc la class AdminMenuConceptController mais je suis confronté à ce problème, ensuite, j'ai essayé en spécifiant le nom du dossier du Modules "menuconcept" Alors es que je ne me suis pas trompé de dossier module ? Quesqui ne va pas ? Merci par avance. Link to comment Share on other sites More sharing options...
DrÿSs' Posted November 5, 2012 Share Posted November 5, 2012 Salut ! Il faut mettre "AdminMenuConcept" (sans le Controller à la fin) comme nom de classe dans les propriétés de ton menu. Ça devrait marcher ! 1 Link to comment Share on other sites More sharing options...
luger95 Posted November 6, 2012 Share Posted November 6, 2012 Merci DrySs pour ta réponse, cependant, je rencontre toujours une erreur : Fatal error: Class 'adminmenuconceptcontrollerController' not found in... Sachant que dans le champ class j'ai mis AdminMenuConcept et dans module menuconcept. Une idée ? Link to comment Share on other sites More sharing options...
DrÿSs' Posted November 6, 2012 Share Posted November 6, 2012 Très étrange, car tu as deux fois "controller",il y est en trop quelque part. Vérifie bien tout une nouvelle fois Link to comment Share on other sites More sharing options...
prof shadoko Posted November 7, 2012 Share Posted November 7, 2012 Bonjour, est il possible de rajouter une classe de style au niveau du tr voir du td dans function renderList() ? Je n'arrive pas à trouver cela. Merci Link to comment Share on other sites More sharing options...
luger95 Posted November 8, 2012 Share Posted November 8, 2012 Il n'y a pour moi aucune erreur :s Le nom de mon fichier du coup doit-être le même que ma class ? Link to comment Share on other sites More sharing options...
DrÿSs' Posted November 8, 2012 Share Posted November 8, 2012 Onglet : - Nom : Mon onglet - Classe : AdminMenuConcept - Module : menuconcept Fichier : monsite/modules/menuconcept/controllers/admin/AdminMenuConceptController.php Classe : AdminMenuConceptController extends ModuleAdminController Si tout correspond, envoie-moi ton module à [email protected] que je regarde en local 1 Link to comment Share on other sites More sharing options...
DrÿSs' Posted November 8, 2012 Share Posted November 8, 2012 (edited) @prof shadoko: Tu ne peux pas sur le TR, par contre tu peux sur le TD en usurpant le paramètre align, qui en fait inclut la valeur du paramètre comme classe CSS : $this->fields_list = array( 'name' => array( 'title' => $this->l('Name'), 'align' => 'maClasse' )); Tu peux sinon utiliser la callback : $this->fields_list = array( 'name' => array( 'title' => $this->l('Name'), 'callback' => 'maCallback' )); static public function maCallback($value, $tr) { if ($value) return $value; $product = new Product(intval($tr['id_product'])); return $product->name; } Edited November 8, 2012 by DrÿSs' (see edit history) Link to comment Share on other sites More sharing options...
luger95 Posted November 8, 2012 Share Posted November 8, 2012 Merci Dryss Link to comment Share on other sites More sharing options...
prof shadoko Posted November 9, 2012 Share Posted November 9, 2012 $this->fields_list = array( 'name' => array( 'title' => $this->l('Name'), 'callback' => 'maCallback' )); static public function maCallback($value, $tr) { if ($value) return $value; $product = new Product(intval($tr['id_product'])); return $product->name; } C'est parfait le callback pour mon cas. Merci Dryss pour ta réponse Link to comment Share on other sites More sharing options...
galerien Posted November 10, 2012 Share Posted November 10, 2012 Dryss Pour avoir galéré de nombreuse heure à chercher à comprendre ces ****** de construction de module (y a vraiment un manque de doc sur les pre requis pour construire un module en utilisant les fonctions intégrés de Prestashop), c'est normal qu'il obtienne l'erreur qu'il ne trouve pas la classe. La vrai structure doit être : Onglet : - Nom : Mon onglet - Classe : AdminMenuConcept - Module : menuconcept Fichier : monsite/modules/menuconcept/controllers/admin/AdminMenuConcept.php et surtout pas comme tu l'indiques monsite/modules/menuconcept/controllers/admin/AdminMenuConceptController.php Classe : AdminMenuConceptController extends ModuleAdminController 1 Link to comment Share on other sites More sharing options...
DrÿSs' Posted November 10, 2012 Share Posted November 10, 2012 (edited) Salut, en fait normalement c'est avec "controller" à la fin, mais effectivement les deux marchent. Le dispatcheur va lister les fichiers présents dans le dossier de ton module, et remplacer "controller.php" par ".php". Ensuite, il supprime l'extension ".php" du nom du fichier. Ainsi, que ton fichier s'appelle "AdminMenuConceptController.php" ou "AdminMenuConcept.php", il ne restera au final que "AdminMenuConcept" pour faire la correspondance avec le nom de l'onglet. Mais à la base, la solution gère les nom avec "Controller.php" à la fin Edited November 10, 2012 by DrÿSs' (see edit history) 1 Link to comment Share on other sites More sharing options...
Ninja Of Web Posted November 11, 2012 Share Posted November 11, 2012 C'est fait => https://github.com/P...e-Prestashop-15 Met peut être le lien dans le premier post pour que ceux qu'il veulent forker puisse voir le lien de suite. Bonjour, Tous d'abord Merci J. Danse pour ce canvas C'est bien la dernière version ou pas ? La version GIT est-elle maintenu ? Loïc. Link to comment Share on other sites More sharing options...
Ninja Of Web Posted November 11, 2012 Share Posted November 11, 2012 Dommage que ce petit projet ne soit pas maintenu... Tous ce que je sais, c'est que vous n'aller pas tarder à voir débarquer git pour PrestaShop 1.5 (Cf. https://twitter.com/...1681408/photo/1) Je vois que maintenant c'est devenu public de quoi se réjouir non? Si mes souvenir sont bon, la communauté pourra dans les mois avenirs commiter sur PrestaShop Bonne news non ? Loïc. Link to comment Share on other sites More sharing options...
DrÿSs' Posted November 11, 2012 Share Posted November 11, 2012 Ouai enfin Git ou SVN, ça reste la même chose au final : j'espère que n'importe qui ne pourra pas commit n'importe quoi n'importe quand... (Déjà que de base le code PrestaShop c'est un bon merdier ) Link to comment Share on other sites More sharing options...
Ninja Of Web Posted November 11, 2012 Share Posted November 11, 2012 Ouai enfin Git ou SVN, ça reste la même chose au final : j'espère que n'importe qui ne pourra pas commit n'importe quoi n'importe quand... (Déjà que de base le code PrestaShop c'est un bon merdier ) Ne va pas croire qu'il vont te laisser développer sans tester et vérifié ton code Il y aura très certainement un ou plusieurs développeur derrière. Loïc. Link to comment Share on other sites More sharing options...
DrÿSs' Posted November 15, 2012 Share Posted November 15, 2012 Apparemment oui, il y aura une validation derrière. Ouf ! Link to comment Share on other sites More sharing options...
J. Danse Posted November 15, 2012 Author Share Posted November 15, 2012 Dommage que ce petit projet ne soit pas maintenu... J'ai laissé exprès la création d'un compte pour réaliser la maintenance (beaucoup de demandes, pas trop de temps et surtout plus de PC pour finaliser les commits moi-même. N'hésitez pas à le faire ! Link to comment Share on other sites More sharing options...
Ninja Of Web Posted November 15, 2012 Share Posted November 15, 2012 Dryss, bien d'accord avec toi J.danse, tous le monde à des projets je te promet pas que je serait a fond sur celui-ci mais je contribuerai ! Peut -tu mettre l'url d'accès dans ton premier post ? Thx par avance ! Loic. Link to comment Share on other sites More sharing options...
J. Danse Posted November 15, 2012 Author Share Posted November 15, 2012 Je pensais l'avoir fait ! Dès que j'aurais un PC pour assurer le suivi, je reprendrais ce fil Link to comment Share on other sites More sharing options...
J. Danse Posted November 26, 2012 Author Share Posted November 26, 2012 Maintenant que je comprends le fonctionnement de GitHub et ai un PC à disposition (même si pas pratique), j'ai moi-même forké le module. N'hésitez donc pas ! Link to comment Share on other sites More sharing options...
vmulot Posted December 6, 2012 Share Posted December 6, 2012 Hello ! je reviens un peu à la charge pour une fonctionnalité qui je crois n'est pas dans le module et qui serait peut-être intéressante. Dans le back office du module (la page de listing des enregistrements), j'ai rajouté la fonctionnalité de publié/dépublié assez facilement, en prenant example sur la partie Catégories. Prestashop le gère presque tout seul. En revanche, je cherche maintenant a gérer l'ordre de mes enregistrements avec le champ "position", mais il ne me semble pas que Presta, ce coup-ci le gère tout seul. Une idée de comment procéder ? j'ai créé mon champ "position" dans ma table, ajouté au model, pour l'instant dans l'admin, j'ai le numéro de la position, et pas les petites flèches pour monter/descendre. Si vous l'avez déjà réalisé, je veux bien une idée ou un conseil pour le faire Merci ! Link to comment Share on other sites More sharing options...
J. Danse Posted December 6, 2012 Author Share Posted December 6, 2012 Normalement, si le position est mis ainsi: $this->fields_list['position'] = array( 'title' => $this->l('Position'), 'width' => 70, 'align' => 'center', 'position' => 'position' ); Cela devrait être bon Link to comment Share on other sites More sharing options...
vmulot Posted December 6, 2012 Share Posted December 6, 2012 ouais c'est ce que j'ai, mais il ne m'affiche que les numéro et pas les flèches Link to comment Share on other sites More sharing options...
doekia Posted December 6, 2012 Share Posted December 6, 2012 Tu dois fournir des methodes updatePosition cleanPosition .... a ton objet et éventuellement les methodes postProcessPosition et postProcessAjaxPosition dans le controlleur Link to comment Share on other sites More sharing options...
vmulot Posted December 6, 2012 Share Posted December 6, 2012 (edited) Je vais regarder ça, il faut donc que j'adapte ces méthodes, ce n'est pas "automatique" comme pour l'option "active" Edit, c'est mieux mais pas encore tout à fait ça, l'url d'une fleche, est la suivante : http://monsite.fr/monadminpresta/index.php?controller=adminmonmodule&=3&way=0&position=1&token=b7b32c414906f2b7b1849b2361f4835b &=3 devrait etre id_matable=3 j'imagine, mais je ne vois pas ou se situe mon pb, je vais continuer d'investiguer Merci en tout cas pour les infos ! Edited December 6, 2012 by vmulot (see edit history) Link to comment Share on other sites More sharing options...
J. Danse Posted December 11, 2012 Author Share Posted December 11, 2012 Sachant que ça peut servir à certain: http://doc.prestashop.com/display/PS15/Helpers Link to comment Share on other sites More sharing options...
J. Danse Posted December 23, 2012 Author Share Posted December 23, 2012 La version 1.5 du module avec des compléments d'infos est disponible (ici dans le sujet et bientôt sur le GitHub du module). Link to comment Share on other sites More sharing options...
Myst26 Posted February 5, 2013 Share Posted February 5, 2013 Bonjour, Ne manquerait-il pas le dossier SQL ? Link to comment Share on other sites More sharing options...
dimb Posted February 11, 2013 Share Posted February 11, 2013 (edited) Bonjour, ce n'est peut-être pas de mon niveau mais j'ai voulu comprendre comment fonctionnait les modules sous prestashop 1.5 et j'ai beaucoup de difficulté pour trouver de la documentation pour m'aider à comprendre. J'ai suivi le tutoriel de prestarocket (qu'on retrouve sur la doc 1.5 anglophone) qui permettait, en utilisant la structure de prestashop de créer un petit module pour laisser ses avis, et de les visualiser et activer en back-office. Très clair. Mais ça reste spécifique, j'ai donc voulu utiliser le bouton "add new" dans le controlleur de back office, ou bien savoir comment fonctionnait ce controlleur. Je suis finalement tombé sur ce canvas qui semble suivre la même construction de module mais j'ai toujours du mal avec ce back-office. Bref, J'ai toujours eu du mal à travailler si je ne comprenais pas la totalité de sur quoi je travaillais :-/ et donc j'aurais encore quelques interrogations. c'est bien la fonction renderForm() qui permet l'affichage du formulaire "add new" ? la methode postProcess() "permet" elle la modification/visualisation des lignes? quand utilise t-on l'ajax dans le back-office? (je pensais à une recherche des informations ou autre mais il faut "entrer". Plus globalement comment connait-on la syntaxe pour tout ça? Je me doute que ça ne s'apprend pas en un jour et que c'est un métier. Mais étant débutant j'aurais pensé qu'une doc "officielle" était un peu plus présente pour appréhender. Je ne sais par où "commencer". Je partais de l'idée de comprendre une grosse majorité du fonctionnement de prestashop avant de créer un module specifique. Maintenant même l'inverse me semble pas aisé. Par exemple si je voulais ajouter dans le tutoriel d'opinion la fonctionalité du bouton "ajouter", je ne saurais comment m'y prendre (notamment pour afficher les clients à choisir par ex). :-o. Edited February 11, 2013 by dimb (see edit history) Link to comment Share on other sites More sharing options...
Myst26 Posted February 14, 2013 Share Posted February 14, 2013 (edited) Bonjour, Dans la fonction postProcess() du module, comment gere t-on la suppresion et l'update? L'update me duplique simplement l'objet éditer et delete ne fais rien du tout. Est-ce que quelqu'un sait comment gérer ces deux fonctionnalités? edit : la fonction postprocess ecrase la fonction parent et enleve plein de fonctionnalité natif ( tri, filtre, delete, update) j'ai simplement supprimer cette fonction et tout marche correctement. Edited February 14, 2013 by Myst26 (see edit history) Link to comment Share on other sites More sharing options...
J. Danse Posted February 14, 2013 Author Share Posted February 14, 2013 De fait, il manque plein de choses, tel que simplement un "parent::postProcess()". Il s'agit vraiment d'un canvas exemple, de documentations. Ce n'est pas un canvas utilisable en l'état, purement et simplement. Cela viendra p-e Link to comment Share on other sites More sharing options...
l2c2 Posted February 17, 2013 Share Posted February 17, 2013 Bonjour, Ne manquerait-il pas le dossier SQL ? Si en effet, c'est domage. Du coup pour palier à ça j'ai crée un dossier sql avec un fichier install.php contenant <?php $sql = array(); ?> Il y a aussi une erreur dans la fonction displayForm de example.php, il manque un if(isset($errors)) $this->context->smarty->assign('errors', $errors); else $errors = array(); pour que le template "configure.tpl" puisse s'afficher. Globalement c'est une super idée (merci J. Danse) ce modèle de base pour un module mais il reste des éléments manquants qui empechent de le tester en l'état 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