Jump to content
sEnte

Image Rotator com PHP

Recommended Posts

sEnte

Queria fazer, via PHP, um "rodador" de imagens, quero dizer adequar a imagem à época.

Explicando melhor, ter uma imagem relacionada com o inverno de 2 de janeiro a 20 de Março, depois de 21 de Março a 21 de Agosto uma de Primavera e por ai em diante., exceto alguns casos de datas expecificas como por exemplo 25 de Dezembro, 1 de Janeiro, entre outras.

Qual destes seguintes exemplos será o melhor?

[list=1]
[*]$spring = array(1,2,3);
[*]$summer = array(4,5,6);
[*]$autum = array(7,8,9);
[*]$winter = array(10,11,12);
[*]
[*]if(in_array(date('m'), $spring) ){
[*]//Show picture of spring
[*]}
[*]else if(in_array(date('m'), $summer) ){
[*]//Show picture of summer
[*]}
[*]else if(in_array(date('m'), $autum) ){
[*]//Show picture of autum
[*]}
[*]else if(in_array(date('m'), $winter) ){
[*]//Show picture of winter
[*]}
[*]else{
[*]//Show error message
[*]}
[/list]

[list=1]
[*]if (date("m") == 12){
[*]?>
[*]<style type="text/css">
[*]body{
[*]background-image: url('christmas.png');
[*]}
[*]</style>
[*]<?php
[*]}elseif (date("m") == 10){
[*]?>
[*]<style type="text/css">
[*]body{
[*]background-image: url('halloween.png');
[*]}
[*]</style>
[*]<?php
[*]}
[/list]

