Βοήθεια με mutlicategories

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
dpa
Δημοσιεύσεις: 631
Εγγραφή: 29 Μαρ 2008 13:55

Βοήθεια με mutlicategories

Δημοσίευση από dpa » 27 Οκτ 2014 10:19

Κώδικας: Επιλογή όλων


$data = array(
    "100" => array("CategoryID" => "100", "CategoryName" => "Ρούχα", "ParentID" => "0"),
    "101" => array("CategoryID" => "101", "CategoryName" => "Χειμωνιάτικα", "ParentID" => "100"),
    "102" => array("CategoryID" => "102", "CategoryName" => "Ανδρικά", "ParentID" => "101"),
    "200" => array("CategoryID" => "200", "CategoryName" => "Παπούτσια", "ParentID" => "0"),
    "201" => array("CategoryID" => "201", "CategoryName" => "Αθλητικά", "ParentID" => "200"),
    "202" => array("CategoryID" => "202", "CategoryName" => "Ανδρικά", "ParentID" => "201"),
    "203" => array("CategoryID" => "203", "CategoryName" => "Αρχική Σελίδα", "ParentID" => "0"),
);


function createTreeView($array, $currentParent, $currLevel = 0, $prevLevel = -1) {

foreach ($array as $categoryId => $category) {

if ($currentParent == $category['parent']) {
    if &#40;$currLevel > $prevLevel&#41; echo " <ul> "; 

    if &#40;$currLevel == $prevLevel&#41; echo " </li> ";

    echo '<li><span><input type="checkbox" name="test"/>'.$category&#91;'label'&#93;.'</span>';

    if &#40;$currLevel > $prevLevel&#41; &#123; $prevLevel = $currLevel; &#125;

    $currLevel++; 

    createTreeView &#40;$array, $categoryId, $currLevel, $prevLevel&#41;;

    $currLevel--;
    &#125;   

&#125;

if &#40;$currLevel == $prevLevel&#41; echo " </li>  </ul> ";

&#125;

Την έχω βρει εδώ 

tree function

Και θέλω να βγάλω το παρακάτω html




Κώδικας: Επιλογή όλων

  <ul class="horizontal_list main_menu type_2 clearfix">

      <li class="current relative f_xs_none m_xs_bottom_5 m_left_10 m_xs_left_0">
          <a href="index.html" class="tr_delay_hover color_dark tt_uppercase r_corners"><b>Αρχική Σελίδα</b></a>
      </li>
      <li class="relative f_xs_none m_xs_bottom_5 m_left_10 m_xs_left_0"><a href="#" class="tr_delay_hover color_dark tt_uppercase r_corners"><b>Ρούχα</b></a>

          <!--sub menu-->
          <div class="sub_menu_wrap top_arrow d_xs_none tr_all_hover clearfix r_corners w_xs_auto">

              <div class="f_left f_xs_none">
                  <b class="color_dark m_left_20 m_bottom_5 m_top_5 d_inline_b">Χειμωνιάτικα</b>
                  <ul class="sub_menu first">
                      <li><a class="color_dark tr_delay_hover" href="#">Ανδρικά</a></li>
                  </ul>
              </div>



          </div>
      </li>

      <li class="relative f_xs_none m_xs_bottom_5 m_left_10 m_xs_left_0"><a href="#" class="tr_delay_hover color_dark tt_uppercase r_corners"><b>Παπούτσια</b></a>

          <!--sub menu-->
          <div class="sub_menu_wrap top_arrow d_xs_none tr_all_hover clearfix r_corners w_xs_auto">

              <div class="f_left f_xs_none">
                  <b class="color_dark m_left_20 m_bottom_5 m_top_5 d_inline_b">Αθλητικά</b>
                  <ul class="sub_menu first">
                      <li><a class="color_dark tr_delay_hover" href="#">Ανδρικά</a></li>
                  </ul>
              </div>



          </div>
      </li>


</ul>
Θα εκτιμούσα πάρα πολύ την βοήθειά σας.

Διότι δεν τα πάω καθόρου καλά με τις συναρτήσης που καλούνε τον εαυτό τους.

Άβαταρ μέλους
giannis17
Honorary Member
Δημοσιεύσεις: 1215
Εγγραφή: 06 Ιαν 2005 19:50
Τοποθεσία: Παγκράτι - Αθήνα
Επικοινωνία:

Βοήθεια με mutlicategories

Δημοσίευση από giannis17 » 27 Οκτ 2014 13:22

Το παράδειγμα που έχεις δει είναι αρκετά "πρωτόγονο". Προϋποθέτει τα ID των στοιχείων να είναι με τη σειρά, για να αλλάξεις ιεραρχία πρέπει να αλλάξεις και το ID (όχι μόνο το ParentID) και να sortάρεις τον πίνακα αποκλειστικά με βάση το ID (οπότε ξεχνάμε την αλφαβητική σειρά).

Προφανώς τα δεδομένα σου δεν τα δημιουργείς κάθε φορά επεμβαίνοντας στο array της PHP, τα τραβάς από κάποια βάση δεδομένων, κάποιο αρχείο (xml?) ή κάποιο feed (json?). Δώσε μας ένα δείγμα αληθινών δεδομένων να σου δώσουμε τη σωστή λύση αλλιώς δεν έχει νόημα να τρέχεις recursive συναρτήσεις όταν μπορείς να πάρεις τα δεδομένα έτοιμα από μια βάση ή κάποιο xml.
"There is only one problem with common sense; it’s not very common."
&#8211; Milt Bryce

dpa
Δημοσιεύσεις: 631
Εγγραφή: 29 Μαρ 2008 13:55

Βοήθεια με mutlicategories

Δημοσίευση από dpa » 27 Οκτ 2014 13:29

Φίλε ναι τα data τα τραβάω από ένα sql ερώτημα και τα αποθηκεύω σε ένα array όπως αυτό.


Κώδικας: Επιλογή όλων

function GetCategoryInArray&#40;$&#41;&#123;
    global $db;

    $sql = "SELECT * FROM categories as m";
    $res = $db->query&#40;$sql&#41;;

    $data = array&#40;&#41;;
	while &#40; $row = $res->fetch_object&#40;&#41; &#41; &#123;
    	$data&#91;$row->CategoryID&#93; = array&#40;
        'CategoryID'    => $row->CategoryID,
        'CategoryName'     => $row->CategoryName,
        'ParentID'       => $row->ParentID
        &#41;;  
    &#125;
    return $data;  
&#125;
Δεν μπορώ να καταλάβω αυτά τα loop που κάνουν οι συναρτήσεις που καλούνε τον εαυτό τους.

Δεν γνωρίζω πως τα κάνεις εσύ αλλά η συγκεκριμένη μου κλείνεί όλα τα tab σωστά.

Ενώ μια άλλη που είχα βρει δεν το κάνει όπως αυτήν => \stackoverflow.com/questions/333735/how-to-build-a-tree-view-with-php-sql

dpa
Δημοσιεύσεις: 631
Εγγραφή: 29 Μαρ 2008 13:55

Βοήθεια με mutlicategories

Δημοσίευση από dpa » 27 Οκτ 2014 14:11

Η αλλήθεια είναι δύσκολο πρεπει να έχει εμπειρία.

Άβαταρ μέλους
giannis17
Honorary Member
Δημοσιεύσεις: 1215
Εγγραφή: 06 Ιαν 2005 19:50
Τοποθεσία: Παγκράτι - Αθήνα
Επικοινωνία:

Βοήθεια με mutlicategories

Δημοσίευση από giannis17 » 27 Οκτ 2014 14:51

Δες 2 τρόπους (δεν είχα την ευκαιρία να τους δοκιμάσω, θεωρητικά παίζουν)

1:

Κώδικας: Επιλογή όλων

//aploikos tropos, kanei polla query &#40;CPU hungry&#41; alla xrisimopoiei ligoteri mnimi

function ShowCategories&#40;$, $parent = 0&#41;&#123; 
//orisame to prwto parent 0 gia na ksekinisei apo tis kyries katigories
	global $db;
//travame ta prwta stoixeia...kai alfavitika &#58;D
	$sql = 'SELECT * FROM categories WHERE CategoryID = '.$parent.' ORDER BY CategoryName ASC';
	$res = $db->query&#40;$sql&#41;;
//an exoume apotelesmata ta typwnoume kai psaxnoume pio mesa
	if&#40;$res->num_rows > 0&#41;&#123;
		echo '<ul>';
		while&#40;$row = $res->fetch_assoc&#40;&#41;&#41;&#123;
			echo'<li data-item="'.$row&#91;'CategoryID'&#93;.'" >'.$row&#91;'CategoryName'&#93;.'</li>';
			//kane tin idia loopa gia tis ypokatigories
			ShowCategories&#40;$, $row&#91;'CategoryID'&#93;&#41;;
		&#125;
		echo'</ul>';
	&#125;
&#125;
//to kaleis sto thema
<div id="menu">
<?php ShowCategories&#40;$&#41;; ?>
</div>
2:

Κώδικας: Επιλογή όλων

//me ena erwtima, polyploko kai xreiazetai perissoteri mnimi
function GetCategories&#40;$&#41;&#123;
	global $db;
        //olo to menu tha mpei se 1 array
	$menu = array&#40;&#41;;
        //travame oles tis katigories me seira gonea wste na mi xreiazetai na kratame to gonea kathe fora
	$sql = 'SELECT * FROM categories ORDER BY ParentID ASC';
	$res = $db->query&#40;$sql&#41;;
	if&#40;$res->num_rows > 0&#41;&#123;
		while&#40;$row = $res->fetch_assoc&#40;&#41;&#41;&#123;
			if&#40;$row&#91;'ParentID'&#93; ==  0&#41;&#123;
			//neos goneas
				$menu&#91;$row&#91;'CategoryID'&#93;&#93; = array&#40;
					'CategoryID' => $row&#91;'CategoryID'&#93;,
					'CategoryName' => $row&#91;'CategoryName'&#93;,
					'children' => array&#40;&#41;
				&#41;;
			&#125; else &#123;
				//neo paidi
				array_push&#40;$menu&#91;$row&#91;'ParentID'&#93;&#93;&#91;'children'&#93;, $row&#41;;
			&#125;
		&#125;
	&#125;
	return $menu;
&#125;

function ListCategories&#40;$menu&#41;&#123;
	foreach&#40;$menu as $key=>$val&#41;&#123;
		echo'<li data-item="'.$key&#91;'CategoryID'&#93;.'">'.$key&#91;'CategoryName'&#93;.'</li>';
		if&#40;sizeof&#40;$key&#91;'children'&#93; > 0&#41;&#123;
			$children = $key&#91;'children'&#93;;
			echo '<ul>';
			foreach&#40;$children as $child=>$data&#41;&#123;
				echo'<li data-item="'.$child&#91;'CategoryID'&#93;.'">'.$child&#91;'CategoryName'&#93;.'</li>';
			&#125;
			echo '</ul>';
		&#125;
	&#125;
&#125;
//to kaleis sto thema
<ul id="menu">
<?php ListCategories&#40;GetCategories&#40;$&#41;&#41;; ?>
</ul>
Υ.Γ. και στο 2ο παράδειγμα γίνεται αλφαβητικό sortάρισμα αλλά θα πρέπει να το κάνεις μέσω της PHP στο $menu
Τελευταία επεξεργασία από το μέλος giannis17 την 27 Οκτ 2014 15:31, έχει επεξεργασθεί 1 φορά συνολικά.
"There is only one problem with common sense; it’s not very common."
&#8211; Milt Bryce

dpa
Δημοσιεύσεις: 631
Εγγραφή: 29 Μαρ 2008 13:55

Βοήθεια με mutlicategories

Δημοσίευση από dpa » 27 Οκτ 2014 15:13

Γιάννη το πρώτο παράδειγμα θα πρέπει να κάνει σύνδεση στη βάση πολλές φορές και θα εκτελεί πολλά queries ίσως το site να είναι αργό έτσι. Γι' αυτό είχα ένα array με όλα τα στοιχεία.

Η αλλήθεια είναι το δεύτερο μου φαίνεται καλύτερο αλλά όντως πολύπλοκο. Θα το δοκιμάσω

dpa
Δημοσιεύσεις: 631
Εγγραφή: 29 Μαρ 2008 13:55

Βοήθεια με mutlicategories

Δημοσίευση από dpa » 27 Οκτ 2014 15:24

Πρόσεχε λίγο τα li δεν τα κλείνεις σωστά

dpa
Δημοσιεύσεις: 631
Εγγραφή: 29 Μαρ 2008 13:55

Βοήθεια με mutlicategories

Δημοσίευση από dpa » 27 Οκτ 2014 15:24

Και όταν μπορέσεις λίγο αυτό θέλω να εμφανίσω

3 level

Κώδικας: Επιλογή όλων

  <ul class="horizontal_list main_menu type_2 clearfix">

      <li class="current relative f_xs_none m_xs_bottom_5 m_left_10 m_xs_left_0">
          <a href="index.html" class="tr_delay_hover color_dark tt_uppercase r_corners"><b>Αρχική Σελίδα</b></a>
      </li>
      <li class="relative f_xs_none m_xs_bottom_5 m_left_10 m_xs_left_0"><a href="#" class="tr_delay_hover color_dark tt_uppercase r_corners"><b>Ρούχα</b></a>

          <!--sub menu-->
          <div class="sub_menu_wrap top_arrow d_xs_none tr_all_hover clearfix r_corners w_xs_auto">

              <div class="f_left f_xs_none">
                  <b class="color_dark m_left_20 m_bottom_5 m_top_5 d_inline_b">Χειμωνιάτικα</b>
                  <ul class="sub_menu first">
                      <li><a class="color_dark tr_delay_hover" href="#">Ανδρικά</a></li>
                  </ul>
              </div>



          </div>
      </li>

      <li class="relative f_xs_none m_xs_bottom_5 m_left_10 m_xs_left_0"><a href="#" class="tr_delay_hover color_dark tt_uppercase r_corners"><b>Παπούτσια</b></a>

          <!--sub menu-->
          <div class="sub_menu_wrap top_arrow d_xs_none tr_all_hover clearfix r_corners w_xs_auto">

              <div class="f_left f_xs_none">
                  <b class="color_dark m_left_20 m_bottom_5 m_top_5 d_inline_b">Αθλητικά</b>
                  <ul class="sub_menu first">
                      <li><a class="color_dark tr_delay_hover" href="#">Ανδρικά</a></li>
                  </ul>
              </div>



          </div>
      </li>


</ul> 

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6234
Εγγραφή: 30 Νοέμ 2004 03:09

Βοήθεια με mutlicategories

Δημοσίευση από fafos » 27 Οκτ 2014 15:26

mia aplh function einai:

Κώδικας: Επιλογή όλων

function tree_menu&#40;$parent,$first_time&#41;
&#123;
	$has_childs = false;
	
	global $data;
	foreach&#40;$data as $key => $value&#41;
	&#123;
		if &#40;$value&#91;'ParentID'&#93; == $parent&#41; 
		&#123;                  
			if &#40;$has_childs === false&#41;
			&#123;             
					$has_childs = true;
					if &#40;$first_time == 1&#41;
					&#123;
						echo '<ul>';
					&#125;					
					else echo '<ul>';
			&#125;
			
				echo '<li>' . $value&#91;'CategoryName'&#93;;			
			
			tree_menu&#40;$key,0&#41;;
			
			echo '</li>';
		&#125;
	&#125;
	if &#40;$has_childs === true&#41; echo '</ul>';
&#125;

	tree_menu&#40;0,1&#41;;
tora pos tha valeis ola auta ta div,b klp ekei mesa einai allo zhtoumeno (kai den katalavaino giati ta exeis etsi!)
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

Άβαταρ μέλους
giannis17
Honorary Member
Δημοσιεύσεις: 1215
Εγγραφή: 06 Ιαν 2005 19:50
Τοποθεσία: Παγκράτι - Αθήνα
Επικοινωνία:

Βοήθεια με mutlicategories

Δημοσίευση από giannis17 » 27 Οκτ 2014 16:01

Εγώ προσωπικά χρησιμοποιώ το 1ο τρόπο που σου έδειξα αλλά είναι αποκλειστικά για μικρού-μεσαίου μεγέθους εφαρμογές. Φυσικά παίζει ρόλο και ο server. Αν είσαι σε P4 αλλά με 4GB RAM+ πας στην δεύτερη λύση, αν έχεις quad core αλλά με λίγη ram (2GB) όπως το vps μου και hostάρεις αρκετά πράγματα τότε "συμφέρουν" τα πολλά queries.

Επίσης παίζει ρόλο αν η βάση τρέχει localhost ή σε άλλο μηχάνημα (latency), ρυθμίσεις apache/php/mysql (κυρίως όσον αφορά το caching, το buffer και τα μεγέθη τους) και φυσικά η επισκεψημότητα.

Όπως καταλαβαίνεις δεν υπάρχει σωστή και λάθος λύση. Υπάρχει καλή και καλύτερη αλλά πάντα ανάλογα με την περίπτωση.

Το πρόβλημα σου είναι πως δεν μπορείς να το συνδυάσεις με το δύσχρηστο θέμα που έχεις επιλέξει. Ουσιαστικά copy-paste τις κλάσεις κάνεις μέσα στα tag.

Θα βρείς πάρα πολλά παραδείγματα online για multilevel menu, και ακόμα περισσότερα έτοιμα modules (πχ megamenu). Ρίξε μια ματιά εδώ: 2ο αποτέλεσμα για "php multilevel menu"
"There is only one problem with common sense; it’s not very common."
&#8211; Milt Bryce

dpa
Δημοσιεύσεις: 631
Εγγραφή: 29 Μαρ 2008 13:55

Βοήθεια με mutlicategories

Δημοσίευση από dpa » 27 Οκτ 2014 18:07

Σας ευχαριστώ πολύ και τους δυο θα το προσπαθήσω

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης