Pages

Monday, August 30, 2010

Ιεραρχική προβολή κατηγοριών με την PHP

Σίγουρα έχετε προσέξει στα διάφορα eshops ή σε διάφορα fora που έχουν τις κατηγορίες και μέσα σε αυτές κι άλλες κατηγορίες κ.ο.κ.. και εμφανίζονται όλα με κάποια ιεραρχία, οι υποκατηγορίες λίγο πιο μέσα από τις... "γονικές" κατηγορίες κλπ.

Καιρό λοιπόν αναρωτιόμουν πώς γίνεται αυτό με το να εμφανίζονται πιο μέσα οι υποκατηγορίες, αλλά πάντα βαριόμουν να το ψάξω.

Οπότε μιας που πλησιάζει η εξεταστική σκέφτηκα "να η ευκαιρία":


Η βάση μας:


Έχουμε έναν πίνακα με κατηγορίες στη βάση που έχει τουλάχιστον 3 πεδία:

cat_id
cat_name
cat_parent_id

Το 1ο πεδίο είναι και το primary key του πίνακά μας.
Το 2ο πεδίο όπως φαίνεται και από την ονομασία του θα έχει τα ονόματα των κατηγοριών.
Το 3ο πεδίο όπως επίσης φαίνεται από το όνομα, θα περιέχει την κατηγορία στην οποία υπόκειται η κάθε κατηγορία, κοινώς την γονική κατηγορία (parent category).

Όπως είναι προφανές, βάσει του 3ου πεδίου θα γίνεται όλη η δουλειά στη συνάρτηση.

Πώς λειτουργεί η συνάρτηση:

Η βασική ιδέα είναι αρκετά απλή:

  • Θέτουμε ένα cat_id ως root id και από αυτή την κατηγορία και κάτω θα πάρουμε τις υποκατηγορίες.
  • Για κάθε κατηγορία που βρίσκουμε, πρώτον την εμφανίζουμε και δεύτερον καλούμε ξανά την ίδια συνάρτηση και της δίνουμε σαν root id το id της κατηγορίας που βρήκαμε.
Παρακάτω παραθέτω τον κώδικα για τον πίνακα στη βάση, τον κώδικα για εισαγωγή 10 κατηγοριών, και τέλος τον κώδικα της συνάρτησης.


--
-- Table structure for table `categories`
--

CREATE TABLE IF NOT EXISTS `categories` (
  `cat_id` int(11) NOT NULL AUTO_INCREMENT,
  `cat_name` varchar(255) NOT NULL,
  `cat_parent_id` int(11) NOT NULL,
  PRIMARY KEY (`cat_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;

--
-- Dumping data for table `categories`
--

INSERT INTO `categories` (`cat_id`, `cat_name`, `cat_parent_id`) VALUES
(1, 'category1', 0),
(2, 'category2', 0),
(3, 'category3', 0),
(4, 'category11', 1),
(5, 'category12', 1),
(6, 'category13', 1),
(7, 'category21', 2),
(8, 'category111', 4),
(9, 'category112', 4),
(10, 'category121', 5);




Αν εμφανίσετε τις κατηγορίες ως μια λίστα θα εμφανιστούν ως εξής:



Ακολουθεί η συνάρτηση στην PHP:


function buildCategoryTree($parentCat)
 {
  $q = "SELECT * FROM categories WHERE cat_parent_id = $parentCat";
  $res = mysql_query($q);
  
  echo '<ul>';
  while($row = mysql_fetch_object($res))
  {
   if(mysql_num_rows($res) > 0)
   {
      echo '<li>' . $row->cat_name . '</li>';  
      //gia tin kathe katigoria ksanakaloume tin synartisi
      //kai pairnoume oles tis ypokatigories
      buildCategoryTree($row->cat_id);
   }
  }
  echo '</ul>';
 }



Πλέον αν εμφανίσετε τις κατηγορίες σας θα δείτε κάτι σαν αυτό:



Από 'κει και πέρα το πως θα το κάνετε να εμφανίζεται καλύτερα, είναι δικό σας θέμα, παίξτε με το CSS μέχρι να το φέρετε στα μέτρα σας.

No comments:

Post a Comment