Foros del Web » Programando para Internet » PHP »

subir nivel en subdirectorios casi solucionado

Estas en el tema de subir nivel en subdirectorios casi solucionado en el foro de PHP en Foros del Web. buenas. tengo casi solucionado el problema de subir de nivel en subdirectorios dentro de un directorio, pero me falta un empujoncillo. a ver: tengo un ...
  #1 (permalink)  
Antiguo 19/04/2007, 05:37
Avatar de estibaliz2006  
Fecha de Ingreso: noviembre-2006
Mensajes: 439
Antigüedad: 17 años, 5 meses
Puntos: 1
subir nivel en subdirectorios casi solucionado

buenas. tengo casi solucionado el problema de subir de nivel en subdirectorios dentro de un directorio, pero me falta un empujoncillo. a ver: tengo un sistema por medio del cual cada vez que se registra un cliente, se crea en el servidor un directorio. este cliente puede acceder a su panel de control y desde él puede subir archivos, borrar archivos o crear subdirectorios dentro de este directorio específico suyo. bien.

la aplicación, en el panel principal de este cliente en cuestión (panel que no es más que SU directorio) muestra los archivos que tiene en ese directorio principal o raiz y también los subdirectorios que tiene creados en el mismo. el tema está en que en ese panel principal, tengo programado que aparezca el enlace "subir nivel", ideado en un principio para que cuando estuviera en un subdirectorio, al pinchar volviera al directorio que lo contiene. pero el problema es que este "subir nivel" me aparece tanto en los subdirectorios (que es donde debería aparecer) como en el directorio principal del cliente donde hí no tendría que aparecer, pues si aparece ahí y se hace click en él me lleva a la carpeta donde tengo alojado todos los archivos del sistema.
es decir, quiero esa utilidad pero que sólo aparezca cuando estamos dentro de un subdirectorio del directorio de ese cliente.

a ver, yo lo que tengo es esto:
recojo el nombre del directorio (que viene dado por el nombre que dio el usuario al registrarse. lo recojo a través de la variable $nombre y así digo que la variable $path=$nombre
Código PHP:
if(!isset($path))  
    {  
        
$path "$nombre";   
//donde la variable nombre recoge el nombre que el usuario da al registrarse y por lo tanto, el nombre del directorio principal//  
    

ahora detecto el directorio o subdirectorio en el que estoy:
Código PHP:
if ($handle opendir($path))   
    {  
//con esto me dice el directorio en el que estoy (directorio o subdirectorio, es decir, si pincho en un subdirectorio, me aparece el nombre del subdirectorio en el que estoy. si estoy en el directorio principal, me aparece el nombre del directorio principal  
        
$curDir substr($path, (strrpos(dirname($path."/."),"/")+0));  
        print 
"<br>Directorio Actual: <b>".$curDir."</b>&nbsp;&nbsp"
y por último, pongo el enlace "subir de nivel" que aparecerá en la web y me permitirá subir al directorio anterior:

Código PHP:
//con esto hago lo que os comentaba. lo que quiero es que sólo aparezca cuando estoy en subdirectorios.           
$up substr($path0, (strrpos(dirname($path."/."),"/")));  
        print 
"|&nbsp;&nbsp;<a href='index.php?mod=10&path=$up' class=textenlace3>Subir Nivel</a> 
qué es lo que hago para subir nivel? bueno, pues leo el número de caracteres de la variable $path mediante strlen:

Código PHP:
if (strlen($path)> 15)
        {
        
$curDir substr($path, (strrpos(dirname($path."/."),"/")+0));

        print 
"<br>Directorio Actual: <b>".$curDir."</b>&nbsp;&nbsp"

         

        
$up substr($path0, (strrpos(dirname($path."/."),"/")));

        print 
"|&nbsp;&nbsp;<a href='index.php?mod=10&path=$up' class=textenlace3>Subir Nivel</a><br><hr color=#EAEAEA>"; }
        else
        {
         
$curDir substr($path, (strrpos(dirname($path."/."),"/")+0));

        print 
"<br>Directorio Actual: <b>".$curDir."</b>&nbsp;&nbsp";} 
claro, si la variable path fuera un fijo, es decir, fuera $path=modulos/directorio, no habría problema: pondría

Código PHP:
if (strlen($path)> 18
donde 18 es el número de caracteres de la palabra directorio más módulos. pero aquí el problema es que la variable $path=modulos/$nombre, donde $nombre es el nombre que mete el usuario cuando se registra. con lo cual puede tener de longitud desde 3 letras (por ejemplo ana) hasta 7 u 8 (alejandro, por ejemplo). entonces, cómo hago el if porque seguro seguro tengo los 8 caracteres de modulos/ pero y después, cómo sé yo los caracteres que va a tener el nombre que venga en la variable $nombre?

buff, que jaleo...


[/PHP]
  #2 (permalink)  
Antiguo 19/04/2007, 14:08
Avatar de estibaliz2006  
Fecha de Ingreso: noviembre-2006
Mensajes: 439
Antigüedad: 17 años, 5 meses
Puntos: 1
Re: subir nivel en subdirectorios casi solucionado

por dios, nadie sabe la solución?
  #3 (permalink)  
Antiguo 19/04/2007, 14:30
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Re: subir nivel en subdirectorios casi solucionado

Por arriba veo que tienes definida la variable $nombre, donde viene el nombre del usuario, no podrias hacer un simple if( $path == $nombre ) { // no imprimir boton de arriba }, o algo por el estilo?
  #4 (permalink)  
Antiguo 19/04/2007, 14:37
Avatar de gerson  
Fecha de Ingreso: febrero-2005
Ubicación: Lima
Mensajes: 481
Antigüedad: 19 años, 2 meses
Puntos: 4
Re: subir nivel en subdirectorios casi solucionado

Hola estibaliz2006 en tu post anterior puse es codigo pero sin el subir nivel, pues a este le agrege eso de subir nivel.
Código PHP:
if (isset($_GET['dir'])){
    
$path $_GET['dir'];    
}else{
    
$path "dir";
}
$rutas explode('/',$path);
if(isset(
$_POST['archivo'])){
    for(
$i=0;$i<sizeof($_POST['archivo']);$i++){
        if (
is_file($path '/' $_POST['archivo'][$i])){
            
unlink($path '/' $_POST['archivo'][$i]);
        }else{
            
rmdir($path '/' $_POST['archivo'][$i]);
        }
    }
    
header('Location: test2.php?dir='.$path);
}
if (
$rutas !== false){
    
$url '';
    
$len sizeof($rutas) - 1;
    for(
$i=0;$i<$len;$i++){
        
$url .= $rutas[$i] .'/';
    }
    
$url substr($url,0,-1);
    echo 
'<a href="test2.php?dir='.$url .'">'.$url.'</a>';
}
echo 
'<form name="frm" method="post" action="test2.php?dir='.$path.'">';
echo 
'<table cellspacing="0" cellspadding="0" border="1">';
echo 
'<tr>';
echo 
'<td colspan="2">para los marcados<input type="submit" value="Eliminar"></td>';
echo 
'</tr>';
echo 
'<tr>';
echo 
'<td>&nbsp;</td><td>Archivo</td>';
echo 
'</tr>';
if (
$handle opendir($path))  
    { 
    while (
false !== ($file readdir($handle))) { 
        if (
$file != "." && $file != "..") {     
            
$fName $file
            
$file $path.'/'.$file
            if(
is_file($file)){////si es un fichero  
                
echo '<tr>';
                echo 
'<td><input type="checkbox" name="archivo[]" value="'.$fName.'"></td>';
                echo 
"<td><a href='".$file."'>".$fName."</a></td>";
                echo 
'</tr>';
            }else{
                if(
$handle2 opendir($file)){
                    
$contador 0;
                    while (
false !== ($file2 readdir($handle2))){
                        
$contador++;
                    }
                }
                if (
$contador == 2){
                    
$check '<input type="checkbox" name="archivo[]" value="'.$fName.'">';
                }else{
                    
$check '&nbsp;';
                }
                echo 
'<tr>';
                echo 
'<td>'.$check.'</td>';
                echo 
"<td><a href='test2.php?dir=".$file."'>".$fName."</a></td>";
                echo 
'</tr>';
            }
        }
    }
}
echo 
'</table>';
echo 
'</form>'
Saludos
__________________

  #5 (permalink)  
Antiguo 20/04/2007, 23:43
Avatar de estibaliz2006  
Fecha de Ingreso: noviembre-2006
Mensajes: 439
Antigüedad: 17 años, 5 meses
Puntos: 1
Re: subir nivel en subdirectorios casi solucionado

hola gerson. gracias por tu ayuda, pero no era a eso a lo que yo me refería. mira, yo lo que tengo es lo siguiente:

en la cabecera de la tabla se muestra un mensaje que dice:
Cita:
Directorio Actual:
y al lado aparece el nombre del usuario que se ha registrado. supongamos que el usuario se ha registrado con el nombre de 'juanluis'. bien. pues automáticamente, se crea en el servidor un nuevo directorio con ese nombre, 'juanluis'. cuando el usuario accede a su panel de usuario, lo que hace es llevarlo a su directorio o carpeta, es decir, a 'juanluis'. con lo cual, el mensaje que le aparecerá en la cabecera de la tabla será:

Cita:
Directorio Actual: juanluis
esto, como te decía en el email anterior, lo hago así:
recojo el nombre del directorio (que viene dado por el nombre que dio el usuario al registrarse. lo recojo a través de la variable $nombre y así digo que la variable $path=$nombre
Código PHP:
if(!isset($path))   
    {   
        
$path "$nombre";    
//donde la variable nombre recoge el nombre que el usuario da al registrarse y por lo tanto, el nombre del directorio principal//   
    

ahora detecto el directorio o subdirectorio en el que estoy:
Código PHP:
if ($handle opendir($path))    
    {   
//con esto me dice el directorio en el que estoy (directorio o subdirectorio, es decir, si pincho en un subdirectorio, me aparece el nombre del subdirectorio en el que estoy. si estoy en el directorio principal, me aparece el nombre del directorio principal   
        
$curDir substr($path, (strrpos(dirname($path."/."),"/")+0));   
        print 
"<br>Directorio Actual: <b>".$curDir."</b>&nbsp;&nbsp"
muy bien. este directorio para él será su directorio raíz, con lo que no podrá aparecer en ningún sitio 'subir nivel' pues si apareciera lo llevaría al directorio raiz del sistema (llamémosle 'modulos') que es donde están todos los archivos que dan forma a la web. por lo tanto, si el usuario está en su directorio raiz, en la cabecera aparecerá
Cita:
Directorio Actual: juanluis
y no habrá posibilidad de que aparezca el enlace 'subir nivel'.
bien. pero es que este usuario tiene la posibilidad, dentro de su directorio principal (dentro de 'juanluis'), de crear nuevas carpetas. así, supongamos que el usuario 'juanluis' crea en su carpeta raíz una nueva carpeta a la que le da el nombre de 'dibujos'. al leer el directorio raíz de ese usuario (es decir, al leer el directorio 'juanluis') desplegará los archivos que haya en él y además el subdirectorio creado 'dibujos'. supongamos que este usuario accede al subdirectorio 'dibujos'. entonces en la cabecera de la tabla aparecerá:
Cita:
Directorio Actual: juanluis/dibujos
y aquí es donde debería aparecer la opción 'subir nivel' para que el usuario volviera a su directorio raíz 'juanluis' (donde nunca podrá aparecer esta opción de 'subir nivel')

cómo había pensado hacer esto? bien. pues contando caracteres: puesto que el todos los archivos de la web están en la carpeta 'modulos' tendríamos que obviamente los directorios creados por los usuarios al registrarse irían a la carpeta 'modulos', de tal forma que $path sería igual a 'modulos/$nombre':
Código PHP:
$path='modulos/$nombre' 
donde $nombre es la variable que recoge el nombre de usuario que da el visitante al registrarse y que da nombre a su directorio raiz.
bueno, pues para todo ello, para contar los caracteres yo hacía así:
Código PHP:
strlen($path)> 
y aquí a partir de mayor ponía un número que debía ser lo suficientemente grande para que cogiera los caracteres que hay en modulos/ más el nombre del usuario, por ejemplo, 15 (que eran los caracteres sumados de modulos/, que son 8, más aproximadamente los del usuario) así yo decía: si eso es mayor que 15 quiere decir que hay un directorio creado, con lo cual debe aparecer la opción 'subir nivel':
Código PHP:
if (strlen($path)> 15
        { 
        
$curDir substr($path, (strrpos(dirname($path."/."),"/")+0)); 

        print 
"<br>Directorio Actual: <b>".$curDir."</b>&nbsp;&nbsp";  

          

        
$up substr($path0, (strrpos(dirname($path."/."),"/"))); 

        print 
"|&nbsp;&nbsp;<a href='index.php?mod=10&path=$up' class=textenlace3>Subir Nivel</a><br><hr color=#EAEAEA>"; } 
        else 
        { 
         
$curDir substr($path, (strrpos(dirname($path."/."),"/")+0)); 

        print 
"<br>Directorio Actual: <b>".$curDir."</b>&nbsp;&nbsp";} 
poniendo un número alto, me curaba en salud de que el 'subir nivel' no aparecería en el directorio raiz del individuo, pues en el caso de un usuario registrado como 'ana' tendriamos en total 8 caracteres (de modulos/) más 3 caracteres (de ana) igual a 11 caracteres. como es menor que 15, quiere decir que estamos en el directorio raiz del usuario (es decir, en 'ana') y no debe aparecer la opción 'subir nivel'. si 'ana' crease una nueva carpeta en su directorio llamada 'claves' por ejemplo, ya tendríamos 8 caracteres (de modulos/) más 3 caracteres (de ana) más 6 caracteres (de claves) igual a 17 caracteres, que es mayor que 15 con lo cual el sistema sabe que no está en el directorio raiz del usuario si no en un subdirectorio y aparece el 'subir nivel'.

pero esto tiene un pero. y cual es? supongamos el caso del usuario 'juanluis'. este usuario, su directorio raiz, tiene como caracteres: 8 caracteres (de modulos/) más otros 8 caracteres de su nombre de usuario, es decir, de 'juanluis' dan lugar a 16 caracteres. qué sucede? pues que 16>15, con lo cual el sistema cree que estamos en un subdirectorio de la carpeta raíz del usuario 'juanluis' (a pesar de que estamos en su directorio principal) y lo que hace es que muestra el enlace 'subir nivel' que si pinchas lo lleva directamente a la carpeta 'modulos' que es la carpeta raíz del sistema.
¡¡¡que jaleo, no?!!!
bueno, el tema está en que ese numero que ponemos al azar en el código (>15) no fuera al azar, sino que tuviera sentido. es decir, que se dijera algo así:
si strlen($path)> suma de caracteres directorio raiz del usuario más caracteres de modulos/, entonces mostrar enlace 'subir nivel', si no, no mostrar nada.
el problema viene que la parte fija en esa expresión es modulos/, que como es fija, sabemos el número de caracteres. pero la variable $nombre, es eso, variable, y recoge el nombre del usuario al registrarse y que da nombre al directorio raiz del usuario. pero es que esa variable puede tener desde 3 caracteres (por ejemplo, ana) hasta 8 (juanluis) o los que sean, con lo cual, cómo hago esto?

espero no haberte liado.
  #6 (permalink)  
Antiguo 20/04/2007, 23:44
Avatar de estibaliz2006  
Fecha de Ingreso: noviembre-2006
Mensajes: 439
Antigüedad: 17 años, 5 meses
Puntos: 1
Re: subir nivel en subdirectorios casi solucionado

anda que... vaya tela... después de toda la parrafada anterior, se me acaba de ocurrir:

Código PHP:
if (strlen($path) > strlen('modulos/')+strlen($nombre
es decir, sumo los caracteres de 'modulos/' más los que tenga la variable... ¡¡¡y todo correcto!!!
si es que una no sabe ni donde está....
saludos a todos y gracias gerson....
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:00.