Ir ao conteúdo
  • Cadastre-se
fspjonny

PHP Site com referência de códigos e lógica de projetos.

Recommended Posts

Estou tentando montar um logotipo rotativo.

 

A cada data de um feriado específico como exemplo: Aniversário da empresa, Páscoa, Natal, Revelion, etc...

A logomarca da empresa na página principal deve se alterar automaticamente e durar por um período(o administrador do site decide no cadastro que já montei), até que termine esse período, então a logomarca normal.

 

Esse ciclo deve ser automático e se repetir ano após ano, pois o administrador vai fazer o cadastro do evento uma única vez, e a cada ano sozinho a logomarca já vai mudar automaticamente na data cadastrada.

 

Minha dificuldade está em montar a lógica desse processo e com isso escrever o código necessário.

 

Tem algum site que possua essa referência para desenvolver uma lógica de funcionamento ou então alguém já fez algo como isso, e que possa me dar um fio de meada?

 

Não sei se só fazer a verificação entre duas datas (data inicial e data final), resolveriam isso, pois o período de reciclagem é de 1 ano e nesse caso uma data gravada, teria que ano seguinte ser renovada automaticamente para o ano vigente sem interferência do ADM e com isso manter a verificação entre o intervalo de datas e ir trocando a logomarca sozinho.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@fspjonny Olá, Se entendi você precisa registrar no BD as datas comemorativas da empresa e mudar elas de acordo com a tal data, ano a ano, mas cadastrando uma vez e a cada ano, se atualizar.

 

Não sei posso dizer que é gambiarra.

 

Cadastra uma vez as datas no banco de dados e as imagens correspondentes(lembrando que é no bd armazene somente o nome da imagem e sua  extensão)

Então pelo PHP  primeiro você faz uma verificação se o ano atual é menor do que o ano ano que vem.  Se for menor. significa que ainda não virou o ano então, você puxa a imagem referente ao ano atual.

Ainda ali dentro do primeiro bloco do IF, verifica-se a data atual e compara com a data cadastrada no banco de dados que contem a imagem.

Assim você consegue trazer a imagem desejada da data comemorativa.

 

No bloco de ELSE, ou seja, se o ano  atual for maior , é sinal que virou o ano. Então faz um update table set atualizando as datas que mudam conforme o ano, como é o exemplo da páscoa, carnaval... e etc 

 

Você pode calcular quando vai ser a páscoa de forma bem simples. 

Por exemplo, criar uma função assim:

function pascoa($ano = null){
    if($ano===null): $ano = intval(date('Y')); endif;
     
     /*Limite de 1970 ou após 2037 da easter_date PHP 
       consulta http://www.php.net/manual/pt_BR/function.easter-date.php*/	
     $pascoa     = easter_date($ano); 

     $dia_pascoa = date('j', $pascoa);
     $mes_pascoa = date('n', $pascoa);
     $ano_pascoa = date('Y', $pascoa);
  
     $feriado_pascoa = mktime(0, 0, 0, $mes_pascoa, $dia_pascoa, $ano_pascoa);   
     return $feriado_pascoa;
}

Com isso você poderia chamar esta função e inserir no banco de dados com o update table set, quando virar o ano.

 

Datas que são sempre fixas, são mais tranquilas!

 

Para verificar o ano e fazer o update table, pode ser feito desta maneira:

 

//ano que vem
$proximoAno = date('Y', strtotime('+1 year', strtotime(date('Y'))));
//Ano atual
$anoAtual = date('Y');

if($anoAtual < $proximoAno):  
    //insere as imagens 
else:
    //faz o update table
endif;
                            
                            
                            

Aí agora chego, no ponto principal. Definir as imagens de acordo com as datas comemorativas:

Você pode criar uma função que recebe uma data como parâmetro. Um bloco de Switch-case para cada feriado necessário. então você armazena na variável o nome da imagem que será inserida.

 

//data atual
$atual = date('Y-m-d');
function logomarca($data){
    //variável vazia
	$img="";
    //aqui você pega os dados do banco inserindo as datas corretas
	$niverEmpresa = date('2018-06-08');
	$pascoa = date("2018-04-1");
	$natal = date("2018-12-25");
	
	switch($data):
		case $niverEmpresa: return $img = "Logomarca_niver_empresa.jpg";
		                    break;
	
		case $pascoa: return $img = "Logomarca_pascoa.jpg";
		              break;  
	
		case $natal: return $img = "Logomarca_natal.jpg";
		             break; 
	
		default:     return $img =" Logomarca_padrão.jpg";
		 
	endswitch;  
}

 //função pronta para uso
 logomarca($atual);

Legal né?

 

Com isso você tem uma função que retorna a imagem do feriado!

 

Aí podes montar a estrutura da imagem com o src recebendo a função!

 

Enfim,  ficou um ´pouco longo post. Depois se quiser eu posto o código "completo"

