Aide - Recherche - Membres - Calendrier
Version complète : adaptation contrib Accordion Menu for Categories
Forum osCommerce-fr > Oscommerce 2.3 > Contributions OsC2.3
cubifil
bonjour,
j' essaie d' adapter cette contrib Accordion Menu for Categories

ça marche mais je suis juste un peu bidouilleur en php

est ce que quelqu'un peu me dire si mon code est bon

Code
<script type="text/javascript" src="jquery.min.js"></script>

<script type="text/javascript" src="ddaccordion.js">

/***********************************************
* Accordion Content script- (c) Dynamic Drive DHTML code library (www.dynamicdrive.com)
* Visit http://www.dynamicDrive.com for hundreds of DHTML scripts
* This notice must stay intact for legal use
***********************************************/

</script>


<script type="text/javascript">


ddaccordion.init({
    headerclass: "submenuheader", //Shared CSS class name of headers group
    contentclass: "submenu", //Shared CSS class name of contents group
    revealtype: "click", //Reveal content when user clicks or onmouseover the header? Valid value: "click", "clickgo", or "mouseover"
    mouseoverdelay: 200, //if revealtype="mouseover", set delay in milliseconds before header expands onMouseover
    collapseprev: true, //Collapse previous content (so only one open at any time)? true/false
    defaultexpanded: [], //index of content(s) open by default [index1, index2, etc] [] denotes no content
    onemustopen: false, //Specify whether at least one header should be open always (so never all headers closed)
    animatedefault: false, //Should contents open by default be animated into view?
    persiststate: true, //persist state of opened contents within browser session?
    toggleclass: ["", ""], //Two CSS classes to be applied to the header when it's collapsed and expanded, respectively ["class1", "class2"]
    togglehtml: ["suffix", "<img src='images/plus.gif' class='statusicon' />", "<img src='images/minus.gif' class='statusicon' />"], //Additional HTML added to the header when it's collapsed and expanded, respectively  ["position", "html1", "html2"] (see docs)
    animatespeed: "fast", //speed of animation: integer in milliseconds (ie: 200), or keywords "fast", "normal", or "slow"
    oninit:function(headers, expandedindices){ //custom code to run when headers have initalized
        //do nothing
    },
    onopenclose:function(header, index, state, isuseractivated){ //custom code to run whenever a header is opened or closed
        //do nothing
    }
})


</script>



