Non riesco ad ottenere il giusto attributo / simplexml

di il
3 risposte

Non riesco ad ottenere il giusto attributo / simplexml

Sto scrivendo un'applicazione abbastanza elementare in PHP. L'idea sarebbe quella di avere un filemanager che permetta di spostarsi all'interno di un XML (che contiene la struttura) fuori dal server (come anche i files): i documenti sarebbero poi copiati solo temporaneamente nel server per essere accessibili dal client.
il problema è che, per qualche ragione, a volte gli attributi sembrano essere presi casualmente...
l'xml:
<?xml version = "1.0" encoding="UTF-8"?>

<base>
    <el owner="system" type="root">
        <el name="Condivisa" type="dir" owner="system"></el>
         <el name="Utenti" type="dir" owner="system">
            <el name="user1" type="dir" owner="user1"></el>
            <el name="user2" type="dir" owner="user2">
                <el name="2.html"  owner="user2" type="html"></el>
            </el>
            </el>
            <el name="user3" type="dir" owner="user3"></el>
        </el>
        <el name="Leggimi.html"  owner="system" type="html"></el>
    </el>
</base>
per essere più chiaro, descrive i luoghi raggiungibili:
/
/Condivisa
/Leggimi.txt
/Utenti
/Utenti/user1
/Utenti/user2
/Utenti/user2/2.html
/Utenti/user3

e ora abbiate pietà, non ho mai visto questo linguaggio prima...
potrebbero esserci dei parametri passati nelle funzioni ma rimasti inutilizzati, come variabili globali che potrebbero anche non essere tali, provvederò a sistemarlo in seguito.
il php:


<?php

session_start();

if (!isset($_SESSION['loggedin'])) {
    header('Location: index.html');
    exit;
}

?>
<form method="post">
    <input type="submit" name="back" value="<--"/>
</form>
<?php


$fsmap="/Applications/XAMPP/xamppfiles/htdocs/FLMNGR/MAP.xml"; //nota: la base del server non è htdocs ma htdocs/site mentre i files risiedono in htdocs/FLMNGR insieme all'xml


