Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



sábado, 30 de junio de 2012



Para entender lo que comenta la documentacion sobre el método .Sort, para la ordenación de listas de objetos, he hecho este pequeño ejemplo.

El metodo Sort, tiene un evento relacionado ( _compare ) que es el que le va indica que comparar para hacer la ordenación.

Mi ejemplo:
Tenemos una lista compuesta por nombre, apellidos y edades.
Lo que quiero hacer es obtener 3 listas ordenadas por el nombre, por el apellidos y por la edad

Os enseño la salida generada...



He usado clases 4 clases:
La ClassPersona: es la que "madre" de las que heredan las otras. Contiene las propiedades (ademas tiene un método para devolver una cadena de texto con los datos).
Public Function informe() As String

Dim a As String

a = " " & hnombre & " " & hapellidos & " " & Str$(hedad) & "\n"
Return a

End

Y las clases ClassPersonaOrdenApellidos,ClassPersonaOrdenEdad,ClassPersonaOrdenNombre, se diferencian en el metodo _compare que es redefinido segun la forma que queramos ordenar los datos.

Por ejemplo, para ordenar por edad...

Public Function _compare(otro As ClassPersona) As Integer

If Super.apellidos > otro.apellidos Then
Return 1
Else
If Super.apellidos < otro.apellidos Then
Return -1
Else
Return 0
Endif
Endif

End


Ademas he incluido dos metodos "convierte" y "conviertelista" que son los encargados de hacer la conversion de los datos de la clase persona (madre) a la propia clase heredada.

Public Function convierte(persona As ClassPersona) As ClassPersonaOrdenApellidos

Super.apellidos = persona.apellidos
Super.edad = persona.edad
Super.nombre = persona.nombre
Return Me

End

Public Function convierteLista(personaLista As ClassPersona[]) As ClassPersonaOrdenApellidos[]

Dim personaOrdenApellidos As New ClassPersonaOrdenApellidos[]
Dim perstemporal As New ClassPersonaOrdenApellidos("", "", 0)
Dim a As Integer

For a = 0 To personaLista.count - 1
perstemporal = New ClassPersonaOrdenApellidos("", "", 0)
perstemporal.convierte(personaLista[a])
personaOrdenApellidos.Add(perstemporal)
Next

Return personaOrdenApellidos

End

Uso en el Fmain:
'ordeno por edad
ordenadaEdad = ordenadaEdadtemp.convierteLista(lista)

lista = ordenadaEdad.Sort(gb.Ascent)

muestralista("Edad", lista)

Os dejo el código fuente completo de la aplicación. Enlace de descarga

Saludos



Fuente:

sábado, 23 de junio de 2012

PHP: Generar listados de archivos contenidos en alguna carpeta de tu servidor web

PHP: Generar listados de archivos contenidos en alguna carpeta de tu servidor web

He creado una web, para alojar un proyecto de un juego.
Se me ha presentado el siguiente problema:
 -Los usuarios pueden subir archivos a la web (mapas del juego y una captura de pantalla)
-  ademas yo mismo subo las nuevas versiones, incluyendo un pequeño archivo de texto, donde cuento las mejoras incluidas y los errores corregidos...

¿como lo hago que automaticamente se genere una tabla, que presente los enlaces de descarga de los archivos, imagenes o textos?


Pues con un simple archivo en PHP. Aprobeche el fichero que daba el servidor por defecto para mostar los archivos, y le añadir crear una table y que en la segunda columna mostrar o la imagen del archivo o el texto.

El truco que hice es que el archivo que subo, al subir su imagen (o texto de version), conservo el mismo nombre, y le hago añado una terminación  (.ver (si es texto) ).
Hay un bucle for, en el programa, que crea una lista de archivos a mostrar en la tabla, con la terminacion ".ver", lo que hace es cuando crea la lista de archivo no añado a la lista los archivo que contengan ".ver" (ni los directorios, para que no se vean). Creandose una lista solo conlos archivos que me interesan.