<?php
/*
  $Id$

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

  Copyright (c) 2010 osCommerce

  Released under the GNU General Public License
*/

  class bm_categories {
    var $code = 'bm_categories';
    var $group = 'boxes';
    var $title;
    var $description;
    var $sort_order;
    var $enabled = false;

    function bm_categories() {
      $this->title = MODULE_BOXES_CATEGORIES_TITLE;
      $this->description = MODULE_BOXES_CATEGORIES_DESCRIPTION;

      if ( defined('MODULE_BOXES_CATEGORIES_STATUS') ) {
        $this->sort_order = MODULE_BOXES_CATEGORIES_SORT_ORDER;
        $this->enabled = (MODULE_BOXES_CATEGORIES_STATUS == 'True');

        $this->group = ((MODULE_BOXES_CATEGORIES_CONTENT_PLACEMENT == 'Left Column') ? 'boxes_column_left' : 'boxes_column_right');
      }
    }

   function execute() {
      global $customer_id, $languages_id, $PHP_SELF, $oscTemplate;
$status = tep_db_num_rows(tep_db_query('describe ' .  TABLE_CATEGORIES . ' status'));


  $query = "select c.categories_id, cd.categories_name, c.parent_id, c.categories_image
            from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd
            where c.categories_id = cd.categories_id";

  if ($status >0)
    $query.= " and c.status = '1'";
  $query.= " and cd.language_id='" . $languages_id ."'
            order by sort_order, c.categories_image";

  
  $categories_query = tep_db_query($query);





// Display box contents

  $categories_string .='<div class="glossymenu">';

    while ($categories = tep_db_fetch_array($categories_query)) {
       if ($categories['parent_id'] == 0) {
            $temp_cPath_array = $cPath_array;  //Johan's solution - kill the array but save it for the rest of the site
            unset($cPath_array);
           $cPath_new = tep_get_path($categories['categories_id']);
           $text_subcategories = '';
          $subcategories_query = tep_db_query($query);
    while ($subcategories = tep_db_fetch_array($subcategories_query)) {
       if ($subcategories['parent_id'] == $categories['categories_id']){
           $cPath_new_sub = "cPath="  . $categories['categories_id'] . "_" . $subcategories['categories_id'];
           $text_subcategories .= '<a href="' . tep_href_link(FILENAME_DEFAULT, $cPath_new_sub, 'NONSSL') . '">' . tep_image(DIR_WS_IMAGES . $subcategories['categories_image'], $subcategories['categories_name'], '25', '25') .'&nbsp;'. $subcategories['categories_name'] . '</a>' . " ";    
           } // if        
         } // While Interno
      
/*     $parent = $categories['parent_id'];
     $count_query = tep_db_query ("select count(*)as sayi from ".TABLE_CATEGORIES." where parent_id = 0 ");
     $count = tep_db_fetch_array($count_query);
    
   $cat_bosluk = '<br style="clear: left"/>';
    for($i=4;$i<$count['sayi'];$i++){

    if(($i%4)!=0) continue; */
    
    
    
    if (tep_has_category_subcategories($category_id)) {
    $child_category_query = tep_db_query("select count(*) as count from " . TABLE_CATEGORIES . " where parent_id = '" . $categories['categories_id'] . "'");
    $child_category = tep_db_fetch_array($child_category_query);

    if ($child_category['count'] > 0) {$categories_string .='<a class="menuitem submenuheader" href="' . tep_href_link(FILENAME_DEFAULT, $cPath_new, 'NONSSL') . '">' . $categories['categories_name'] . '</a>';
    $categories_string .='<div class="submenu">';
    $categories_string .='<ul><li>' . $text_subcategories.'</li></ul>';
    $categories_string .='</div>';}
     else {$categories_string .='<a class="menuitem" href="' . tep_href_link(FILENAME_DEFAULT, $cPath_new, 'NONSSL') . '">' . $categories['categories_name'] . '</a>'; }}

    
    
    
    // echo''.$cat_bosluk[$i].'';    
      
   // }
    $cPath_array = $temp_cPath_array; //Re-enable the array for the rest of the code
    }
  }
   $categories_string .='</div>';    
$data = '<div class="ui-widget infoBoxContainer">' .
                  '  <div class="ui-widget-header infoBoxHeading">' . MODULE_BOXES_CATEGORIES_BOX_TITLE . '</div>' .
                  '  ' . $categories_string .
                  '</div>';

          $oscTemplate->addBlock($data, $this->group);
  }
    function isEnabled() {
      return $this->enabled;
    }

    function check() {
      return defined('MODULE_BOXES_CATEGORIES_STATUS');
    }

    function install() {
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Afficher le bloc Catégories', 'MODULE_BOXES_CATEGORIES_STATUS', 'True', 'Voulez-vous afficher ce module dans le site?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Position du bloc', 'MODULE_BOXES_CATEGORIES_CONTENT_PLACEMENT', 'Left Column', 'Le module doit-il être placé en colonne de droite ou de gauche?', '6', '1', 'tep_cfg_select_option(array(\'Left Column\', \'Right Column\'), ', now())");
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Ordre d\'affichage.', 'MODULE_BOXES_CATEGORIES_SORT_ORDER', '0', 'Ordre d\'affichage dans la page. Le plus petit en premier. ', '6', '0', now())");
    }

    function remove() {
      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
    }

    function keys() {
      return array('MODULE_BOXES_CATEGORIES_STATUS', 'MODULE_BOXES_CATEGORIES_CONTENT_PLACEMENT', 'MODULE_BOXES_CATEGORIES_SORT_ORDER');
    }
  }
?>
FoxP2
effectivement, il y a des corrections à apporter :
à dégager la ligne : <script type="text/javascript" src="jquery.min.js"></script>
à mettre dans le head : <script type="text/javascript" src="ddaccordion.js">
à mettre dans la méthode et une fois le dom chargé: l'initialisation de ton script.

