HTML - PHP - MySQL - SVG

KERNI's SEITE

Das Nested Set Model

Veröffentlicht am


Funktionen der einzelnen Buttons

 

Nun, da das Formular zum Bearbeiten der Struktur steht, können wir uns um die einzelnen Buttons kümmern.

Als erstes kommt die Inputs zum hinzufügen eines neuen Eintrags. Ich begnüge mich damit den Eintrag nach der Auswahl 'Einfügen nach:' einzufügen.

 

Eintrag einfügen

		function EinfuegenNach(){
		  var name = $("#mname").val();
		  var id = $("#mid").combobox('getValue'); // Muss noch nachgearbeitet werden
		  $.ajax({
		    type:"POST",
		    url:"php/neu.php",
		    data:{id:id,name:name}
		  })
		  .done(function(data){
		    laden();
		  });
		  $("#mid").combobox("reload"); // Muss noch nachgearbeitet werden
		}
	

Diese Funktion ruft das PHP Script zum einfügen eines neuen Eintrages auf.

 

PHP Code: neu.php

		$id = $_REQUEST["id"];
		$name = $_REQUEST["name"];
		include "connpdo.php";
		 
		$sql = "SET @rw = (SELECT rgt FROM tree WHERE id=".$id.");
		UPDATE `tree` SET `rgt`=`rgt`+2 WHERE `rgt`>@rw;
		UPDATE `tree` SET `lft`=`lft`+2 WHERE `lft`>@rw;
		INSERT INTO `tree` (`name`, `lft`, `rgt`) VALUES ('".$name."',@rw+1,@rw+2);";
		 
		$rst = $pdo->prepare($sql);
		$rst->execute();
		$result = 0;
		 
		do {
		    $result += $rst->rowCount();
		} while ($rst->nextRowset());
		 
		echo $result;
	

 

Auf Hr. Klempert's Seite sind einige Beispiele zum Einfügen neuer Elemente zu finden.
In meinem Beispiel füge ich einen neuen Eintrag immer nach dem im Feld 'Einfügen nach:' ausgewählten Eintrag ein. Daher unterscheidet sich meine erste UPDATE Abfrage etwas.

Beispiel: (Die Einträge unterhalb von Vögel habe ich weggelassen)

id name lft rgt
1 Reptilien 1 6
2 Frosch 2 3
3 Krokodil 4 5
4 Primaten 7 14
5 Schimpanse 8 9
6 Orangutan 10 11
7 Bonobo 12 13
8 Vögel 15 22

 

Wird bei 'Einfügen nach:' Primaten ausgewählt, bedeutet dies, der Eintrag wird zwischen Bonobo und Vögel eingefügt. Auf der gleichen Ebene wie Primaten. Nicht als Untereintrag von Primaten.

SET @rw = ... -> Suche den Wert rgt
UPDATE rgt = rgt + 2 WHERE rgt > @rw -> rgt aller nachfolger um 2 erhöhen
UPDATE lft = lft + 2 WHERE lft > @rw -> lft aller nachfolger um 2 erhöhen
INSERT ... (.., lft, rgt) VALUES (.., @rw + 1, @rw + 2) -> Neuen Eintrag einfügen

Ich habe einige Versuche mit nur einer UPDATE Abfrage. Sobald es Untereinträge gibt funktioniert es nicht mehr.

 

id name lft rgt
1 Reptilien 1 6
2 Frosch 2 3
3 Krokodil 4 5
4 Primaten 7 14
5 Schimpanse 8 9
6 Orangutan 10 11
7 Bonobo 12 13
17 Nagetiere 15 16
8 Vögel 17 24

 

Nach dem Einfügen wird die Funktion 'laden()' aufgerufen um die Liste auf den neuesten Stand zu bringen.

 

Löschen

		function delNode(OneOrAll){
		  var nid = $("#nodeid").val();
		 
		  $.ajax({
		    type: "POST",
		    url: "php/loeschen.php",
		    data: {id:nid,oa:OneOrAll}
		  })
		  .done(function(data){
		    $("#bla").window("close");
		    $("#msg").html(data);
		    laden();
		  });
		}
	

JavaScript Funktion für den Button Löschen.

 

In der index.html, Zeile 33 benötigen wir noch diese Zeilen. Sonst verursacht das obere Script einen Fehler.

<div class="easyui-window" data-options="collapsible:false,closed:true" title="Löschbestätigung" id="bla" style="width:400px;height: 180px; padding: 5px;">
		  <div class="easyui-layout" data-options="fit:true">
		    <div data-options="region:'center'" id="regnorthmsg" style="padding: 5px;">
		      <p> </p>
		    </div>
		    <div data-options="region:'south',border:false" style="text-align:center;padding:5px 0 0;">
		      <button class="easyui-linkbutton c7" onclick="delNode(1)" style="width:30%">Behalten</button>
		      <button class="easyui-linkbutton c5" onclick="delNode(0)" style="width:30%">Löschen</button>
		      <button class="easyui-linkbutton c8" onclick="$('#bla').window('close')" style="width:30%">Abbrechen</button>
		    </div>
		  </div>
		</div>
	

 

PHP Code: loeschen.php

		$id = $_REQUEST["id"];
		$oneorall = $_REQUEST["oa"];
		 
		// SQL zum Löschen des Eintrags und aller Untereinträge
		$sqldelall = "SET @lt = (SELECT `lft` FROM `tree` WHERE `id`=".$id.");
		SET @rt = (SELECT `rgt` FROM `tree` WHERE `id`=".$id.");
		DELETE FROM `tree` WHERE `lft` BETWEEN @lt AND @rt;
		UPDATE `tree` SET `lft`=`lft`-(@rt-@lt+1) WHERE `lft`>@rt;
		UPDATE `tree` SET `rgt`=`rgt`-(@rt-@lt+1) WHERE `rgt`>@rt;";
		 
		// SQL zum Löschen des Eintrages und behalten der Untereinträge.
		// Untereinträge werden auf das Level des gelöschten Eintrages verschoben.
		$sqldelone = "SET @lt = (SELECT `lft` FROM `tree` WHERE `id`=".$id.");
		SET @rt = (SELECT `rgt` FROM `tree` WHERE `id`=".$id.");
		DELETE FROM tree WHERE `lft` = @lt;
		UPDATE tree SET `lft`=`lft`-1, `rgt`=`rgt`-1 WHERE `lft` BETWEEN @lt AND @rt;
		UPDATE tree SET `lft`=`lft`-2 WHERE `lft`>@rt;
		UPDATE tree SET `rgt`=`rgt`-2 WHERE `rgt`>@rt;";
		 
		include "connpdo.php";
		 
		if($oneorall==0){
		  $rst = $pdo->prepare($sqldelall);
		}else{
		  $rst = $pdo->prepare($sqldelone);
		}
		 
		$rst->execute();
		 
		$result = 0;
		 
		do {
		  $result += $rst->rowCount();
		} while ($rst->nextRowset());
		 
		echo $result;
	

Vor dem Löschen eines Eintrages wird noch gefragt ob nur dieser eine Eintrag gelöscht werden soll oder auch alle untergeordneten Einträge.