sábado, 1 de março de 2008

Detectar bloqueador de popup

Site que utilizam popup geralmente têm problemas com os bloqueadores de popup. Internet Banking e outros geralmente abrem uma janela para que o usuário possa continuar navegando no site e concluir o processo que havia iniciado.

Dessa forma se faz necessário detectar antecipadamente se o usuário possui ou não o bloqueador de popup ativado, com isso ele pode ser avisado, desativar o bloqueador e continuar navegando no site.

O script abaixo, em JavaScript, se propõe justamente a isso, detectar se o usuário possui ou não um bloqueador de popups ativado e avisá-lo da situação.

var tentativa = 1;
var aviso = 1;

function getBloqueador()
{
var janela = window.open("#","janelaBloq", "width=10, height=10, top=0, left=0, scrollbars=no, status=no, resizable=no, directories=no, location=no, menubar=no, titlebar=no, toolbar=no");
if (janela == null)
{
if (tentativa == 1)
{
alert("Bloqueador de popup ativado. Desabilite para continuar.");
tentativa++;
return false;
} else if ((tentativa > 1) && (tentativa <= 3))
{
alert("Tentativa " + tentativa + " de 3: O bloqueador ainda está ativado.");
tentativa++;
return false;
} else if (tentativa > 3)
{
if (aviso == 1)
{
if (confirm("O bloqueador de popups ainda está ativado, você pode ter dificuldades para acessar o site.\n\nDeseja continuar assim mesmo?"))
{
aviso = 0;
return true;
} else
{
aviso = 0;
return false;
}
}
}
} else
{
janela.close();
return true;
}
}
Este script tenta abrir uma janela popup, caso não consiga, inicia a sequência de avisos ao usuário. Caso consiga abrir a janela, nenhuma mensagem é exibida e o usuário segue a navegação normalmente.

Clique em links que abrem em uma janela não são considerados popup, ou seja, as janelas que abrem automaticamente são consideradas popup.

Este script pode ser usado no <body>, com o evento onLoad(), no evento onMouseOver() de algum elemento (um botão ou link, por exemplo).

sexta-feira, 29 de fevereiro de 2008

Restaurando MBR após instalação do Windows

Para quem usa dual boot (Linux/Windows) e teve que reinstalar o Win, sabe que ele toma conta da MBR.

Com o GRUB gerenciando o boot, é simples fazer com que ele volte a atuar! Caso já tenha instalado o GRUB antes de reinstalar o Win, ele já está configurado para boot com os dois sistemas operacionais, sendo assim, basta fazer com que ele volte a gerenciar o boot pela MBR.


  1. Inicie o computador com um Live CD;
  2. Abra um terminal e mude para root;
    $ sudo passwd root
  3. Escolha uma nova senha para root;
  4. Monte a partição;
    # mount -t reiserfs /dev/hdaX /mnt/hdaX
    X é o número da partição que está instalado o SO. Para saber onde está instalado o SO, execute fdisk -l ou fdisk /dev/hda, digitanto p logo em seguida.
  5. "Entre" na distribuição instalada na máquina;
    # chroot /mnt/hdaX
  6. Como o GRUB já está configurado, basta reinstalá-lo;
    # grub-install /dev/hda
  7. Pronto! O GRUB voltou a gerenciar o boot!

Este script valida checkbox gerados dinamicamente, com nomes diferentes.

function validaCheckbox(v)
{
todos = document.getElementsByTagName('input');
for(x = 0; x < todos.length; x++)
{
if (todos[x].checked)
{
return true;
}
}
alert("Selecione pelo menos um item!");
return false;
}
Na chamada do formulário <form [...] > basta colocar onSubmit="return validaCheckbox(this);"
<form action="arquivo.php" method="post" onSubmit="return validaCheckbox(this);">

A função abaixo converte uma string para maiúsculo em PHP, inclusive caracteres acentuados. É usada a função strtoupper para converter a string e, em casos em que caracteres acentuados não são convertidos, é usada a função str_replace, que substitui o caractere acentuado pelo seu equivalente maiúsculo.

Em suma, converte, usando PHP, uma string qualquer para sua equivalente maíscula.

function converteMaiusculo($string) 
{
$string = strtoupper ($string);
$string = str_replace ("â", "Â", $string);
$string = str_replace ("á", "Á", $string);
$string = str_replace ("ã", "Ã", $string);
$string = str_replace ("à", "A", $string);
$string = str_replace ("ê", "Ê", $string);
$string = str_replace ("é", "É", $string);
$string = str_replace ("Î", "I", $string);
$string = str_replace ("í", "Í", $string);
$string = str_replace ("ó", "Ó", $string);
$string = str_replace ("õ", "Õ", $string);
$string = str_replace ("ô", "Ô", $string);
$string = str_replace ("ú", "Ú", $string);
$string = str_replace ("Û", "U", $string);
$string = str_replace ("ç", "Ç", $string);
return $string;
}
A chamada da função é feita da seguinte maneira:
$variavel = converteMaiusculo($variavel); 

Para verificar se o JavaScript está desabilitado, basta:

<noscript> 
  Ação caso o JavaScript não esteja habilitado
</noscript>

CSS oferece uma forma de selecionar o que imprimir em uma página, ou seja, quais quadros você deseja imprimir.

Isto é definido pela tag @media print. Dentro desta tag você coloca as DIVs que não deseja imprimir. Por exemplo, após ter definido a folha de estilo para seu site, dividido em cabeçalho, conteúdo e rodapé, você pode definir quais DIVs poderão ser impressas. Caso queira que somente o conteúdo seja impresso, a definição de @media print ficaria assim:

@media print 
{
#cabecalho { display: none; }
#rodape { display: none; }
}
Neste caso, impede-se o cabeçalho e o rodapé de serem impressos, ficando apenas o conteúdo!

O PHP dispõe de um tipo de variável que permite que se altere seu nome dinamicamente. A variável que varia!

$var1  = 5;
$var2 = 'var1';
Dessa forma pode-se usar o nome var2 no lugar de var1.

$$var2 = 10;
Isto é o mesmo que:

$var1 = 10;
Várias variáveis que variam invariavelmente!

Uma forma simples de exibir conteúdo conforme a ação do usuário é através de camadas e JavaScript.

Um ícone de ajuda, por exemplo, ao ser clicado pode exibir uma camada com informações pertinentes, e esta mesma camada, ao ser clicada, pode se ocultar.

O evento JavaScript para fazer isto é o sequinte:

function controlaCamada(nomeDiv) 
{
if( document.getElementById(nomeDiv).style.visibility == "hidden" )
{
document.getElementById(nomeDiv).style.visibility = "visible";
} else
{
document.getElementById(nomeDiv).style.visibility = "hidden";
}
}


Ou seja, caso a camada esteja visível, então esconde, caso esteja escondida, então exibe!

O código a ser inserido no HTML é o seguinte:
<div id="nome" onClick="controlaCamada('nome')"> 
Texto desejado
</div>

A camada possui um evento onClick. Quando clicada executa a função controlaCamada() em JavaScript, que faz exatamente o que foi mencionado acima!

Este evento onClick chamando a função JavaScript pode ser adicionado a qualquer elemento, como em um ícone de ajuda por exemplo, que quando clicado, exibe a camada, e a camada ou o ícone, quando clicado de novo, esconde a camada. Magia pura!

Hoje precisei vincular um item a várias categorias. Como estrutura, tinha uma tabela com perguntas e respostas e outra tabela com as categorias que essas perguntas podiam ser vinculadas. Criei uma outra tabela que tinha como chave estrangeira as chaves primárias dessas duas tabelas.

Na interface com o usuário, fiz um cadastro de perguntas e respostas, e na mesma tela o usuário poderia vincular as categorias que a pergunta se encaixava. Como as categorias podiam ser muitas, não quis usar checkbox. Como solução optei pelo select multiple, que definido o tamanho ele habilita a barra de rolagem, caso necessite.

Para pegar os dados desse formulário, fiz o seguinte: criei um campo select com os dados que eu precisava:

<select name="nomeSelect[]" size="5" multiple> 
    <option value="1">Valor 1</option>
    <option value="2">Valor 2</option>
    <option value="3">Valor 3</option>
</select>

Para pegar os dados enviados pelo POST, fiz o seguinte:
for ($i = 0; $i < count($_POST['nomeSelect']); $i++) 
{
  echo $_POST['nomeSelect'][$i];
}

No código, eu usava o laço de repetição para vincular a pergunta a cada categoria selecionada no select multiple, através de INSERT na base de dados!

Eu utilizo um editor JavaScript online para editar alguns conteúdos previamente gravados, como notícias, arquivos com mensagens que são enviadas por e-mail, etc. Cada objeto desses possui sua formatação própria, podendo conter links, aspas simples e duplas, cores, tamanhos e formatos de fontes, dentre outras formas.

O editor JavaScript delimita o conteúdo a ser editado por aspas duplas, ou seja, se dentro do texto tivesse aspas duplas, o editor acusaria erro, pois consideraria a primeira aspa após a delimitação inicial do conteúdo como sendo fim de conteúdo e o restante não seria lido.

Outro erro é que ele não interpreta retorno de carro (ENTER) "\r" (ASCII 13 (0x0D)) e nova linha "\n" (ASCII 10 (0x0A)), ou seja, caso você copie e cole um texto que tenha estes caracteres, ele acusará erro. Para o editor, o texto tem que ser passado em uma única linha.

Para resolver estes problemas é simples, remover os caracteres que ele não aceita! As funções abaixo se referem a linguagem PHP.

Removendo aspas duplas

$conteudo = str_replace("\"", "'", $conteudo);

Troco as aspas duplas por aspas simples

Removendo retorno de carro (ENTER)
$conteudo = str_replace(chr(13), "", $conteudo);

Troco o \r por vazio

Removendo nova linha
$conteudo = str_replace(chr(10), "", $conteudo);

Troco \n por vazio

Com isso, o editor não acusará mais erros referentes aos problemas aqui expostos.

---

Update
Existe a função nl2br que faz o trabalho de trocar \n por <br />.

Muitos sites utilizam o recurso de exibir banners de propaganda no canto direito do navegador quando a resolução do usuário é maior que 800x600.

Para implementar este recurso, basta:
1. Criar uma DIV onde será armazenado o conteúdo da propaganda.

<div id="publicidade" style="display:none;">
Conteúdo da propaganda
</div>

2. Incluir um código JavaScript que exibirá a DIV com a propaganda caso a largura da resolução do monitor do usuário seja maior que 800.
window.onload = function()
{
if(screen.width > 800)
{
document.getElementById("publicidade").style.display = "block";
}
}

Dessa forma, quando um usuário com resolução maior que 800x600 acessar seu site, será exibida na tela uma coluna à direita com um conteúdo qualquer, geralmente propaganda.