sexta-feira, 25 de novembro de 2011

CodeIgniter - Usando CSS e Imagens

Hello World!

Esse tópico pode parecer "meio" sem sentido, mas aqui explicarei um pouco sobre a utilização de CSS e Imagens com o CodeIgniter e onde colocar as imagens e o CSS.

Esse tópico será útil para que pretende trabalhar com Templates no CodeIgniter. E em breve colocarei um tópico sobre o uso de templates com CodeIgniter.

Muitos que estão começando a programar com o CodeIgniter acabam tendo duvidas sobre onde colocar o arquivo CSS e a pasta das imagens do site.

Para resolver esse problema, coloque o arquivo CSS diretamente no pasta raiz do site e carregue o arquivo assim:

<link href="style.css" rel="stylesheet" type="text/css" />

Pronto! Isso resolve o seu problema.
Para as imagens é a mesma coisa, crie a pasta de imagens na raiz do site e irá funcionar.

Agora, se você pretende usar templates para o site, a conversa muda de rumo.

Para fazer algo minimamente organizado, você deve armazenar todos os arquivos do template na mesma pasta das Views, correto?

Exemplo:
Template 1: /application/view/template1
Template 2: /application/view/template2

E dentro dessas pastas de templates as imagens e o CSS.

Por tanto, para carregar por exemplo o CSS, a tag deveria ser assim:

<link href="http://site/application/views/template1/style.css" rel="stylesheet" type="text/css" />

Parece simples se o CodeIgniter não bloqueasse esse acesso.
Sem mexer na configuração do CodeIgniter, isso não irá funcionar. Pelo menos nas versões 2.x do CI.

Para resolver isso você precisa mudar a configuração do arquivo .htaccess que está DENTRO da pasta "application".

O arquivo .htaccess deve ficar assim:

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

Feito isso, seus arquivos de CSS e imagens que estão na pasta "views" estarão acessíveis.

Duvidas? Deixe um comentário.

CodeIgniter - Executando Subqueries

Hi!

Hoje eu vou mostrar uma biblioteca bem interessante que eu encontrei enquanto procurava uma forma de realizar subqueries com o Active Record do CodeIgniter.

Antes de mais nada, eu vou explicar o motivo dessa subquery:

Quando se usa o SELECT SUM() do Mysql junto com LIMIT, você precisa usar subquery para o SUM() somar apenas aquilo que foi determinado no LIMIT.

Vamos ao exemplo que NÃO funciona:

SELECT SUM('campo_numerico') FROM tabela LIMIT 25

Isso definitivamente não irá funcionar corretamente e a soma do campo numerico será realizada sobre toda a clausula WHERE (se existir) e não apenas dentro do que foi determinado no LIMIT 25.

Para funcionar, a query deve ser assim:

SELECT SUM('campo_numerico') FROM (SELECT campo_numerico FROM tabela LIMIT 25) AS subquery;

Ai sim você terá o resultado da soma do campo numerico apenas daquilo que foi determinado no LIMIT.

Nessa bibliteca, é possível realizar essa subquery usando Active Record do CodeIgniter.
https://github.com/NTICompass/CodeIgniter-Subqueries

Vejam como essa subquery ficaria com essa biblioteca em uma Model:

$this->db->select_sum('campo_numerico');

$sub = $this->subquery->start_subquery('from');
$sub->select('campo_numerico');
$sub->from('tabela');
$sub->limit(25);
$this->subquery->end_subquery('campo_numerico');

$sql = $this->db->get();
return $sql->result();


Simples não?
Isso funcionou perfeitamente bem no meu servidor local, já no meu servidor WEB deixou a desejar e não funcionou... Ainda não descobri o porque mas assim que resolver eu posto a solução.

Mas a biblioteca é muito boa!
Vale a pena conferir!

CodeIgniter - Upload de Imagem

Salve, salve!

Agora eu vou mostrar como fazer Upload de imagem usando o CodeIgniter.
Quanto a View, ela pode ter o mesmo formulário utilizado no exemplo anterior de upload de imagem com PHP.

Para fazer o upload, coloque o seguinte código dentro do Controller que receberá os dados do formulário:


$config['upload_path'] = './upload/imagem/';//Caminho onde será salvo
$config['allowed_types'] = 'gif|jpg|png';//Tipos de imagem aceito
$config['max_size'] = '2048';//Tamanho - Aqui aceitamos até 2 Mb
$config['overwrite']  = FALSE;//Não irá sobre-escrever o arquivo
$config['encrypt_name'] = TRUE;//Trocará o nome do arquivo para um HASH