[list=1]
[*]<!DOCTYPE HTML>
[*]<html>
[*]<head>
[*]<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
[*]<style>
[*].container { width:80%; margin:auto; min-height:750px;}
[*]
[*].container.month-1{ background:#9F3;}
[*].container.month-2{ background:#9F3;}
[*]
[*]
[*].container.month-12{ background:#F00;}
[*]</style>
[*]<title></title>
[*]</head>
[*]
[*]<body>
[*]<div class="container month-<?php echo date('m'); ?>">
[*]
[*]</div>
[*]</body>
[*]</html>
[/list]

[list=1]
[*]$date = explode(' ', date('n j'));
[*]
[*]		if (($date["0"] == 12 && $date["1"] <= 25)){
[*]			echo '<link rel="stylesheet" type="text/css" href="/css/xmas-style.css">';		
[*]		} else {
[*]			echo '<link rel="stylesheet" type="text/css" href="/css/style.css">';
[*]		}
[*]				
[*]		?>
[/list]


"If It Ain't Broke, Break it and build something Cooler!" Unknown

Share this post


Link to post
Share on other sites
HappyHippyHippo

para mim, a melhor solução e aquela que leva a que menos informação é necessária envia para o vliente. logo será uma solução server-side (a 1ª ou a 4ª)


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
sEnte

Agora para datas especificas terei de usar um switch certo?


"If It Ain't Broke, Break it and build something Cooler!" Unknown

Share this post


Link to post
Share on other sites
sEnte

Um short if statement xD

yoda esse código aplica-se ao 1º exemplo?

Andei a perguntar em outros forums, e pralém de usar PHP também me foi dado um exemplo com CSS, mas sinceramente também prefiro em PHP xD


"If It Ain't Broke, Break it and build something Cooler!" Unknown

Share this post


Link to post
Share on other sites
sEnte

Agora é que reparei. O código que escreveste é uma minificação do 4º exemplo, mas isso e digamos a excepção, ou seja datas especificas. Agora para o geral. seria melhor juntar o 1º e o 4º exemplo certo?


"If It Ain't Broke, Break it and build something Cooler!" Unknown

Share this post


Link to post
Share on other sites
yoda

Nenhum dos scripts te dá o que queres, não verificam bem as estações nem contam com anos bissextos.

O script abaixo assume que o teu locale está em inglês. Talvez seja exagerado a quantidade de código para o caso, mas ..

#


$css = holiday() ? holiday() : season();

#


function season()
{
static $current = null;

if (!is_null($current))
{
 return $current;
}

$date = date('z');
$seasons = array(
 'spring' => array('March 21', 'June 20'),
 'summer' => array('June 21', 'September 22'),
 'autumn' => array('September 23', 'December 20'),
 'winter' => array('December 21', 'March 20')
);

foreach ($seasons as $name=>$range)
{
 if ($date >= date('z', strtotime($range[0])) && $date <= date('z', strtotime($range[1])))
 {
  return $name;
 }
}

return false;
}
function holiday()
{
static $current = null;

if (!is_null($current))
{
 return $current;
}

$date = date('j/n');
$holidays = array(
 'christmas' => '20/6',
 'apocalypse' => '21/12',
);

foreach ($holydays as $name=>$holiday)
{
 if ($date == $holyday)
 {
  return $name;
 }
}

return false;
}

Edited by yoda

Share this post


Link to post
Share on other sites
sEnte

Ui... tenho de ler isto bem.

Eu sei que os exemplos que dei não são os melhores, mas era para mostrar a ideia.

Agora vamos a dúvidas....

O primeiro $css é facil de perceber.

Onde se encaixa o $css que usas-te no inicio?

o

return = false

é caso haja erros certo? Caso contrário vai mostrar como deve ser.

AHAHA

'apocalypse' => '21/12',

morri loooooooooool

Pode-se usar isto para o default time

date_default_timezone_set('Europe/Lisbon');

testei o código... tens um pequeno erro, no foreach escreves-te holydays em vez de holidays mas já está resolvido, fora isso não deu erro nenhum

http://exp.net84.net/season2.php

Edited by sEnte

"If It Ain't Broke, Break it and build something Cooler!" Unknown

Share this post


Link to post
Share on other sites
sEnte

@ yoda

 <?php
function season()
{
   static $current = null;

   if (!is_null($current)) {
    return $current;
   }

   $date    = date('z');
   $seasons = array(
    'Spring' => array(
	    'March 21',
	    'June 20'
    ),
    'Summer' => array(
	    'June 21',
	    'September 22'
    ),
    'Autumn' => array(
	    'September 23',
	    'December 20'
    ),
    'Winter' => array(
	    'December 21',
	    'March 20'
    )
   );

   foreach ($seasons as $name => $range) {
    if ($date >= date('z', strtotime($range[0])) && $date <= date('z', strtotime($range[1]))) {
	    return $name;
    }
   }

   return false;
}
function holiday()
{
   static $current = null;

   if (!is_null($current)) {
    return $current;
   }

   $date	 = date('j/n');
   $holidays = array(
    'christmas' => '25/12'

   );

   foreach ($holidays as $name => $holiday) {
    if ($date == $holiday) {
	    return $name;
    }
   }

   return false;
}
#
echo holiday() ? holiday() : season();
#
?>

Algo de estranho se passa neste código.

Pelo menos para o outono funcionou bem, para o Inverno é que nem por isso?

Não será preciso verificar se é este ano ainda?


"If It Ain't Broke, Break it and build something Cooler!" Unknown

Share this post


Link to post
Share on other sites
yoda

Sim, tens razão, esqueci-me disso. Como o Inverno conta de um ano para o outro, e o script verifica os dias, não está a dar.

Podes na mesma assumir que se a função retornar falso (e souberes que está a funcionar quando a meteres no servidor), que é Inverno, pois o script só retorna falso se for Inverno ou se o locale for irreconhecivel.

Ou seja, em vez de retornar falso na função season(),

return 'Winter';

Edited by yoda

Share this post


Link to post
Share on other sites
sEnte

Podes dar umas dicas?

Posso fazer algo assim?

(($now >= $inv_start && $now < $prim_prox_ano) || ($now >= $inv_ano_ant && $now < $prim_start))

mas como fizeste de maneira diferente não estou a conseguir aplicar


"If It Ain't Broke, Break it and build something Cooler!" Unknown

Share this post


Link to post
Share on other sites
sEnte

Realmente tens razão lol

mas vou experimentar noutra alteração que fiz que em vez de aparecer um string de texto aparece mesmo uma imagem.

EDIT: Pelo menos parece estar a funcionar e com datas especificas mostra como deve ser.

Agora é uma questão de esperar 3 meses para ver se muda para Spring e respectiva imagem.

Edited by sEnte

"If It Ain't Broke, Break it and build something Cooler!" Unknown

Share this post


Link to post
Share on other sites
sEnte

pode ser assim?

$date    = 24-12-12

Obrigado


"If It Ain't Broke, Break it and build something Cooler!" Unknown

Share this post


Link to post
Share on other sites
sEnte

experimentei mudar o

$date = date('z');
..
if ($date >= date('z', strtotime($range[0])) && $date <= date('z', strtotime($range[1]))) {
...
$date	 = date('j/n');

para

$date = 19/10;
..
if ($date >= date('19/10', strtotime($range[0])) && $date <= date('19/10', strtotime($range[1]))) {
...
$date	 = date('19/10');

e dizia que estava no Verão...


"If It Ain't Broke, Break it and build something Cooler!" Unknown

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.