ces corrections sont vraiment les bases à connaitre et à retenir.

des points importants:
un système d'accordéon est embarqué nativement avec JqueryUI arrow.gif ligne 283/299 du fichier catalog/ext/jquery/ui/jquery-ui-1.8.6.min.js
la méthode tep_show_category(..)construit l'arbre, la méthode getdata() récupère les données et la methode execute() les expose.(revois le code initial pour respecter le concept)
dans la super classe osc_template, en fonction du paramètre is_enabled on appelle la méthode execute: conclusion, on ne requête pas la base de données dans execute.
excl.gif ta boxe ne gère pas le cache.

au boulot.
cubifil
ok merci déjà j' ai déplacé <script type="text/javascript" src="ddaccordion.js"> dans le header et supprimé <script type="text/javascript" src="jquery.min.js"></script> qui sert à rien
j' ai modifié un peu mon code et rajouté la fonction du cache,
merci pour les conseils .
Code
<?php
/*
  $Id$

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

  Copyright (c) 2010 osCommerce

  Released under the GNU General Public License
*/

  class bm_categories {
    var $code = 'bm_categories';
    var $group = 'boxes';
    var $title;
    var $description;
    var $sort_order;
    var $enabled = false;

    function bm_categories() {
      $this->title = MODULE_BOXES_CATEGORIES_TITLE;
      $this->description = MODULE_BOXES_CATEGORIES_DESCRIPTION;

      if ( defined('MODULE_BOXES_CATEGORIES_STATUS') ) {
        $this->sort_order = MODULE_BOXES_CATEGORIES_SORT_ORDER;
        $this->enabled = (MODULE_BOXES_CATEGORIES_STATUS == 'True');

        $this->group = ((MODULE_BOXES_CATEGORIES_CONTENT_PLACEMENT == 'Left Column') ? 'boxes_column_left' : 'boxes_column_right');
      }
    }

function getData() {
      global $categories_string, $tree, $languages_id, $cPath, $cPath_array;

      $categories_string = '';
      $tree = array();
$status = tep_db_num_rows(tep_db_query('describe ' .  TABLE_CATEGORIES . ' status'));


  $query = "select c.categories_id, cd.categories_name, c.parent_id, c.categories_image
            from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd
            where c.categories_id = cd.categories_id";

  if ($status >0)
    $query.= " and c.status = '1'";
  $query.= " and cd.language_id='" . $languages_id ."'
            order by sort_order, c.categories_image";

  
  $categories_query = tep_db_query($query);





// Display box contents

  $categories_string .='<div class="glossymenu">';

    while ($categories = tep_db_fetch_array($categories_query)) {
       if ($categories['parent_id'] == 0) {
            $temp_cPath_array = $cPath_array;  //Johan's solution - kill the array but save it for the rest of the site
            unset($cPath_array);
           $cPath_new = tep_get_path($categories['categories_id']);
           $text_subcategories = '';
          $subcategories_query = tep_db_query($query);
    while ($subcategories = tep_db_fetch_array($subcategories_query)) {
       if ($subcategories['parent_id'] == $categories['categories_id']){
           $cPath_new_sub = "cPath="  . $categories['categories_id'] . "_" . $subcategories['categories_id'];
           $text_subcategories .= '<a href="' . tep_href_link(FILENAME_DEFAULT, $cPath_new_sub, 'NONSSL') . '">' . tep_image(DIR_WS_IMAGES . $subcategories['categories_image'], $subcategories['categories_name'], '25', '25') .'&nbsp;'. $subcategories['categories_name'] . '</a>' . " ";    
           } // if        
         } // While Interno
      
/*     $parent = $categories['parent_id'];
     $count_query = tep_db_query ("select count(*)as sayi from ".TABLE_CATEGORIES." where parent_id = 0 ");
     $count = tep_db_fetch_array($count_query);
    
   $cat_bosluk = '<br style="clear: left"/>';
    for($i=4;$i<$count['sayi'];$i++){

    if(($i%4)!=0) continue; */
    
    
    
    if (tep_has_category_subcategories($category_id)) {
    $child_category_query = tep_db_query("select count(*) as count from " . TABLE_CATEGORIES . " where parent_id = '" . $categories['categories_id'] . "'");
    $child_category = tep_db_fetch_array($child_category_query);

    if ($child_category['count'] > 0) {$categories_string .='<a class="menuitem submenuheader" href="' . tep_href_link(FILENAME_DEFAULT, $cPath_new, 'NONSSL') . '">' . $categories['categories_name'] . '</a>';
    $categories_string .='<div class="submenu">';
    $categories_string .='<ul><li>' . $text_subcategories.'</li></ul>';
    $categories_string .='</div>';}
     else {$categories_string .='<a class="menuitem" href="' . tep_href_link(FILENAME_DEFAULT, $cPath_new, 'NONSSL') . '">' . $categories['categories_name'] . '</a>'; }}

    
    
    
    // echo''.$cat_bosluk[$i].'';    
      
   // }
    $cPath_array = $temp_cPath_array; //Re-enable the array for the rest of the code
    }
  }
  
   $categories_string .='</div>';
    
       
$data = '<div class="ui-widget infoBoxContainer">' .
                  '  <div class="ui-widget-header infoBoxHeading">' . MODULE_BOXES_CATEGORIES_BOX_TITLE . '</div>' .
                  '  ' . $categories_string .
                  '</div>';
return $data;
    }
          function execute() {
      global $SID, $oscTemplate;

      if ((USE_CACHE == 'true') && empty($SID)) {
        $output = tep_cache_categories_box();
      } else {
        $output = $this->getData();
      }

      $oscTemplate->addBlock($output, $this->group);
    }
    function isEnabled() {
      return $this->enabled;
    }

    function check() {
      return defined('MODULE_BOXES_CATEGORIES_STATUS');
    }

    function install() {
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Afficher le bloc Catégories', 'MODULE_BOXES_CATEGORIES_STATUS', 'True', 'Voulez-vous afficher ce module dans le site?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Position du bloc', 'MODULE_BOXES_CATEGORIES_CONTENT_PLACEMENT', 'Left Column', 'Le module doit-il être placé en colonne de droite ou de gauche?', '6', '1', 'tep_cfg_select_option(array(\'Left Column\', \'Right Column\'), ', now())");
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Ordre d\'affichage.', 'MODULE_BOXES_CATEGORIES_SORT_ORDER', '0', 'Ordre d\'affichage dans la page. Le plus petit en premier. ', '6', '0', now())");
    }

    function remove() {
      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
    }

    function keys() {
      return array('MODULE_BOXES_CATEGORIES_STATUS', 'MODULE_BOXES_CATEGORIES_CONTENT_PLACEMENT', 'MODULE_BOXES_CATEGORIES_SORT_ORDER');
    }
  }