de como ficaria.  Mas acho que com isso você pode ter uma luz.

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia!

Sim na sua função logomarca eu já havia pensado em algo como utilizar o switch case, pois é a parte "mais fácil" de verificar quando já se tem os dados prontos.

Mas o meu dilema está em considerar usar ano (Y), na data, eu penso que se poderia simplesmente eliminar o ano e usar só o dia e mês(d/m), isso resolve o problema de ter que incrementar ano e com isso evitar mexer na tabela do banco de dados e só realizar consulta.

Algumas datas como a páscoa por exemplo é móvel, não tem dia fixo e pode variar o mês e como fazer então?

image.png.f9474a26acf8ab1597beea99c0541eda.png

 

Está sendo um bom exercício mental matar essas charadas.

 

Considerando usar apenas dia e mês eu poderia fazer uma query que me retorna todas as datas que tenha por exemplo o mês de ABRIL(04) então eu passaria a verificar quantas datas festivas são retornadas dentro de ABRIL, e faria um laço testando se na data atual, O DIA  é MENOR que o primeiro MENOR dia encontrado pela query no mês de Abril.

Se for atendido, mantém a logomarca normal ou a do atual evento festivo, senão se for MAIOR,  carrega a logomarca que está cadastrada para esse dia festivo e assim por diante, até que o mês vire, MAIO(05).

Caso a query retorne vazio para o mês,a logomarca padrão deve ser restabelecida até o mês seguinte quando e se houver mais eventos festivos para o mês.

 

Será que funciona? vou testar!

 

Obrigado pela ajuda Dif, eu retorno aqui nesse tópico, para deixar uma solução pronta para os interessados.

 

E aos colegas que acompanham esse tópico,  se tiverem idéias de algo mais simples em que isso possa se feito, ajudem!, pois qualquer ideia é sempre muito bem vinda, pois essas informações ajudam a tirar muita gente do sufoco!

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@fspjonny Não sei se vai funcionar como o esperado, só fazendo o teste. Eu, de certo modo acho mais complicado fazer isso.

Repare que nessa sua solução só vai até 2028. OU eu entendi assim.

 

Se você não quiser fazer um update da tabela de acordo com o ano " atual", há possibilidade de criar uma nova tabela no banco de dados com todas as datas comemorativas para os próximos 50 anos. É trabalhoso? É.  Mas resolve o problema.  Daí no caso, basta fazer as queries e comparar o ano atual com o cadastrado para pegar a imagem certa.

 

Dá para combinar a sua ideia com esta, fazer um laço e inserir no banco de dados todas as datas da páscoa pelos próximos 50 anos ou menos se quiser...  Enfim... não consigo pensar mais nada além disso por enquanto.

 

Eu ainda acho mais prático, fazer o sistema atualizar as datas a cada ano automaticamente. 

Inclusive há  até como criar uma store procedure no banco de dados para ele atualizar sempre quando virar o ano.

Por exemplo veja este link: Calculate Easter Date on SQL que fala sobre como calcular  páscoa pelo banco de dados.  Não sei se funciona por não tenho experiência com funções no banco de dados.

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda não tive tempo de mexer hoje, mas não vou precisar cadastrar nada de datas como nessa tabela de exemplo da Páscoa.

Só a coloquei como exemplo para ver que a data em sí é aleatória em dia e mês.

O ponto é guardar só o dia e o mês em que o administrador quer que vigore o logotipo e o programa verificar as datas e carregar de acordo.

 

Mas seguindo esse exemplo da Páscoa que cai em Março ou Abril, o administrador pode colocar a logomarca para vigorar durante todo o mês ou a partir de um dia do mês, pois a Páscoa sempre cai no final de Março ou no inicio e quase meio do mês de Abril.

 

Não vejo isso muito bem pois nesse caso em específico a logomarca pode durar um pouco mais de 30 dias entre os meses de Março e Abril, mas ele poderá editar as datas e fazer os ajustes que achar necessário.

 

No sistema antigo uma menina do DP é quem trocava isso manualmente, ela copiava uma imagem png de uma pasta com o mesmo nome da logomarca normal (logomarca.png) e fazia somente substituição de acordo com a data do evento, então nessa pasta tem várias (logomarca.png) para: Natal, Ano Novo, Revellion, Aniversário, etc...

 

Com a crise ela foi dispensada e com isso o gerente administrador não queria fazer o "trabalho dela".... e perguntou se isso poderia ser automatizado também...

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@fspjonny Outra possível solução que pensei agora seria parecido com a sua,  seria algo parecido com a steam.

Ao invés de colocar em uma data exata,  pode-se fazer apenas baseado no mês ou semana.

 

Por exemplo: semana ou mês da páscoa.  Na steam,(site e aplicativo) quando há uma promoção, é adicionado uma capa no site ou app dizendo: "Promoção semana tal"  e a imagem dura só o tempo da promoção.

 