Luego hay otro bucle for, para ir creando el archivo .html, alli pillara el nombre de la lista, y en la 2º columna, le añade al nombre la terminacion ".ver", para que coincida con el fichero de texto.

Os enseño como quedo el resultado:




Os dejo el codigo del programa, de PHP:



<?
$host=$_SERVER['HTTP_HOST'];
/*
Directory Listing Script - Version 2
====================================
Script Author: Ash Young <ash@evoluted.net>. www.evoluted.net
Layout: Manny <manny@tenka.co.uk>. www.tenka.co.uk
Modificado por JSBSAN para generar tabla de los archivos e insercion de imagen o textos
*/
$startdir = '.';
$showthumbnails = false;
$showdirs = true;
$forcedownloads = false;
$hide = array(
'dlf',
'public_html',
'index.php',
'Thumbs',
'.htaccess',
'.htpasswd'
);
$displayindex = false;
$allowuploads = false;
$overwrite = false;


$indexfiles = array (
'index.html',
'index.htm',
'default.htm',
'default.html'
);

$filetypes = array (
'png' => 'jpg.gif',
'jpeg' => 'jpg.gif',
'bmp' => 'jpg.gif',
'jpg' => 'jpg.gif',
'gif' => 'gif.gif',
'zip' => 'archive.png',
'rar' => 'archive.png',
'exe' => 'exe.gif',
'setup' => 'setup.gif',
'txt' => 'text.png',
'htm' => 'html.gif',
'html' => 'html.gif',
'php' => 'php.gif',
'fla' => 'fla.gif',
'swf' => 'swf.gif',
'xls' => 'xls.gif',
'doc' => 'doc.gif',
'sig' => 'sig.gif',
'fh10' => 'fh10.gif',
'pdf' => 'pdf.gif',
'psd' => 'psd.gif',
'rm' => 'real.gif',
'mpg' => 'video.gif',
'mpeg' => 'video.gif',
'mov' => 'video2.gif',
'avi' => 'video.gif',
'eps' => 'eps.gif',
'gz' => 'archive.png',
'asc' => 'sig.gif',
);

error_reporting(0);
if(!function_exists('imagecreatetruecolor')) $showthumbnails = false;
$leadon = $startdir;
if($leadon=='.') $leadon = '';
if((substr($leadon, -1, 1)!='/') && $leadon!='') $leadon = $leadon . '/';
$startdir = $leadon;


if($_GET['dir']) {
//check this is okay.

if(substr($_GET['dir'], -1, 1)!='/') {
$_GET['dir'] = $_GET['dir'] . '/';
}

$dirok = true;
$dirnames = split('/', $_GET['dir']);
for($di=0; $di<sizeof($dirnames); $di++) {

if($di<(sizeof($dirnames)-2)) {
$dotdotdir = $dotdotdir . $dirnames[$di] . '/';
}

if($dirnames[$di] == '..') {
$dirok = false;
}
}

if(substr($_GET['dir'], 0, 1)=='/') {
$dirok = false;
}

if($dirok) {
$leadon = $leadon . $_GET['dir'];
}
}






$opendir = $leadon;
if(!$leadon) $opendir = '.';
if(!file_exists($opendir)) {
$opendir = '.';
$leadon = $startdir;
}


