Jump to content

hiroshi

Members
  • Posts

    28
  • Joined

  • Last visited

About hiroshi

  • Birthday 07/22/1984

Profile Information

  • Location
    Strasbourg
  • Activity
    Developer

hiroshi's Achievements

Newbie

Newbie (1/14)

3

Reputation

  1. Merci ManiT4c mais graphismoweb avait répondu à mon souci. Et pour le problème d'erreur 500 il faut bien commencé par quelque par afin d'avoir un message d'erreur, quitte a mettre du die() un peu partout, afin d'isolé et corriger le problème. Pour l'instant j'essaie déjà de savoir s'il réussi a avoir un retour d'erreur avec le debug. Cordialement,
  2. Merci infiniment Graphismoweb !!! au cas ou, à tu activé les retours d'erreur dans /config/defines.inc.php ? define('_PS_DEBUG_SQL_', true); Quel est ton hébergeur ?
  3. J'ai bien regardé ça. Voici quelque screen pour montrée un peu mes configs :
  4. Bien le bonjour, Voila déjà un certain temps que je ne comprend pas pourquoi, je n'arrive pas à avoir un second transporteur d'affiché sur le front office. Je suivi pas à pas ceci : http://doc.prestasho...?pageId=3506306 pour être sur de n'avoir rien oublier... mais rien n'y change... Alors j'ai besoin de lumière ou de corde. Cordialement,
  5. Enfin nous allons nous intéresser à la partie front. Tout d'abord afin d'avoir une notion de groupe sur l'intégralité du site (car je n'ai pas trouvé de variable sur le current groupe pré-enregistrer dans le smarty) nous allons ajouter dans le fichier /override/classes/controller/FrontController.php : public function initContent() { $this->context->smarty->assign('currentGroups', $this->getCurrentGroup()); parent::initContent(); } public function getCurrentGroup() { if($this->context->customer->isLogged()) { $current_groups=$this->context->customer->getGroups(); } else { $current_groups=array(Configuration::get('PS_UNIDENTIFIED_GROUP')); } return $current_groups; } Nous aurons ainsi pour toute nos page de template la variable {$currentGroups} qui correspond a un tableau. Nous allons surclasser la class product pour y ajouter les éléments voulu (/override/classes/Product.php) : class Product extends ProductCore { public $groups; public function __construct($id_product = null, $full = false, $id_lang = null, $id_shop = null, Context $context = null) { if($id_product!=null) { $this->groups=$this->getProductGroupFull($id_product); } parent::__construct($id_product, $full, $id_lang, $id_shop, $context); } public function getProductGroupFull($id_product = '') { $groups = array(); $result = Db::getInstance()->executeS(' SELECT pg.`id_group`, pg.`etat` FROM '._DB_PREFIX_.'product_group pg WHERE pg.`id_product` = '.(int)$id_product ); foreach ($result as $group){ $groups[$group['id_group']] = $group['etat']; } return $groups; } /* fonction de remonté des variable dans la partie liste de produits (valable aussi pour les packs) */ public static function getProductProperties($id_lang, $row, Context $context = null) { if (!$row['id_product']) return false; $newgroups=self::getProductGroupFull($row['id_product']); if(empty($newgroups)){$newgroups=array(1=>0);} $row['groups']=$newgroups; return parent::getProductProperties($id_lang, $row, $context); } } Avec ce code nous pouvons interagir sur la partie produit et sur la partie listes des produits mais pour ma part, je n'ai fait que la partie listes pour allez au plus vite (nous pouvons toujours après cela renforcer avec des test et des redirections). Voici mon ajout dans la partie /theme/mon_theme/product-list.php : {if isset($products)} <!-- Products list --> <div> <ul id="product_list" class="clear"> {foreach from=$products item=product name=products} {assign var=viewProduct value=false} {foreach from=$product['groups'] item=group key=groupkey} {foreach from=$currentGroups item=cgroup} {if $groupkey==$cgroup && $group} {assign var=viewProduct value=true} {/if} {/foreach} {/foreach} {if $viewProduct} <li class="ajax_block_product {if $smarty.foreach.products.first}first_item{elseif $smarty.foreach.products.last}last_item{/if} {if $smarty.foreach.products.index % 2}alternate_item{else}item{/if} clearfix"> [...]tout le contenu[...] </li> {/if} {/foreach} <li class="clear clearfix"></li> </ul> </div> <!-- /Products list --> {/if} Et vous avez une mini gestion des groupe associer a vos produits. Merci de m'avoir lu et a bientôt. Cordialement,
  6. Ensuite pour enregistrer les éléments sélectionné en base de donnée nous devons reprendre notre petit fichier /override/controllers/admin/AdminProductsController.php et y ajouter : /** Les trois fonctions suivante sont plus ou moins sur le modèle des associations **/ /* fonction de modifications des éléments en base de donnée **/ public function updateGroups($product, $groups) { $this->cleanGroups($product); $this->addGroups($product, $groups); } /* fonction de suppressions des éléments en base de donnée **/ public function cleanGroups($product) { Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'product_group` WHERE `id_product` = '.(int)$product->id); } /* fonction d'ajouts des éléments en base de donnée **/ public function addGroups($product, $groups) { foreach ($groups as $group) { $row = array('id_product' => (int)$product->id, 'id_group' => (int)$group['id'], 'etat' => (int)$group['etat']); Db::getInstance()->insert('product_group', $row); } } /* fonction de traitement des donnée récupéré du formulaire pour les ranger dans un tableau comme je le souhaite pour l'ajout en base de donnée */ public function addFormGroups($product) { $groups = Group::getGroups(Context::getContext()->language->id); $mygroups=array(); if(isset($_POST['groupBox'])) { foreach($_POST['groupBox'] as $gb) { foreach($groups as $group) { if($gb==$group['id_group']) { $mg=array(); $mg['id']=$gb; $mg['etat']=true; $mygroups[]=$mg; } } } } $this->updateGroups($product, $mygroups); } /* fonction appeler à l'envois du formulaire lors de l'ajout d'un produits */ public function processAdd() { $this->checkProduct(); if (!empty($this->errors)) { $this->display = 'add'; return false; } $this->object = new $this->className(); $this->_removeTaxFromEcotax(); $this->copyFromPost($this->object, $this->table); $groups = Group::getGroups(Context::getContext()->language->id); $mygroups=array(); foreach($groups as $group) { $mg=array(); $mg['id']=$group['id_group']; $mg['etat']=true; $mygroups[]=$mg; } if ($this->object->add()) { $this->addGroups($this->object, $mygroups); } parent::processAdd(); } /* fonction appeller lors de la modifications des produits */ public function processUpdate() { $this->checkProduct(); if (!empty($this->errors)) { $this->display = 'edit'; return false; } $id = (int)Tools::getValue('id_'.$this->table); /* Update an existing product */ if (isset($id) && !empty($id)) { $object = new $this->className((int)$id); $this->object = $object; if (Validate::isLoadedObject($object)) { $this->_removeTaxFromEcotax(); $this->copyFromPost($object, $this->table); $object->indexed = 0; if (Shop::isFeatureActive() && Shop::getContext() != Shop::CONTEXT_SHOP) $object->setFieldsToUpdate((array)Tools::getValue('multishop_check')); if ($object->update()) { if (in_array($this->context->shop->getContext(), array(Shop::CONTEXT_SHOP, Shop::CONTEXT_ALL))) { if ($this->isTabSubmitted('Groups')) $this->addFormGroups($object); } } } } parent::processUpdate(); } à partir de ce moment vous avez l'ajout et la modification de vos éléments qui sont pris en compte.
  7. bonjour, Ces derniers jours j'ai passer un certain temps à modifier ce cher prestashop 1.5 afin d'avoir une gestion des groupes sur les produit eux même et pas seulement sur les catégories. Je vais partager mon travail pour en premier lieu aidé ceux qui le veulent, et aussi pour peut-être améliorer mon code fait un peu à la rash. Tout d’abord j'ai fait la modification en partie admin afin d'obtenir ceci : En premier lieu il nous faut ajouter la table en base de donnée : CREATE TABLE IF NOT EXISTS `PREFIX_product_group` ( `id_group` int(11) NOT NULL, `id_product` int(11) NOT NULL, `etat` tinyint(1) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; Ensuite nous allons préparer la récupération des donnée de cette base de donnée pour l'inclure et l'affiché dans une partie de l'administration du produit. Pour ma part j'ai choisi dans la partie association car cette partie n'est pas trop charger(sachant que ma partie description est déjà blinder d'ajout) et il s'agit de la partie qui correspond le mieux à cette partie. Donc nous allons ouvrir notre joli fichier /override/controllers/admin/AdminProductsController.php ​et y surclasser une fonction complète (car c'est un peu beaucoup enchevêtrer) : public function initFormAssociations($obj) { $product = $obj; $data = $this->createTemplate($this->tpl_form); // Prepare Categories tree for display in Associations tab $root = Category::getRootCategory(); $default_category = Tools::getValue('id_category', Context::getContext()->shop->id_category); if (!$product->id || !$product->isAssociatedToShop()) $selected_cat = Category::getCategoryInformations(Tools::getValue('categoryBox', array($default_category)), $this->default_form_language); else { if (Tools::isSubmit('categoryBox')) $selected_cat = Category::getCategoryInformations(Tools::getValue('categoryBox', array($default_category)), $this->default_form_language); else $selected_cat = Product::getProductCategoriesFull($product->id, $this->default_form_language); } /** Ajout par rapport à la fonction de base Gestion des groupes existant et récupération des informations en base de donnée **/ /* on parcours tout les groupe existant et on en fait une liste */ $groups = Group::getGroups(Context::getContext()->language->id); $selected_group=array();/* tableau des groupe selectionné pour notre produit*/ if (!$product->id) { foreach($groups as $group) { $selected_group['groupBox_'.$group['id_group']]=true; } } else { $prod_groups=Product::getProductGroupFull($product->id); if(empty($prod_groups)) { foreach($groups as $group) { $selected_group['groupBox_'.$group['id_group']]=true; } } else { foreach($groups as $group) { if(isset($prod_groups[$group['id_group']]) && $prod_groups[$group['id_group']]) { $selected_group['groupBox_'.$group['id_group']]=true; } else { $selected_group['groupBox_'.$group['id_group']]=false; } } } } /** Fin de l'ajout **/ // Multishop block $data->assign('feature_shop_active', Shop::isFeatureActive()); $helper = new HelperForm(); if ($this->object && $this->object->id) $helper->id = $this->object->id; else $helper->id = null; $helper->table = $this->table; $helper->identifier = $this->identifier; // Accessories block $accessories = Product::getAccessoriesLight($this->context->language->id, $product->id); if ($post_accessories = Tools::getValue('inputAccessories')) { $post_accessories_tab = explode('-', Tools::getValue('inputAccessories')); foreach ($post_accessories_tab as $accessory_id) if (!$this->haveThisAccessory($accessory_id, $accessories) && $accessory = Product::getAccessoryById($accessory_id)) $accessories[] = $accessory; } $data->assign('accessories', $accessories); $product->manufacturer_name = Manufacturer::getNameById($product->id_manufacturer); $tab_root = array('id_category' => $root->id, 'name' => $root->name); $helper = new Helper(); $category_tree = $helper->renderCategoryTree($tab_root, $selected_cat, 'categoryBox', false, true, array(), false, true); /** Ajout par rapport à la fonction de base J'ai ajouté les variable groups_tree et groups_selected à l'assign **/ $data->assign(array('default_category' => $default_category, 'groups_tree' => Group::getGroups(Context::getContext()->language->id), 'groups_selected' => $selected_group, 'selected_cat_ids' => implode(',', array_keys($selected_cat)), 'selected_cat' => $selected_cat, 'id_category_default' => $product->getDefaultCategory(), 'category_tree' => $category_tree, 'product' => $product, 'link' => $this->context->link, 'is_shop_context' => Shop::getContext() == Shop::CONTEXT_SHOP )); /** Fin de l'ajout **/ $this->tpl_form_vars['custom_form'] = $data->fetch(); } Et enfin nous allons surclasser le template admin présent dans /admin/theme/default/templates/controllers/products/associations.tpl par le fichier /override/controllers/admin/templates/products/associations.tpl. Si ce fichier n'existe pas, le créer à partir du fichier de base. Vous allez vous placer juste avant le second "<div class="separation"></div>" (ctrl+f : separation). et ajouter : <div class="separation"></div> <input type="hidden" name="submitted_tabs[]" value="Groups" /> <table> <tr> <td class="col-left"> {include file="controllers/products/multishop/checkbox.tpl" field="category_box" type="category_box"} <label for="category_block">{l s='Group access:'}</label> </td> <td class="col-right"> <div id="category_block"> {include file="helpers/form/form_group.tpl" groups=$groups_tree fields_value=$groups_selected} </div> </td> </tr> </table> A partir de ce moment vous avez un joli formulaire avec une récupération des données mais aucune possibilité d'enregistrer.
  8. Alors là, infiniment merci !!!! Bon je me recycle en vendeur de corde pour ceux qui veulent
  9. Bonjour, Je me retrouve avec un petit problème idiot, quand je souhaite surclassé une fonction static dans une class, il ne fait plus rien... pour exemple dans mon fichier /override/classes/Product.php je souhaite ajouté des éléments a la fonction getProductProperties mais dès que je met ça : public static function getProductProperties($id_lang, $row, Context $context = null) { parent::getProductProperties($id_lang, $row, $context); } Je n'ai plus de remonté dans ma liste de produits. alors que si j'ajoute un die() dans la classe parent (/classes/Product.php) j'ai bien les éléments qui y sont. Est-ce que quelqu'un pourrait m'aiguiller sur mon erreur ? cordialement,
  10. Bonjour, J'ai eu le souci avec une adresse en [email protected] mais un adresse plus ou moins valide (ton adresse perso par exemple) cela devrai fonctionner. Moi par contre j'arrive a m'inscrire, a attribué un groupe a la volé en fonction des champ remplis mais je n'arrive pas à me connecter même si je vois bien le compte dans l'admin et que ce dernier est bien activé. Si quelqu'un à une proposition. Cordialement,
  11. Voici mon dernier élément, pour l'ajout à un groupe automatique j'ai over-classer la classe Customer dans le fichier /override/classes/Customer.php : class Customer extends CustomerCore { public static $initGroupBox=-1; public function updateGroup($list) { $this->cleanGroups(); if(isset(self::$initGroupBox) && self::$initGroupBox>=0) { $this->addGroups(array(self::$initGroupBox)); } else { parent::updateGroup($list); } } } J'espère vous avoir un peu aidé. Cordialement.
  12. Donc j'ai réussi en parti et donc voila une ébauche de ce que j'ai fait. Tout d'abord, afin d'avoir un formulaire comme vous le souhaité, je vous conseil de le faire vous même mais pour les fainéants voici un exemple tiré de mon /theme/mon_theme/authentification.tpl : {* variable pour savoir si nous sommes dans une configuration B2B ou B2C *} {assign var=modeCompany value=false} {if isset($smarty.post.typeofcount) && $smarty.post.typeofcount=='society'}{assign var=modeCompany value=true}{/if} <script type="text/javascript"> {literal} /* fonction pour afficher ou caché les éléments souhaité, dans mon cas il s'agis du fieldset de la partie infos société et du champ société dans l'adresse */ function switchType(valeur) { if(valeur=='society'){ $('.field_company').show(); } else { $('.field_company').hide(); } } {/literal} </script> <p class="select required"> <span>{l s='You are'}</span> <select id="typeofcount" name="typeofcount" onchange="switchType(this.value);"> <option value="individual" {if isset($smarty.post.typeofcount) && $smarty.post.typeofcount=='individual'}selected="selected"{/if}>{l s='An individual'}</option> <option value="society" {if isset($smarty.post.typeofcount) && $smarty.post.typeofcount=='society'}selected="selected"{/if}>{l s='A society'}</option> </select> </p> Et j'ai donc ajouté une class "field_company" aux éléments fieldset des infos companie (ctrl+f sur "{l s='Your company information'}" et c'est la ligne du dessus) et sur le champ Société dans la partie de l'enregistrement de l'adresse (ctrl+f sur " $field_name eq "company"}" et c'est la ligne du dessous). Ensuite dans le fichier /override/controllers/front/AuthController.php vous allez créer un over-classage de la fonction qui permet la vérification des champs uniquement si le champ ajouté via le select est à la valeur souhaité. class AuthController extends AuthControllerCore { protected function processSubmitAccount() { if(isset($_POST['typeofcount']) && $_POST['typeofcount']=='society'){ Customer::$definition['fields']['siret']['required']=true; Customer::$definition['fields']['ape']['required']=true; Customer::$definition['fields']['company']['required']=true; /* Le groupe 4 étant mon groupe de type société */ Customer::$initGroupBox=4; } parent::processSubmitAccount(); } } Maintenant, le second problème pour ma part, c'est l'auto-assignation à un groupe dans la cas ou le SIRET est valide. Je n'ai pas trouvé d'ajout a un groupe. pour le moment. Merci d'avance et à bientôt. Cordialement,
  13. Bonjour, Voila je voudrai ajouté dans ma page d'inscription un select qui aura pour capacité de switcher entre un compte particulier et un compte entreprise. Pour l'instant j'ai fait la partie facile, c'est à dire que mon select fait du .show() et .hide() sur les éléments voulu. Mais maintenant il me faut faire la vérification des champs dans le traitement. C'est pour le cas ou l'on est une entreprise il faut une validation du siret obligatoire. Mais j'ai un peu cherché sans trouvé ou était implémenté la fonction pour l'enregistrement... Alors j'aimerai bien avoir une doc ou tout autre élément pour me précisé dans quel fichier trouvé se que je cherche et au cas ou un nom de fonction. Merci beaucoup d'avance et je mettrai comme d'hab à contribution tout le récapitulatif et un petit tuto une fois mon problème régler. Cordialement,
×
×
  • Create New...