Announcement

Collapse
No announcement yet.

Dynamischer TreeView ohne Javascript

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Dynamischer TreeView ohne Javascript

    Hallo zusammen,

    ich arbeite seit einiger Zeit an einem Neuaufbau meiner Website und komme derzeit leider nicht weiter.
    Derzeit beschäftige ich mich mit einem Nachrichtensystem, bei dem Benutzer u.a. persönliche Ordner (ähnlich E-Mail) anlegen können. Diese sollen vom jeweiligen Benutzer eigenhändig erstellt/verschoben/bearbeitet/gelöscht werden können. Abgesehen natürlich von 3 System Ordnern (Posteingang, Postausgang, Papierkorb).
    Mein Ziel ist es, dass alle vorhandenen Ordner in einem dynamisch erweiterbaren TreeView dargestellt werden. Allerdings habe ich so meine Probleme damit


    Meine Datenbankstruktur sieht folgendermaßen aus:

    Code:
    CREATE TABLE IF NOT EXISTS `user_messages_folder` (
      `id` int(11) NOT NULL,
      `user` int(11) NOT NULL,
      `name` varchar(50) NOT NULL,
      `parent_id` int(11) NOT NULL
    ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
    Zum Auslesen der Datenbank habe ich mir eine kleine Hilfsfunktion geschrieben (dynamic_db_reader):

    PHP Code:
    function dynamic_db_reader($ms$params$sqlStmt){
    // Initialise some empty arrays
        
    $fields = array();
        
    $results = array();

    mysqli_set_charset($ms'utf8');

    if (
    $stmt $ms->prepare($sqlStmt)) {
         
    // Bind params

    if (!empty($params)) {
    $types '';
                foreach(
    $params as $param) {
                 
    // Set param type
                 
    if (is_string($param)) {
                
    $types .= 's';  // strings
                 
    } else if (is_int($param)) {
    $types .= 'i';  // integer
                 
    } else if (is_float($param)) {
    $types .= 'd';  // double
                 
    } else {
                   
    $types .= 'b';  // default: blob and unknown types
                 
    }
             }

    $bind_names[] = $types;
    for (
    $i=0$i<count($params);$i++) {
            
    $bind_name 'bind' $i;      
             $
    $bind_name $params[$i];      
             
    $bind_names[] = &$$bind_name;  
         }

    call_user_func_array(array($stmt,'bind_param'),$bind_names);
         } else {
        return 
    NULL;
         }

         
    // execute query
         
    $stmt->execute();

         
    // Get metadata for field names
         
    $meta $stmt->result_metadata();

         
    // Dynamically create an array to bind the results
         
    while ($field $meta->fetch_field()) {
          
    $var $field->name;
             $
    $var null;
             
    $fields[$var] = &$$var;
         }

         
    // Bind Results
         
    call_user_func_array(array($stmt,'bind_result'),$fields);

         
    // Fetch Results
         
    $i 0;
    while (
    $stmt->fetch()) {
      
    $results[$i] = array();
             foreach(
    $fields as $k => $v) {
          
    $results[$i][$k] = $v;
             }      
         
    $i++;
         }

         
    // close statement
         
    $stmt->close();
    if(
    sizeof($results) > 0){
    return 
    $results;
    } else {
    return 
    NULL;
    }
        } else {
      return 
    NULL;
        }


    Meine Aktuelle Klasse sieht so aus:

    PHP Code:
    <?php
    class obj_postoffice_navigation {

    private 
    $db;
    private 
    $usr;
    private 
    $rawentries = array();

    function 
    __construct($ms$user){
    $this->db $ms;
    $this->usr $user;
    }

    function 
    get_children($parent_id) {
    return 
    dynamic_db_reader($this->db, array($this->usr->getInfos()['id'], $parent_id), "SELECT * FROM `user_messages_folder` WHERE (`user` = -1 OR `user` = ?) AND `parent_id` = ?");
    }

    function 
    has_children($node_id){
    return (
    sizeof($this->get_children($node_id)) != 0);
    }

    function 
    addNode($arr$node){
    if (
    $this->has_children($node['id'])){
    $node['children'] = $this->get_children($node['id']);
    array_push($arr$node);
    } else {
    array_push($arr$node);
    }
    return 
    $arr;
    }

    function 
    get_menu() {
        
    $all dynamic_db_reader($this->db, array($this->usr->getInfos()['id']), "SELECT * FROM `user_messages_folder` WHERE `user` = -1 OR `user` = ?");
    $temp = array();

    for (
    $i 0$i sizeof($all); $i++){
    $entry $all[$i];
    $temp $this->addNode($temp$entry);
    }
    return 
    $all;  
    }

    function 
    build_html(array $menu) {
        
    $str '';

        foreach (
    $menu as $id => $item) {
        if (!isset(
    $item['children'])){
        
    $str .= ("<li>" $item['name'] . "</li>");
        } else {
        
    $str .= $this->build_html($item['children']);
        }

        }
        return (
    "<ul>" $str "</ul>");

    }

    function 
    build_catalog() {
        
    $menu $this->get_menu();
        echo(
    $this->build_html($menu));
    }

    }
    ?>


    Kann mir dabei jemand helfen? Bin nicht der beste wenn es um solche Rekursionen geht.. :/

    Vielen Dank im Voraus!
    Gruß, Cyntho
    Zuletzt editiert von Christian Marquardt; 02.10.2019, 12:33.

  • #2
    Wo genau liegt denn das Problem? Es wäre besser wenn Du das Problem etwas konkreter schilderst. Auf mehrseitigen Code bekommst Du mit Sicherheit nicht sehr viele Antworten, weil es recht mühsam ist sich alles durchzulesen und zu verstehen. Das ganze dann noch im Browser und ohne IDE vielleicht kannst Du es etwas kürzer beschreiben was genau Dein Problem ist.

    Comment


    • #3
      http://stackoverflow.com/questions/3...k-trees-in-php
      Christian

      Comment


      • #4
        Wenn ich es richtig rauslese, ist Dein Problem die dynamische Erweiterbarkeit des Trees und nicht die Darstellung selbst?
        Das würde ich in dem Fall über Ajax-Request machen. Du wirst beim Entfernen eines Ordners sicher die ID wissen, die übergibst Du dann per Ajax an ein PHP-Script, das die Id aus der DB löscht und den Tree neu lädt und zurückliefert. Sinnvoll wäre, wenn die Response bereits HTML liefert, so daß Du den DOM-Node direkt "austauschen" kannst.
        PHP rocks!
        Eine Initiative der PHP Community

        Comment

        Working...
        X