Skip to main content

admin diviser les categories

More
1 year 5 months ago - 1 year 5 months ago #366547 by erickb
-- HikaShop version -- : 5.1.5

Bonjour
dans l admin (index.php?option=com_hikashop&ctrl=product) quand on cree un nouveau produit
il y a une box Catégories (<dd class="hikashop_product_category">) qui est tres dure a gérer, si on a comme dans notre cas, 15 categories avec chacune x sous categories

comment faire pour diviser ca en autant de box categories avec toutes les sous categories visibles ?

tel quel c'est un supplice a utiliser, des heures de boulot et toujours des erreurs et oublis

par exemple diviser le :
Code:
<div style="" data-oresize="data_product_categories" class="namebox-popup-resize namebox-popup-container"> <div id="data_product_categories_otree" class="oTree namebox-popup-content"> <div class="oTreeNode"><img id="data_product_categories_i1" alt="" src="../media/com_hikashop/images/otree/world.png"><a id="data_product_categories_s1" class="node" href="#" onclick="window.oTrees.data_product_categories.sel(1);return false;">racine</a></div> ...

avec la sélection des categotries onclick="window.oTrees.data_product_categories.sel(3)
je pourrais diviser en autant qu il y en a

merci
Last edit: 1 year 5 months ago by erickb.

Please Log in or Create an account to join the conversation.

More
1 year 5 months ago #366550 by nicolas
Bonjour,

Désolé mais j'ai du mal à comprendre la problématique. Pourriez-vous faire des captures d'écran pour illustrer le problème ?

Please Log in or Create an account to join the conversation.

More
1 year 5 months ago - 1 year 5 months ago #366564 by erickb
Replied by erickb on topic admin diviser les categories
actuellement on a ca



et on voudrait ca


toutes les categories séparées avec leurs sous categories en case a cocher
cette box telle qu elle est est épouvantable , c est des heures de boulot a ouvrir et fermer et chercher pour sélectionner une catégorie

par exemple pour la pointure 40 votre code genre ce lien
Code:
<div class="oTreeNode"> <a id="data_product_categories_s17" class="node" href="#" onclick="window.oTrees.data_product_categories.sel(17);return false;">40</a></div>
et on voudrait tout en cases a cocher
ou si cest impossible avoir autant de box que de categories
Last edit: 1 year 5 months ago by erickb.

Please Log in or Create an account to join the conversation.

More
1 year 5 months ago #366566 by nicolas
Bonjour,

ok, c'est plus clair, merci.

Au cas où vous ne seriez pas au courant, savez vous qu'une fois le dropdown de sélection déplié, vous pouvez taper les premiers caractères de la catégorie que vous voulez sélectionner et ainsi vous pouvez facilement la sélectionner sans avoir à chercher ?

Par exemple, pour choisir la couleur, au lieu de:
- cliquer sur le sélecteur
- déplier la catégorie "couleur" en cliquant dessus
- faire défiler la liste des couleurs jusqu'à atteindre la catégorie à sélectionner
- cliquer sur la catégorie

Vous pouvez:
- cliquer sur le sélecteur
- taper sur "b" et "l" sur votre clavier
- vous aurez directement les catégories "blanc" et "bleu" qui apparaitront et vous pourrez directement sélectionner la catégorie en cliquant dessus.

C'est peut être même plus rapide que de devoir faire défiler la page, lire les noms des catégories en diagonale pour trouver la bonne et cliquer sur la case à cocher correspondante.

Qu'en pensez-vous ?