$DF = simplexml_load_file($fsmap);
    global $path;
    global $child;
    global $pget;
    $pget=$_GET['path'];
    $pgetc=$pget;
    
    $pp=explode(".", $pget);
    $pel=count($pp);
    $path=$DF;


    if(isset($pget)){
        
        for($c=0; $c<--$pel; $c++){
            $tmp=intval($pp[$c]);

            $path=$path->el[$tmp];
            
                
        }
    }
   



    echo "<table style=\"width:100%\"><tr>";

    function auth($path){
        $a=$path['owner'];
        $n=$_SESSION['name'];
        if($a=="system")return 0;
        if($a==$n){return 1;}
        else{return 2;}
        
        
    }
    function type($path,$pgetc){
        $a=$path["type"];
        if($a=="html")return 1;
        if($a=="dir")return 0;
        if($a=="root")return 999;
        echo "Il tipo dell'elemento selezionato non prevede nessun comportamento predefinito";
        return null;
    }
    function open($path,$pgetc, $DF){
        $a=intval(type($path,$pgetc));
        if($a==0 or $a=999)get_dir_content($path, $pgetc);
        if($a==0)get_html_file($path, $pgetc, $DF);
        return null;
    }
    
    function goback(){
        
        $pget=$_GET['path'];
        $pp=explode(".", $pget);
        $bk = array_pop($pp);
        $bk = array_pop($pp);
        $bk = array_pop($pp);
        $prp=implode(".",$pp);
        
        header("Location: file_manager.php?path=".$prp.".");
    }

    function get_html_file($path, $pgetc, $DF){
        //////////INCOMPLETO////////////
        if(isset($_POST['back']))goback();
        $base="/Applications/XAMPP/xamppfiles/htdocs/FLMNGR/";
        $f0=explode(".", $pget);
        $pel=count($f0);
        $pth=$DF;
        for($c=0; $c<=--$pel; $c++){
            $tmp=intval($f0[$c]);
            $pth=$pth->el[$tmp];
            if($c >= "1"){
                $base=$base.$pth['name']."/";
            }
        }
        //////////INCOMPLETO////////////
    }
    
    
    function get_dir_content($path,$pgetc){
        
        ob_start();
        if(isset($_POST['back'])) {
    
            goback();
            
        }
        
        $foldericon="<img src=\"filemanager/icone/foldericon.tiff\" width=\"50\" height=\"50\">";
        $sfoldericon="<img src=\"filemanager/icone/session_foldericon.tiff\" width=\"50\" height=\"50\">";
        $yfoldericon="<img src=\"filemanager/icone/system_foldericon.tiff\" width=\"50\" height=\"50\">";
        $docicon="<img src=\"filemanager/icone/docicon.tiff\" width=\"50\" height=\"50\">";
        $el=$path->count();
        $el++;
        
        for($c=1;$c<$el;$c++){
            
            $child=$path->children();
            $temp=$child[$c-"1"];
            $DoF=$child[$c-"1"]['type'];
            if($DoF=="dir" and auth($temp)==2){
                echo "<td><div align=\"center\">".$sfoldericon."</div></td>";
            }
            if($DoF=="dir" and auth($temp)==1){
                echo "<td><div align=\"center\">".$foldericon."</div></td>";
            }
            if($DoF=="dir" and auth($temp)==0){
                echo "<td><div align=\"center\">".$yfoldericon."</div></td>";
            }
            if($DoF=="txt" or $DoF=="html"){
                echo "<td><div align=\"center\">".$docicon."</div></td>";
            }

            if(($c%6)==0 and $c!=0 ){
                echo "</tr>";
                for($cn=$c-"6"; $cn<$c; $cn++){
                    $child=$path->children();
                    $bchild=$child[$cn];
                    $name=$child[$cn]['name'];
                    $at=auth($bchild);
                    if($at==2){
                        echo "<th><div align=\"center\"><a href=\"#\" onClick=\"alert('Attenzione! Non sembri disporre dei privilegi per effettuare le seguenti azioni su questo elemento: visualizzazione, modifica')\">".$name."</a></div></th>";
                    }else{
 

un'altra cosa che non riesco a comprendere: per muovermi all'interno dell'xml uso un percorso composto da indici consequenziali separati da "." e logica vorrebbe che per raggiungere la seconda cartella dentro la seconda cartella in "/" si possa usare .1.1. ... invece per qualche oscuro motivo (ci sono arrivato a tentativi) ho notato che per spostarmi all'interno di una cartella dovevo inserire due volte l'indice per lo stesso elemento, per riprendere l'esempio precedente: .1.1.1.1. dove i primi due "1" portano all'interno di "/Utenti" e i secondi due a "/Utenti/user1"
             
                        echo "<th><div align=\"center\"><a href=\"file_manager.php?path=".$pgetc.$cn.".".$cn."\">".$name."</a></div></th>";
                    }
                }
                echo "</tr><tr>";
            }
        }
        if($el%6!=0){
            echo "</tr>";
            for($cn=$c-$el%6; $cn<$c; $cn++){
                $child=$path->children();
                $bchild=$child[$cn];
                $name=$child[$cn]['name'];
                $at=auth($bchild);
                if($at==2){
                    echo "<th><div align=\"center\"><a href=\"#\" onClick=\"alert('Attenzione! Non sembri disporre dei privilegi per effettuare le seguenti azioni su questo elemento: visualizzazione, modifica')\">".$name."</a></div></th>";
                }else{
                
                    echo "<th><div align=\"center\"><a href=\"file_manager.php?path=".$pgetc.$cn.".".$cn.".\">".$name."</a></div></th>";
                }
                
                
            }
            echo "</tr><tr>";
        }
    }
    
    open($path,$pgetc, $DF);
        
    

?>

Grazie in anticipo a chi proverà ad aiutarmi!

3 Risposte

  • Re: Non riesco ad ottenere il giusto attributo / simplexml

    Ciao,
    tu fai chiamate SOAP ad un server che ti restituisce un XML?

    Come vuoi rendere fruibili questi dati?

    Per capire...

    Ciao
  • Re: Non riesco ad ottenere il giusto attributo / simplexml

    Si, certo, non sono molto chiaro ...
    Una volta selezionato un file, questo verrebbe copiato all'interno del server in una cartella temporanea solo se il proprietario del file è lo stesso utente che ha effettuato il login. (Viceversa sarebbe per la scrittura).
  • Re: Non riesco ad ottenere il giusto attributo / simplexml

    Il proprietario del file di default in linux è il 33 o www-data a meno che tu non cambi le impostazione del webserver. Se tu scrivi un file da PHP il file come proprietario è il www-data o 33.
    Non sò come l'hai implementato.

    Questo server ti restituisce un file XML... poi che ci vuoi fare con la stringa? Lo vuoi esporre a video... in una tabella? O con dei DIV?

    In due parole fai una chiamata CURL o come vuoi tu al server, ti restituisce un XML e lì vuoi esporre a video? Giusto?

    Non capisco perché parli di selezionare il file. Tu vai a scrive la stringa in un file per poi leggerlo? Ma se elabori direttamente senza scrive file nel server non fai prima?

    Mi fai vedere come fai una chiamata al server in PHP? E cosa ti restituisce? Mi sembra strano che ti restituisce un XML incompleto.

    Le chiamate le faccio in CURL, poi se un server mi restituisce in JSON le converto in array, se mi da un XML utilizzo "simplexml_load_string", utilizzo le funzioni inerenti e li converto in array. In base ai nodi che passo alla funzione che mi sono creato, sò come mi viene restituito l'array. Ovviamente prima devo vedere come è formato l'XML in base al tipo di chiamata.

    Ciao
Devi accedere o registrarti per scrivere nel forum
3 risposte