admin diviser les categories

  • Posts: 2665
  • Thank you received: 68
  • Hikashop Business
3 weeks 2 days ago #366547

-- 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 :

<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: 3 weeks 2 days ago by erickb.

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

  • Posts: 83674
  • Thank you received: 13545
  • MODERATOR
3 weeks 1 day ago #366550

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.

  • Posts: 2665
  • Thank you received: 68
  • Hikashop Business
3 weeks 1 day ago #366564

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
<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

Attachments:
Last edit: 3 weeks 1 day ago by erickb.

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

  • Posts: 83674
  • Thank you received: 13545
  • MODERATOR
3 weeks 23 hours ago #366566

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:

			<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é):
<?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.

  • Posts: 2665
  • Thank you received: 68
  • Hikashop Business
3 weeks 19 hours ago #366569

Super
Je vais essayer ça ! Assez simple a mettre en place
Merci

Last edit: 3 weeks 19 hours ago by erickb.

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

  • Posts: 2665
  • Thank you received: 68
  • Hikashop Business
3 weeks 4 hours ago #366572

mon code affiche parfaitement, mais : voir message suivant

$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: 3 weeks 3 hours ago by erickb.

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

  • Posts: 2665
  • Thank you received: 68
  • Hikashop Business
3 weeks 3 hours ago #366575

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: 3 weeks 3 hours ago by erickb.

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

  • Posts: 83674
  • Thank you received: 13545
  • MODERATOR
3 weeks 3 hours ago #366578

Bonjour,

Le problème vient de la ligne:

name='{$catalias}{$multi}'
Je pense qu'il faut plutôt que ce soit:
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
data[product][categories]

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

  • Posts: 2665
  • Thank you received: 68
  • Hikashop Business
3 weeks 2 hours ago #366579

yeeees ! :-)
ca marche d'enfer
me faut juste le code pour virer le popup racine


merci

Attachments:
Last edit: 3 weeks 2 hours ago by erickb.

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

  • Posts: 83674
  • Thank you received: 13545
  • MODERATOR
2 weeks 6 days ago #366580

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.

  • Posts: 2665
  • Thank you received: 68
  • Hikashop Business
2 weeks 6 days ago #366586

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: 2 weeks 6 days ago by erickb.

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

  • Posts: 83674
  • Thank you received: 13545
  • MODERATOR
2 weeks 6 days ago #366588

Je pense qu'il faut mettre

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.

  • Posts: 2665
  • Thank you received: 68
  • Hikashop Business
2 weeks 6 days ago #366589

Ç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: 2 weeks 6 days ago by erickb.

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

  • Posts: 83674
  • Thank you received: 13545
  • MODERATOR
2 weeks 6 days ago #366591

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.

  • Posts: 2665
  • Thank you received: 68
  • Hikashop Business
2 weeks 6 days ago #366593

mon code fonctionnel si ca peut tenter quelqu'un
nécessite un custom champ category_choice [0,1,2]

<?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

Attachments:
Last edit: 2 weeks 6 days 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.120 seconds
Powered by Kunena Forum