Version imprimable du sujet

Cliquez ici pour voir ce sujet dans son format original

Forum osCommerce-fr _ Echanges développeurs _ Img des catégories mères&filles dans la boxe catégories

Écrit par : coconimo 11 Sep 2008, 21:56

hello,
bon comme j'ai pas la science infuse, je pose la question.
Je travaille sur la boxe catégories (pas des plus simples à modifier) et souhaite afficher l'image de la catégorie active dedans.
donc je suis parti du code original de la boxe categories et j'ai ajouté après :

Code
tep_show_category($first_element);

  $info_box_contents = array();
  $info_box_contents[] = array('text' => $categories_string);

ceci :
Code
if ($cPath>0){  
  $info_box_contents[] = array('text' => tep_image(DIR_WS_IMAGES . tep_get_category_image($categories_image), tep_get_category_image($categories_name), 128, 128));
  
  }

évidemment, la fonction tep_get_category_image n'existe pas, donc je l'ai créé dans le fichier general.php :
Code
////
// Return a category image  
  function tep_get_category_image($language = '') {
    global $languages_id;
    global $current_category_id;    
    if (empty($language)) $language = $languages_id;    
    $category_image_query = tep_db_query("select cd.categories_name, c.categories_image from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.categories_id = '" . $current_category_id . "' and c.categories_id = cd.categories_id and cd.language_id = '" . (int)$languages_id . "'");
    $category_image = tep_db_fetch_array($category_image_query);    
    return $category_image['categories_image'];    
  }
////


la question que je me pose, c'est est ce que j'ai pas réinventé la roue ? n'y a t'il pas une autre solution en exploitant déjà le code existant de la boxe, voir des fonctions natives d'oscommerce ? j'ai pas mal trituré mes poves méninges, mais à mon niveau, j'ai vu que ça... Qu'en pensez vous ?

'ci les zamis !

cdt

Écrit par : shoprun 12 Sep 2008, 05:45

Salut

Une petite erreur ici je pense : tep_get_category_image($categories_image) au lieu de -> $languages_id
C'est la langue qui est attendue, voir ne rien mettre vu que tu as mis un global sur cette variable dans ta fonction.


Ceci dit, il me semble qu'il peut avoir au moins 2 moyens d'obtenir le nom de l'image de la catégorie courante.

1/ La première peut ce faire dans la box categories, suffit de rajouter le champ categories_image dans les requêtes et aussi dans les tableaux.
Exemple pour le tableau :

Code
...etc ...
$tree[$row['categories_id']] = array('name' => $row['categories_name'],
                            'image' => $row['categories_image'],
                            'parent' => $row['parent_id'],
                            'level' => $key+1,
                            'path' => $new_path . '_' . $row['categories_id'],
                            'next_id' => false);
...etc ...


Ensuite, avec la condition que tu as rajouté, ceci devrait te permettre de rajouter l'image :
Code
if ($cPath>0){  
    $info_box_contents[] = array('text' => tep_image(DIR_WS_IMAGES.$tree[$counter]['image'], $tree[$counter]['name'], 128, 128));
}



2/ Dans le application_top.php aussi il devrait avoir moyen, (ligne 477).
Il y a une requête qui est effectué pour obtenir les noms de toutes les catégories, l'arborescence en faite, c'est pour le breadcrumb, mais sachant que la dernière catégorie correspond à la catégorie en court, ça devrait le faire, suffirait de rajouter le champ categories_image dans la requête.
Exemple :
Code
for ($i=0, $n=sizeof($cPath_array); $i<$n; $i++) {
    $categories_query = tep_db_query("select categories_name, categories_image from " . TABLE_CATEGORIES_DESCRIPTION . " where categories_id = '" . (int)$cPath_array[$i] . "' and language_id = '" . (int)$languages_id . "'");
    if (tep_db_num_rows($categories_query) > 0) {
        $categories = tep_db_fetch_array($categories_query);
        // On réinitialise à chaque fois, la dernière correspond à l'image de la catégorie courante
        $current_category_image = $categories['categories_image'];
        //
        $breadcrumb->add($categories['categories_name'], tep_href_link(FILENAME_DEFAULT, 'cPath=' . implode('_', array_slice($cPath_array, 0, ($i+1)))));
    }
    else {
        break;
    }
}

Écrit par : coconimo 12 Sep 2008, 07:38

Citation (shoprun @ 12 Sep 2008, 07:45) *
Salut

1)Une petite erreur ici je pense : tep_get_category_image($categories_image) au lieu de -> $languages_id
C'est la langue qui est attendue, voir ne rien mettre vu que tu as mis un global sur cette variable dans ta fonction.



Ceci dit, il me semble qu'il peut avoir au moins 2 moyens d'obtenir le nom de l'image de la catégorie courante.

1/ La première peut ce faire dans la box categories, suffit de rajouter le champ categories_image dans les requêtes et aussi dans les tableaux.
Exemple pour le tableau :
Code
...etc ...
$tree[$row['categories_id']] = array('name' => $row['categories_name'],
                            'image' => $row['categories_image'],
                            'parent' => $row['parent_id'],
                            'level' => $key+1,
                            'path' => $new_path . '_' . $row['categories_id'],
                            'next_id' => false);
...etc ...


Ensuite, avec la condition que tu as rajouté, ceci devrait te permettre de rajouter l'image :
Code
if ($cPath>0){  
    $info_box_contents[] = array('text' => tep_image(DIR_WS_IMAGES.$tree[$counter]['image'], $tree[$counter]['name'], 128, 128));
}

.../...

[/code]

slt shoprun,
effectivement, j'avais pensé à faire comme tu l'as indiqué au début.
rajout du champs dans les deux requètes de la boxe et la construction des deux tableaux. mais rien ne s'affiche .
d'ailleurs, quand je fais un var_dump($tree[$counter]['image']); j'ai NULL comme réponse. mrgreen.gif
quand à ma fonction, j'ai pris référence de celle là :
Code
// Return a product's name
// TABLES: products
  function tep_get_products_name($product_id, $language = '') {
    global $languages_id;

vraiment pas facile cette boxe catégories.

Écrit par : shoprun 12 Sep 2008, 08:07

Citation (coconimo @ 12 Sep 2008, 10:38) *
rajout du champs dans les deux requètes de la boxe et la construction des deux tableaux. mais rien ne s'affiche .

A ben là tu m'étonne, c'est pas possible, c'est mathématique si on peux dire ...
Dans les 2 requêtes tu récupère bien le categories_id, le champ categories_image ce trouve dans la même table, il y a donc aucune raison que celui ci ne soit pas retourné (si tu le rajoute évidemment) ...
Pour ma part tu dois faire une erreur sur le nom ou je ne sais quoi d'autre ...

Quand tu as une incohérence comme ça, fais simple, du basic de chez basic, tu peux par exemple prendre la requête et l'exécuter dans PhpMyAdmin, mais aussi faire un essai dans une autre page en y mettant juste la requête avec une petite boucle tout simple, bref, c'est ce que je fais, je déporte la partie de code en simplifiant au maximum le choses, pour voir où est le blême, sans code pollueur ...

Pour ma part il y a pas lieu de refaire une requête pour récupérer le nom de l'image, osC est déjà assez blindée en requêtes, surtout au niveau des catégories.


Si tu sèche, je ferais un essai de mon coté, mais il y peu j'ai eu un crash disque, je n'ai plus sous le coude une MS2 de base d'installée, mais tout est ok maintenant, ça doit pas me prendre 3 plombe pour réinstaller tout ça ...

Écrit par : coconimo 12 Sep 2008, 08:21

youpi, ayé, j'ai trouvé, ct plus simple qu'il n'y parait. (j'étais bien parti au début)
alors j'ai rajouté au fichier ./boxes/categories.php notre fameuse globale $current_category_id dans la fonction :