clearstatcache();
if ($handle = opendir($opendir)) {
while (false !== ($file = readdir($handle))) {
//first see if this file is required in the listing
if ($file == "." || $file == ".." || $file=="error_log" || $file=="default.php" ) continue;


if (strpos($file, ".png")!==FALSE) CONTINUE;


if (strpos($file, ".php")!==FALSE) CONTINUE;


if (strpos($file, ".ver")!==FALSE) CONTINUE;


$discard = false;
for($hi=0;$hi<sizeof($hide);$hi++) {
if(strpos($file, $hide[$hi])!==false) {
$discard = true;
}
}

if($discard) continue;
if (@filetype($leadon.$file) == "dir") {
if(!$showdirs) continue;

$n++;
if($_GET['sort']=="date") {
$key = @filemtime($leadon.$file) . ".$n";
}
else {
$key = $n;
}
$dirs[$key] = $file . "/";
}
else {
$n++;
if($_GET['sort']=="date") {
$key = @filemtime($leadon.$file) . ".$n";
}
elseif($_GET['sort']=="size") {
$key = @filesize($leadon.$file) . ".$n";
}
else {
$key = $n;
}
$files[$key] = $file;

if($displayindex) {
if(in_array(strtolower($file), $indexfiles)) {
header("Location: $file");
die();
}
}
}
}
closedir($handle);
}


//sort our files




@ksort($files, SORT_NUMERIC);




//order correctly




$dirs = @array_values($dirs); $files = @array_values($files);




?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Versiones Guerra de Estrellas </title>
<link rel="stylesheet" type="text/css" href="http://cpanel.main-hosting.com/images/index/styles.css" />
<link href="http://jsbsanblog.16mb.com/estrellas/menu_assets/styles.css" rel="stylesheet" type="text/css">
</head>


<table border=1>
<div id="container">


<h1>Versiones....</h1>

<div id="listingcontainer">

<div id="listing">
<?
$class = 'b';
if($dirok) {
?>
<div><a href="<?=$dotdotdir;?>" class="<?=$class;?>"><img src="http://cpanel.main-hosting.com/images/index/dirup.png" alt="Folder" /><strong>..</strong> <em>-</em>
<?=date ("M d Y h:i:s A", filemtime($dotdotdir));?>
</a></div>
<?
if($class=='b') $class='w';
else $class = 'b';
}
$arsize = sizeof($dirs);
for($i=0;$i<$arsize;$i++) {
?>
<div><a href="<?=$leadon.$dirs[$i];?>" class="<?=$class;?>"><img src="http://cpanel.main-hosting.com/images/index/folder.png" alt="<?=$dirs[$i];?>" /><strong>
<?=$dirs[$i];?>
</strong> <em>-</em>
<?=date ("M d Y h:i:s A", filemtime($leadon.$dirs[$i]));?>
</a></div>
<?
if($class=='b') $class='w';
else $class = 'b';
}

$arsize = sizeof($files);


array_multisort($files, SORT_DESC);
for($i=0;$i<$arsize;$i++) {
$icon = 'unknown.png';
$ext = strtolower(substr($files[$i], strrpos($files[$i], '.')+1));
$supportedimages = array('gif', 'png', 'jpeg', 'jpg');
$thumb = '';

if($filetypes[$ext]) {
$icon = $filetypes[$ext];
}

$filename = $files[$i];
if(strlen($filename)>43) {
$filename = substr($files[$i], 0, 40) . '...';
}

$fileurl = $leadon . $files[$i];
?>
<tr><td>
<div><a href="<?=$fileurl;?>" class="<?=$class;?>"<?=$thumb2;?>><img src="http://cpanel.main-hosting.com/images/index/<?=$icon;?>" alt="<?=$files[$i];?>" /><strong>
<?=$filename;?>
</strong> <em>
<?=round(filesize($leadon.$files[$i])/1024);?>
KB</em>
<?=date ("M d Y h:i:s A", filemtime($leadon.$files[$i]));?>
<?=$thumb;?>
</a></td><td><? $archivo = file($files[$i] . ".ver"); $lineas = count($archivo); for($ia=0; $ia < $lineas; $ia++){ echo $archivo[$ia]; } ?>
</td></tr></div>
<?
if($class=='b') $class='w';
else $class = 'b';
}
?>
</div>
</div>
</div>
<div id="copy"><? $c_global_f = get_cfg_var('c_global_f'); if (!empty($c_global_f)) echo $c_global_f; ?></div>
</table>
</body>
</html>