Après, faire votre propre système de sélection avec des cases à cocher, c'est tout à fait possible avec un peu de développement.
Je pense que c'est assez facile pour vous, vu que vous savez coder.
Ce qu'il faut faire, c'est faire un override de product / form pour le template du backend via le menu Affichage>Vues.
Là, supprimez le code qui affiche le sélecteur de catégories actuel:
Code:
<dt class="hikashop_product_category"><label for="data_product_categories_text"><?php echo JText::_('HIKA_CATEGORIES'); ?></label></dt> <dd class="hikashop_product_category"><?php $categories = null; if(!empty($this->product->categories)) $categories = array_keys($this->product->categories); echo $this->nameboxType->display( 'data[product][categories]', $categories, hikashopNameboxType::NAMEBOX_MULTIPLE, 'category', array( 'delete' => true, 'brand' => false, 'sort' => true, 'default_text' => '<em>'.JText::_('HIKA_NONE').'</em>', 'tooltip' => true, ) ); ?></dd>
A la place, vous pouvez écrire un peu de PHP. Par exemple, quelque chose du genre (pas testé):
Code:
<?php $alreadySelected = array_keys($this->product->categories); $db = JFactory::getDBO(); $db->setQuery('SELECT category_id, category_name WHERE #__hikashop_category WHERE category_parent_id=1 AND category_type=\'product\''); $categories = $db->loadObjectList(); foreach($categories as $category) { echo '<dt>'.$category->category_name.'</dt>'; $db->setQuery('SELECT category_id, category_name WHERE #__hikashop_category WHERE category_parent_id='.(int)$category->category_id.' ORDER BY category_name ASC'); $subcategories = $db->loadObjectList(); echo '<dd>'; foreach($subcategories as $subcategory) { $checked = ''; if(in_array($subcategory->category_id, $alreadySelected)) $checked = 'checked="checked"'; echo '<input type="radio" '.$checked.' name="data[product][categories]" value="'.$subcategory->category_id.'"/>'.$subcategory->category_name; } echo '</dd>'; } ?>
En gros, il y a une première requête pour charger les catégories principales, ensuite une boucle sur cette liste. Et dans la boucle, il y a une requête pour charger les sous catégorie de la catégorie principale, et ensuite l'affichage de la checkbox et du nom pour chaque sous catégories.
The following user(s) said Thank You: erickb

Please Log in or Create an account to join the conversation.

More
1 year 5 months ago - 1 year 5 months ago #366569 by erickb
Replied by erickb on topic admin diviser les categories
Super
Je vais essayer ça ! Assez simple a mettre en place
Merci
Last edit: 1 year 5 months ago by erickb.

Please Log in or Create an account to join the conversation.

More
1 year 5 months ago - 1 year 5 months ago #366572 by erickb
Replied by erickb on topic admin diviser les categories
mon code affiche parfaitement, mais : voir message suivant
Code:
$container = $checked = $multi = $catalias = $catname = ''; $catid = $choice = null; $alreadySelected = array_keys($this->product->categories); //var_dump($alreadySelected); $db = JFactory::getDBO(); $q1 = "SELECT * FROM #__hikashop_category WHERE category_parent_id = 1 AND category_type = 'product' AND category_choice !='null';"; $db->setQuery($q1); $categories = $db->loadObjectList(); foreach ($categories as $category) { $catalias = $category->category_alias; $catname = $category->category_name; $catid = (int)$category->category_id; $choice = $category->category_choice; if($choice == "checkbox"){$multi = '[]';}; $q2 = "SELECT category_id, category_name FROM #__hikashop_category WHERE category_parent_id = '{$catid}' ORDER BY category_name ASC;"; $db->setQuery($q2); $subcategories = $db->loadObjectList(); $container .= "<dl id='subcat-list-{$category->category_id}' class='hk-pro-form-cats-list'>"; $container .= "<dt>{$catname}</dt><dd>"; foreach ($subcategories as $subcategory) { $checked = in_array($subcategory->category_id, $alreadySelected, true) ? ' checked' : ''; $container .= "<input type='$choice' $checked name='{$catalias}{$multi}' id='subcat{$subcategory->category_id}' value='{$subcategory->category_id}' /> <label for='subcat{$subcategory->category_id}'>{$subcategory->category_name}</label><br />"; } $container .= '</dd></dl>'; } echo "<style> .hk-pro-form-cats{ display: flex; flex-wrap: wrap; gap: 10px; dl{ flex: 1 1 45%; border:1px solid black; display: flex; flex-direction: column; align-items: stretch; padding: 10px; background-color:#ccc; dt{ width: 100%; text-align: center; margin-bottom: 10px; display:block; } dd{ display: block; } } } </style>"; echo "<section class='hk-pro-form-cats'>$container</section>";
Last edit: 1 year 5 months ago by erickb.

