Comunidad de diseño web y desarrollo en internet online

Funcion Random y función include

Citar            
MensajeEscrito el 15 Sep 2009 08:47 am
Hola compañeros foreros, a ver si me podéis ayudar con un tema. Yo no sé prácticamente nada de PHP, pero a veces lo necesito para mi curro y normalmente voy reciclando código porque para mi es un mundo, en fin que me encuentro con un problema que no sé cómo resolver. Es el siguiente:
estoy maquetando un sitio web y en la index tengo unos banners (hechos con código, no con imágenes) que quiero que aparezcan aleatoriamente introduciendo un Random, para que cada vez que entre el usuario le aparezcan banners diferentes. Esto mismo lo he hecho ya varias veces con imágenes, poniendo el siguiente código:
El script que meto en el <head>:
<script>

var images1 = new Array();

images1[0] = 'img/foto_central.jpg';

images1[1] = 'img/img_central02.jpg';

images1[2] = 'img/img_central03.jpg';

images1[3] = 'img/img_central04.jpg';

images1[4] = 'img/img_central05.jpg';

images1[5] = 'img/img_central06.jpg';

images1[6] = 'img/img_central07.jpg';

images1[7] = 'img/img_central08.jpg';

images1[8] = 'img/img_central09.jpg';

images1[9] = 'img/img_central10.jpg';

images1[10] = 'img/img_central11.jpg';

images1[11] = 'img/img_central12.jpg';

images1[12] = 'img/img_central13.jpg';

images1[13] = 'img/img_central14.jpg';

images1[14] = 'img/img_central15.jpg';


function getRandomIndex(min, max)

{

var rng = max-min;

var r = Math.random() * rng;

r = Math.floor(r);

return parseInt(min)+r;

}



function writeRandomImage(imagesArray)

{

var idx = getRandomIndex(0,imagesArray.length);

document.writeln('<img src="' + imagesArray[idx] + '">');

}

</script>

Y después en la celda en cuestión (dentro del <body>) en la que quiero que aparezca la imagen aleatoria el siguiente script:
<script>writeRandomImage(images1);</script>

Bueno la cuestión es que para lo que necesito ahora tengo 6 celdas en las que quiero introducir 6 banners. Inicialmente lo había hecho con includes, es decir, en la celda en la que quiero que aparezca mi banner meto lo siguiente:
<?php include('banner1.html'); ?>
<?php include('banner2.html'); ?>
<?php include('banner3.html'); ?>

y así hasta los 6. el problema es que no sé como hacer que un bloque de código (un html independiente en este caso)
me lo cargue aleatoriamente en la index al entrar en la página. He probado a modificar el script que funciona con la imagen y ponerlo así:

var incluir = new Array();

incluir[0] = 'banner1.html';

incluir[1] = 'banner2.html';

incluir[2] = 'banner3.html';

incluir[3] = 'banner4.html';

incluir[4] = 'banner5.html';

incluir[5] = 'banner6.html';

incluir[6] = 'banner7.html';

incluir[7] = 'banner8.html';


function getRandomIndex(min, max)

{

var rng = max-min;

var r = Math.random() * rng;

r = Math.floor(r);

return parseInt(min)+r;

}



function writeRandominclude(imagesArray)

{

var idx = getRandomIndex(0,includeArray.length);

document.writeln('<?php include="' + imagesArray[idx] + '" ;?>');

}

</script>

Después en cada celda, donde quiero que aparezca el banner pongo el código:
<script>writeRandominclude(incluir);</script>

Y por me dice que mandarinas de la china, no lo reconoce (normal por otro lado con el pifostio que he montao)...

Bueno, siento el mail largo, pero es que es complicado de explicar. ¿Alguien sabe y quiere y puede ayudarme?


Eternamente agradecida, saludos a todos.

Por ardardina

13 de clabLevel



 

msie8
Citar            
MensajeEscrito el 16 Sep 2009 01:10 am
Estás intentando mezclar código PHP y JavaScript. No va a funcionar nunca, porque PHP se ejecuta en el servidor antes de servir la página al cliente y el cliente ejecuta JavaScript (casi) después de haber recibido la página en cuestión.

Se me ocurren dos ideas, la primera es dejar que PHP sea quien elija aleatoriamente la página con el banner y prescindir de JavaScript (de hecho en la primera versión con imágenes podrías haber hecho lo mismo). Es más, el código JS que has puesto puedo traducirlo casi completamente a PHP:

Código PHP :

$incluir = Array('banner1.html','banner2.htm3','banner4.html','banner5.html','banner6.html','banner7.html','banner8.html');

function getRandomIndex($min,$max) {
  return Rand($min,$max);
}

function writeRandomInclude() {
  global $incluir;
  $i = getRandomIndex(1,8);
  return file_gets_content($incluir[$i]);
}


Y luego en tu código HTML donde quieres que aparezca el banner pones un:

Código PHP :

<?php echo writeRandomInclude(); ?>

Y listo.
La primera parte del código debe estar en el mismo archivo .php que esto último.

La segunda solución es AJAX.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 16 Sep 2009 11:39 am
Hola, muchas gracias por tu respuesta, la verdad es que lo has simplificado mucho, pero bueno, como comenté soy muy inexperta en temas de programación y lo que me ha valido par una vez intento reciclarlo para otra (... con los resultados desastrosos que cabe esperar).
Respecto a la solución que me das hay un problema, la funcion 'file_gets_content' no está declarada en el código que me has puesto, entonces al subir la página me da un error que dice algo así como que está llamando a una función que no está definida.

Entiendo que para que no de error habria que añadir a este código la declaración de la función:

function file_gets_content() {
;
}

pero no sé que argumentos poner dentro para que funcione (he probado a declararla y ya no da error, pero tampoco me devuelve ningún resultado ni hace nada, porque no estaban bien definidos los argumentos).

Porfa, ¿si no te importa me puedes terminar de ayudar con el tema? Muchas gracias, solucionar este tema es lo único que me falta para terminar la web.

Thank u, thank u.

Por ardardina

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 17 Sep 2009 03:28 am
Oops!, sorry, metí la pata :P

Como escribí de memoria cometí un error de tipeo, la función es:

file_get_contents

Nota la posición de la S. Esta función no hace falta declararla, es interna de PHP.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 17 Sep 2009 07:38 am
Perfect, ahora sí, muchas graciaaaaaas.
Sólo voy a abusar de ti un poco más (pero en el buen sentido eh, no pienses mal, :) ).

La cosa es que en total tengo 6 celdas que van a llevar el banner, en cada una de las celdas he puesto el código:

<?php echo writeRandomInclude(); ?>

Entonces se ven los banners perfectamente, lo único que a veces, cada vez que actualizo con F5 algunas de esas celdas aparecen vacias, otras veces salen las 6 con sus banners, pero otras veces salen sólo 3, 2, 5, etc.

¿No se podría hacer que siempre saliera algún banner, que nunca se quedara ninguna celda vacía? Voy a hacer más modelos, creo que unos 8 más, para tener un total de 16, pero mucho me temo que no es cuestión de cantidad el que las celdas siempre muestren un banner.

Bueno tío, muchas gracias por todo, me has ayudado un montón. Super amable.

Por ardardina

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 17 Sep 2009 06:24 pm
A ver, a ver, déjame pensar...

Bueno pues, metí la pata en otra parte. En la llamada a la función getRandomIndex() le pasé como parámetro 1 y 8. Está mal, debe ser 0 y 7 ya que los arrays en PHP tienen índice inferior cero y no uno, así que debería ser:

Código PHP :

$i = getRandomIndex(0,7);


Pero aún puedo mejorar eso si vas a meter más archivos y por lo tanto agradar el array, mejor prueba esto:

Código PHP :

$i = getRandomIndex(0,count($incluir)-1);


Así no tienes que preocuparte de modificar los parámetros de esa función cada vez que agregas más items en el array.

Un placer ayudarte.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 21 Sep 2009 07:27 am
Bieeeen, gracias, ahora sí, ahora sí. ¿No se pueden votar las respuestas? Te pongo un 10.

Un abrazo,
chaooo.

Por ardardina

13 de clabLevel



 

msie8
Citar            
MensajeEscrito el 21 Sep 2009 07:31 am
No hace falta. Mi recompensa es la satisfacción de haber sido útil.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 23 Sep 2009 10:08 am
Hola compañero, me vas a perdonar que reabra nuevamente el post, pero he descubierto un pequeño inconveniente del que hace unos días no me di cuenta. Como te comenté se solucionó el problema con los códigos que me proporcionaste y ahora todas las celdas que deben mostrar banner lo muestran, pero ahora el problemilla es que los repiten, cosa lógica porque al ser un Random es aleatorio. He probado con las dos últimas opciones que me diste para declarar la variable i, y con ambas formas se obtiene el mismo resultado. Pienso que a lo mejor lo que habría que modificar es el código que va en las celdas (<?php echo writeRandomInclude(); ?>) y no el de la función en sí, aunque pensándolo bien no tiene mucha lógica. No sé, la verdad. ¿Podrías ayudarme tú en este punto? ¿Se te ocurre algo que solucione el problema de la repetición?

Bueno, muchas gracias nuevamente. si crees que puedes y quieres ayudarme genial y sino pues también, que ya me has ayudado un montón.


Bye,
M.

Por ardardina

13 de clabLevel



 

msie8
Citar            
MensajeEscrito el 25 Sep 2009 09:46 am
Se me ha ocurrido una idea para solucionar el problema, es un poco cutre, la verdad, pero es práctica.
Lo que creo que voy a hacer es reestructurar mi html y crear un única celda central donde voy a meter con php otro html que llevará, este sí, 6 celdas con 6 banners diferentes. Entonces en el html principal haré que el otro html se muestre en random (tendré preparados unos 6 o 7, cada uno con 6 banners) y así aunque aparecerán los mismos siempre el bloque, al menos no se me da el problema de que me repita un banner en la misma página.

Como digo es algo cutrecillo, pero bueno, pienso que es la única manera de que no se repitan al aplicar el Random, ¿no?

Saludos,
Made.

Por ardardina

13 de clabLevel



 

msie8
Citar            
MensajeEscrito el 26 Sep 2009 12:12 am
Claro, es lógico. Cuando se generan números aleatorios tarde o temprano aparecerá dos veces el mismo dentro de la serie. Es parte natural de la aleatorización.
La solución que planteas en tu último mensaje no me parece muy elegante y creo que puedo encontrar una solución exclusivamente en PHP sin modificar el HTML que ya tienes escrito. Pero debo probarlo por mi cuenta así que dame tiempo y date una vuelta por este foro por si publico mi versión.-

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 28 Sep 2009 08:47 am
Hola. Ya, ya se que es cutre mi solución, pero no se me ocurría otra cosa. La página está ya publicada, pero hay un problema con el servidor y todavía no permite visualizar php, así que tampoco hay excsiva prisa. Yo iré mirando el foro a ver si consigues una versión en php como decías, y sino pues aplicaré este parchecillo para salir del paso.

Muchas gracias por todo. Bye

Por ardardina

13 de clabLevel



 

msie8

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.