$field_name1 = "photo";// Nome do campo INPUT do formulário $this->load->library('upload'); $this->upload->initialize($config); 

//Faz o upload if(!$this->upload->do_upload($field_name1)) {     $error = array('erro' => $this->upload->display_errors()); }else{     $upload_data = $this->upload->data();     $nome_do_arquivo_gravado = $upload_data['file_name'];  } //Fim - Upload da Imagem

domingo, 20 de novembro de 2011

PHP - Upload de Imagem

Salve!

Aqui eu vou mostrar uma forma "simples" de se fazer Upload de imagens com o PHP.
Neste exemplo, nós vamos gerar um nome aleatório para a imagem.

Vamos ao formulário:

<form action="upload.php" method="post" enctype="multipart/form-data">
Selecione a imagem: <input name="photo" type="file" /><br />
<input name="submit" type="submit" value="Enviar" />
</form>


Agora o arquivo "upload.php":

#Inicio da função de validação e gravação de imagem
$erro = $config = array();

// Prepara a variável do arquivo
$arquivo = isset($_FILES["photo"]) ? $_FILES["photo"] : FALSE;
if($arquivo == ""){
echo "<p>Variavel de arquivo vazio</p>";}
else{echo "<p>Variavel de arquivo OK!</p>";}
// Tamanho máximo do arquivo 50Kb - 110px x 110px(em bytes)
$config["tamanho"] = 102400;
// Largura máxima (pixels)
$config["largura"] = 500;
// Altura máxima (pixels)
$config["altura"]  = 800;

// Formulário postado... executa as ações
if($arquivo)
{
    // Verifica se o mime-type do arquivo é de imagem
    if(!eregi("^image\/(pjpeg|jpeg|png|gif|bmp)$", $arquivo["type"]))
    {
        $erro[] = "Arquivo em formato inválido! A imagem deve ser jpg, jpeg,
bmp, gif ou png. Envie outro arquivo";
    }
    else
    {

        // Verifica tamanho do arquivo
        if($arquivo["size"] > $config["tamanho"])
        {
            $erro[] = "Arquivo em tamanho muito grande!
A imagem deve ser de no máximo " . $config["tamanho"] . " bytes.
Envie outro arquivo";
        }
     
        // Para verificar as dimensões da imagem
        $tamanhos = getimagesize($arquivo["tmp_name"]);
     
        // Verifica largura
        if($tamanhos[0] > $config["largura"])
        {
            $erro[] = "Largura da imagem não deve
ultrapassar " . $config["largura"] . " pixels";
        }

        // Verifica altura
        if($tamanhos[1] > $config["altura"])
        {
            $erro[] = "Altura da imagem não deve
ultrapassar " . $config["altura"] . " pixels";
        }
    }
 
    // Imprime as mensagens de erro
    if(sizeof($erro))
    {
        foreach($erro as $err)
        {
            echo " - " . $err . "<BR>";
        }

        echo "Erro no Upload da imgem - Reveja o tamanho e a largura";
    }

    // Verificação de dados OK, nenhum erro ocorrido, executa então o upload...
    else
    {
        // Pega extensão do arquivo
        preg_match("/\.(gif|bmp|png|jpg|jpeg){1}$/i", $arquivo["name"], $ext);

        // Gera um nome único para a imagem
        $imagem_nome = md5(uniqid(time())) . "." . $ext[1];

        // Caminho de onde a imagem ficará
        $imagem_dir = "upload/" . $imagem_nome;

        // Faz o upload da imagem
        if(!move_uploaded_file($arquivo["tmp_name"], $imagem_dir)){
}
    }
}


Duvidas? Deixe um comentário.
Proximo post será sobre Upload de imagem usando o CodeIgniter.

sábado, 19 de novembro de 2011

Editores / IDE para Programação em PHP


Olá!

Eu vou colocar aqui as minhas opiniões sobre qual o melhor programa para escrever códigos em PHP.

Muito se fala por ai do Eclipse. Eu já testei e me pareceu uma excelente IDE para programação. Mas um ponto que não me agradou foi o consumo de memória.

Na minha maquina (Intel Core i3, 2 Gb RAM) ele consome mais de 300 Mb assim que é inicializado. Desempenho pra mim é fundamental! E todo esse consumo de memória pra mim torna-se algo completamente descartável!

Existe um editor de texto, que se mostrou excelente além de muito útil é o Notepad++.
Editor simples, rápido, um Notepad (normal) muito melhorado!