Please Log in or Create an account to join the conversation.

More
1 year 5 months ago - 1 year 5 months ago #366575 by erickb
Replied by erickb on topic admin diviser les categories
les categories sont bien sélectionnées mais si je modifie ajoute ou enleve des catégories , rien n'est enregistre

pour info je l'appelle form_categories.php a la fin du form.php echo $this->loadTemplate('categories');
Last edit: 1 year 5 months ago by erickb.

Please Log in or Create an account to join the conversation.

More
1 year 5 months ago #366578 by nicolas
Bonjour,

Le problème vient de la ligne:
Code:
name='{$catalias}{$multi}'
Je pense qu'il faut plutôt que ce soit:
Code:
name='data[product][categories]{$multi}'
car si le name change, alors côté serveur, le système de sauvegarde n'arrive pas à retrouver la liste des catégories dans
Code:
data[product][categories]

Please Log in or Create an account to join the conversation.

More
1 year 5 months ago - 1 year 5 months ago #366579 by erickb
Replied by erickb on topic admin diviser les categories
yeeees ! :-)
ca marche d'enfer
me faut juste le code pour virer le popup racine

merci
Last edit: 1 year 5 months ago by erickb.

Please Log in or Create an account to join the conversation.

More
1 year 5 months ago #366580 by nicolas
Euh, je vous ai déjà indiqué quel code supprimer pour enlever le sélecteur par défaut dans mon premier message:
www.hikashop.com/forum/5-support-en-fran...tegories.html#366566
Donc je ne suis pas sûr de comprendre ce que vous voulez dire ?
The following user(s) said Thank You: erickb

Please Log in or Create an account to join the conversation.

More
1 year 5 months ago - 1 year 5 months ago #366586 by erickb
Replied by erickb on topic admin diviser les categories
Oui désolé !

Par contre mon code ne sauve rien même avec name='data[product][categories]{$multi}'
Je vais enlever multi qui sert à rien et re tester
Last edit: 1 year 5 months ago by erickb.

Please Log in or Create an account to join the conversation.

More
1 year 5 months ago #366588 by nicolas
Je pense qu'il faut mettre
Code:
name='data[product][categories][]'
pour le name.
Je ne vois pas de raison qui ferait que cela ne fonctionne pas.

Please Log in or Create an account to join the conversation.

More
1 year 5 months ago - 1 year 5 months ago #366589 by erickb
Replied by erickb on topic admin diviser les categories
Ça marche mais uniquement pour les types checkbox et non les types radios , or j'ai des produits qui ne peuvent être que dans une seule sous catégories d'une catégorie comme hauteur de talons , ils ne peuvent pas être à la fois de 5 et de 10cm

Les types radio ne sont même pas checked Si le produit est dans la sous cat
Si je mets des checkbox partout tout ça marche
J ignore comment forcer un seul choix pour certaines catégories à part en JavaScript
Last edit: 1 year 5 months ago by erickb.

Please Log in or Create an account to join the conversation.

More
1 year 5 months ago #366591 by nicolas
Bonjour,

Coté PHP, HikaShop attend un array d'id de catégories. Donc il faut les crochets dans name pour tous les inputs. Aussi, en HTML vous ne pouvez pas avoir des radios et des checkboxes avec le même name.
Donc il faut n'avoir que des checkboxes.
Après, si vous voulez limiter à un seul choix certains groupes de catégories, là, en effet, il va falloir écrire du javascript, avec un onclick et une fonction qui va décocher les autres catégories du même groupe.
The following user(s) said Thank You: erickb

Please Log in or Create an account to join the conversation.

