HUFERSIL.WEBDEVELOPER

Calculando data final com horas/dias úteis

Ajudando uma pessoa no fórum do iMasters, postei um exemplo de código para calcular a data/hora final para um determinado prazo em horas.

Abaixo, a solução proposta para o problema (o código parece grande, mas tem mais comentários do que código :D ). Continuar lendo

Recorrência de Datas com MySQL

Geralmente isto é usado para quando você quer montar uma agenda, que tenha tarefas recorrentes.

Primeiramente, temos que definir os níveis de repetição que quero:

0 = não repetir
1 = diário
2 = semanal
3 = quinzenal
4 = mensal

Neste artigo, mostrarei do diário para frente. Continuar lendo

Gerador de Etiquetas

Bom, eu não sei vocês, mas em vários sistemas que desenvolvi, tive que fazer alguma coisa para gerar etiqueta de alguma forma (ainda mais eu que trabalho com vários sistemas de inscrição em eventos, com interface via Web).

Assim, resolvei em um belo dia, criar uma ferramenta para que eu pudesse reaproveitar em outros sistemas, me poupando tempo para implementar.

Observação: Para PHP 5.3 ou superior

O resultado você confere neste link.

Ah, e vocês poderão baixar os arquivos fonte neste outro link.

@braços e fiquem com Deus!

Validação de Dados

Uma das coisas mais chatas para fazer no momento do desenvolvimento é a validação de dados. Geralmente, o que vemos é:

if(empty($_POST['name'])) {
    echo 'Supply your name';
} else if(strlen($_POST['name']) < 5) {
    echo 'Your name must have at least 5 chars';
}

Logo, se você tiver que validar a mesma informação em dois locais diferentes, você recorre ao velho CTRL+C > CTRL+V..

Para evitar este tipo de coisa, eu geralmente uso regras de validação pré-determinadas, assim, se eu precisar re-utilizar a mesma regra em outro lugar, basta instanciar a classe e tá tudo certo. Por exemplo:

$user = new bean\User();
$user->setCpf('123132121321');
$user->setName('my name');
$user->setEmail('my@email.com');
 
// creating a validation list
$exec = new Executor();
$exec->addRule(new CPF('cpf', 'Invalid Brazilian CPf'));
$exec->addRule(new RequiredEmail('email','Invalid e-mail'));
$exec->addRule(new RequiredString('name','Supply your name with at least 4 chars', 4));
 
// executing 
$results = $exec->validate($user);
 
if(empty($results)){
     // ok, we're good to save in database
} else {
     echo 'Some errors occurred<br>';
     print_r($results);
}

Todos os erros encontrados na validação estão agora dentro da variável $results, indexados pelo nome da propriedade que gerou o erro. Logo, se ela estiver vazia, nenhum erro foi encontrado e você poderá prosseguir. Do contrário (tem algum valor), é só exibir ao usuário os erros encontrados.

Desta forma, facilita para enviar para a camada de visualização os erros encontrados, bem como posicioná-los de acordo com as necessidades.

Este formato pode ser aplicado à qualquer classe.

E o melhor: se eu precisar criar mais regras, eu não preciso refatorar/hackear códigos para suprir as necessidades – basta criar uma nova regra e aplicar no objeto em questão.

Os arquivos de exemplo podem ser baixados na área de downloads/exemplos.

@braços e fiquem com Deus!

PostgreSQL – Log automatico de alterações

Procurando algumas coisas sobre Stored Procedures e Triggers para o Postgres, cai neste link muito legal:

http://binodsblog.blogspot.com.br/2011/02/multi-table-trigger-in-postgresql-rocks.html

Espero que ajude como ajudou nos meus estudos!

@braços e fiquem com Deus

Database Modeler

Fala pessoal,

Depois de muito tempo sem postar, estou eu aqui de novo.
Coloquei na Chrome Web Store uma app para modelagem de dados.