?>


et comme ça c'est plus joli
cubifil
un ptit aperçu du résultat, juste pour faire envie tongue.gif tongue.gif
FoxP2
Citation (cubifil @ 3 Jan 2011, 15:04) *
.../...
et comme ça c'est plus joli


la question n'est pas de faire du joli, mais du fonctionnel en comprenant ce que l'on code.
ta méthode getData() mélange les appels à la bdd et leurs vues arrow.gif pas bon.
inspires toi de cet addon pour voir comment le code est construit.(c'est proche, seul le js diffère)

pour conclure, il est totalement inutile d'embarquer un nouveau script pour ce résultat, le framework jquery (et son interface) embarque déjà toutes les classes nécessaire pour un résultat similaire. ça demande juste à être codé.
cubifil
merci beaucoup de ton aide je pense pouvoir finir de me débrouiller
comme je le disais plus haut je suis un peu limite en php
cubifil
Citation
inspires toi de cet addon pour voir comment le code est construit.(c'est proche, seul le js diffère)


le menu n' est pas construit de la même manière wacko.gif
dans mon menu accordéon on montre ou on ne montre pas les sous catégories
pour le coup je suis un peu dans l' impasse , le résultat que je souhaitais était de pouvoir naviguer dans le menu sans recharger la page !

Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2014 Invision Power Services, Inc.