Mas também é absurdamente simples e não possui nenhuma barra de ferramentas com funções para programação. Apesar de contar com milhares de plug-ins disponíveis para download.

Pra mim, a principal utilidade fica com a possibilidade de mudar a formatação de um arquivo para por exemplo: UTF-8 (Sem BOM). Isso é muito útil e resolve uma série de problemas com o PHP e CodeIgniter quando a programação é sobre UTF-8.

Agora o editor que eu gosto (gosto é gosto e não se discute), é o Adobe Macromedia Dreamweaver CS3.

Leve, fácil, tem funções de aut0-complete além da preferencia. E gosto tanto da versão CS3 que não tenho nem vontade de atualizar para alguma versão mais recente.

E você? Prefere o que? Algum outro software? Ou tem algo a comentar sobre os softwares que foram comentados aqui?

Importar Informações de XML Utilizando o CodeIgniter

Salve, salve!

Agora vamos comentar um pouco sobre a importação de XML para aplicações desenvolvidas utilizando o CodeIngiter.

O CodeIgniter por si só, não oferece grandes recursos para XML até por ser uma tarefa extremamente simples! Usando funções do próprio PHP como o “Simple XML” com o CodeIgniter fica muito simples.

Vamos ao XML:

<?xml version="1.0" encoding="utf-8"?>
<lista>

<produto>
<nome>Produto Numero 1</nome>
<tipo>Tipo 1</tipo>
<valor>100,00</valor>
</produto>

<produto>
<nome>Produto Numero 2</nome>
<tipo>Tipo 2</tipo>
<valor>50,00</valor>
</produto>

</lista>



Agora o Controler, na função que recebe e carrega o arquivo.

$url_xml = $this->input->post('xml');//http://www.site.com.br/arquivo.xml
if($xml_content['xml'] = simplexml_load_file($url_xml)){
$this->load->view('mostra_xml_view', $xml_content);
}else{
$this->load->view('xml_error_view');
}


A View, que irá mostrar o conteúdo do arquivo.

for($i=0; $i < count($xml->produto); $i++) {
echo "Nome: ", $xml->produto->nome, "<br />";
echo "Tipo: ", $xml->produto->tipo, "<br />";
echo "Valor: ", $xml->produto->valor, "<br />";
echo "<br />";
}


Isso deve resolver muitos problemas considerando que esse código da View poderia de utilizado no Controler para incluir os dados no banco de dados.

Duvidas? Deixe um comentário…

CodeIgniter – Traduzindo as Mensagens de Erro na Validação de Formulários

Salve!

O CodeIgniter tem uma biblioteca para validação de formulários chamada: form_validation

Para traduzir as mensagens de erro, localize o arquivo chamado “form_validation_lang”. Este arquivo deve ser encontrado em: /system/language/english/.

Veja a estrutura do arquivo:

<?php
$lang['required'] = "O campo %s &eacute; requerido."; $lang['isset'] = "The %s field must have a value."; $lang['valid_email'] = "O campo de %s precisa conter um endere&ccedil;o de e-mail v&aacute;lido."; $lang['valid_emails'] = "The %s field must contain all valid email addresses."; $lang['valid_url'] = "O campo %s precisa conter uma URL v&aacute;lida."; $lang['valid_ip'] = "The %s field must contain a valid IP."; $lang['min_length'] = "O Campo %s precisa ter pelo menos %s caracteres."; $lang['max_length'] = "O Campo %s pode ter no maximo %s caracteres."; $lang['exact_length'] = "O Campo %s precisa ter exatamente %s caracteres."; $lang['alpha'] = "The %s field may only contain alphabetical characters."; $lang['alpha_numeric'] = "O Campo %s s&oacute; pode conter caracteres alpha-num&eacute;ricos."; $lang['alpha_dash'] = "The %s field may only contain alpha-numeric characters, underscores, and dashes."; $lang['numeric'] = "O Campo %s s&oacute; pode conter numeros."; $lang['is_numeric'] = "The %s field must contain only numeric characters."; $lang['integer'] = "O campo %s precisa conter um numero inteiro."; $lang['regex_match'] = "The %s field is not in the correct format."; $lang['matches'] = "O Campo %s n&atilde;o confere com o campo %s."; $lang['is_natural'] = "The %s field must contain only positive numbers."; $lang['is_natural_no_zero'] = "The %s field must contain a number greater than zero."; $lang['decimal'] = "The %s field must contain a decimal number."; $lang['less_than'] = "The %s field must contain a number less than %s."; $lang['greater_than'] = "The %s field must contain a number greater than %s."; $lang['valid_cnpj'] = "O campo %s n&atilde;o &eacute; um CNPJ v&aacute;lido. Use o formato 00.000.000/0000-00"; $lang['valid_cpf'] = "O campo %s n&atilde;o &eacute; um CPF v&aacute;lido. Use o formato 000.000.000-00"; $lang['valid_date'] = "O campo %s n&atilde;o &eacute; uma data (dd/mm/yyyy) v&aacute;lida."; $lang['valid_hour'] = "O campo %s n&atilde;o &eacute; uma hora (hh/mm) v&aacute;lida.";
/* End of file form_validation_lang.php */ /* Location: ./system/language/english/form_validation_lang.php */

Como você pode notar, algumas mensagens já foram traduzidas. E é muito simples!

CodeIgniter e PagSeguro – Retorno Automático



Salve!

Vamos falar um pouco sobre a integração do UOL PagSeguro com aplicações desenvolvidas utilizando o CodeIgniter como framework.

Após muitos testes, buscas pela internet, perguntas em Fórum de discussão, eu consegui fazer pelos meus próprios meios. E compartilho aqui pois acredito que outras pessoas estejam com o mesmo problema.

Enviar as informações de pagamento para o PagSeguro é muito fácil e eu não preciso comentar nada por aqui. O grande “vilão” dessa conversa é o Retorno Automático.

Vamos começar pelo Controler.
Obs. Imagine que essa função seria exatamente a informada nas configurações de retorno do PagSeguro (http://www.seusite.com.br/retorno_automatico).


public function retorno_pagseguro(){

if (count($_POST) > 0) {

// POST recebido, indica que é a requisição do NPI.
//$npi = new PagSeguroNpi();
$this->load->library(PagSeguroNpi);//Carrega a library
$result = $this->PagSeguroNpi->notificationPost();

$transacaoID = isset($_POST['TransacaoID']) ? $_POST['TransacaoID'] : '';

if ($result == "VERIFICADO") {
//O post foi validado pelo PagSeguro.
$source = array('.', ',');
$replace = array('', '.');
$pagamento['TransacaoID'] = $_POST['TransacaoID'];
$pagamento['Referencia'] = $_POST['Referencia'];
$pagamento['TipoPagamento'] = $_POST['TipoPagamento'];
$pagamento['StatusTransacao'] = $_POST['StatusTransacao'];
$pagamento['Anotacao'] = $_POST['Anotacao'];
$pagamento['DataTransacao'] = $_POST['DataTransacao'];
$pagamento['ProdValor_1'] = str_replace($source, $replace, $_POST['ProdValor_1']);
$this->load->model('financeiro_model');//Carrega a Model
$this->financeiro_model->GravaRetorno($pagamento);//Grava os dados recebido
if($_POST['StatusTransacao'] == 'Aprovado'){
$histpagto = $this->financeiro_model->GetPagtoByID($_POST['Referencia']);
$pag['valor'] = $histpagto[0]->nu_valor;
$pag['idanunciante'] = $histpagto[0]->id_anunciante;
$this->financeiro_model->AtualizaCredito($pag);
$pag['idtransacao'] = $_POST['TransacaoID'];
$pag['idpagto'] = $_POST['Referencia'];
$this->financeiro_model->AtualizaHistPag($pag);
$informacao['status'] = '1';
}elseif($_POST['StatusTransacao'] == 'Em Análise'){
$informacao['status'] = '2';
}elseif($_POST['StatusTransacao'] == 'Aguardando Pagto'){
$informacao['status'] = '3';
}elseif($_POST['StatusTransacao'] == 'Completo'){
$informacao['status'] = '4';
}elseif($_POST['StatusTransacao'] == 'Cancelado'){
$informacao['status'] = '5';
}
} else if ($result == "FALSO") {
//O post não foi validado pelo PagSeguro.
$informacao['status'] = '1000';
} else {
//Erro na integração com o PagSeguro.
$informacao['status'] = '3';
}

} else {
// POST não recebido, indica que a requisição é o retorno do Checkout PagSeguro.
// No término do checkout o usuário é redirecionado para este bloco.
$informacao['status'] = '3';
}

$this->load->view('header_interna_view', $page_infos);//Carrega o cabeçalho
$this->load->view('empresa/sidebar_view');//Carrega a Sidebar
$this->load->view('financeiro/retorno_view', $informacao);//Carrega a view de conteudo

$this->load->view('footer_view');//carrega do rodapé

}


Agora a library:

<?php

header('Content-Type: text/html; charset=ISO-8859-1');

define('TOKEN', '2EEF70CFFCB547DBA7823F19C7D17F24');

class PagSeguroNpi {

private $timeout = 20; // Timeout em segundo

public function notificationPost() {
$postdata = 'Comando=validar&Token='.TOKEN;
foreach ($_POST as $key =>$value) {
$valued = $this->clearStr($value);
$postdata .= "&$key=$valued";
}
return $this->verify($postdata);
}

private function clearStr($str) {
if (!get_magic_quotes_gpc()) {
$str = addslashes($str);
}
return $str;
}

private function verify($data) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://pagseguro.uol.com.br/pagseguro-ws/checkout/NPI.jhtml");
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_TIMEOUT, $this->timeout);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$result = trim(curl_exec($curl));
curl_close($curl);
return $result;
}

}