Code
function tep_show_category($counter) {
    global $tree, $categories_string, $cPath_array, $current_category_id;

rajouté dans les deux requètes le champs 'c.categories_image' :
Code
  $categories_query = tep_db_query("select c.categories_id, c.categories_image, cd.categories_name, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.parent_id = '0' and c.categories_id = cd.categories_id and cd.language_id='" . (int)$languages_id ."' order by sort_order, c.parent_id, cd.categories_name");

et
Code
      $categories_query = tep_db_query("select c.categories_id, cd.categories_name, c.categories_image, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.parent_id = '" . (int)$value . "' and c.categories_id = cd.categories_id and cd.language_id='" . (int)$languages_id ."' order by sort_order, cd.categories_name");

et l'appel dans les tableaux :
Code
$tree[$categories['categories_id']] = array('name' => $categories['categories_name'],
                                                'image' => $categories['categories_image'],
                                                'parent' => $categories['parent_id'],
                                                'level' => 0,
                                                'path' => $categories['categories_id'],
                                                'next_id' => false);

et :
Code
while ($row = tep_db_fetch_array($categories_query)) {
          $tree[$row['categories_id']] = array('name' => $row['categories_name'],
                                               'image' => $row['categories_image'],
                                               'parent' => $row['parent_id'],
                                               'level' => $key+1,
                                               'path' => $new_path . '_' . $row['categories_id'],
                                               'next_id' => false);

et ensuite après :
Code
tep_show_category($first_element);

  $info_box_contents = array();
  $info_box_contents[] = array('text' => $categories_string);

ce code :
Code
  $info_box_contents[] = array('text' => tep_image(DIR_WS_IMAGES.$tree[$current_category_id]['image'], $tree[$current_category_id]['name'], 128, 128));


voilà, plus besoin de ma fonction .... y'a pas à dire, je réfléchis le matin au reveil ... cool.gif
merci shoprun.

cdt

Écrit par : shoprun 12 Sep 2008, 08:27

Ben voilà, et puis hop, une petite requête d'économisée wink.gif Ya pas d'petit profit laugh.gif


[EDIT]

Citation
vraiment pas facile cette boxe catégories.

Je reste surpris tout de même qu'avec le $counter ça ne marche pas, j'ai comme l'impression que tu appel cette fonction tep_show_category($counter) dans un autre cadre.

Le principe c'est que la fonction tep_show_category() est une fonction récursive, elle boucle sur elle même.
Il y une requête (la seconde) qui récupére toutes les catégories des catégories "mères" (égales à 0), et la toute première catégorie est initialisée, c'est -> $first_element (la première categories_id)

Donc cette fonction boucle tant que $tree[] contient des éléments (des ID de catégories), c'est à dire jusqu'à que le "next_id n'est pas FAUX, cette condition :
Code
if (!isset($first_element)) {
    $first_element = $categories['categories_id'];
}
Ca démarre donc du premier élément jusqu'à qu'il y en est plus ...

Du coup, en faisant ceci -> $tree[$current_category_id] tu force quelque part le tableau à afficher la catégorie courante.
Ca marche, apparement, mais je reste tout de même surpris qu'avec le $counter ça ne marche pas.
Je me dis quelque part que la condition que tu mets n'est pas correcte, car je me dis qu'au moment de ta condition, les 2 variables $counter et $current_categories_id devraient être égales, les mêmes. Ca pas à l'air d'être le cas.

Du coup une question me viens à l'esprit : Ne perdrais tu pas une catégories en court de route ?
Autre suggestion, peut être faudrait il faire une condition comme celle ci :
Code
if ($counter == $current_categories_id) {
// Ma boucle arrive à l'élément de la categorie courante
}



Bref, j'ai rien tester, je me fis uniquement au code, et c'est le raisonnement que j'en déduis.
Je débloque peut être, qui sait tongue.gif

[/EDIT]

Écrit par : coconimo 12 Sep 2008, 13:08

tiens, voilà le code de la boxe categories original :

Code
<?php
/*
  $Id: categories.php 1739 2007-12-20 00:52:16Z hpdl $

  osCommerce, Open Source E-Commerce Solutions
  http://www.oscommerce.com

  Copyright (c) 2003 osCommerce

  Released under the GNU General Public License
*/

  function tep_show_category($counter) {
    global $tree, $categories_string, $cPath_array, $current_category_id;

    for ($i=0; $i<$tree[$counter]['level']; $i++) {
      $categories_string .= "&nbsp;&nbsp;";
    }

    $categories_string .= '<a href="';

    if ($tree[$counter]['parent'] == 0) {
      $cPath_new = 'cPath=' . $counter;
    } else {
      $cPath_new = 'cPath=' . $tree[$counter]['path'];
    }

    $categories_string .= tep_href_link(FILENAME_DEFAULT, $cPath_new) . '">';

    if (isset($cPath_array) && in_array($counter, $cPath_array)) {
      $categories_string .= '<b>';
    }

// display category name
    $categories_string .= $tree[$counter]['name'];

    if (isset($cPath_array) && in_array($counter, $cPath_array)) {
      $categories_string .= '</b>';
    }

    if (tep_has_category_subcategories($counter)) {
      $categories_string .= '-&gt;';
    }

    $categories_string .= '</a>';

    if (SHOW_COUNTS == 'true') {
      $products_in_category = tep_count_products_in_category($counter);
      if ($products_in_category > 0) {
        $categories_string .= '&nbsp;(' . $products_in_category . ')';
      }
    }

    $categories_string .= '<br>';

    if ($tree[$counter]['next_id'] != false) {
      tep_show_category($tree[$counter]['next_id']);
    }
  }
?>
<!-- categories //-->
          <tr>
            <td>
<?php
  $info_box_contents = array();
  $info_box_contents[] = array('text' => BOX_HEADING_CATEGORIES);

  new infoBoxHeading($info_box_contents, true, false);

  $categories_string = '';
  $tree = array();

  $categories_query = tep_db_query("select c.categories_id, cd.categories_name, c.categories_image, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.parent_id = '0' and c.categories_id = cd.categories_id and cd.language_id='" . (int)$languages_id ."' order by sort_order, cd.categories_name");
  while ($categories = tep_db_fetch_array($categories_query))  {
    $tree[$categories['categories_id']] = array('name' => $categories['categories_name'],
                                                'parent' => $categories['parent_id'],
                                                'image' => $categories['categories_image'],
                                                'level' => 0,
                                                'path' => $categories['categories_id'],
                                                'next_id' => false);

    if (isset($parent_id)) {
      $tree[$parent_id]['next_id'] = $categories['categories_id'];
    }

    $parent_id = $categories['categories_id'];

    if (!isset($first_element)) {
      $first_element = $categories['categories_id'];
    }
  }

  //------------------------
  if (tep_not_null($cPath)) {
    $new_path = '';
    reset($cPath_array);
    while (list($key, $value) = each($cPath_array)) {
      unset($parent_id);
      unset($first_id);
      $categories_query = tep_db_query("select c.categories_id, cd.categories_name, c.categories_image, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.parent_id = '" . (int)$value . "' and c.categories_id = cd.categories_id and cd.language_id='" . (int)$languages_id ."' order by sort_order, cd.categories_name");
      if (tep_db_num_rows($categories_query)) {
        $new_path .= $value;
        while ($row = tep_db_fetch_array($categories_query)) {
          $tree[$row['categories_id']] = array('name' => $row['categories_name'],
                                               'parent' => $row['parent_id'],
                                               'image' => $row['categories_image'],
                                               'level' => $key+1,
                                               'path' => $new_path . '_' . $row['categories_id'],
                                               'next_id' => false);

          if (isset($parent_id)) {
            $tree[$parent_id]['next_id'] = $row['categories_id'];
          }

          $parent_id = $row['categories_id'];

          if (!isset($first_id)) {
            $first_id = $row['categories_id'];
          }

          $last_id = $row['categories_id'];
        }
        $tree[$last_id]['next_id'] = $tree[$value]['next_id'];
        $tree[$value]['next_id'] = $first_id;
        $new_path .= '_';
      } else {
        break;
      }
    }
  }
  tep_show_category($first_element);

  $info_box_contents = array();
  $info_box_contents[] = array('text' => $categories_string);
  $info_box_contents[] = array('text' => tep_image(DIR_WS_IMAGES. $tree[$current_category_id]['image'], $tree[$current_category_id]['name'], 128, 128));
  new infoBox($info_box_contents);
?>
            </td>
          </tr>
<!-- categories_eof //-->


peut être que je me suis mal exprimé, mais quand je parle d'afficher les images des catégories, c'est aussi celle des sous catégories, pas uniquement les catégories mères, je veux les filles avec. ninja.gif

quand à la condition soit disante fausse, en fait elle est liée avec un autre code que je fais pour Padaben (oui, encore lui ! cool.gif ) pour un affichage uniquement des sous catégories.
donc j'ai changé la première requète de la bowe catégories avec :
Code
  //$categories_query = tep_db_query("select c.categories_id, c.categories_image, cd.categories_name, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.parent_id = '" . (int)$cPath . "' and c.categories_id = cd.categories_id and cd.language_id='" . (int)$languages_id ."' order by sort_order, cd.categories_name");

donc si la valeur $cPath n'est pas un entier, c'est forcément un arbre $tree de sous catégorie à construire.
Je ne sais pas si tu suis ma logique, mais c'est le moyen le plus simple que j'ai trouvé avec la même requète sans refaire le code de la boxe (comme j'ai vu dans de nombreuses contrib) d'arriver à mes fins.
j'ai rajouté dans la colonne left la même requète un peu changé :
Code
if (($cPath>0) xor (tep_has_category_subcategories($cPath) == '0' )){

pour que la boxe categories ne s'affiche pas en index (puisque qu'il y a soit un menu horizontal avec les categories mère, sois un module main_categories) et j'ai exclu l'affichage aussi de la boxe (qui serait vide) si la categorie mère n'a pas de sous categorie (donc on arrive direct sur le module product listing) avec cette condition tep_has_category_subcategories($cPath) == '0'.
j'essaye comme tu vois de respecté au mieux les fonctions native d'oscommerce, maintenant je continue à apprendre en vous lisant ici rolleyes.gif


en espérant que cela t'a un peu éclairé ... idea.gif idea.gif idea.gif

Écrit par : coconimo 12 Sep 2008, 13:10

crotte de bique, j'ai floodé en postant ! blink.gif

Écrit par : gentag 12 Sep 2008, 14:10

Bonjour,

J'ai pas trop eu le temps ce matin, j'ai fait un truc pour jolilola (ça m'a pas pris trop longtemps) mais j'avais beaucoup d'autres choses à faire si bien que je suis resté sur son post toute la matinée (le pauvre en train de regarder son post avec gentag en italique en bas pendant trois heures...) du coup j'ai pas intercepté votre truc intéressant...

Bon, c'est toujours aussi joli (enfin propre, là, le noir...), même pour une demo... ça rigole pas côté design chez coconimo... smile.gif

par contre j'ai pas compris ce qui te chiffones (j'ai pas dû bien lire...), ça marche ton truc... non ?

Écrit par : coconimo 12 Sep 2008, 14:38

enfait gentag, ça marche et ça marche pas ...
si je suis dans une catégorie fille, la ligne de code :

Code
  $info_box_contents[] = array('text' => tep_image(DIR_WS_IMAGES. $tree[$current_category_id]['image'], $tree[$current_category_id]['name'], 128, 128));

si je suis dans une catégorie mère (avec présence de filles), l'image de la catégorie mère ne s'affiche pas.
donc mon code ressemble à ça pour l'instant :
Code
tep_show_category($first_element);

  $info_box_contents = array();
  $info_box_contents[] = array('text' => $categories_string);
  
  if ($cPath > 0) {    
  $info_box_contents[] = array('text' => tep_image(DIR_WS_IMAGES . tep_get_category_image($categories_image), tep_get_category_image($categories_name), 128, 128));
  }else{  
  $info_box_contents[] = array('text' => tep_image(DIR_WS_IMAGES. $tree[$current_category_id]['image'], $tree[$current_category_id]['name'], 128, 128));
  }
  new infoBox($info_box_contents);

donc je fais appel à ma fonction tep_get_category_image.
bon, c'est dû au changement de la première requète de la boxe catégories (voir post ci dessus)
aussi le current_category_id ne fonctionne plus (si on fait un echo, elle donne en fait la première categorie fille (next_id)). la seule variable qui a le même 'id' que la current_category_id à cet endroit du code et la variable $cPath. donc je me demande comment je vais la récupérer pour l'exploiter et me passer donc de la fonction que j'ai créé (et qui fonctionne qu'elle que soit l'endroit ou on se trouve dans la boxe, avec ou sans les categories mère affichées)
peut être que je cherche à faire un truc trop simple ou trop compliqué ou les deux à la fois en touchant le moins de code possible mais en exploitant celui qui existe déjà. mrgreen.gif

Écrit par : gentag 12 Sep 2008, 15:01

Re,

Bah le cPath tu l'http://fr2.php.net/manual/fr/function.explode.php par le caractère "_" et tu récupères la dernière valeur du tableau pour avoir la catégorie courante... wink.gif

Genre :

Code
$cPath_array = explode('_', $cPath);
$array_entry_number = count($cPath_array);
$current_cat = $cPath_array[$array_entry_number - 1];
Pas testé par contre...

Écrit par : coconimo 12 Sep 2008, 15:06

non, j'ai pas besoin de l'exploder, le $cPath est toujours un entier avec mon code.
regarde je te mets le code de la boxe categories que j'exploite actuellement :

Code
<?php
/*
  $Id: categories.php 1739 2007-12-20 00:52:16Z hpdl $

  osCommerce, Open Source E-Commerce Solutions
  http://www.oscommerce.com

  Copyright (c) 2003 osCommerce

  Released under the GNU General Public License
*/
  
  function tep_show_category($counter) {
    global $tree, $categories_string, $cPath_array, $current_category_id;

    for ($i=0; $i<$tree[$counter]['level']; $i++) {
      $categories_string .= "&nbsp;&nbsp;";
    }

    $categories_string .= '<a href="';

    if ($tree[$counter]['parent'] == 0) {
      $cPath_new = 'cPath=' . $counter;
      } else {
      $cPath_new = 'cPath=' . $tree[$counter]['path'];
    }

    $categories_string .= tep_href_link(FILENAME_DEFAULT, $cPath_new) . '">';

    if (isset($cPath_array) && in_array($counter, $cPath_array)) {
      $categories_string .= '<b>';
    }

// display category name
    $categories_string .= $tree[$counter]['name'];

    if (isset($cPath_array) && in_array($counter, $cPath_array)) {
      $categories_string .= '</b>';
    }

    if (tep_has_category_subcategories($counter)) {
      $categories_string .= '';
    }

    $categories_string .= '</a>';

    if (SHOW_COUNTS == 'true') {
      $products_in_category = tep_count_products_in_category($counter);
      if ($products_in_category > 0) {
        $categories_string .= '&nbsp;(' . $products_in_category . ')';
      }
    }

    $categories_string .= '<br>';

    if ($tree[$counter]['next_id'] != false) {
      tep_show_category($tree[$counter]['next_id']);
    
    }
  }
?>
<!-- categories //-->
          <tr>
            <td>
<?php
  $info_box_contents = array();
  $info_box_contents[] = array('text' => BOX_HEADING_CATEGORIES);
  
  new infoBoxHeading($info_box_contents, true, true);

  $categories_string = '';
  $tree = array();
  
  //$categories_query = tep_db_query("select c.categories_id, c.categories_image, cd.categories_name, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.parent_id = '0' and c.categories_id = cd.categories_id and cd.language_id='" . (int)$languages_id ."' order by sort_order, c.parent_id, cd.categories_name");
  $categories_query = tep_db_query("select c.categories_id, c.categories_image, cd.categories_name, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.parent_id = '" . (int)$cPath . "' and c.categories_id = cd.categories_id and cd.language_id='" . (int)$languages_id ."' order by sort_order, cd.categories_name");
  
  while ($categories = tep_db_fetch_array($categories_query))  {  
    $tree[$categories['categories_id']] = array('name' => $categories['categories_name'],
                                                'image' => $categories['categories_image'],
                                                'parent' => $categories['parent_id'],
                                                'level' => 0,
                                                'path' => $categories['categories_id'],
                                                'next_id' => false);
    
    if (isset($parent_id)) {
      $tree[$parent_id]['next_id'] = $categories['categories_id'];
    }
    
    
    $parent_id = $categories['categories_id'];
    
    if (!isset($first_element)) {
      $first_element = $categories['categories_id'];
      
      
     }
    
  }

  //------------------------
  if (tep_not_null($cPath)) {
    $new_path = '';
    reset($cPath_array);
    while (list($key, $value) = each($cPath_array)) {
      
      unset($parent_id);
      unset($first_id);
      $categories_query = tep_db_query("select c.categories_id, cd.categories_name, c.categories_image, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.parent_id = '" . (int)$value . "' and c.categories_id = cd.categories_id and cd.language_id='" . (int)$languages_id ."' order by sort_order, cd.categories_name");
      if (tep_db_num_rows($categories_query)) {
        $new_path .= $value;
        while ($row = tep_db_fetch_array($categories_query)) {
          $tree[$row['categories_id']] = array('name' => $row['categories_name'],
                                               'image' => $row['categories_image'],
                                               'parent' => $row['parent_id'],
                                               'level' => $key+1,
                                               'path' => $new_path . '_' . $row['categories_id'],
                                               'next_id' => false);

          if (isset($parent_id)) {
            $tree[$parent_id]['next_id'] = $row['categories_id'];
          }
          

          $parent_id = $row['categories_id'];

          if (!isset($first_id)) {
            $first_id = $row['categories_id'];
          }

          $last_id = $row['categories_id'];
        }
        
        $tree[$last_id]['next_id'] = $tree[$value]['next_id'];
        $tree[$value]['next_id'] = $first_id;
        $new_path .= '_';
      } else {
        break;
      }
    }
  }

  tep_show_category($first_element);

  $info_box_contents = array();
  $info_box_contents[] = array('text' => $categories_string);
  
  if ($cPath > 0) {

  // le $cPath est toujours un entier et correspond à la current_category_id

  echo $cPath;

// fin du com pour gentag;o)
  $info_box_contents[] = array('text' => tep_image(DIR_WS_IMAGES . tep_get_category_image($categories_image), tep_get_category_image($categories_name), 128, 128));
  }else{  
  $info_box_contents[] = array('text' => tep_image(DIR_WS_IMAGES. $tree[$current_category_id]['image'], $tree[$current_category_id]['name'], 128, 128));
  }
  new infoBox($info_box_contents);  
?>
            </td>
          </tr>
<!-- categories_eof //-->


d'ailleurs, en mettant dans le fichier general.php (code corrigé sur les conseil de shoprun) :
Code
function tep_get_category_image($categories_id) {
    global $languages_id;
    global $current_category_id;    
    if (empty($language)) $language = $languages_id;    
    $category_image_query = tep_db_query("select cd.categories_name, c.categories_image from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.categories_id = '" . $current_category_id . "' and c.categories_id = cd.categories_id and cd.language_id = '" . (int)$languages_id . "'");
    $category_image = tep_db_fetch_array($category_image_query);    
    return $category_image['categories_image'];    
  }

et que tu mets à la place de :
Code
$info_box_contents[] = array('text' => tep_image(DIR_WS_IMAGES . tep_get_category_image($categories_image), tep_get_category_image($categories_name), 128, 128));

ça :
Code
  $info_box_contents[] = array('text' => tep_image(DIR_WS_IMAGES . tep_get_category_image($cPath), tep_get_category_image($categories_name), 128, 128));

tu obtiens le même résultat.


question à 1000 croquettes au poisson : comment exploiter avec le tableau $tree cette valeur $cPath comme une $categories_id pour appeler l'image qui lui correspond ? (pas d'égalité sur $cpath , ça fait foirer le script)

Écrit par : gentag 12 Sep 2008, 15:57

Re,

Bah je pense un peu comme shoprun, le fait d'avoir modifié la requête originale modifie le $tree donc tu dois zapper une catégorie quelque part...

A l'époque de mes grands tests sur cette boxe je me suis bien galérer... et j'ai fini, pour comprendre la construction, par faire des echos partout, et l'arborescence est compliquée franchement...

Euh désolé ma journée de travail est finie, je voulais finir ce truc avant mais je n'ai pas (eu) le temps...

Au fait dans application_top.php, il y a ça :

Code
  if (tep_not_null($cPath)) {
    $cPath_array = tep_parse_category_path($cPath);
    $cPath = implode('_', $cPath_array);
    $current_category_id = $cPath_array[(sizeof($cPath_array)-1)];
  } else {
    $current_category_id = 0;
  }
Du coup, tu devrais virer cette variable globale qui a le même nom que celle définie dans application_top.php (et dont le code ressemble beaucoup au mien en plus, en plus "pro" tout de même), elle existe déjà et contient la bonne valeur...

Je passerais peut-être ce WE sur le post mais sans garantie.

Bon courage

Écrit par : shoprun 12 Sep 2008, 16:16

Il y a un souci dans la fonction, car celle ci fait toujours référence au $current_category_id.
Du coup, le paramètre $categories_id ne sert à rien, n'est jamais exploité.
Faut peut être supprimer le global $current_category_id; et utiliser / remplacer par $categories_id dans la requête.
Le tout est de passer le $categories_id où on souhaite récupérer l'image à cette fonction.

Ce qui donnerait :

Code
function tep_get_category_image($categories_id) {
    global $languages_id;
        
    if (empty($language)) $language = $languages_id;    
    $category_image_query = tep_db_query("select cd.categories_name, c.categories_image from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.categories_id = '" . (int)$categories_id . "' and c.categories_id = cd.categories_id and cd.language_id = '" . (int)$languages_id . "'");
    $category_image = tep_db_fetch_array($category_image_query);    
    return $category_image['categories_image'];    
  }

J'avoue que je patauge aussi dans les croquettes laugh.gif

Écrit par : coconimo 12 Sep 2008, 19:10

après la première boucle while ($categories = tep_db_fetch_array($categories_query))

avec un var_dump($tree); j'obtiens :

Code
array(1) { [12]=>  array(6) { ["name"]=>  string(5) "Phone" ["image"]=>  string(14) "4324-34098.png" ["parent"]=>  string(2) "11" ["level"]=>  int(0) ["path"]=>  string(2) "12" ["next_id"]=>  bool(false) } }

array(2) { [12]=>  array(6) { ["name"]=>  string(5) "Phone" ["image"]=>  string(14) "4324-34098.png" ["parent"]=>  string(2) "11" ["level"]=>  int(0) ["path"]=>  string(2) "12" ["next_id"]=>  bool(false) }
           [13]=>  array(6) { ["name"]=>  string(5) "Modem" ["image"]=>  string(31) "modem_shikamaru-mj_hardware.png" ["parent"]=>  string(2) "11" ["level"]=>  int(0) ["path"]=>  string(2) "13" ["next_id"]=>  bool(false) } }

array(3) { [12]=>  array(6) { ["name"]=>  string(5) "Phone" ["image"]=>  string(14) "4324-34098.png" ["parent"]=>  string(2) "11" ["level"]=>  int(0) ["path"]=>  string(2) "12" ["next_id"]=>  string(2) "13" }
           [13]=>  array(6) { ["name"]=>  string(5) "Modem" ["image"]=>  string(31) "modem_shikamaru-mj_hardware.png" ["parent"]=>  string(2) "11" ["level"]=>  int(0) ["path"]=>  string(2) "13" ["next_id"]=>  bool(false) }
           [14]=>  array(6) { ["name"]=>  string(9) "Bluetooth" ["image"]=>  string(27) "8003-athlon64-Bluetooth.png" ["parent"]=>  string(2) "11" ["level"]=>  int(0) ["path"]=>  string(2) "14" ["next_id"]=>  bool(false) } }

et avec le var_dump($categories) j'obtiens :
Code
array(4) { ["categories_id"]=>  string(2) "12" ["categories_image"]=>  string(14) "4324-34098.png" ["categories_name"]=>  string(5) "Phone" ["parent_id"]=>  string(2) "11" }
array(4) { ["categories_id"]=>  string(2) "13" ["categories_image"]=>  string(31) "modem_shikamaru-mj_hardware.png" ["categories_name"]=>  string(5) "Modem" ["parent_id"]=>  string(2) "11" }
array(4) { ["categories_id"]=>  string(2) "14" ["categories_image"]=>  string(27) "8003-athlon64-Bluetooth.png" ["categories_name"]=>  string(9) "Bluetooth" ["parent_id"]=>  string(2) "11" }

sachant que les categories_id 12/13/14 sont bien les filles de la catégorie 11
sachant que dans la requète, j'ai demandé que que le champs parent_id soit égal à $cpath, donc le résultat obtenu est conforme.

Quand à la fonction tep_get_category_image(), elle ne pose aucun problème, bien au contraire, elle appelle bien l'image.
en aucun cas le code suivant :
Code
$info_box_contents[] = array('text' => tep_image(DIR_WS_IMAGES.$tree[$counter]['image'], $tree[$counter]['name'], 128, 128));

fonctionne même sur une boxe catégorie vierge de toute modification...
bref, y'a de quoi s'arracher les poils !

Écrit par : shoprun 13 Sep 2008, 10:06

Bon, j'ai installé une MS2-FR-W3C-3, et j'ai fais des essais.

En premier j'ai rajouté aux 2 requêtes le champ categorie_image.
Pour vérifier j'ai rajouté le devant le nom de la catégorie $tree[$counter]['image'] dans la fonction tep_show_category(), et toutes les catégories ont bien le nom de l'image. C'était provisoire, juste pour vérifier si ces images étaient dispo.
Jusque là ça va.

Pour mieux vérifier, j'ai rajouter 2 sous catégories -> "Plats" et "Crt" à la catégories "Moniteur", qui elle même appartient à la catégorie "Matériel".

Maintenant, pour obtenir les catégories enfants de la catégorie courante (par rapport à $current_category_id) j'ai modifier la fonction tep_show_category() comme ceci :
($current_category_id, $cPath_courant, $catsCourant ajouté en global)

Code
//---AJOUTE_boc-----------------------------------------------------------------
$catsCourant = '';
$cPath_courant = 0;
//---AJOUTE_eoc-----------------------------------------------------------------
function tep_show_category($counter) {
    global $tree, $categories_string, $cPath_array, $current_category_id, $cPath_courant, $catsCourant;
    
    for ($i=0; $i<$tree[$counter]['level']; $i++) {
        $categories_string .= "&nbsp;&nbsp;";
    }
    
    $categories_string .= "\n".'<a href="';
    
    if ($tree[$counter]['parent'] == 0) {
        $cPath_new = 'cPath=' . $counter;
        //---AJOUTE_boc-----------------------------------------------------------
        $tree_cat[0] = $counter;
        //---AJOUTE_eoc-----------------------------------------------------------
    } else {
        $cPath_new = 'cPath=' . $tree[$counter]['path'];
        //---AJOUTE_boc-----------------------------------------------------------
        $tree_cat = explode("_", $tree[$counter]['path']);
        //---AJOUTE_boc-----------------------------------------------------------
    }
    
    $categories_string .= tep_href_link(FILENAME_DEFAULT, $cPath_new) . '">';
    
    if (isset($cPath_array) && in_array($counter, $cPath_array)) {
        $categories_string .= '<b>';
    }
    
    //---AJOUTE_boc--------------------------------------------------------------
    if (!$cPath_courant && $counter == $current_category_id) {
        $cPath_courant = $current_category_id;
    }    
    //
    if (isset($tree_cat) && in_array($cPath_courant, $tree_cat)) {
        $catsCourant .= '<div>'.$tree[$counter]['name'].'|'.$tree[$counter]['image'].'</div>';
    }
    //---AJOUTE_eoc--------------------------------------------------------------

    // display category name
    $categories_string .= $tree[$counter]['name'];
    
    
    if (isset($cPath_array) && in_array($counter, $cPath_array)) {
        $categories_string .= '</b>';
    }
    
    if (tep_has_category_subcategories($counter)) {
        $categories_string .= '-&gt;';
    }
    
    $categories_string .= '</a>';
    
    if (SHOW_COUNTS == 'true') {
        $products_in_category = tep_count_products_in_category($counter);
        if ($products_in_category > 0) {
            $categories_string .= '&nbsp;(' . $products_in_category . ')';
        }
    }
    
    $categories_string .= '<br>';
    
    if ($tree[$counter]['next_id'] != false) {
        tep_show_category($tree[$counter]['next_id']);
    }
}


Après l'affichage du menu, j'ai rajouté ceci :
Code
if ($cPath > 0) {
    echo $catsCourant;
}

Donc après l'affichage du menu, donc pour le echo $catsCourant; j'obtient :
1/ Quand je suis sur la page d'accueil (défaut) ou autre page comme contact_us, etc ... il y a rien. Normal il n'y a pas de $cPath.

2/ En sélectionnant la catégorie "Matériel" :
Matériel|category_hardware.gif
Cartes graphiques|subcategory_graphic_cards.gif
Claviers|subcategory_keyboards.gif
Haut-parleurs|subcategory_speakers.gif
Imprimantes|subcategory_printers.gif
Lecteurs CDROM|subcategory_cdrom_drives.gif
Mémoire|subcategory_memory.gif
Moniteurs|subcategory_monitors.gif
Souris|subcategory_mice.gif

3/ En sélectionnant la catégorie "Moniteur" :
Moniteurs|subcategory_monitors.gif
plats|subcategory_monitors_plats.gif
crt|subcategory_monitors_crt.gif

4-5/ En sélectionnant la catégorie "Plat" ou un produit de celle ci :
plats|subcategory_monitors_plats.gif

Je stop ma prospection à ce stade, car à vrai dire je sais plus vraiment ce que tu souhaite, j'ai comme l'impression d'avoir perdu le fil ...
Enfin, je suis partie ici du principe de lister la catégorie courante + les enfants directes (mais pas les petits enfants, etc ...)
Ceci dit, peut être que la dedans il y a des éléments qui peuvent t'aider ...

Écrit par : coconimo 13 Sep 2008, 11:18

slt shoprun,
je vais regarder ton code de très près (j'ai la truffe déjà collé sur l'écran wacko.gif )
pour voir, le résultat que je souhaite obtenir, rends toi sur le site arrow.gif http://ouistiti.ke0.eu/catalog/
ça va te permettre de comprendre ma démarche.
actuellement je me sers de ma fonction (dans ./functions/general.php)pour l'affichage du résultat que je souhaite obtenir.(donc fontionnel) :

Code
////
// Return a category image  and category name
  function tep_get_category_image() {
    global $languages_id;
    global $current_category_id;        
    if (empty($language)) $language = $languages_id;    
    $category_image_query = tep_db_query("select c.categories_id, cd.categories_id, cd.categories_name as name, c.categories_image as image from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.categories_id = '" . $current_category_id . "' and c.categories_id = cd.categories_id and cd.language_id = '" . (int)$languages_id . "'");
    $category_image = tep_db_fetch_array($category_image_query);            
    return tep_image(DIR_WS_IMAGES . $category_image['image'] , $category_image['name'], 128, 128);    
    }
  
////

que j'appelle dans la construction de la boxe à cet endroit :
Code
tep_show_category($first_element);
$info_box_contents = array();
$info_box_contents[] = array('text' => $categories_string);  
// appel de l'image de la catégorie/ss catégorie en cours
$info_box_contents[] = array('text' => tep_get_category_image());

bon, une requète de plus ...

tout ce travail pour préparer une boxe catégorie en Jquery ... je sens que je vais ramer ...

en tous cas merci de ton aide.
je ne mets pas résolu encore dans le titre du sujet . cool.gif

Écrit par : coconimo 13 Sep 2008, 20:20

@ shoprun:
bon, je viens de tester ton code, sur un code original (us, mais je ne pense pas qu'il y ai des diff):
voici le résultat visuel en categorie mère :



donc l'image de la catégorie mère ne s'affiche pas.

en categorie fille, voici le résultat (pas d'image, et l'echo par dessus) :



alors que je cherche à faire pour une categorie mère :



et fille :



je me demande si je vais pas garder ma fonction ... cette boxe catégorie est somme toute assez compliqué à changer en l'état. mrgreen.gif ?

Écrit par : shoprun 13 Sep 2008, 21:08

Exact Coconimo, ce n'était pas le top, loin de là huh.gif

En faite je commençais à me dire qu'il serait bon d'abandonner le code d'origine de cette box catégorie, car il me parait trop spécifique, donc beaucoup trop éloigné selon ton besoin.
En gros, vouloir faire du neuf avec du vieux c'est par moment plus compliqué que de faire du neuf avec du neuf ...

Du coup, j'ai fait ceci, et ça me parais plus simple, mais c'est du spécifique, ça remplace totalement l'ancien.
On obtiens normalement quasi la même chose.
Mais "quasi", donc pas d'bol il manque toujours un truc, et ce truc c'est le nom et l'image de la catégorie parente, c'est toujours celle ci qui pose problème en faite.

Mais bon, à l'heure ou il est c'est un peu tard, alors je mets quand même le code.
Et même crédo, si ça peu faire avancer le schmilblick temps mieux. wink.gif


Code
function tep_get_sub($parent_id = 0) {
    global $languages_id, $current_category_id, $cPath;
    
    if (tep_has_category_subcategories($current_category_id)) {
        //
        $subcategories_query = tep_db_query("SELECT c.categories_id, cd.categories_name
            FROM ".TABLE_CATEGORIES." c
            LEFT JOIN ".TABLE_CATEGORIES_DESCRIPTION." cd ON c.categories_id = cd.categories_id
            WHERE c.parent_id = '".(int)$parent_id."'
            AND cd.language_id = '".(int)$languages_id."'
            ORDER BY sort_order, cd.categories_name");
    }
    else {
        $subcategories_query = tep_db_query("SELECT c.categories_id, cd.categories_name
            FROM ".TABLE_CATEGORIES." c
            LEFT JOIN ".TABLE_CATEGORIES_DESCRIPTION." cd ON c.categories_id = cd.categories_id
            WHERE parent_id IN (SELECT c2.parent_id
                FROM ".TABLE_CATEGORIES." c2
                WHERE c2.categories_id = '".(int)$current_category_id."')
            AND cd.language_id = '".(int)$languages_id."'
            ORDER BY sort_order, cd.categories_name");
    }
    //
    while ($sub = tep_db_fetch_array($subcategories_query)) {
        if (tep_not_null($cPath)) {
            $cPath_new = 'cPath='.$cPath.'_'.$sub['categories_id'];
        }
        else {
            $cPath_new = 'cPath='.$sub['categories_id'];
        }
        //
        echo '<a href="'.tep_href_link(FILENAME_DEFAULT, $cPath_new).'" style="display: block;">'.$sub['categories_name'].'</a>';
        //
    }
}
//
if (tep_not_null($cPath)) {
    tep_get_sub($current_category_id);
}

Écrit par : coconimo 13 Sep 2008, 21:40

oui, j'ai bien l'impression qu'on arrive à la même conclusion.
il serait interessant d'avoir l'avis d'autres qui auraient pas mal touché cette boxe. Ce post restera ouvert à d'autres propositions.(entre autre mon 'tit delete wub.gif si tu passes sur mon post ...var_dump($category_id['oui\,c\'est_un_appel_de_la_patte']))
Personnellement, je ne suis pas assez calé pour exploiter le code existant de cette boxe, voir les fonctions natives d'oscommerce pour arriver au résultat sans passer par ma fonction tep_get_category_image (et requête) supplémentaire.

[POST]clos momentanément.

ps: merci à shoprun et gentag.

Écrit par : delete 14 Sep 2008, 09:15

Je passe par là je n'ai pas tout suivi mais je crois que la réponse initiale de Gentag tient la route.

Utilise ta version originale de tep_get_categorie_image (version débugguée par Shoprun)

et dans ta boxe catégorie affiche l'image en récupérant la catégorie courante dans le cPath :

Code
  $arr = explode('_', $cPath);
  $cat = $arr[sizeof($arr) - 1];

Écrit par : coconimo 14 Sep 2008, 12:44

Citation (delete @ 14 Sep 2008, 11:15) *
.../...
Utilise ta version originale de tep_get_categorie_image (version débugguée par Shoprun)

et dans ta boxe catégorie affiche l'image en récupérant la catégorie courante dans le cPath :

Code
  $arr = explode('_', $cPath);
  $cat = $arr[sizeof($arr) - 1];

mais avec ma fonction 'tep_get_categorie_image' affiche l'image des categories mère et fille sans problème.(hum... je crois que j'ai embrouillé tt le monde ! Lahchouma sur moi! mrgreen.gif )

Écrit par : delete 14 Sep 2008, 16:21

Meskine le chat pleurniche ! tongue.gif

En bref tu veux que :

Si l'on est dans une catégorie mère autre que 0 sélectionnée, avoir son image

Si l'on est dans une sous-catégorie sélectionnée, avoir l'image la sous-catégorie

Et tu veux toujours avoir la catégorie mère courante qui apparait avec son image. Quelque soit la sous-catégorie

Et tu ne veux pas les autres catégories mères.

C'est ça ?

Écrit par : coconimo 14 Sep 2008, 16:51

c presque ça mon 'tit Delete.
sauf pour : Et tu veux toujours avoir la catégorie mère courante qui apparait avec son image. Quelque soit la sous-catégorie
si on est à la racine de la catégorie mère, c'est l'image de la catégorie mère qui apparaît. Si on est dans une catégorie fille, c'est l'image de la catégorie fille qui s'affiche.
c'est le fonctionnement de l'appel des images des cat/sscat de la page index. mais ramener à la boxe cat.

Écrit par : delete 14 Sep 2008, 17:04

Citation (coconimo @ 14 Sep 2008, 17:51) *
c'est le fonctionnement de l'appel des images des cat/sscat de la page index. mais ramener à la boxe cat.


En fait tu ne veux pas radicalement changer la box categories. Tu veux t'inspirer de son code pour créer une box contextuelle ? Qui potentiellement n'apparaitrait pas sur la page d'accueil ou alors avec un contenu différent ?


Écrit par : gentag 15 Sep 2008, 09:19

Bonjour,

Bon bah aujourd'hui ça être tendu... j'ai encore 3g dans le sang, c'est la voiture qui m'a amené au taff (comme sur un rail...)... rolleyes.gif

Mais comme shoprun, à mon sens, faut tout refaire... le code de la boxe d'origine ne correspond plus à ton besoin...

Mais chez moi, ton code posté à mon attention fonctionne impeccable hormis pour l'affichage de la catégorie mère...

Si on reprend le post dont tout part (celui pour padaben... http://www.oscommerce-fr.info/forum/index.php?showtopic=57087&hl=), je donnais une solution qui était finalement mieux en fait... comment l'expliquer... la tienne était plus simple pour la retouche (un seul changement...) mais la mienne ne touchait pas du tout à la construction du $tree donc tu gardais l'arborescence impeccable. Du coup, tout devrait bien fonctionner sans tout retoucher mais en partant de là... je regarde mais je promet rien... l'écran est flou (pas l'affichage, l'écran entier, même les bords... ils bougent... mrgreen.gif )

Écrit par : delete 15 Sep 2008, 09:25

Citation (gentag @ 15 Sep 2008, 10:19) *
Mais comme shoprun, à mon sens, faut tout refaire... le code de la boxe d'origine ne correspond plus à ton besoin...


C'est pour ça que je lui ai demandé ces précisions excl.gif D'après les premières réponses à ces précisions, je penses que nous sommes sur la même longueur d'onde (même si tu as 3g laugh.gif).

Il est souvent mieux d'avoir une page blanche de la remplir et de tester que de trifouiller du code.


Écrit par : coconimo 15 Sep 2008, 10:05

oki les garçons.
voici le scénario :
on a dans le header un menu avec les catégories mère [parent_id =0] (actuellement sur mon site, c'est le module main_categories qui permet d'y accéder, mais qu'importe)
ensuite la boxe catégories apparaît suivant les conditions suivantes :
cas 1 : je cliques sur le menu : la catégorie mère n'a pas de ss categories, juste des produits -> la boxe categories n'apparaît pas, c'est inutile, l'arborescence serait vide : donc on a l'affichage direct du listing produit.
cat 2 : je cliques sur le menu : la catégorie mère a des ss catégories -> la boxe catégories apparaît avec l'image de la catégorie mère. je cliques sur une ss catégories -> l'image de la sous catégorie vient remplacer celle de la catégorie mère. etc, etc ...
l'arbre continu de se déployer si j'ai des sous sous catégories au fur et à mesure (fonctionnement normal de la boxe catégories originale)
cas 3 : je suis sur la page product_info : la boxe catégories apparaît en fonction des cas 1 et 2.
en résumé, avec mon code, la boxe catégories n'apparaît que dans 3 cas.
si vous êtes sur la page product_new.php, product_review.php, etc , la boxe n'a pas lieu d'apparaître puisque le chemin n'est pas définit.(multi-produits et multi-catégorie)

les seules choses que j'ai affiné dans mon code est :
d'une part la conditionnelle dans la column left :

Code
if (($cPath != 0) xor (tep_has_category_subcategories($cPath) == 0 )){
  if ((USE_CACHE == 'true') && empty($SID)) {
    echo tep_cache_categories_box();
  } else {
    include(DIR_WS_BOXES . 'categories.php');
  }
  }

et ma fonction dans general.php (pour gérer la présence ou non d'une image):
Code
function tep_get_category_image() {
    global $languages_id;
    global $current_category_id;        
    if (empty($language)) $language = $languages_id;    
    $category_image_query = tep_db_query("select c.categories_id, cd.categories_id, cd.categories_name as name, c.categories_image as image from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.categories_id = '" . $current_category_id . "' and c.categories_id = cd.categories_id and cd.language_id = '" . (int)$languages_id . "'");
    $category_image = tep_db_fetch_array($category_image_query);
    if (tep_not_null($category_image['image'])){            
    return tep_image(DIR_WS_IMAGES . $category_image['image'] , $category_image['name'], 128, 128);
    }else{
    return false;
    }    
    }

Écrit par : gentag 15 Sep 2008, 12:04

Re,

J'étais en train de me dire... pourquoi afficher le nom de la catégorie principale dans la boxe et pas dans le titre de la boxe... plus sympa et du coup ça simplifie tout (enfin presque...).

Pour faire ça juste un petit truc, dans "\catalog\includes\boxes\categories", juste avant ça (vers ligne 59):

Code
  $info_box_contents = array();
  $info_box_contents[] = array('text' => BOX_HEADING_CATEGORIES);

  new infoBoxHeading($info_box_contents, true, false);
rajouter ça :
Code
if ($cPath != 0) {
  $arr = explode('_', $cPath);
  $main_cat = $arr[0];
  $cat_name_query = tep_db_query("select cd.categories_name from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.categories_id = '" . $main_cat . "' and cd.categories_id = c.categories_id and cd.language_id='" . (int)$languages_id ."'");
  $cat_name = tep_db_fetch_array($cat_name_query);
  if (strlen($cat_name['categories_name']) != 0) {
    $strg_cat_name = $cat_name['categories_name'];
  } else {
    $strg_cat_name = BOX_HEADING_CATEGORIES;
  }
}
et en profiter au passage pour remplacer BOX_HEADING_CATEGORIES par $strg_cat_name dans les trois lignes de code citées au-dessus.

Après laisser soit ton code filé à padaben soit le mien (peu importe les deux fonctionnent, perso, j'ai pris le mien) pour afficher juste les sous-catégories dans la boxe.

Ne reste qu'à modifier un peu ta fonction d'affichage d'image et le tour est joué, pour cette partie je vois cet après-midi, faut que je remplisse mon estomac là j'en peux plus, ça tourne à l'aigre là-dedans... vite, de la bouffe pour éponger, j'ai presque mal tellement j'ai le bide en vrac...

Écrit par : coconimo 15 Sep 2008, 14:00

alors ne mélangeons pas tout.
le code pour padaben est sur un autre post, et il est confronté à un problème de compatibilité avec un module de categories_tab.(mon code est totalement fonctionnel avec celui d'une autre contrib que Delete a laissé sur un autre post [un trucmuche en css]) et ça, je le suis pas email (oui, je fais aussi de la hotline payante, et bien plus cher que ce que penses Delete tongue.gif )
la question au départ été de savoir si on pouvait se servir du code existant de la boxe catégories originale pour arriver à mes fins.
Shoprun a été très clair : non.
Donc ma solution actuellement est la plus simple :
- une double conditionnelle dans la colonne gauche
- une modification dans la première requête de la boxe catégories.
- une fonction (et donc une requête supplémentaire) dans le fichier general.
- l'appel de la fonction dans la construction de la boxe.

Le tout ? une future contrib pour la boxe catégorie qui n'existe pas encore.(en gestation pour un code propre et portable, biensûr smile.gif basé sur la librairie jquery, autant dire que je n'en suis qu'au prémisse actuellement.)

Écrit par : gentag 15 Sep 2008, 14:17

Re,

Bah je ne mélangeais pas... au contraire, je finis plutôt...

Ca te plaisais pas l'idée de la cat princ en titre de boxe ?? parce que si oui c'est presque fini et fonctionnel de mon côté... ne reste que modifier l'affichage de ton image pour avoir la cat princ si dessus et hop mais j'attendais ton retour sur l'idée (et oui après tout tu es peut-être obligée de mettre la cat princ dans la boxe, je ne sais pas moi, un cahier des charge qui traine par exemple... au pire même ça je pense pouvoir le faire...).

Pour aller encore plus loin, je dirais même qu'il faudrait éviter de réutiliser la boxe d'origine, elle va requêter comme une folle pour créé le tree alors que tu n'en as pas besoin... mais elle a quand même un gros avantage... si tu actives son cache, elle ne requête plus du tout et affiche le cache donc finalement elle est pas si mal...

Écrit par : delete 15 Sep 2008, 14:33

Citation (coconimo @ 15 Sep 2008, 15:00) *
(mon code est totalement fonctionnel avec celui d'une autre contrib que Delete a laissé sur un autre post [un trucmuche en css])


Je me rappelles effectivement avoir pondu un truc mono-requête pour l'affichage des catégories ... car le menu d'origine osC est gourmant en ressources ...

Citation (coconimo @ 15 Sep 2008, 15:00) *
et ça, je le suis pas email (oui, je fais aussi de la hotline payante, et bien plus cher que ce que penses Delete tongue.gif )


J'attends des dividendes ... tongue.gif

Écrit par : gentag 15 Sep 2008, 15:01

Plus de chat... ?

Tant pis, je finis comme ça et posterais le truc, on verra si ça lui convient...

[EDIT] Ah, je sais pourquoi pas de réponses, si je fournis une solution complète ici, plus de hotline payante par mail pour padaben... fini les tunes pour le chat... plus de croquettes... bon bah je fais vite... biggrin.gif

Écrit par : gentag 15 Sep 2008, 17:01

Bon bein ça fonctionne parfaitement... les dernières modifs étaient tranquille en plus... juste que je suis en lutte avec moi-même aujourd'hui donc c'est long...

Donc, pour ne pas compliqué tout ça plus que ce ne l'est déjà... pas simple entre tous les codes etc... je reprend tout depuis le début (même si ça va faire lourd... désolé mais ce serait trop compliqué de dire : aller sur ce post là et prenez juste telle partie du code puis aller sur cet autre post et copiez telle partie, etc... -> incompréhensible.... j'étais en train de le faire mais je me suis paumé en route, donc du complet, tant pis, ce sera encore un gros message de gentag...)

Commencer par faire ce que proposait coconimo dans un autre post, n'afficher la boxe que si dans une sous-catégorie, donc :
dans le fichier "\catalog\includes\column_left.php", juste avant ça :

Code
if ((USE_CACHE == 'true') && empty($SID)) {
    echo tep_cache_categories_box();
rajouter ça :
Code
if ($cPath != 0){
ensuite faut fermer ce if donc après ça :
Code
} else {
    include(DIR_WS_BOXES . 'categories.php');
  }
rajouter ça :
Code
}
-> plus de boxe sur l'acceuil

Ensuite dans le fichier "\catalog\includes\functions\general.php" rajouter ça n'importe où (entre des balises <?php et ?> tout de même et pas en plein milieu d'une autre fonction, hein mellow.gif ) :
Code
////
// Return a category image  
  function tep_get_category_image($id_cat = 0, $id_lang = 0) {
    if (($id_cat != 0) && ($id_lang != 0)) {
      $category_image_query = tep_db_query("select cd.categories_name, c.categories_image from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.categories_id = '" . (int)$id_cat . "' and c.categories_id = cd.categories_id and cd.language_id = '" . (int)$id_lang . "'");
      $category_image = tep_db_fetch_array($category_image_query);
      if (strlen($category_image['categories_image'])) {
        return (tep_image(DIR_WS_IMAGES . $category_image["categories_image"], $category_image["categories_name"], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT));
      } else {
        return ('');
      }
    } else {
      return ('');
    }
  }
Donc toujours la fonction de coconimo que j'ai retouchée un peu (bah oui on n'utilises pas de variables globales quand on fait du code "moderne" - c'est les "vieux" codeurs en C qui font ça, et encore... - on utilise le passage de paramètre, c'est beaucoup plus propre et surtout on peut passer ce qu'on veut, hein, imagine que tu ne veuilles pas qu'elle utilise la catégorie courante comme catégorie à tester mais une spécifique, tu peux lui passer là, c'est plus pratique quoi...)

Puis - et voilà le gros pâté... désolé - le code de la boxe catégorie modifié et complet (donc juste faire une copie de l'originale pour la garder et remplacer la totalité du code de l'originale par celui que je donnes ici...) :
Code
<?php
/*
  $Id: categories.php,v 1.25 2003/07/09 01:13:58 hpdl Exp $

  osCommerce, Open Source E-Commerce Solutions
  http://www.oscommerce.com

  Copyright (c) 2003 osCommerce

  Released under the GNU General Public License
*/
  function tep_show_category($counter) {
    global $tree, $categories_string, $cPath_array;

    if ($tree[$counter]['parent'] == 0) {
      //$cPath_new = 'cPath=' . $counter;
    } else {
      for ($i=0; $i<$tree[$counter]['level']; $i++) {
        $categories_string .= "&nbsp;&nbsp;";
      }
      $categories_string .= '<a href="';
      $cPath_new = 'cPath=' . $tree[$counter]['path'];
      $categories_string .= tep_href_link(FILENAME_DEFAULT, $cPath_new) . '">';
      if (isset($cPath_array) && in_array($counter, $cPath_array)) {
        $categories_string .= '<b>';
      }
      // display category name
      $categories_string .= $tree[$counter]['name'];

      if (isset($cPath_array) && in_array($counter, $cPath_array)) {
        $categories_string .= '</b>';
      }

      if (tep_has_category_subcategories($counter)) {
        $categories_string .= '-&gt;';
      }

      $categories_string .= '</a>';

      if (SHOW_COUNTS == 'true') {
        $products_in_category = tep_count_products_in_category($counter);
        if ($products_in_category > 0) {
          $categories_string .= '&nbsp;(' . $products_in_category . ')';
        }
      }

      $categories_string .= '<br />';
    }

    if ($tree[$counter]['next_id'] != false) {
      tep_show_category($tree[$counter]['next_id']);
    }
  }
?>
<!-- categories //-->
          <tr>
            <td>
<?php
if ($cPath != 0) {
  $arr = explode('_', $cPath);
  $main_cat = $arr[0];
  $cat_name_query = tep_db_query("select cd.categories_name from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.categories_id = '" . $main_cat . "' and cd.categories_id = c.categories_id and cd.language_id='" . (int)$languages_id ."'");
  $cat_name = tep_db_fetch_array($cat_name_query);
  if (strlen($cat_name['categories_name']) != 0) {
    $strg_cat_name = $cat_name['categories_name'];
  } else {
    $strg_cat_name = BOX_HEADING_CATEGORIES;
  }
}
  $info_box_contents = array();
  $info_box_contents[] = array('text' => $strg_cat_name);

  new infoBoxHeading($info_box_contents, true, false);

  $categories_string = '';
  $tree = array();

  $categories_query = tep_db_query("select c.categories_id, cd.categories_name, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.parent_id = '0' and c.categories_id = cd.categories_id and cd.language_id='" . (int)$languages_id ."' order by sort_order, cd.categories_name");
  while ($categories = tep_db_fetch_array($categories_query))  {
    $tree[$categories['categories_id']] = array('name' => $categories['categories_name'],
                                                'parent' => $categories['parent_id'],
                                                'level' => 0,
                                                'path' => $categories['categories_id'],
                                                'next_id' => false);

    if (isset($parent_id)) {
      $tree[$parent_id]['next_id'] = $categories['categories_id'];
    }

    $parent_id = $categories['categories_id'];

    if (!isset($first_element)) {
      $first_element = $categories['categories_id'];
    }
  }

  //------------------------
  if (tep_not_null($cPath)) {
    $new_path = '';
    reset($cPath_array);
    while (list($key, $value) = each($cPath_array)) {
      unset($parent_id);
      unset($first_id);
      $categories_query = tep_db_query("select c.categories_id, cd.categories_name, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.parent_id = '" . (int)$value . "' and c.categories_id = cd.categories_id and cd.language_id='" . (int)$languages_id ."' order by sort_order, cd.categories_name");
      if (tep_db_num_rows($categories_query)) {
        $new_path .= $value;
        while ($row = tep_db_fetch_array($categories_query)) {
          $tree[$row['categories_id']] = array('name' => $row['categories_name'],
                                               'parent' => $row['parent_id'],
                                               'level' => $key+1,
                                               'path' => $new_path . '_' . $row['categories_id'],
                                               'next_id' => false);

          if (isset($parent_id)) {
            $tree[$parent_id]['next_id'] = $row['categories_id'];
          }

          $parent_id = $row['categories_id'];

          if (!isset($first_id)) {
            $first_id = $row['categories_id'];
          }

          $last_id = $row['categories_id'];
        }
        $tree[$last_id]['next_id'] = $tree[$value]['next_id'];
        $tree[$value]['next_id'] = $first_id;
        $new_path .= '_';
      } else {
        break;
      }
    }
  }
  tep_show_category($first_element);

  $info_box_contents = array();
  $info_box_contents[] = array('text' => $categories_string);

  if ($current_category_id != 0 && $languages_id != 0) {
    $strg_to_display = tep_get_category_image((int)$current_category_id, (int)$languages_id);
    if (strlen($strg_to_display) != 0) {
      $info_box_contents[] = array('text' => $strg_to_display);
    }
  }  
  new infoBox($info_box_contents);
?>
            </td>
          </tr>
<!-- categories_eof //-->
Voilà, voilà... pas si compliqué en fait... tongue.gif

Écrit par : coconimo 15 Sep 2008, 17:52

alors, mon 'tit gentag, je reste dubitative ... unsure.gif
j'attends les commentaires de shoprun et Delete (voir d'autres plus calés encore [mais ils se cachent en ce moment ... wink.gif ]), mon niveau 'chaton' en php ne me permet pas d'analyser ton code.
a + tard.


Écrit par : shoprun 15 Sep 2008, 19:47

Citation (coconimo @ 15 Sep 2008, 20:52) *
j'attends les commentaires de shoprun et Delete (voir d'autres plus calés encore [mais ils se cachent en ce moment ... wink.gif ]),
Disons que le dernier code que j'ai posté m'a semblé très proche de ce que tu souhaitais obtenir, mais j'ai pas vu de commentaires de ta parts, du coup j'ai quelque part "passer la main" aux autres.

C'est vrai j'avais dis que ce n'était pas totalement abouti car il manquait cette fichu image de la catégorie parente, mais mon code + ta fonction donne (à mon sens) le résultat final, du moins je pense.


Ceci dit, en lisant un peu tes explications, il y a des points un peu ombrageux, alors je vais donné le déroulement par rapport à ce que j'ai pu voir sur ton site démonstratif, car il y a une particularité que j'ai remarqué.
De plus je suis d'accord avec Delete de ce mettre d'accord sur le fonctionnement, ça va éviter de coder dans tous les sens.

1/ On a est dans la page d'accueil ou autre page, il y a rien, pas de box catégorie, normal.
Les catégories principales ou catégorie mères (celles dont le parent = 0) sont dans la page centrale.
On clique sur une des catégories.....

2/ On arrive dans la catégorie sélectionnée. On obtient l'ID de cette catégorie courante -> $current_category_id
-> on affiche l'image de la catégorie parente (ta fonction) de -> $current_category_id
-> on affiche les liens textuels des catégorie filles de -> $current_category_id

3/ -- etc --- idem que l'étape 2/ tant que la catégorie courante ($current_category_id) a des filles ...

4/ On arrive dans la catégorie sélectionnée, mais en bout de chaine, la dernière.
On obtient l'ID de cette catégorie courante -> $current_category_id
-> on affiche l'image de la catégorie parente (ta fonction) de -> $current_category_id
-> Et là on cette particularité, car normalement on devrait rien afficher car $current_category_id n'a plus de filles.
Mais j'ai vu que tu affichais des liens, et ces lien sont en faites les filles de la catégorie parentes (ou les soeurs de la catégorie courantes), les mêmes en faite que l'étape juste avant.
C'est ceci que l'on peut voir dans le code que j'avais proposé, en faisant une alternative :
Code
if (tep_has_category_subcategories($current_category_id)) {
// Requête 1
}
else {
// Requête 2
}



J'ai essayé le code de Gentag et il me semble que ce n'est pas ce qui doit être fait, ça affiche beaucoup trop de catégories que prévues. Enfin, toujours d'après ce que j'ai compris ...


Citation
Shoprun a été très clair : non.
Je dis pas que c'est impossible d'adapter le code d'origine de cette boxe, mais c'est la croix et la bannière.
Si c'est simple alors c'est que j'ai rien vu ni comment le faire.
Alors j'en reste à mon idée de faire du code spécifique pour le faire, et ça doit tenir sur 2 ou 3 requêtes max, juste celles dont on a besoin.
-> Le nom et l'image de la catégorie parente
-> Les filles de la catégorie courante
-> Et le test si la catégorie courant a des filles ou pas
Ce qui fait que je ne me replongerais pas encore dans le code de cette boxe qui pour ma part en fait beaucoup trop de ce que tu veux et en plus c'est même pas prévu pour.

Écrit par : delete 15 Sep 2008, 20:20

Citation (coconimo @ 15 Sep 2008, 18:52) *
alors, mon 'tit gentag, je reste dubitative ... unsure.gif
j'attends les commentaires de shoprun et Delete (voir d'autres plus calés encore [mais ils se cachent en ce moment ... wink.gif ]), mon niveau 'chaton' en php ne me permet pas d'analyser ton code.
a + tard.


Hummm maurice, tu pousses le bouchon un peu trop loin ... mrgreen.gif

Les plus calés, notamment Gnidhal sont occupés ou ne répondent pas pour une bonne raison :

La finalité n'était pas claire dès le début d'où mon intervention dans ce post.

Evite de "Chatouiller" les efforts de chacun car l'investissement personnel de chaque intervenant a été certainement très chronophage.

Allez ! Une caresse pour le chaton wink.gif

Écrit par : coconimo 15 Sep 2008, 21:15

oula, je ne veux chatouiller personne.
je vais synthétiser les diverses réponses.
donc merci à vous 3 pour l'ensemble de vos efforts smile.gif smile.gif smile.gif

Écrit par : gentag 15 Sep 2008, 22:20

Re,

sinon je pense toujours comme shoprun que c'est très "gourmand" comme solution pour pas vraiment la bonne utilisation (la création du tree veux-je dire...) et perso je trouvais son code très propre, vite fait et bien fait... mais je ne l'ai pas testé... ça semblait fonctionnel à lire quoi.

Mais vu que la boxe est mise en cache, c'est pas trop génant, c'est pour ça que j'ai fini le machin, c'était lancé j'avais tout sous la main en fait (dans mes onglets Notepad++) sinon j'aurais pris le code de shoprun si il n'y avait pas cette possibilité (d'ailleurs fallait juste finir pour l'image et mettre en cache pour en faire le truc "parfait")...

Bon du coup, faut l'activer... (EDIT: le cache hein)

EDIT2:

Citation
J'ai essayé le code de Gentag et il me semble que ce n'est pas ce qui doit être fait, ça affiche beaucoup trop de catégories que prévues. Enfin, toujours d'après ce que j'ai compris ...
il me semble que coconimo voulait le tree intégral de la categorie principale sélectionnée (parce qu'elle affiche les principales en horizontal dans le header ) donc le tree est respecté et il passe bien en gras tout ce qui l'est d'habitude, enfin si me souviens bien (pas trop en fait) de ce que j'ai fait aujourd'hui...

Écrit par : shoprun 16 Sep 2008, 06:06

Citation
je vais synthétiser les diverses réponses.
Synthétiser peut être, mais surtout décrire ton besoin de la manière la plus précise possible.
Les explications données plus haut restent encore floues, pour m'a part il y a encore ambiguïté.
Enfin, c'est mon avis ...


Citation (gentag @ 16 Sep 2008, 01:20) *
il me semble que coconimo voulait le tree intégral de la categorie principale sélectionnée (parce qu'elle affiche les principales en horizontal dans le header )
@Gentag
On ne comprend pas la même chose, on en fait des déductions personnelles, en faite.
Tu dis qu'il faut un $tree complet parce qu'il y a les catégories mères dans le header.
Et bien moi je pense qu'il y a pas lieu d'avoir un $tree complet justement parce que le header contient déjà les catégories mères.

Bref, sans retour de Coconimo, on va sans cesse faire de "l'approximatif".

Écrit par : gentag 16 Sep 2008, 06:35

Salut shoprun,

en fait, je (pen)sais (savoir... huh.gif ) exactement ce que voulais coconimo parce que je suis le débat dès le départ, sur le post de padaben cité plus haut, car tout part de là...

En fait mettre le tree "en entier" de la catégorie principale est important car sinon il ne reste que la breadcrumb poour retrouver les sous-catégories quand on est dans une sous-sous-catégorie, la navigation devient très chiante si la catégorie dans laquelle on rentre devient la "principale" des catégories affichées dans la boxe (j'ai essayé, j'étatis parti sur un truc comme ça au départ...)

Écrit par : shoprun 16 Sep 2008, 07:22

@Gentag
Je viens de constater ceci dans le titre -> -| sujet clos |-
Etonnant, mais bon ... huh.gif

Alors j'en fais plus état, le débat est clos.

Écrit par : coconimo 16 Sep 2008, 08:00

Citation (coconimo @ 15 Sep 2008, 12:05) *
oki les garçons.
voici le scénario :
on a dans le header un menu avec les catégories mère [parent_id =0] (actuellement sur mon site, c'est le module main_categories qui permet d'y accéder, mais qu'importe)
ensuite la boxe catégories apparaît suivant les conditions suivantes :
cas 1 : je cliques sur le menu : la catégorie mère n'a pas de ss categories, juste des produits -> la boxe categories n'apparaît pas, c'est inutile, l'arborescence serait vide : donc on a l'affichage direct du listing produit.
cat 2 : je cliques sur le menu : la catégorie mère a des ss catégories -> la boxe catégories apparaît avec l'image de la catégorie mère. je cliques sur une ss catégories -> l'image de la sous catégorie vient remplacer celle de la catégorie mère. etc, etc ...
l'arbre continu de se déployer si j'ai des sous sous catégories au fur et à mesure (fonctionnement normal de la boxe catégories originale)
cas 3 : je suis sur la page product_info : la boxe catégories apparaît en fonction des cas 1 et 2.
en résumé, avec mon code, la boxe catégories n'apparaît que dans 3 cas.
si vous êtes sur la page product_new.php, product_review.php, etc , la boxe n'a pas lieu d'apparaître puisque le chemin n'est pas définit.(multi-produits et multi-catégorie)

.../...



Citation (shoprun @ 16 Sep 2008, 08:06) *
Citation
je vais synthétiser les diverses réponses.
Synthétiser peut être, mais surtout décrire ton besoin de la manière la plus précise possible.
Les explications données plus haut restent encore floues, pour m'a part il y a encore ambiguïté.
Enfin, c'est mon avis ...


Citation (gentag @ 16 Sep 2008, 01:20) *
il me semble que coconimo voulait le tree intégral de la categorie principale sélectionnée (parce qu'elle affiche les principales en horizontal dans le header )
@Gentag
On ne comprend pas la même chose, on en fait des déductions personnelles, en faite.
Tu dis qu'il faut un $tree complet parce qu'il y a les catégories mères dans le header.
Et bien moi je pense qu'il y a pas lieu d'avoir un $tree complet justement parce que le header contient déjà les catégories mères.

Bref, sans retour de Coconimo, on va sans cesse faire de "l'approximatif".



Citation (gentag @ 16 Sep 2008, 08:35) *
Salut shoprun,

en fait, je (pen)sais (savoir... huh.gif ) exactement ce que voulais coconimo parce que je suis le débat dès le départ, sur le post de padaben cité plus haut, car tout part de là...

En fait mettre le tree "en entier" de la catégorie principale est important car sinon il ne reste que la breadcrumb poour retrouver les sous-catégories quand on est dans une sous-sous-catégorie, la navigation devient très chiante si la catégorie dans laquelle on rentre devient la "principale" des catégories affichées dans la boxe (j'ai essayé, j'étatis parti sur un truc comme ça au départ...)


Désolé, je pensais que mes explications avaient été claires . Sachant que dès le départ, le résultat 'physique' de mon code été opérationnel sur le site de démo, car les conditionnelles et la fonction remplissaient bien leur tâche.(couplé avec le module main_categories + le module categories_tab de Delete dans le hearder)
C'est pour cette raison que je ne souhaitais pas forcément totalement modifier le code de la boxe pour garder la construction de l'arbre.
Néanmoins, les codes que vous avez eu la gentillesse de poster vont me servir à décortiquer l'indispensable et l'inutile de cette boxe pour arriver au but final (qui peut paraître bizarre car non réalisé encore en boutique ... c'est du visuel, mais ça doit rester ergonomique en même temps)
pour finir, j'ai mis le sujet clos parce que je ne souhaite pas non plus abusé du temps de chacun, mais travaillé sur les pistes données. wink.gif
merci pour tout. wub.gif

Écrit par : shoprun 16 Sep 2008, 10:44

Citation
l'arbre continu de se déployer si j'ai des sous sous catégories au fur et à mesure (fonctionnement normal de la boxe catégories originale)

Et bien c'est là le problème.
Cette info me parait contradictoire par rapport à ce que je vois dans la boxe catégories sur ton site "démo".
En visuel je ne vois pas l'arbre ce déployer, mais je vois uniquement les catégories filles, et uniquement celles liées directement, je ne vois donc pas les petites filles (ss cat), et encore moins les autres catégories mères et leur filles, petites filles, etc ...

--> Quand on sélectionne "Computeur", il y a "Laptop" et "Mac" comme catégories fille, et l'image de la catégorie parente "Computeur". (je ne vois pas autre chose).

--> Quand on sélectionne Laptop" (c'est la dernière, on est en bout de chaine), il y a à nouveau "Laptop" et "Mac", et l'image de la catégorie parente "Laptop" (qui est la même d'ailleurs).
Ici, ce n'est pas un comportement normal, car le catégorie "Laptop" n'a pas de fille, donc normalement il devrait rien avoir dans cette box catégorie sinon que l'image de "Laptop".
Mais dans le fond c'est pas plus mal ainsi, mais je note cette spécificité ...


Sérieux, j'ai surement raté une étape, mais c'est pas grâve, il y a pas mort d'homme blush.gif
De plus, mon aide a toujours été qu'une aide, et non pas vouloir proposer une solution clé en main.

Écrit par : coconimo 16 Sep 2008, 12:03

bon, toutes mes categories n'ont pas forcément des ss ss catégories.
mais c le cas de "software".
sinon, oui la boxe reste présente tant qu'on navigue dans la même categorie principale, faut garder un tant soit peu de l'ergonomie, non?

Écrit par : shoprun 16 Sep 2008, 15:50

Citation (coconimo @ 16 Sep 2008, 15:03) *
bon, toutes mes categories n'ont pas forcément des ss ss catégories.
mais c le cas de "software".

Ben j'ai essayé pas de catégories, mais pas celle ci, et là, les choses sont un peu plus clair.

-> Je note maintenant que le déploiement ce fait effectivement au fur et à mesure que l'on avance dans l'arbre de la catégorie de départ, elles sont présentes/conservées sous forme de liens, ce qui permet de remonter plus facilement.
(Je n'avais pas du tout remarqué ça, du coup mon code ne représente pas ça, donc pas bon).

-> Petite particularité tout de même.
La catégorie mère (parente = 0) n'est pas présente sous forme de lien textuel, mais uniquement sous forme de lien "image" quand on arrive dans celle ci de la page d'accueil. (ou que l'on clique sur le lien présent dans la barre de navigation).
Mais c'est dû au fait qu'il est prévu que les catégories mères soient dans le header il me semble.

-> L'autre particularité, c'est la même que j'avais noté plus haut, c'est quand on arrive en bout de chaine, dans une catégorie n'ayant plus de filles.


En ce qui concerne l'ergonomie, effectivement c'est bien mieux ainsi

Écrit par : coconimo 16 Sep 2008, 21:57

bon, quoi qu'il en soit, faudra que je revois ma copie car en définissant error_reporting(E_ALL | E_STRICT);, j'ai une belle :
Notice: Undefined offset: 10 in C:\wamp\www\catalog\includes\boxes\categories.php on line 132
(10 étant l'id de la catégorie mère appelée et $first_id = $row['categories_id']; la ligne posant problème.)
ça n'empêche pas le script de fonctionner, mais c pas terrible quand même d'un point de vue développement.

Écrit par : gentag 16 Sep 2008, 22:23

Bonsoir,

euh... tu as eu ça sur mon code ?

Citation
mais c pas terrible quand même d'un point de vue développement
pire...
C'est vrai que quand je teste je suis sur une OsC vierge donc avec la vilaine ligne dans application.top qui met ça en plus permissif donc a pas pû la voir...

Écrit par : shoprun 17 Sep 2008, 06:33

Bon, et bien j'en conviens qu'il est préférable ou plus simple de conserver le code d'origine
J'ai donc repris le code de Gentag qui répond finalement bien au besoin exprimé, j'avais pas compris tout ça, c'est clair mrgreen.gif
Scouzy Gentag wink.gif

Du coup, j'en reviens à mon idée de départ, au tout début, qu'il doit être possible d'éviter de requêter afin de récupérer l'image de la catégorie.
L'idée était de rajouter dans les requêtes le nom du champ, bref, on avait déjà vu ça ...

Donc voilà le code (celui de Gentag) avec quelques tout petits aménagements, dont la fonction tep_get_category_image() devient inutile (c'est le but ici).
Ajout de la variable global -> $cat_image

Code
$cat_image = null;
function tep_show_category($counter) {
    global $tree, $categories_string, $cPath_array, $cat_image;
    
    if ((int)$tree[$counter]['parent'] > 0) {
        for ($i=0; $i<$tree[$counter]['level']; $i++) {
            $categories_string .= "&nbsp;&nbsp;";
        }
        $categories_string .= '<a href="';
        $cPath_new = 'cPath=' . $tree[$counter]['path'];
        $categories_string .= tep_href_link(FILENAME_DEFAULT, $cPath_new) . '">';
        if (isset($cPath_array) && in_array($counter, $cPath_array)) {
            //
            $cat_image = '<a href="'.tep_href_link(FILENAME_DEFAULT, $cPath_new).'">'.tep_image(DIR_WS_IMAGES.$tree[$counter]['image'], $tree[$counter]['name']).'</a>';
            //
            $categories_string .= '<b>';
        }
        // display category name
        $categories_string .= $tree[$counter]['name'];
        
        if (isset($cPath_array) && in_array($counter, $cPath_array)) {
            $categories_string .= '</b>';
        }
        
        if (tep_has_category_subcategories($counter)) {
            $categories_string .= '-&gt;';
        }
        
        $categories_string .= '</a>';
        
        if (SHOW_COUNTS == 'true') {
            $products_in_category = tep_count_products_in_category($counter);
            if ($products_in_category > 0) {
                $categories_string .= '&nbsp;(' . $products_in_category . ')';
            }
        }
        
        $categories_string .= '<br />';
    }
    
    
    if ($tree[$counter]['next_id'] != false) {
    tep_show_category($tree[$counter]['next_id']);
    }
}

Puis :
Code
if ($cPath != 0) {
    $arr = explode('_', $cPath);
    $main_cat = $arr[0];
    $cat_name_query = tep_db_query("select c.categories_id , c.categories_image, cd.categories_name  from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.categories_id = '" . $main_cat . "' and cd.categories_id = c.categories_id and cd.language_id='" . (int)$languages_id ."'");
    if (tep_db_num_rows($cat_name_query) > 0) {
        $cat_name = tep_db_fetch_array($cat_name_query);
        $strg_cat_name = $cat_name['categories_name'];
        $cat_image = '<a href="'.tep_href_link(FILENAME_DEFAULT, 'cPath='.$cat_name['categories_id']).'">'.tep_image(DIR_WS_IMAGES.$cat_name['categories_image'], $cat_name['categories_name']).'</a>';
    }
    else {
        $strg_cat_name = BOX_HEADING_CATEGORIES;
    }
}
$info_box_contents = array();
$info_box_contents[] = array('text' => $strg_cat_name);
new infoBoxHeading($info_box_contents, true, false);

Puis :
Code
tep_show_category($first_element);

$info_box_contents = array();
$info_box_contents[] = array('text' => $categories_string);

if (tep_not_null($cat_image)) {
    $info_box_contents[] = array('text' => $cat_image);
}
new infoBox($info_box_contents);


Et enfin, ne pas oublier le nom de l'image + ajout dans le tableau pour les 2 requêtes :
Code
// Dans la 1ère pour le tableau :
'image' => $categories['categories_image'],
// Dans la 2ème pour le tableau :
'image' => $row['categories_image'],



Citation (coconimo @ 17 Sep 2008, 00:57) *
Notice: Undefined offset: 10 in C:\wamp\www\catalog\includes\boxes\categories.php on line 132

Je n'est pas du cette erreur avec un E-ALL | E_STRICT, du coup difficile de voir le problème.
Puis je reste tout même surpris du type d'erreur retourné car avant de faire le -> $first_id = $row['categories_id']; il y a le -> $tree[$row['categories_id']] = array(......), donc le tableau est initialisé. Pige pas.

Fait un echo sur $row['categories_id'] et $tree[$row['categories_id']]['name'] juste après la création de ce tableau, ne serait ce pour voir ce que ça contient.
Peut être que ta BDD te retourne un enregistrement null ou vide.
Peut être est dû aux copies de produits dans une ou plusieurs catégories.

Bref, vu que je n'est pas cette erreur, ça doit venir d'une particularité chez toi, et ça viendrait peut être de la BDD, du moins je pense.

Écrit par : gentag 17 Sep 2008, 06:48

Bonjour,

Citation
Scouzy Gentag
Bah ecoute aucun problème hein, je ne me suis pas senti agressé ni rien, tout le monde fait son interprétation, juste que j'étais le mieux placé pour comprendre (bon à part coconimo) j'ai presque vu germer l'idée dans sa tête sur le post de padaben... (bonne idée au passage, c'est pour ça que j'ai participé dans ma modeste mesure)

Sinon l'erreur avec mon code n'est pas impossible car comme je zappe toute la partie de la construction des catégories principales et qu'il reste une ligne commentée pour dire de passer à une principale suivante (à ne pas décommenter, voilà le bordel sinon...), je ne suis pas (trop) étonné que cela pose un problème sur une catégorie principale en fait... juste que je ne pouvais pas la voir avec la boutique par défaut. Mais du coup je me demande si la construction du tree (hormis l'erreur) ne serait pas "parfaite", soit, qu'il ne liste que la catégorie principale de la catégorie en cours et pas toutes les catégorie comme le fait celui d'origine (j'ai pas vérifié mais je pense que c'est le cas, ce qui ferait que mon truc ne serais pas mal en fait, mais faut vérifier...)

Écrit par : gentag 17 Sep 2008, 07:01

Par contre, perso, je reste sur l'idée que le code de cette boxe est beaucoup trop lourd et qu'il y a moyen d'alléger en faisant du spécifique (en partant du cPath il doit même y avoir un moyen de faire beaucoup plus simple que cette usine à gaz qu'est la boxe d'origine... c'est tellement lourd à requêter que les concepteurs l'ont mise en cache, on comprend pourquoi....)

Écrit par : shoprun 17 Sep 2008, 07:09

Citation (gentag @ 17 Sep 2008, 09:48) *
Sinon l'erreur avec mon code n'est pas impossible car comme je zappe toute la partie de la construction des catégories principales et qu'il reste une ligne commentée pour dire de passer à une principale suivante (à ne pas décommenter, voilà le bordel sinon...)

Si tu pense que c'est cette partie qui cause problème, et bien j'ai modifier comme ceci en faite :
Code
    if ((int)$tree[$counter]['parent'] > 0) {
        for ($i=0; $i<$tree[$counter]['level']; $i++) {
            $categories_string .= "&nbsp;&nbsp;";
        }
    ... etc ...
    }
Donc on zappe bien les catégories dont les parent = 0, du coup pas de problème.


Ceci dit je ne pense pas que ce soit cette partie, car l'erreur vient avant d'après le retour d'erreur, quand on construit le tableau $tree, dans la 2ème requête, donc avant l'appel à la fonction tep_show_category().

Je n'est pas cette erreur, je ne sais même pas comment provoquée cette erreur.
L'erreur dit que le $tree[] n'est pas défini à un moment, donc j'en conclu qu'à un moment donné la requête retourne un $row['categorie_id'] null ou vide ou rien. Ce qui sous entends que cela viendrait de la requête, d'une ligne quelle retourne pas très conforme.
Enfin, je vois pas autre chose.

Écrit par : gentag 17 Sep 2008, 08:20

En fait, le truc que j'avais fait n'affichait rien si level 0 mais le tree n'était pas touché normalement... mais sans le code (edit: et le site pour tester, le code était là dans le post...) je n'étais plus sûr de rien, je vais voir... mais je persiste en pensant que c'est vraiment trop tout ce toutim pour juste le besoin de coconimo... mrgreen.gif

Écrit par : coconimo 17 Sep 2008, 08:55

heu, pour l'erreur Undefined offset: 10, c'était sur mon code, pas sur les vôtres. mrgreen.gif -> changement de la première requête de la boxe avec le c.parent_id = '" . $cPath . "' qui automatiquement créé le tableau de sous catégories (et non des catégories parentes) -> je me demande si le chemin ne passe pas par là pour alléger le code.
en attendant, on se retrouve bien avec une requête de plus dans la boxe (celle même qu'on voulait éviter par fonction) :

Code
    $cat_name_query = tep_db_query("select c.categories_id , c.categories_image, cd.categories_name  from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.categories_id = '" . $main_cat . "' and cd.categories_id = c.categories_id and cd.language_id='" . (int)$languages_id ."'");

alors pour, ceux qui suivent le sujet (et bien ils sont forts, parce que y'a de la matière tongue.gif wink.gif ), voici donc le code de gentag & shoprun compilé :
Code
<?php
/*
  $Id: categories.php,v 1.25 2003/07/09 01:13:58 hpdl Exp $

  osCommerce, Open Source E-Commerce Solutions
  http://www.oscommerce.com

  Copyright (c) 2003 osCommerce

  Released under the GNU General Public License
*/
$cat_image = null;
function tep_show_category($counter) {
    global $tree, $categories_string, $cPath_array, $cat_image;
    
    if ((int)$tree[$counter]['parent'] > 0) {
        for ($i=0; $i<$tree[$counter]['level']; $i++) {
            $categories_string .= "&nbsp;&nbsp;";
        }
        $categories_string .= '<a href="';
        $cPath_new = 'cPath=' . $tree[$counter]['path'];
        $categories_string .= tep_href_link(FILENAME_DEFAULT, $cPath_new) . '">';
        if (isset($cPath_array) && in_array($counter, $cPath_array)) {
            //
            $cat_image = '<a href="'.tep_href_link(FILENAME_DEFAULT, $cPath_new).'">'.tep_image(DIR_WS_IMAGES.$tree[$counter]['image'], $tree[$counter]['name'], 128, 128).'</a>';
            //
            $categories_string .= '<b>';
        }
        // display category name
        $categories_string .= $tree[$counter]['name'];
        
        if (isset($cPath_array) && in_array($counter, $cPath_array)) {
            $categories_string .= '</b>';
        }
        
        if (tep_has_category_subcategories($counter)) {
            $categories_string .= '-&gt;';
        }
        
        $categories_string .= '</a>';
        
        if (SHOW_COUNTS == 'true') {
            $products_in_category = tep_count_products_in_category($counter);
            if ($products_in_category > 0) {
                $categories_string .= '&nbsp;(' . $products_in_category . ')';
            }
        }
        
        $categories_string .= '<br />';
    }
    
    
    if ($tree[$counter]['next_id'] != false) {
    tep_show_category($tree[$counter]['next_id']);
    }
}
?>
<!-- categories //-->
          <tr>
            <td>
<?php
if ($cPath != 0) {
    $arr = explode('_', $cPath);
    $main_cat = $arr[0];
    $cat_name_query = tep_db_query("select c.categories_id , c.categories_image, cd.categories_name  from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.categories_id = '" . $main_cat . "' and cd.categories_id = c.categories_id and cd.language_id='" . (int)$languages_id ."'");
    if (tep_db_num_rows($cat_name_query) > 0) {
        $cat_name = tep_db_fetch_array($cat_name_query);
        $strg_cat_name = $cat_name['categories_name'];
        $cat_image = '<a href="'.tep_href_link(FILENAME_DEFAULT, 'cPath='.$cat_name['categories_id']).'">'.tep_image(DIR_WS_IMAGES.$cat_name['categories_image'], $cat_name['categories_name'], 128, 128).'</a>';
    }
    else {
        $strg_cat_name = BOX_HEADING_CATEGORIES;
    }
}
  $info_box_contents = array();
  $info_box_contents[] = array('text' => $strg_cat_name);

  new infoBoxHeading($info_box_contents, true, true);

  $categories_string = '';
  $tree = array();

  $categories_query = tep_db_query("select c.categories_id, cd.categories_name, c.categories_image, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.parent_id = '0' and c.categories_id = cd.categories_id and cd.language_id='" . (int)$languages_id ."' order by sort_order, cd.categories_name");
  while ($categories = tep_db_fetch_array($categories_query))  {
    $tree[$categories['categories_id']] = array('name' => $categories['categories_name'],
                                                'image' => $categories['categories_image'],
                                                'parent' => $categories['parent_id'],
                                                'level' => 0,
                                                'path' => $categories['categories_id'],
                                                'next_id' => false);

    if (isset($parent_id)) {
      $tree[$parent_id]['next_id'] = $categories['categories_id'];
    }

    $parent_id = $categories['categories_id'];

    if (!isset($first_element)) {
      $first_element = $categories['categories_id'];
    }
  }
  

  //------------------------
  if (tep_not_null($cPath)) {
    $new_path = '';
    reset($cPath_array);
    while (list($key, $value) = each($cPath_array)) {
      unset($parent_id);
      unset($first_id);
      $categories_query = tep_db_query("select c.categories_id, cd.categories_name, c.categories_image, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.parent_id = '" . (int)$value . "' and c.categories_id = cd.categories_id and cd.language_id='" . (int)$languages_id ."' order by sort_order, cd.categories_name");
      if (tep_db_num_rows($categories_query)) {
        $new_path .= $value;
        while ($row = tep_db_fetch_array($categories_query)) {
          $tree[$row['categories_id']] = array('name' => $row['categories_name'],
                                               'image' => $row['categories_image'],
                                               'parent' => $row['parent_id'],
                                               'level' => $key+1,
                                               'path' => $new_path . '_' . $row['categories_id'],
                                               'next_id' => false);

          if (isset($parent_id)) {
            $tree[$parent_id]['next_id'] = $row['categories_id'];
          }

          $parent_id = $row['categories_id'];

          if (!isset($first_id)) {
            $first_id = $row['categories_id'];
          }

          $last_id = $row['categories_id'];
        }
        $tree[$last_id]['next_id'] = $tree[$value]['next_id'];
        $tree[$value]['next_id'] = $first_id;
        $new_path .= '_';
      } else {
        break;
      }
    }
  }
tep_show_category($first_element);  
$info_box_contents = array();
$info_box_contents[] = array('text' => $strg_cat_name);

$info_box_contents = array();
$info_box_contents[] = array('text' => $categories_string);

if (tep_not_null($cat_image)) {
    $info_box_contents[] = array('text' => $cat_image);
}
new infoBox($info_box_contents);
?>
            </td>
          </tr>
<!-- categories_eof //-->


Écrit par : shoprun 17 Sep 2008, 08:58

Citation (gentag @ 17 Sep 2008, 11:20) *
c'est vraiment trop tout ce toutim pour juste le besoin de coconimo... mrgreen.gif

Disons qu'au départ je pensais que son besoin était bien moindre que cette box d'origine, mais c'était bien une erreur d'appréciation de ma part, c'est clair.
Mais maintenant, si on regarde bien, son besoin est presque le même, à part que les catégories mères ne sont pas listés, c'est tout.
Donc finalement, je ne vois pas comment lister/déployer les catégories au fur et à mesure sans parser la catégorie de départ.
Il faut boucler, je ne pense pas que ce soit possible autrement, du moins je vois pas comment faire autrement.
Dans ce cas, la mise en cache est essentiel, surtout si on a beaucoup de catégories.

Mais ce n'est pas si énorme que ça en faite, le truc le plus gourmant la dedans c'est si on veux mettre le nombre de produit total dans chaque catégorie, c'est la condition -> if (SHOW_COUNTS == 'true'), et là c'est chaud, tu as la fonction -> tep_count_products_in_category() qui est effectuée en boucle ... Là si on a beaucoup de produits, ça peux mettre en vrac osC. Il y a un sujet épinglé la dessus il me semble.


[optimisation]
En regardant encore un le truc, il me semble qu'il y a moyen d'économiser une requête, c'est pour le nom de la catégorie mère dans l'entête du menu catégorie, car son nom peut être récupéré dans la requête qui permet de construire le breadcrumb, dans le application_top (ligne 477).
Code
// add category names or the manufacturer name to the breadcrumb trail
$strg_cat_name = null; // Initialisation de la variable
if (isset($cPath_array)) {
    for ($i=0, $n=sizeof($cPath_array); $i<$n; $i++) {
        $categories_query = tep_db_query("select categories_name from " . TABLE_CATEGORIES_DESCRIPTION . " where categories_id = '" . (int)$cPath_array[$i] . "' and language_id = '" . (int)$languages_id . "'");
        if (tep_db_num_rows($categories_query) > 0) {
            $categories = tep_db_fetch_array($categories_query);
            // Le premier enregistrement correspond à la catégorie mère
            if ($i == 0) $strg_cat_name = $categories['categories_name'];
            //
            $breadcrumb->add($categories['categories_name'], tep_href_link(FILENAME_DEFAULT, 'cPath=' . implode('_', array_slice($cPath_array, 0, ($i+1)))));
        } else {
            break;
        }
    }
}
elseif (isset($HTTP_GET_VARS['manufacturers_id'])) {
    $manufacturers_query = tep_db_query("select manufacturers_name from " . TABLE_MANUFACTURERS . " where manufacturers_id = '" . (int)$HTTP_GET_VARS['manufacturers_id'] . "'");
    if (tep_db_num_rows($manufacturers_query)) {
        $manufacturers = tep_db_fetch_array($manufacturers_query);
        $breadcrumb->add($manufacturers['manufacturers_name'], tep_href_link(FILENAME_DEFAULT, 'manufacturers_id=' . $HTTP_GET_VARS['manufacturers_id']));
    }
}

Ensuite, dans la box catégorie, on avait ceci :
Code
if ($cPath != 0) {
    $arr = explode('_', $cPath);
    ... etc ...
}

A remplacer par :
Code
if (tep_not_null($strg_cat_name)) {
    $info_box_contents = array();
    $info_box_contents[] = array('text' => $strg_cat_name);
    new infoBoxHeading($info_box_contents, true, false);
}

Écrit par : gentag 17 Sep 2008, 09:10

Euh là je dirais qu'il n'y a presque plus que du shoprun... mais comme d'hab, ça fonctionne nickel, c'est le but smile.gif

Je savais que ce n'était pas si compliqué que ça, juste que c'est vrai que c'est un peu lourd (le tree est toujours intégral si je ne me trompe pas...), heureusement il y a le cache... si tu en fait une contrib', indique bien dans l'install' ou la description que l'activation du cache est recommandée (bon de toute façon, l'activation du cache EST recommandée).

Bon, c'est vrai, ça ne changeras pas le temps de chargement de la page par rapport au code normal, mais c'est justement ça le problème, ça devrait... si tu as dix catégories principales contenant chacunes dix catégories (déjà vu... et même pire...), tu devrais économiser 90 requêtes, ce qui n'est pas négligeable et devrait se ressentir...

Sinon, bah... champagne ! cool.gif ça y est c'est fait... (un petit RESOLU dans le titre pour respecter les règles d'usage du forum svp biggrin.gif )

Écrit par : shoprun 17 Sep 2008, 09:19

Citation (gentag @ 17 Sep 2008, 12:10) *
Euh là je dirais qu'il n'y a presque plus que du shoprun..

Ce n'était pas le but, mais pour enfoncer un peu le bouchon quand même, c'est que les 2 idées ici je les avaient données depuis le début, mon premier post.
Citation
Ceci dit, il me semble qu'il peut avoir au moins 2 moyens d'obtenir le nom de l'image de la catégorie courante.
1/ La première peut ce faire dans la box categories, suffit de rajouter le champ categories_image dans les requêtes et aussi dans les tableaux.
2/ Dans le application_top.php aussi il devrait avoir moyen, (ligne 477).


Mais je crois bien que c'est moi qui foutu tout ce bordel aussi mrgreen.gif laugh.gif

M'enfin, c'est le résultat qui compte smile.gif

Écrit par : coconimo 17 Sep 2008, 09:33

bah non c pas bon si on supprime le code de gentag, on a plus l'image de la cat principale unsure.gif

Écrit par : shoprun 17 Sep 2008, 09:39

Citation (coconimo @ 17 Sep 2008, 12:33) *
bah non c pas bon si on supprime le code de gentag, on a plus l'image de la cat principale unsure.gif

Faut pas le supprimer, mais le remplacer par le nouveau, mais avant faut récupérer son nom en exploitant la requête qui ce fait dans le application_top.php

Ok, je vois le problème.

Mais bon, faut arrêter de faire des réponses à l'emporte pièce.
Tu veux à chaque fois un code finalisé, tu te concentre pas sur l'idée.
Si on obtien son nom, c'est qu'il y a moyen de récupérer son image, non ?

Donc faut juste créer 2 variables ou je quoi d'autre (une juste pour le nom, et une autre pour le lien/image).
Cependant, c'est vrai qu'il faut modifier la requête, pour récupérer le nom de l'image qui elle ce trouve dans la table categorie, ce n'est qu'une question d'ajout de la table, du nom du champ, son ID, et une jointure.

Enfin, plus tard je vois ça, mais il y a moyen d'économiser une requête en exploitant celle ci ...

Écrit par : coconimo 17 Sep 2008, 09:48

Citation (shoprun @ 17 Sep 2008, 10:58) *
Citation (gentag @ 17 Sep 2008, 11:20) *
c'est vraiment trop tout ce toutim pour juste le besoin de coconimo... mrgreen.gif


[optimisation]
En regardant encore un le truc, il me semble qu'il y a moyen d'économiser une requête, c'est pour le nom de la catégorie mère dans l'entête du menu catégorie, car son nom peut être récupéré dans la requête qui permet de construire le breadcrumb, dans le application_top (ligne 477).
Code
// add category names or the manufacturer name to the breadcrumb trail
$strg_cat_name = null; // Initialisation de la variable
if (isset($cPath_array)) {
    for ($i=0, $n=sizeof($cPath_array); $i<$n; $i++) {
        $categories_query = tep_db_query("select categories_name from " . TABLE_CATEGORIES_DESCRIPTION . " where categories_id = '" . (int)$cPath_array[$i] . "' and language_id = '" . (int)$languages_id . "'");
        if (tep_db_num_rows($categories_query) > 0) {
            $categories = tep_db_fetch_array($categories_query);
            // Le premier enregistrement correspond à la catégorie mère
            if ($i == 0) $strg_cat_name = $categories['categories_name'];
            //
            $breadcrumb->add($categories['categories_name'], tep_href_link(FILENAME_DEFAULT, 'cPath=' . implode('_', array_slice($cPath_array, 0, ($i+1)))));
        } else {
            break;
        }
    }
}
elseif (isset($HTTP_GET_VARS['manufacturers_id'])) {
    $manufacturers_query = tep_db_query("select manufacturers_name from " . TABLE_MANUFACTURERS . " where manufacturers_id = '" . (int)$HTTP_GET_VARS['manufacturers_id'] . "'");
    if (tep_db_num_rows($manufacturers_query)) {
        $manufacturers = tep_db_fetch_array($manufacturers_query);
        $breadcrumb->add($manufacturers['manufacturers_name'], tep_href_link(FILENAME_DEFAULT, 'manufacturers_id=' . $HTTP_GET_VARS['manufacturers_id']));
    }
}

Ensuite, dans la box catégorie, on avait ceci :
Code
if ($cPath != 0) {
    $arr = explode('_', $cPath);
    ... etc ...
}

A remplacer par :
Code
if (tep_not_null($strg_cat_name)) {
    $info_box_contents = array();
    $info_box_contents[] = array('text' => $strg_cat_name);
    new infoBoxHeading($info_box_contents, true, false);
}



appliqué à la lettre.
si je te suis bien, je remplace la boucle complète (donc la requète s'en va avec) :
Code
if ($cPath != 0) {
    $arr = explode('_', $cPath);
    $main_cat = $arr[0];
    $cat_name_query = tep_db_query("select c.categories_id , c.categories_image, cd.categories_name  from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.categories_id = '" . $main_cat . "' and cd.categories_id = c.categories_id and cd.language_id='" . (int)$languages_id ."'");
    if (tep_db_num_rows($cat_name_query) > 0) {
        $cat_name = tep_db_fetch_array($cat_name_query);
        $strg_cat_name = $cat_name['categories_name'];
        $cat_image = '<a href="'.tep_href_link(FILENAME_DEFAULT, 'cPath='.$cat_name['categories_id']).'">'.tep_image(DIR_WS_IMAGES.$cat_name['categories_image'], $cat_name['categories_name'], 128, 128).'</a>';
    }
    else {
        $strg_cat_name = BOX_HEADING_CATEGORIES;
    }
}
  $info_box_contents = array();
  $info_box_contents[] = array('text' => $strg_cat_name);

  new infoBoxHeading($info_box_contents, true, true);

?

Écrit par : coconimo 17 Sep 2008, 09:52

oki shoprun, donc j'exploite la requète du breadcrumb dans le fichier application_top pour appeler l'image également, ça je sais faire à l'aise avec la jointure sur la table categories)
heu, je demande pas du tout cuit, il me semble que je ne fonctionne pas comme cela sur ce forum (ça fait 2 fois que la reflexion est faite, c'est assez vexant ... mrgreen.gif )

Écrit par : gentag 17 Sep 2008, 09:57

Juste si je peux me permettre tep_not_null() est une fonction faite pour simplifier le code pour ceux qui ne savent pas ce qu'ils vont tester (vu que ce n'est pas ton cas shoprun, je suis même étonné que tu l'utilises...), c'est une grosse usine à gaz aussi...

J'utilises au maximum les fonctions d'osc mais là franchement celle là... si tu sais que tu testes une chaîne, un simple : $strg != "" ou encore mais moins optimisé strlen($strg) != 0 ou à la delete (mais j'aime moins, c'est trop compter sur la permissivité du php, on sait jamais, si un jour ça change faudra tout réécrire) $strg

Écrit par : shoprun 17 Sep 2008, 10:26

Citation (coconimo @ 17 Sep 2008, 12:52) *
heu, je demande pas du tout cuit, il me semble que je ne fonctionne pas comme cela sur ce forum (ça fait 2 fois que la reflexion est faite, c'est assez vexant ... mrgreen.gif )

Ok, désolé, excuse moi wink.gif

N'empêche faut pas perdre de vu qu'on est sur un forum, on ne se vois pas, alors on interprète les choses, cela inconsciemment.

J'ai donné une solution, certes pas abouti, mais 5 minutes après tu dis en une seule phase "ça marche pas en le supprimant" ?
Alors que veux tu, j'interprète ça mal aussi, car je me dis quand bien même que ça marche pas, l'idée est là.
Aussi, j'attendais plus une réponse du genre : "Je ne comprends, car l'image ne s'affiche plus, comment ce fait il " ...

Donc répondre du tac o tac "ça marche pas" j'ai jamais apprécié ça, que je raconte des craks ou pas ...

Mais t'inquietes pas, je me focalise pas sur ce genre de détail, je t'ai répondu aussi du "tac o tac", ça m'a énervé de lire ta réponse je te l'accorde, mais je me calme aussi vite ...


Maintenant que l'idée et là et que tu peux être sûr qu'il y a moyen d'économiser cette requête, faut juste trouver "le truc".



@Gentag
Et bien je vais t'étonner, mais j'utilise couramment cette fonction. Peut être par flemmardise, mais par (mauvaise) habitude surement.
Mais pas à tour de bras, il y a des cas ou cette fonction est trompeuse, elle est a évitée, un empty() tout seul et de loin préférable, voir le seul moyen.
Donc je sais l'éviter quand il faut, la dessus t'inquiètes pas ...
J'ai moi même dit sur ce forum que osC à tendance à mélanger les types (null, vide, false, 0) et cette fonction en fait partie, je le sais.
Mais c'est vrai qu'un simple strlen() est tout aussi efficace dans des cas comme ici, et même plus rapide, c'est certain.
Je note la remarque ... ceci dit ...

Écrit par : coconimo 17 Sep 2008, 10:27

oki, la jointure est faite :
j'ai donc mis dans application_top :

Code
// add category names or the manufacturer name to the breadcrumb trail
  $strg_cat_name = null; // Initialisation de la variable
  $parent_image = null; // initialisation de la variable image
  if (isset($cPath_array)) {
    for ($i=0, $n=sizeof($cPath_array); $i<$n; $i++) {
      $categories_query = tep_db_query("select cd.categories_name, c.categories_image from " . TABLE_CATEGORIES_DESCRIPTION . " cd, " . TABLE_CATEGORIES . " c where cd.categories_id = '" . (int)$cPath_array[$i] . "' and c.categories_id = '" . (int)$cPath_array[$i] . "' and language_id = '" . (int)$languages_id . "'");
      if (tep_db_num_rows($categories_query) > 0) {
        $categories = tep_db_fetch_array($categories_query);
        if ($i == 0) {
        $strg_cat_name = $categories['categories_name'];
        $parent_image = '<a href="'.tep_href_link(FILENAME_DEFAULT, 'cPath='.(int)$cPath_array[$i]).'">'.tep_image(DIR_WS_IMAGES.$categories['categories_image'], $categories['categories_name'], 128, 128).'</a>';
        }
        $breadcrumb->add($categories['categories_name'], tep_href_link(FILENAME_DEFAULT, 'cPath=' . implode('_', array_slice($cPath_array, 0, ($i+1)))));
      } else {
        break;
      }
    }

et dans la boxe catégories:
rajouter à global mon $parent_image; nan, suis je c..., y'en a pas utilité !
et dans la construction de l'info_box :
Code
if (tep_not_null($cat_image)) {
    $info_box_contents[] = array('text' => $cat_image);
}
elseif (tep_not_null($parent_image)) {
    $info_box_contents[] = array('text' => $parent_image);
}

j'ai même mis un tep_not_null pour faire plaisir à gentag ... cool.gif

le code fonctionne, delà à dire qu'il soit le plus juste ... c'est autre chose ...

Écrit par : gentag 17 Sep 2008, 11:46

Re,

Bah ton attention me touche coconimo, vrai, mais tu n'as pas dû bien lire ce que j'ai mis... je disais que si on connait le type de ce que l'on teste, il faut proscrire cette fonction (certes confortable) mais qui franchement est bien compliquée pour tester une chaîne... (si on retranscrit tout ça en ce qui va être interprété par le proc' bah à mon avis, tu fais vingt pages ecran pour interpréter le tep_not_null alors que tu dois rester dans les 5-6 pages ecran pour un test de base, c'est lourd l'assembleur...)

Écrit par : coconimo 17 Sep 2008, 12:26

sauf que strlen() ne s'applique pas dans ce cas, car lorsqu'une catégorie n'a pas d'image, le champs se met à NULL, donc 4 caractères ...
d'ailleurs le test tep_not_null ne remplit pas son rôle puisque j'ai une image vide mais avec le chemin relatif au répertoire image...

Écrit par : shoprun 17 Sep 2008, 13:04

@Coconimo
Je viens d'essayer ton code, ça me parais tout à fait correcte, nickel même.
Peut être la fin de cette étape ...

@Gentag
(Pas de polémique, on discute smile.gif )
Que cette fonction tep_not_null soit une usine à gaz, alors là quand même pas, faut pas exagérer.
La fonction (d'origine) la voici :

Code
  function tep_not_null($value) {
    if (is_array($value)) {
      if (sizeof($value) > 0) {
        return true;
      } else {
        return false;
      }
    } else {
      if (($value != '') && (strtolower($value) != 'null') && (strlen(trim($value)) > 0)) {
        return true;
      } else {
        return false;
      }
    }
  }
Ca casse pas des briques, je ne vois pas qu'est ce qui pourrait provoquer des ralentissement.

Puis le choix d'utiliser tep_not_null() au lieu d'un strlen() peut ce justifier, car cette fonction tep_not_null() élimine en quelque sorte toutes variables : null, vide, 0, false

Exemple tout simple.
On a une variable qui est égale à 0 :
$test = 0;
Si on fait un -> if (tep_not_null($test)) cette condition est Faux, entre pas dans la condition, $test est considéré comme null.
Si on fait un -> if (strlen($test) != 0) cette condition est Vrai, on entre dans la condition. 0 est converti en une chaine contenant 1 caractère. Si on mets $test = 20; -> 2 caractères, donc toujours vrai.

C'est quand même pas la même chose, non ?

Un strlen() c'est piégeant en fin de compte, becarefull !
J'avais jamais fait ce petit test, je viens de le faire, c'est assez surprenant, mais logique en fin de compte.

Écrit par : gentag 17 Sep 2008, 13:35

Eh ! Mais euh !
Je sais bien que je suis un poil "épidermique" mais c'est pas la peine de prendre des gants avec moi à chaque fois... rolleyes.gif
EDIT : et puis depuis notre discussion sur le flash, je sais qu'on peut discuter ensemble, pas de soucis (même si ça ressemblait à une joute, ça m'a bien fait marrrer...)

Effectivement vu comme ça... mais bon ce que je disais en gros, c'est que plus on fait court, plus on optimise, rappeler une fonction à chaque fois pour faire des tests qu'on peut faire sans, c'est pas LE super truc... vu qu'on parlait d'optimisation...

L'exemple le plus flagrant que j'ai vu, c'est mon prof d'info (ça fait loin...) qui l'a mis en évidence en C (mais c'est pareil pour tous les langages) avec une fonction d'affichage (printf je crois...) et une équivalente plus pratique à utiliser définie, dont on avait le code pour être plus précis... (je ne sais plus laquelle...) -> il a fait une équivalence en assembleur à printf et une à la fonction équivalente -> 5 pages écran de plus... wouaie...

[EDIT de relecture] pour ton exemple, c'est tiré par les cheveux, tu ne vas pas faire un strlen d'un entier, c'est un peu "béta", c'est pour ça que je spécifiais si l'on sait ce que l'on teste...

Écrit par : coconimo 17 Sep 2008, 13:45

pouuuuuuuuuuuuuce !!!
pas la peine d'argumenter, dans les deux cas, si la catégorie/ss catégorie n'a pas d'image, on se retrouve avec une image vide (portant le nom de la cat ou ss cat), bref les chaînes $cat_image et $parent_image ne sont jamais vide.
j'avais gérer ça avec ma fonction, vais retourner dans mon ancien code sortir le truc ...
en l'état, le code est presque fini...

Écrit par : shoprun 17 Sep 2008, 13:51

Citation
c'est que plus on fait court, plus on optimise

Exacte, je suis d'accord, sans compter que c'est un peu ça qui a fait le succès de Php, c'est permissif, on fait des test minimum, simple à faire et à comprendre, et surtout, ça va vite, très vite ...

Cependant, la tendance actuelle est de faire de en plus complexe, et la POO par exemple contribue à rendre les applications de plus en plus lourdes, les test et autre traitements sont de plus en verrouillés, beaucoup de codes, etc, etc ...

Dans le cadre ici, je me contenterais effectivement de faire des test assez simple, du baba.
Etant donné que l'on part sur le faite d'afficher l'image des catégories, alors le minimum et de faire en sorte que cette image soit présente.
Du coup, là ou il faudrait un minimum verrouiller le truc, c'est du coté admin.
En premier, la BDD actuelle et sur le champ categories_image accepte les NULL, et bien il faudrait ne pas accepter de NULL, donc avoir ceci -> `categories_image` varchar(64) NOT NULL

Ensuite, dans le code coté admin toujours, faire en sorte de ne pas pouvoir créer ou modifier une catégorie sans qu'il y est une image.
En faisant ceci on limite pas mal le problème du manque d'image.

Écrit par : delete 17 Sep 2008, 13:52

Citation (gentag @ 17 Sep 2008, 14:35) *
(je ne sais plus laquelle...) -> il a fait une équivalence en assembleur à printf et une à la fonction équivalente -> 5 pages écran de plus... wouaie...


Oulà mais nous ne sommes plus à l'époque du proc 286, AT86 ou pire ...

En C je mettait les strings dans des structures car un strcpy faisait autant d'instructions CPU/assembleur qu'il y avait de caractères,
Alors qu'avec une copie de structure, ça faisait 3 instructions en assembleur quelle que soit sa taille. D'où un gain de performances énorme.

Mais maintenant, de l'interprété, au vue de la performance des processeurs actuels, ce n'est pas un frein. La fonction tep_not_null remplit parfaitement sa mission. Pourtant dans mon cas j'ai plus tendance à faire autrement. Mais la sémantique osC n'est pas du tout mauvaise à ce niveau du code.

Ce qui est *PENALISANT*, ce sont les multiples requêtes SQL pour rien à tous les niveaux du code. C'est certainement pour ca que Coconimo est aller chercher un bout de code que j'ai pondu (je ne sais plus où il est) afin d'avoir l'ensemble des catégories et sous catégories en une requête (enfin j'imagine, si c'est pas le cas il vaut mieux le faire).

D'ailleurs, aujourd'hui ca fait deux posts que j'actualise sur le sujet en question.

Désolé : C'est la Saint-Gentag aujourd'hui wink.gif wink.gif wink.gif

tongue.gif




Écrit par : coconimo 17 Sep 2008, 14:06

pour une categorie mère sans image, il suffit de rajouter la conditionnelle :

Code
if(tep_not_null($categories['categories_image'])){

dans l'application_top,
et pour les catégories filles, il suffit de rajouter la conditionnelle :
Code
if (tep_not_null($tree[$counter]['image'])){

avant la construction de la variable $cat_image.

Bon, hé bien tous les cas de figure maintenant sont gérés, le code est nikel (pas de notice ou d'erreur), je vais publier un dernier post qui va résumer tout ça.

Écrit par : coconimo 17 Sep 2008, 15:14

alors la solution suivante est :
pour un affichage des sous catégories (et leurs filles) avec ou sans leurs images dans la boxe catégories (sachant que les catégories doivent restées accessible par un menu dans le header, biensûr):
fichier catalog/includes/column_left.php :
ajouter avant :

Code
if ((USE_CACHE == 'true') && empty($SID)) {

ce code :
Code
if ($cPath != 0){

et après celui :
Code
include(DIR_WS_BOXES . 'categories.php');
  }

ceci :
Code
}

dans le fichier catalog/includes/application_top.php :
changer :
Code
if (isset($cPath_array)) {
    for ($i=0, $n=sizeof($cPath_array); $i<$n; $i++) {
      $categories_query = tep_db_query("select categories_name from " . TABLE_CATEGORIES_DESCRIPTION . " where categories_id = '" . (int)$cPath_array[$i] . "' and language_id = '" . (int)$languages_id . "'");
      if (tep_db_num_rows($categories_query) > 0) {
        $categories = tep_db_fetch_array($categories_query);
        $breadcrumb->add($categories['categories_name'], tep_href_link(FILENAME_DEFAULT, 'cPath=' . implode('_', array_slice($cPath_array, 0, ($i+1)))));
      } else {
        break;
      }
    }

par :
Code
$strg_cat_name = null; // Initialisation de la variable
  $parent_image = null; // initialisation de la variable image
  if (isset($cPath_array)) {
    for ($i=0, $n=sizeof($cPath_array); $i<$n; $i++) {
      $categories_query = tep_db_query("select cd.categories_name, c.categories_image from " . TABLE_CATEGORIES_DESCRIPTION . " cd, " . TABLE_CATEGORIES . " c where cd.categories_id = '" . (int)$cPath_array[$i] . "' and c.categories_id = '" . (int)$cPath_array[$i] . "' and language_id = '" . (int)$languages_id . "'");
      if (tep_db_num_rows($categories_query) > 0) {
        $categories = tep_db_fetch_array($categories_query);
        if ($i == 0) {
        $strg_cat_name = $categories['categories_name'];
        if(tep_not_null($categories['categories_image'])){
        $parent_image = '<a href="'.tep_href_link(FILENAME_DEFAULT, 'cPath='.(int)$cPath_array[$i]).'">'.tep_image(DIR_WS_IMAGES. $categories['categories_image'], $categories['categories_name'], SUBCATEGORY_IMAGE_WIDTH, SUBCATEGORY_IMAGE_WIDTH).'</a>';
        }
        }
        $breadcrumb->add($categories['categories_name'], tep_href_link(FILENAME_DEFAULT, 'cPath=' . implode('_', array_slice($cPath_array, 0, ($i+1)))));
      } else {
        break;
      }
    }

enfin changer le code complet du fichier catalog/includes/boxes/categories.php avec celui ci :
Code
<?php
/*
  $Id: categories.php,v 1.25 2003/07/09 01:13:58 hpdl Exp $

  osCommerce, Open Source E-Commerce Solutions
  http://www.oscommerce.com

  Copyright (c) 2003 osCommerce

  Released under the GNU General Public License
*/
$cat_image = null;
function tep_show_category($counter) {
    global $tree, $categories_string, $cPath_array, $cat_image;
    
    if ((int)$tree[$counter]['parent'] > 0) {
        for ($i=0; $i<$tree[$counter]['level']; $i++) {
            $categories_string .= "&nbsp;&nbsp;";
        }
        $categories_string .= '<a href="';
        $cPath_new = 'cPath=' . $tree[$counter]['path'];
        $categories_string .= tep_href_link(FILENAME_DEFAULT, $cPath_new) . '">';
        if (isset($cPath_array) && in_array($counter, $cPath_array)) {
            //construction de l'image des catégories filles.
            if (tep_not_null($tree[$counter]['image'])){            
            $cat_image = '<a href="'.tep_href_link(FILENAME_DEFAULT, $cPath_new).'">'.tep_image(DIR_WS_IMAGES. $tree[$counter]['image'], $tree[$counter]['name'], SUBCATEGORY_IMAGE_WIDTH, SUBCATEGORY_IMAGE_WIDTH).'</a>';
            }
        
            $categories_string .= '<b>';
        }
        // display category name
        $categories_string .= $tree[$counter]['name'];
        
        if (isset($cPath_array) && in_array($counter, $cPath_array)) {
            $categories_string .= '</b>';
        }
        
        if (tep_has_category_subcategories($counter)) {
            $categories_string .= '-&gt;';
        }
        
        $categories_string .= '</a>';
        
        if (SHOW_COUNTS == 'true') {
            $products_in_category = tep_count_products_in_category($counter);
            if ($products_in_category > 0) {
                $categories_string .= '&nbsp;(' . $products_in_category . ')';
            }
        }
        
        $categories_string .= '<br />';
    }
    
    
    if ($tree[$counter]['next_id'] != false) {
    tep_show_category($tree[$counter]['next_id']);
    }
}
?>
<!-- categories //-->
          <tr>
            <td>
<?php

if (tep_not_null($strg_cat_name)) {
    $info_box_contents = array();
    $info_box_contents[] = array('text' => $strg_cat_name);

}
  
  new infoBoxHeading($info_box_contents, true, true);
  $categories_string = '';
  $tree = array();

  $categories_query = tep_db_query("select c.categories_id, cd.categories_name, c.categories_image, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.parent_id = '0' and c.categories_id = cd.categories_id and cd.language_id='" . (int)$languages_id ."' order by sort_order, cd.categories_name");
  
  while ($categories = tep_db_fetch_array($categories_query))  {
    $tree[$categories['categories_id']] = array('name' => $categories['categories_name'],
                                                'image' => $categories['categories_image'],
                                                'parent' => $categories['parent_id'],
                                                'level' => 0,
                                                'path' => $categories['categories_id'],
                                                'next_id' => false);
    
    if (isset($parent_id)) {
      $tree[$parent_id]['next_id'] = $categories['categories_id'];
    }

    $parent_id = $categories['categories_id'];

    if (!isset($first_element)) {
      $first_element = $categories['categories_id'];
    }
    
    
  }
  

  //------------------------
  if (tep_not_null($cPath)) {
    $new_path = '';
    reset($cPath_array);
    while (list($key, $value) = each($cPath_array)) {
      unset($parent_id);
      unset($first_id);
      $categories_query = tep_db_query("select c.categories_id, cd.categories_name, c.categories_image, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.parent_id = '" . (int)$value . "' and c.categories_id = cd.categories_id and cd.language_id='" . (int)$languages_id ."' order by sort_order, cd.categories_name");
      
       if (tep_db_num_rows($categories_query)) {
      
        $new_path .= $value;
        while ($row = tep_db_fetch_array($categories_query)) {
          $tree[$row['categories_id']] = array('name' => $row['categories_name'],
                                               'image' => $row['categories_image'],
                                               'parent' => $row['parent_id'],
                                               'level' => $key+1,
                                               'path' => $new_path . '_' . $row['categories_id'],
                                               'next_id' => false);
        

          if (isset($parent_id)) {
            $tree[$parent_id]['next_id'] = $row['categories_id'];
          }

          $parent_id = $row['categories_id'];

          if (!isset($first_id)) {
            $first_id = $row['categories_id'];
          }

          $last_id = $row['categories_id'];
          
        
        }
        $tree[$last_id]['next_id'] = $tree[$value]['next_id'];
        $tree[$value]['next_id'] = $first_id;
        $new_path .= '_';
        
      } else {
        break;
      }
    }
  }
tep_show_category($first_element);  
$info_box_contents = array();
$info_box_contents[] = array('text' => $strg_cat_name);

$info_box_contents = array();
$info_box_contents[] = array('text' => $categories_string);

if ($cat_image) {    
    $info_box_contents[] = array('text' => $cat_image);
}else{    
    $info_box_contents[] = array('text' => $parent_image);
}

new infoBox($info_box_contents);
?>
            </td>
          </tr>
<!-- categories_eof //-->


specials thanks : shoprun & gentag & coconimo cool.gif

je laisse le mot de la fin aux deux premiers intervenants.

Écrit par : shoprun 17 Sep 2008, 15:42

Citation (coconimo @ 17 Sep 2008, 18:14) *
je laisse le mot de la fin aux deux premiers intervenants.

Impeccable tout ça.
Pour ma part il y a plus rien à dire ... J'vais m'ennuyer du coup laugh.gif

En tout cas, vu tous les post qu'il a fallut pour modifier un menu, j'ose même pas imaginer les gars qui font des applications entières comme osC ...
Ca doit être la croix et la bannière ... huh.gif

C'est le mot de la fin ... smile.gif


PS : @Coconimo
Encore désolé pour les petits reproches etc ...

Écrit par : coconimo 5 Oct 2008, 20:20

alors, le mot de la fin de la fin cette fois ci:
Si on active le cache, les images et les titres des catégories ne s'affichent pas ! mrgreen.gif
aussi, il faut modifier le fichier catalog/includes/functions/cache.php:
changer :

Code
function tep_cache_categories_box($auto_expire = false, $refresh = false) {
    global $cPath, $language, $languages_id, $tree, $cPath_array, $categories_string;

    $cache_output = '';

    if (($refresh == true) || !read_cache($cache_output, 'categories_box-' . $language . '.cache' . $cPath, $auto_expire)) {
      ob_start();
      include(DIR_WS_BOXES . 'categories.php');
      $cache_output = ob_get_contents();
      ob_end_clean();
      write_cache($cache_output, 'categories_box-' . $language . '.cache' . $cPath);
    }

    return $cache_output;
  }

avec :
Code
function tep_cache_categories_box($auto_expire = false, $refresh = false) {
    global $cPath, $language, $languages_id, $tree, $cPath_array, $categories_string, $cat_image, $parent_image, $strg_cat_name;

    $cache_output = '';

    if (($refresh == true) || !read_cache($cache_output, 'categories_box-' . $language . '.cache' . $cPath, $auto_expire)) {
      ob_start();
      include(DIR_WS_BOXES . 'categories.php');
      $cache_output = ob_get_contents();
      ob_end_clean();
      write_cache($cache_output, 'categories_box-' . $language . '.cache' . $cPath);
    }

    return $cache_output;
  }


The End.

Écrit par : padaben 13 Oct 2008, 13:22

salut à tous

ET bien je dois dire bravo ...
j'ai tellement eu la tete dans le guidon que je ne suis pas venu une seule fois dans ce post depuis le début et j'arrive apres la guerre ! rires...
toujours est il que vous avez fait un super boulot smile.gif
et j'ai pu noter que vous avez parlé de moi !

Citation
"(oui, encore lui ! ) cool.gif "
rires...

m'enfin bravo, du coup j'ai testé un premier code de http://www.oscommerce-fr.info/forum/index.php?s=&showtopic=57244&view=findpost&p=295540
qui fonctionne chez moi et qui fait ce que je voulais .. reste donc à faire la mise en forme smile.gif

Mais bien entendu je prend la solution optimisée -> je choisi la solution OFFENSIVE !

Super et encore bravo à tous smile.gif

Écrit par : padaben 13 Oct 2008, 14:33

re salut !

j'hésite à faire un autre post pour cela, je tente là ca coute rien, je pense que c'est un peu lié ... mais comment, je ne sais pas .
dans mon breadcrumb, je n'ai pas le nom de la catégorie lors que je suis dans une sous catégorie !
En fait cela est ok lorsque j'accède direct au produit, mais pas lorsque j'utilise la navigation par menu ou sous menu ....

je vais regarder pres du code du breadcrumb de ma page product_info.
[edit] rien ne diffère... je ne comprend pas ... des idées ?? [/edit]

A+

Écrit par : gentag 13 Oct 2008, 16:56

Bonjour,

Mouais, perso je n'ai pas (encore) installé le module du haut pour avoir les catégories principales, mais une chose est sûre, le code que l'on donne sur ce post ne modifie absolument pas le comportement de la breadcrumb (mon code, celui de coconimo, celui de shoprun, tous en fait), d'ailleurs chez moi ça fonctionne nickel (juste que pour accéder aux catégories faut rentrer par les nouveautés ou autre puisque pas de boxe sur la page d'accueil... smile.gif ).

Faut redéfinir ce qu'est la breadcrumb quand même (on ne parle pas forcément de la même chose hein) :
sur un site par défaut, ce sont les liens de navigation en haut de page du genre (avec les articles et catégories par défaut) :
Accueil » Catalogue » Matériel » Souris » MSIMPRO

Et comme tu peux le voir j'ai bien toutes les catégories comme il faut...

Faut voir si cela ne vient pas du truc en plus que tu as en haut pour les catégories principales (euh delete ne va pas être content... de tête, il me semble que le code que tu utilises pour l'affichage des catégories pricipales en haut vient de lui...).

Bon courage

Écrit par : padaben 13 Oct 2008, 17:11

Citation (gentag @ 13 Oct 2008, 18:56) *
Faut redéfinir ce qu'est la breadcrumb quand même (on ne parle pas forcément de la même chose hein) :
sur un site par défaut, ce sont les liens de navigation en haut de page du genre (avec les articles et catégories par défaut) :
Accueil » Catalogue » Matériel » Souris » MSIMPRO


oui Beadcrumb est ce que l'on apelle aussi le fil d'ariane, nous avons donc la meme définition.
mais tout est rentré dans l'ordre ! très étonnant... je ne sais ce que j'ai modifié, mais effectivement ce n'était pas dans ce que vous avez développé pour la box catégorie.

Citation
Faut voir si cela ne vient pas du truc en plus que tu as en haut pour les catégories principales (euh delete ne va pas être content... de tête, il me semble que le code que tu utilises pour l'affichage des catégories pricipales en haut vient de lui...).

donc cela ne vient pas de là ..

Pourquoi Delete ne serait pas content ? ce que j'ai utilisé vient d'une contrib pue-etre d'ailleurs est-ce lui qui l'a dévéloppée. je ne me souviens pas.
toujours est il que je l'ai à l'époque adaptée pour ne faire ce dont j'avais besoin.
par chance je l'ai réutilisé en partie sur la boutique que je développe actuellement.
Qu'elle soit de lui ou non, merci à celui ou celle qui l'a développé, c'était la contrib categories_tab il me semble, et elle a dû aider un bon nombre d'osciens à travers le monde !

de mon coté tout est donc rentré dans l'ordre, dû moins de ce coté là... en espérant que ça dure smile.gifsmile.gifsmile.gif
merci encore une fois à tous pour votre aide précieuse.

Bonne soirée et bon code

++

Écrit par : gentag 14 Oct 2008, 14:39

Bonjour,

Citation
Pourquoi Delete ne serait pas content ? ce que j'ai utilisé vient d'une contrib pue-etre d'ailleurs est-ce lui qui l'a dévéloppée
Bah non pas pour ça ce serait plutôt flatteur ça.

Je disais cela (de tête - pour l'origine de la contrib' - donc pas fiable avec moi smile.gif la preuve ce n'était pas le code de delete mais Categories Tab...) car entre mes tests et la partie en cause de ton site, il n'y a que ça qui diffère donc je suggérais de regarder de ce côté. Le mécontentement de delete serait donc venu du fait que ce qu'il a partagé ne fonctionne pas parfaitement, mais ce n'est pas le cas (et de toute façon, ça m'aurait vraiment étonné, franchement, mais c'était la seule différence... alors... faut bien essayer de cerner le truc...)

Tout ce qui est ici est libre et dans les contrib' aussi, ne te fais pas de soucis avec ça (mais perso je préfère prévenir les contributeurs quand je les connais, ça ne mange pas de pain et je trouve ça plus sympa et correct - puis ça leur permet de savoir que leurs contrib' sont appréciées donc utilisées, ce qui fait toujours plaisir puisque c'est pour ça qu'elles sont en lignes...)

Tant mieux si c'est tout OK maintenant mais je savais que ce ne pouvait pas venir de là, c'est impossible franchement.

Écrit par : padaben 14 Oct 2008, 17:53

Bah tout va pour le mieux alors smile.gif

Merci à Delete :] et à tous

Bon code smile.gif ninja.gif

Propulsé par Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)