Foros del Web » Programando para Internet » PHP »

[Aporte] Listas vinculadas

Estas en el tema de [Aporte] Listas vinculadas en el foro de PHP en Foros del Web. Un problema común, es el de vincular listas... o tablas, grids, etc... Los ejemplos mas básicos, son... el Explorador de archivos, y reporte de Base ...
  #1 (permalink)  
Antiguo 14/01/2009, 06:39
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 3 meses
Puntos: 2534
[Aporte] Listas vinculadas

Un problema común, es el de vincular listas... o tablas, grids, etc...

Los ejemplos mas básicos, son... el Explorador de archivos, y reporte de Base de datos, veamos....

Explorador de Archivos

explorer.php

Código PHP:
<?php
//primero, debemos saber que carpeta explorar... la definimos
define('EX_PATH'dirname(__FILE__)); // sin la barra final

// en los ejemplos usamos la ruta misma del script...
// pero puede ser cualquiera
?>
explorer.php

Código PHP:
<?php
$path 
EX_PATH;
if ( ! empty(
$_GET['dir']))
{
  
// sub carpeta a listar??
  
$path .= "/$_GET[dir]";
}


// la carpeta deberia ser "privada" de modo que solo funcione
// hasta donde nosotros queramos...
if ( ! is_dir($path))
{
  die(
"No existe: $path");
}


// después, hacemos un iterador de archivos... algo muy conocido
$tmp opendir($path);


// enlace "arriba"
$top dirname(str_replace(EX_PATH''$path));

if (
$top !== '/' && $top !== '.')
{
  
// eliminamos la carpeta privada del enlace...
  
$top str_replace('\\''/'trim($top'/\\')); // DOS/*nix [fix]

  
echo '[<a href="'$_SERVER['PHP_SELF'], ! empty($top)? "?dir=$top"'''">arriba</a>]';
}

// usamos una tabla y formulario, obvio!
?>
<form method="post"><table>

<thead>
  <tr><th></th><th>nombre</th><th>tamaño</th><th>modificado</th></tr>
</thead>

<tfoot>
  <td colspan="99"><input type="submit" value="Eliminar seleccionados"/>
</tfoot>
<?php

while (($old readdir($tmp)) !== false)
{
  
// evitamos .. y .
  
if ($old !== '..' && $old !== '.')
  {
    
// generamos el link por archivo/carpeta...
    
$file "$path/$old";

    
$new str_replace(EX_PATH''$file);
    
$new str_replace('\\''/'trim($new'/\\')); // DOS/*nix [fix]
    // eliminamos la carpeta privada del enlace...
    
?>
<tr>
  <td><input type="checkbox" name="borrar[]" value="<?php echo $new?>"/></td>
  <td><?php
    
// si es una carpeta lo mejor es crear un enlace, para
    // continuar navegando sobre nuestra aplicacion...

    
if (is_dir($file))
    {
      echo 
'<a href="?dir='$new'">'$old'</a>';
    }
    else
    {
      echo 
$old;
    }
?></td>
  <td><?php echo is_file($file)? ceil(filesize($file) / 1024) . ' KB''-'?></td>
  <td><?php echo is_file($file)? date('d-m-Y H:i:s'filemtime($file)): '-'?></td>
</tr>
<?php

    
// vinculamos la accion de eliminar en un checkbox
    // de este modo, es mas precisa nuestra "accion"
    // (ademas de transparente)
    //
    // en cualquier otra acción, simplemente... podemos
    // utilizar un enlace comun y corriente....
  
}
}

?>
</table></form>
Reporte de BD

report.php

Código PHP:
<?php
// este reporte todos lo conocen, simplifiquemos...

while (($row mysql_fetch_assoc($result)) !== false)
{
?>
<tr>
  <td><input type="checkbox" name="borrar[]" value="<?php echo $row['id']; ?>" /></td>
  <td><?php echo $row['titulo']; ?></td>
  <td><a href="?accion=editar&amp;id=<?php echo $row['id']; ?>">editar</a></td>
</tr>
<?php
}

?>
Y así es, las acciones basadas en enlaces (GET) son simples de realizar con if-then-else o switch/case como con cualquier otra variable, etc, etc...

(un ejemplo de acción por enlace fue... el mismo de cambiar carpeta con ?dir=)


Ahora, para la acción POST, en este caso del checkbox (borrar) necesitamos hacer esto...


explorer.php

Código PHP:
<?php
// explorador de archivos
if ( ! empty($_POST['borrar']))
{
  
// iteramos el "paquete"
  
foreach ($_POST['borrar'] as $old)
  {
    
$file str_replace('\\''/'EX_PATH "/$old"); // DOS/*nix [fix]

    
if (is_file($file))
    {
      
var_dump($file); // borramos!!
      // cambiar por unlink()
    
}
    elseif (
is_dir($file)) {

      
// recordemos que no se pueden eliminar carpetas
      // que contengan archivos, para esto primero
      // debemos eliminar todo su contenido
      // y despues, eliminar...
      //
      // esto no esta implementado en el ejemplo, pero
      // es muy sencillo de desarrollar para uds.

    
}
  }
}
?>
report.php

Código PHP:
<?php
// reporte de base de datos
if ( ! empty($_POST['borrar']))
{
  
// en este ejemplo, vamos a usar el operador IN de SQL
  // ya que es mucho mas rapido que iterar por cada elemento...

  
$ids join(','$_POST['borrar']); // 1,15,4,66,9,...,N
  
$sql "DELETE FROM tabla WHERE id IN($ids)";

  
mysql_query($sql) or die(mysql_error());
}
?>
Y eso es todo, tal ves un ejemplo mas completo puede hacer falta.... pero de verdad, que trate de simplificar la lógica (mas del explorador) de vincular cualquier dato...

Ya que esto no solo se aplica a Reportes, o Archivos.... de hecho, es un concepto básico en general de programación Web....

Pueden haber muchas acciones, varias a la ves, etc... todo depende de la creatividad de uno!

(espero haberme explicado correctamente)



suerte!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.

Última edición por pateketrueke; 14/01/2009 a las 06:44
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

SíEste tema le ha gustado a 5 personas




La zona horaria es GMT -6. Ahora son las 01:38.