?>


Testem! Qualquer problema, sugestão ou qualquer outra coisa, deixe um comentário.

Codeigniter: Pegando o ID auto-gerado depois de executar um INSERT



Olá,

Aqui vai uma dica simples mas que eu quebrei a cabeça quando comecei a utilizar o CodeIgniter.

Como pegar o ID auto-gerado pelo banco de dados depois de executar uma query INSERT?
Muito simples! Veja o exemplo a baixo:


$var['nome'] = $this->input->post('nome');
$var['email'] = $this->input->post('email');
//Recebendo os valores do formulário e armazenando em um array

$this->load->module('modulo_db');//Carrega a Model
if($this->modulo_db->grava_form($var)){
$id_auto_gerado = $this->db->insert_id();//Pega o ID auto-gerado e armazena na variavel
}

Simples não?

Este código deve ser utilizado em Controler.

PHP – Funções Recursivas


Hello World!

Aqui eu vou apresentar um caso que me deu um certo trabalho. Trata-se de uma classe usada para listar “Filhos” e os “Filhos dos Filhos” até onde forem.

Eu tive essa demanda em um sistema no qual usuários indicavam novos usuários e deveria ser apresentado uma lista com a “rede de indicados” de um determinado usuário indicante.

Segue a classe em PHP com consulta a um banco de dados MySql.

Obs: Eu não vou postar o código de conexão com o banco de dados, isso pode ser facilmente encontrado no internet.

<?php
class Rede
{
private $nivel; //Esta variavel é usada para enumerar todos os listados
private $subnivel = 0; //Esta variavel server para referenciar o pai dos listados em qualquer nível

public function verifica_filho($idpai, $nivel, $subnivel){//Função que verifica se o usuário que esta sendo listado possui filho(s) $sql = "SELECT id_usuario FROM tb_usuarios WHERE id_pai = $idpai"; $res = mysql_query($sql) or die ("Erro na Query: $sql"); if(mysql_num_rows($res) != ""){ $subnivel = $this->$nivel; $this->lista_filhos($nivel, $subnivel,$idpai); //Chama a função que lista os filhos caso o usuário tenha filhos } }//Se o usuário não tiver filhos, retorna ao loop anterior public function lista_filhos($nivel, $subnivel, $id2){ $sql1 = "SELECT id_usuario, nm_nome FROM tb_usuarios WHERE id_pai = $id2";//Lista os filhos do usuário $res1 = mysql_query($sql1) or die ("Erro na Query: $sql1"); while($row1 = mysql_fetch_array($res1)) { $this->$nivel++; echo "d.add(", $this->$nivel, ",", $subnivel, ",'", $row1["nm_nome"], "');\n";//Escreve o ID (nivel) + nome do usuário
$this->verifica_filho($row1["id_distribuidor"], $nivel, $subnivel); //Chama a função que verifica se o usuário possui filhos } } }#Fim da classe
?>


Esse é um exemplo de funções recursivas, que uma função chama a outra em um loop e é encerrada quando uma das condições não é atendida.

O mais facinante é que o PHP consegue “lembrar” de onde parou e voltar a execução a partir do ID que iniciou um loop.

Comentários e sugestões serão bem vindos!

Iniciando

Olá!
Eu me chamo Edgard e vou postar muitas coisas relacionadas a Programação com PHP, MySql, Css, Zend Framework entre muitas outras coisas.
Espero poder ajudar outros programadores a encontrar uma solução para seus problemas com as informações que serão postadas aqui.
Iniciando…