Pode ser uma boa você cadastrar no BD uma margem de tempo, entre março e abril, já que são datas que mudam de acordo com o ano..  enfim.. a medida que tiver ideias eu posto aqui. :thumbsup:

 

PS: 

13 minutos atrás, fspjonny disse:

com isso o gerente administrador não queria fazer o "trabalho dela".... e perguntou se isso poderia ser automatizado também..

Admin folgado esse heim... :lol:

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, DiF disse:

@fspjonny Outra possível solução que pensei agora seria parecido com a sua,  seria algo parecido com a steam.

Ao invés de colocar em uma data exata,  pode-se fazer apenas baseado no mês ou semana.

 

Por exemplo: semana ou mês da páscoa.  Na steam,(site e aplicativo) quando há uma promoção, é adicionado uma capa no site ou app dizendo: "Promoção semana tal"  e a imagem dura só o tempo da promoção.

 

Pode ser uma boa você cadastrar no BD uma margem de tempo, entre março e abril, já que são datas que mudam de acordo com o ano..  enfim.. a medida que tiver ideias eu posto aqui. :thumbsup:

 

PS: 

Admin folgado esse heim... :lol:

É gerente de uma empresa de descartáveis, nada relacionado a TI, mas não gosto quando qualquer pessoa coloque a frase "automatizado também", ou seja, dá a entender que pessoas não são importantes. Aconteceu comigo, pode acontecer novamente, pode acontecer com você, com qualquer pessoa, acho que a mão de obra está sendo muito desvalorizada aqui no BR.

 

Gostei da sua ideia do Steam, embora eu não saiba como funciona, mas como seria esse funcionamento de tempo no BD? tem alguma função que conte "x" horas em dias e depois faça algo? Não sei se é isso que entendi!

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@fspjonny

16 minutos atrás, fspjonny disse:

tem alguma função que conte "x" horas em dias e depois faça algo?

Não, teria que implementar uma tanto no PHP como no SQL.

 

O problema é bem maior do que pensava.

Dá para se pensar em fazer uma Trigger específica no banco de dados para atualizar somente as datas que não são fixas.

O mysql permite criar funções e executa-las em períodos pré-determinados.

Isso seria um processo interno, então não haveria mãos humanas na atualização.. e aí por php trazer as imagens.

 

Com isso, pode-se fazer por php definindo a troca das imagens semanalmente  por exemplo semana da páscoa, semana do natal etc

 

 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acredito ter conseguido!

Está funcionando porém eu queria fazer as logomarcas durarem até as próximas datas dentro do mesmo mês, vai que tem vários feriados no mesmo mês.

Por Exemplo: dia 15 teve feriado e o próximo é dia 21 do mesmo mês, tentei fazer com que a logomarca do dia 15 durasse até o dia 20, já que no dia 21 mudaria e essaa do dia 21 seguiria o mesmo destino, caso fosse necessário até que feche o mês.

 

Do jeito como está, a logomarca dura apenas um dia, ou seja a do feriado em sí, não é como a da página do Google por exemplo, que pode durar uns dias ou um dia, dependendo da data que se comemora.

 

bom o código é esse abaixo, para quem quiser copiar :

<?php
date_default_timezone_set('America/Sao_Paulo'); 
	
$diaAtual = date("d");
$mesEvento = date("m");
 

$selectLogo = "SELECT datainicial, imagem FROM tbl_logotipo WHERE datainicial LIKE '%{$mesEvento}%' ORDER BY datainicial ASC";
$exec_query = mysqli_query($conecta, $selectLogo);
	
$verifica = mysqli_num_rows($exec_query); // me retorna o total de dados encontrados na Query

// Se retornar algum valor maior que 0 na Query, executa abaixo, do contrário vai para o último ELSE. 

		if($verifica > 0){

// vai repetir o processo até que termine o total de registros encontrados pela Query	

			while ( $logotipo = mysqli_fetch_assoc($exec_query) ){

				$dataIni = substr($logotipo['datainicial'],0,2);

				if ( $diaAtual == $dataIni ){

					$logo = $logotipo['imagem'];
					break;

				} else {
					
					$logo = 'assets/logotipo.png';
					continue;
				}

			}
			
		} else {
			
			$logo = 'assets/logotipo.png';
			
		}
	
mysqli_free_result($exec_query);
?>	

Depois disso, basta colocar a variável $logo via PHP dentro da tag img src, dessa forma:

<!-- Este é um trecho do HTML, referente ao cabeçalho, onde se encontra logomarca que vai ficar mudando -->
<a class="navbar-brand" href="index.php"><img src="<?php echo $logo; ?>" class="rounded"></a>

Se tiver alguma sugestão de melhora disso, aceito de braços abertos...kkkk

Ou uma solução para o que expliquei lá no topo desta.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×