Ainda está em versão beta e ainda tem alguns bugs, porém já estou usando em alguns projetos sem maiores problemas.

Quem quiser colaborar com o projeto, fique a vontade para dar sugestões!

@braços e fiquem com Deus!

Facilitando as chamadas ao servidor com RequestJS e jQuery

Em muito projetos eu uso HTML e jQuery.
A unica coisa que eu acho um pouco chata no jQuery é a forma das chamadas ao servidor.

Estudando ExtJS, achei muito legal a forma como ExtDirect funciona.

Então, resolvi fazer uma versão para eu poder usar em projetos com jQuery. Consiste, basicamente, de uma classe em PHP e outra JS (na verdade um objeto que não pode ser instanciado).

Ficou bem mais simples para eu trabalhar. Ainda estou testando, mas se alguém quiser se aventurar ou até mesmo me ajudar a testar/melhorar o código, qualquer ajuda será bem vinda! Continuar lendo

Reiniciando as sequences no PostgreSQL

Se você, como eu, usa muito o PostgreSQL, e de vez em quando precisa reiniciar as sequencias, vai uma dica de como fazer isso (testado no 9.0):

do $$
 
DECLARE
	rec RECORD;
	valor BIGINT;
BEGIN
	FOR REC IN SELECT  
		c.relname::text AS TABLE
		, f.attname::text AS FIELD
		, n.nspname::text AS schema
		, regexp_replace(CAST(d.adsrc AS TEXT), '.*?''(\w+)''.*?$'::TEXT, '\1'::TEXT, 'g'::TEXT) AS seq_name
 
		FROM pg_attribute f
		JOIN pg_class c ON c.oid = f.attrelid
		JOIN pg_type t ON t.oid = f.atttypid
		LEFT JOIN pg_attrdef d ON d.adrelid = c.oid AND d.adnum = f.attnum
		LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
		LEFT JOIN pg_constraint p ON p.conrelid = c.oid AND f.attnum = ANY ( p.conkey ) AND p.contype IN ('p')
		LEFT JOIN pg_constraint fk ON fk.conrelid = c.oid AND f.attnum = ANY ( fk.conkey ) AND fk.contype IN ('f')
		LEFT JOIN pg_class AS g ON fk.confrelid = g.oid
		WHERE c.relkind = 'r'::CHAR
			 AND f.attnum &gt; 0
			 AND n.nspname = 'public'
			 AND p.contype = 'p'
			 AND SUBSTR(CAST(d.adsrc AS TEXT), 1, 7) = 'nextval'
	LOOP
		EXECUTE 'SELECT COALESCE(MAX('||rec.FIELD||'),0) + 1 FROM '||rec.TABLE INTO valor ;
		RAISE NOTICE 'Valor para %: % na sequence %', rec.TABLE, valor, rec.seq_name;
 
		PERFORM SETVAL(rec.seq_name, valor);
 
	END LOOP;
END
$$

@braços e fiquem com Deus!

Exemplo para trabalhar com CRUD e Bootstrap do Twitter

Ajudando uma pessoa neste tópico, fiz um exemplo bem simples de CRUD com PDO, usando os arquivos de bootstrap do Twitter.

Você pode baixar os arquivos aqui.

@braços e fiquem com Deus!

Outro de Exemplo de ExtJS 4

Fala pessoas!

Estou gostando bastante dessa nova versão do ExtJS. Principalmente por conta do ExtDirect.

Consegui fazer boa parte deste exemplo usando somente a documentação. Poucas coisas que não funcionaram conforme o que estava descrito e tive que pedir ajuda ao oráculo.

Na seção de exemplos você poderá baixar o arquivo contendo todos os arquivos necessários (exceto o ExtJS 4, que você pode baixar no site da Sencha).

No arquivo ZIP contém um arquivo “readme.txt” que tem os passos a serem seguidos para configurar o exemplo.

@braços e fiquem com Deus!

Previous Posts