move more functionalty to Diogenes_Barrel_Menu
authorJeremy Laine <jeremy.laine@m4x.org>
Mon, 5 Jun 2006 13:19:22 +0000 (13:19 +0000)
committerJeremy Laine <jeremy.laine@m4x.org>
Mon, 5 Jun 2006 13:19:22 +0000 (13:19 +0000)
include/Barrel/Menu.php
include/admin/menus.php

index 000b036..34d70e0 100644 (file)
@@ -42,9 +42,10 @@ class Diogenes_Barrel_Menu
   /** Delete the specified entry.
    *
    * @param $MID
+   * @param $parent
    * @param $caller
    */
-  function deleteEntry($MID, &$caller)
+  function deleteEntry($MID, $parent, &$caller)
   {
     if (mysql_num_rows($this->dbh->query("SELECT MID FROM {$this->table_menu} WHERE MIDpere=$MID")) > 0) {
       $caller->info(__("The selected menu has child items, please remove them first."));
@@ -55,7 +56,7 @@ class Diogenes_Barrel_Menu
     $this->dbh->query("DELETE FROM {$this->table_menu} WHERE MID=$MID");
 
     /* renumber the other menu entries so that they are between 1 and the number of entries */
-    $res = $this->dbh->query("SELECT MID FROM {$this->table_menu} WHERE MIDpere=$MIDpere ORDER BY ordre");
+    $res = $this->dbh->query("SELECT MID FROM {$this->table_menu} WHERE MIDpere=$parent ORDER BY ordre");
     $i = 0;
     while (list($MIDtoorder) = mysql_fetch_array($res)) {
       $i++;
@@ -65,17 +66,6 @@ class Diogenes_Barrel_Menu
   }
 
 
-  /** Get the maximum child index for a given menu entry.
-   */
-  function maxChildIndex($MIDpere)
-  {
-    $res=$this->dbh->query("SELECT MAX(ordre) from {$this->table_menu} where MIDpere=$MIDpere");
-    list($maxOrdre)=mysql_fetch_row($res);
-    mysql_free_result($res);
-    return $maxOrdre;
-  }
-
-
   /** Build the user-defined part of the menu.
    *
    * @param $PID
@@ -101,6 +91,19 @@ class Diogenes_Barrel_Menu
   }
 
 
+  /** Return the maximum index for children of a given entry.
+   *
+   * @param $parent
+   */
+   function maxChildIndex($parent)
+   {
+      $res=$this->dbh->query("SELECT MAX(ordre) from {$this->table_menu} where MIDpere=$parent");
+      list($maxOrdre)=mysql_fetch_row($res);
+      mysql_free_result($res);
+      return $maxOrdre;
+   }
+
+
   /** Return the filiation to get to the root element.
    *
    * @param mcache
@@ -162,14 +165,15 @@ class Diogenes_Barrel_Menu
   function menuRead()
   {
     $menu = array();
-    $res = $this->dbh->query("select MID,MIDpere,title,link,PID from {$this->table_menu} order by ordre");
-    while (list($mid, $parent, $title, $link, $pid) = mysql_fetch_row($res))
+    $res = $this->dbh->query("select MID,MIDpere,title,link,PID,ordre from {$this->table_menu} order by ordre");
+    while (list($mid, $parent, $title, $link, $pid, $ordre) = mysql_fetch_row($res))
     {
       $menu[$mid]['parent'] = $parent;
       $menu[$mid]['title'] = $title;
       $menu[$mid]['link'] = $link;
       $menu[$mid]['title'] = $title;
       $menu[$mid]['pid'] = $pid;
+      $menu[$mid]['ordre'] = $ordre;
       if (!is_array($menu[$mid]['children']))
         $menu[$mid]['children'] = array();
 
@@ -209,6 +213,42 @@ class Diogenes_Barrel_Menu
     $this->dbh->query("UPDATE {$this->table_menu} SET ordre=$a WHERE MID=$MIDb");
   }
 
+
+  /**
+   * Write an entry to database. If $mid is 0, a new entry is created.
+   *
+   * @param $mid
+   * @param $props
+   */
+  function writeEntry($mid, $props)
+  {
+    if ($mid == 0) {
+      $props['ordre'] = $this->maxChildIndex($props['parent']) + 1;
+    }
+
+    // build SQL string
+    $nprops = array('parent' => 'MIDpere', 'ordre' => 'ordre', 'title' => 'title', 'link' => 'link', 'pid' => 'pid');
+    $sprops = "";
+    foreach($nprops as $prop => $dbkey)
+    {
+      if (isset($props[$prop]))
+      {
+        $val = $props[$prop];
+        $sprops .= "$dbkey='$val', ";
+      }
+    }
+    if (!$sprops)
+      return;
+    $sprops = substr($sprops, 0, -2);
+    if ($mid == 0) {
+      $this->dbh->query("INSERT INTO {$this->table_menu} SET $sprops");
+      $mid = mysql_insert_id();
+    } else {
+      $this->dbh->query("UPDATE {$this->table_menu} SET $sprops WHERE MID=$mid");
+    }
+    return $mid;
+  }
+
 }
 
 ?>
index 5fd313b..1875326 100644 (file)
@@ -2,6 +2,7 @@
 require_once 'diogenes.common.inc.php';
 require_once 'diogenes.admin.inc.php';
 require_once 'Barrel/Menu.php';
+require_once 'Barrel/Page.php';
 
 $page = new DiogenesAdmin;
 $bbarrel =& $page->barrel;
@@ -19,7 +20,7 @@ switch ($action) {
 /* we want to erase the current entry */
 case "supprimer":
   $MID = $_REQUEST['MID'];
-  $bmenu->deleteEntry($MID, $page);
+  $bmenu->deleteEntry($MID, $MIDpere, $page);
   break;
 
 /* bring an entry up in the menu */
@@ -37,30 +38,21 @@ case "descendre":
 /* create or update a menu entry */
 case "modifier":
     $typelink = $_REQUEST['typelink'];
+    $props = array(
+      'parent' => $MIDpere,
+      'pid' => 0,
+      'link' => '',
+      'title' => $_REQUEST['title'],
+    );
     switch ($typelink) {
     case "boutonPI" :
-      $pid = isset($_REQUEST['PIvaleur']) ? $_REQUEST['PIvaleur'] : 0;
-      $link = "";
+      $props['pid'] = isset($_REQUEST['PIvaleur']) ? $_REQUEST['PIvaleur'] : 0;
       break;
     case "boutonSE" :
-      $pid = 0;
-      $link = $_REQUEST['SEvaleur'];
+      $props['link'] = $_REQUEST['SEvaleur'];
       break;
-    default:
-      $pid = 0;
-      $link = "";
     }
-    $MID = $_REQUEST['MID'];
-    $title = $_REQUEST['title'];
-    if ($MID == 0) {
-      $ordre = $bmenu->maxChildIndex($MIDpere);
-      $ordre++;
-      $globals->db->query("INSERT INTO {$bbarrel->table_menu} SET MIDpere='$MIDpere',ordre='$ordre',title='$title',link='$link',pid='$pid'");
-      $MID = mysql_insert_id();
-    } else {
-      $globals->db->query("UPDATE {$bbarrel->table_menu} SET title='$title',link='$link',pid='$pid' WHERE MID=$MID");
-    }
-
+    $MID = $bmenu->writeEntry($_REQUEST['MID'], $props);
     break;
 
 /* display the form to edit an entry */
@@ -73,9 +65,10 @@ case "editer":
 
   // if this is an existing entry, retrieve data
   if ($MID) {
-    $res = $globals->db->query("SELECT link,title,pid FROM {$bbarrel->table_menu} WHERE MID=$MID");
-    list($link, $title, $pid) = mysql_fetch_row($res);
-    mysql_free_result($res);
+    $mcache = $bmenu->menuRead();
+    $link = $mcache[$MID]['link'];
+    $title = $mcache[$MID]['title'];
+    $pid = $mcache[$MID]['pid'];
   }
 
   // fill out form data
@@ -132,12 +125,15 @@ case "editer":
 // get the maximum order
 $maxOrdre = $bmenu->maxChildIndex($MIDpere);
 
-// retrieve the entries
-$res = $globals->db->query("SELECT m.MID,m.ordre,m.title,m.link,m.PID,p.title ".
-                       "from {$bbarrel->table_menu} as m ".
-                       "left join {$bbarrel->table_page} as p on m.PID=p.PID ".
-                       "where MIDpere=$MIDpere order by ordre");
-while (list($MID,$ordre,$title,$link,$PID,$ptitle) = mysql_fetch_row($res)) {
+// all menu entries from database
+$mcache = $bmenu->menuRead();
+
+foreach($mcache[$MIDpere]['children'] as $MID)
+{
+  $ordre = $mcache[$MID]['ordre'];
+  $title = $mcache[$MID]['title'];
+  $link = $mcache[$MID]['link'];
+  $PID = $mcache[$MID]['pid'];
   $clickup="?action=remonter&amp;MIDpere=$MIDpere&amp;ordre=$ordre";
   $clickdown="?action=descendre&amp;MIDpere=$MIDpere&amp;ordre=$ordre";
 
@@ -152,7 +148,8 @@ while (list($MID,$ordre,$title,$link,$PID,$ptitle) = mysql_fetch_row($res)) {
   
   // describe the current link
   if ($PID) {
-    $descr = "<a href=\"pages?dir=$PID\">$ptitle</a>";
+    $tpage = Diogenes_Barrel_Page::fromDb($bbarrel, $PID);
+    $descr = "<a href=\"pages?dir=$PID\">".$tpage->props['title']."</a>";
   } elseif ($link) {
     $descr = "<a href=\"$link\">[ext] $link</a>";
   } else {
@@ -165,20 +162,14 @@ while (list($MID,$ordre,$title,$link,$PID,$ptitle) = mysql_fetch_row($res)) {
           stripslashes($descr),
           $edit,$del,$up,$down));
 }
-mysql_free_result($res);
 
-// all menu entries from database
-$mcache = $bmenu->menuRead();
 $filiation = $bmenu->menuToRoot($mcache,$MIDpere,array());
 $menubar = array();
 foreach($filiation as $mykey=>$myval) {
   if ($myval == 0) {
     $blab = "<i>home</i>";
   } else {
-    $res = $globals->db->query("SELECT title FROM {$bbarrel->table_menu} WHERE MID='$myval'");
-    list($blab) = mysql_fetch_row($res);
-    $blab = stripslashes($blab);
-    mysql_free_result($res);
+    $blab = stripslashes($mcache[$myval]['title']);
   }
   array_unshift($menubar,$mykey ? array($blab,"?MIDpere=$myval") : array($blab));
 }