More
1 year 5 months ago - 1 year 5 months ago #366593 by erickb
Replied by erickb on topic admin diviser les categories
mon code fonctionnel si ca peut tenter quelqu'un
nécessite un custom champ category_choice [0,1,2]
Code:
<?php /** * @package HikaShop for Joomla! * @version 4.0.3 * @author hikashop.com * @copyright (C) 2010-2019 HIKARI SOFTWARE. All rights reserved. * @license GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html */ defined('_JEXEC') or die; $container = $container_cat = $checked = $multi = $class = $catalias = $catname = $name = ''; $catid = $choice = null; $alreadySelected = array_keys($this->product->categories); //var_dump($alreadySelected); $db = JFactory::getDBO(); $q1 = "SELECT * FROM #__hikashop_category WHERE category_parent_id = 1 AND category_type = 'product' AND category_choice !='0';"; $db->setQuery($q1); $categories = $db->loadObjectList(); $exclusiveCategories = []; foreach ($categories as $category) { $catalias = $category->category_alias; $catname = $category->category_name; $catid = (int)$category->category_id; $choice = $category->category_choice; if($choice == 1){ $multi = 'exclusive-' . $category->category_id; $exclusiveCategories[] = $category->category_id; }; $q2 = "SELECT category_id, category_name FROM #__hikashop_category WHERE category_parent_id = '{$catid}' ORDER BY category_name ASC;"; $db->setQuery($q2); $subcategories = $db->loadObjectList(); $container .= "<dl id='subcat-list-{$category->category_id}' class='hk-pro-form-cats-list {$multi}'>"; $container .= "<dt>{$catname}</dt><dd>"; foreach ($subcategories as $subcategory) { $checked = in_array($subcategory->category_id, $alreadySelected, true) ? ' checked' : ''; $name = "data[product][categories][]"; $container .= "<input type='checkbox' $checked name='{$name}' id='subcat{$subcategory->category_id}' value='{$subcategory->category_id}' class='checkbox-item'/> <label for='subcat{$subcategory->category_id}'>{$subcategory->category_name}</label><i class='gap'></i>"; if($checked){ $container_cat .= "<span>{$subcategory->category_name}</span>"; } $multi = $choice = ""; } $container .= "</dd></dl>"; } $style = "<style> .hk-pro-form-cats { display: flex; flex-wrap: wrap; gap: 10px; dl { flex: 1 1 45%; border: 1px solid black; display: flex; flex-direction: column; align-items: stretch; padding: 10px; background-color: #ddd; dt { width: 100%; text-align: center; margin-bottom: 10px; display: block; } dd { display: block; } } } .hk-pro-form-cats-sel { width: 100%; padding: 10px; background-color: #ddd; display: flex; flex-wrap: wrap; justify-content: space-evenly; gap: 10px; border: 1px solid black; margin: 10px auto; span { border: 1px solid black; white-space: nowrap; padding: 0 5px; background-color: #fff; } } .checkbox-item { width: 25px; height: 25px; appearance: none; -webkit-appearance: none; -moz-appearance: none; outline: none; background-color: white; border: none; box-shadow: 0 0 0 1px black; border-radius: 0; cursor: pointer; margin-right: 10px; position: relative; vertical-align: middle; } .checkbox-item:checked { background-color: pink; box-shadow: 0 0 0 1px black; } i.gap { line-height: 10px; height: 10px; display: block; } </style>"; echo $style; echo "<section class='hk-pro-form-cats-sel'>$container_cat</section>"; echo "<section class='hk-pro-form-cats'>$container</section>"; ?> <script> const exclusiveCategories = <?php echo json_encode($exclusiveCategories); ?>; exclusiveCategories.forEach(categoryId => { makeExclusive(`exclusive-${categoryId}`); }); function makeExclusive(groupClass) { document.querySelectorAll('.' + groupClass + ' .checkbox-item').forEach(checkbox => { checkbox.addEventListener('change', function() { if (this.checked) { document.querySelectorAll('.' + groupClass + ' .checkbox-item').forEach(cb => { if (cb !== this) cb.checked = false; }); } }); }); } </script>
ce rendu
Last edit: 1 year 5 months ago by erickb.
The following user(s) said Thank You: nicolas

Please Log in or Create an account to join the conversation.

Time to create page: 0.285 seconds
Powered by Kunena Forum