Como habilitar/desabilitar elementos com jQuery

As vezes precisamos habilitar/desabilitar elementos via javascript, e o jquery facilita e muito nosso trabalho! Tudo que você deve fazer é habilitar o atributo “disabled” através do método .attr(); Veja um exemplo abaixo:

//Para desabilitar
$('#elemento').attr('disabled', 'disabled');

E para habilitar novamente nosso elemento basta remover o atributo disabled da seguinte forma:

// Para habilitar
$('#element').removeAttr('disabled');

Um exemplo útil de quando devemos habilitar/desabilitar um botão é por exemplo em uma requisição ajax, para evitar que nosso usuário fique clicando várias vezes, e gerando várias requisições, podemos desabilitar o botão enquanto uma requisição é feita, e habilitar quando ela terminar veja o exemplo:

$("#loading").ajaxStart(function(){
        $(this).show();
        $('button').attr('disabled', 'disabled');
    });
    $("#loading").ajaxStop(function(){
        $(this).hide();
        $('button').removeAttr('disabled');
    });

Autocomplete no netbeans para o CodeIgniter

Essa é uma dica rápida, para ativar o autocomplete do codeigniter no netbeans, basta você criar um arquivo na raiz do projeto, eu o chamei de ci.php, dentro do ci.php coloque o código abaixo:

/**
 * @property CI_Loader $load
 * @property CI_Form_validation $form_validation
 * @property CI_Input $input
 * @property CI_Email $email
 * @property CI_DB_active_record $db
 * @property CI_DB_forge $dbforge
 * @property CI_Table $table
 * @property CI_Session $session
 * @property CI_FTP $ftp
 * @property Cache $cache
 * ....
 */
Class CI_Controller {

}

E pronto! a partir de agora seu netbeans já auto completará o codeigniter! 🙂
Ps: Não se esqueça de apagar o arquivo quando o projeto estiver pronto/não enviar para seu servidor!
Qualquer dúvida/bugs sei la, deixa nos comentários!

5 Dicas para otimizar seu código PHP

Como estou um pouco ocupado demais, e sem idéias para posts, irei apenas dar 5 dicas básicas que todo programador PHP deveria saber, mas as vezes acabamos nos esquecendo por descuido etc.

Use o echo, e não o print

Apesar de as 2 terem o mesmo funcionamento, os construtores de linguagem echo e print tem uma leve diferença de processamento, e o echo é mais rápido na execução. Por não ser uma função propriamente dita, o echo não precisa de parênteses (), e ele aceita vários parâmetros, sendo também mais rápido um echo com vários parâmetros, do que concatenando strings.

Dê preferência as aspas simples ‘ ao invés das duplas “

Onde for possível utilize as aspas simples, pois como elas não tem que varrer a procura de variáveis  dentro, executam mais rápido. Portanto um echo ‘Com aspas Simples” executa melhor e mais rápido que um echo “Com Aspas Duplas“. A principal diferença entre as duas além da velocidade, é que seguinte:

$variavel = 'Texto simples';
echo '$variavel';
//Imprime $variavel
echo "$variavel";
//Imprime Texto Simples

Não utilize funções na chamada de loops

Evite ao máximo, fazer chamadas de funções como condições para loops, em cada vez que o loop for executado a função é também executada, por exemplo:

//Como não deve ser feito
for($i=0;$i <= count($total); ++$i)

//A maneira correta/mais eficiente
$count = count($total);
for($i=0;$i <= $count; ++$i)

Libere da memória variáveis inutilizadas

Aprender a usar o unset() pode ser muito útil para melhorar o desempenho de nossos aplicativos php, especialmente em arrays, onde o consumo de memória é mais elevado, então liberar as memórias com unset() é sempre recomendavel.

Utilize o Manual!

E agora acho que estou dando a melhor dica de todas, o manual do php é bastante completo, e também sempre traz exemplos feitos por usuários de como usar as funções e também melhorias/alternativas a elas.

Como instalar e configurar o Sphinx Search

Hoje vou iniciar uma série de posts sobre o Sphinx Search, um servidor de busca fulltext open source e escrito em C++, atualmente ele roda em Linux (RedHat, Ubuntu, etc), Windows, MacOS, Solaris, FreeBSD, e alguns outros sistemas. Com o Sphinx você pode gerar índices em batch, a partir de um banco de dados relacional, NoSql, ou simplesmente arquivos, de maneira fácil e rápida.

Para instalar no linux primeiro você deve baixar uma versão na página de download. Após feito o download você irá executar os comandos abaixo:

Fulltext Search com o Sphinx Search Server

Este vai ser um pequeno post, para quem não conhece o Sphinx Search ainda, vale a pena conhecer, ele é uma ótima alternativa ao índice Fulltext Search nativo do Mysql, ele é muito mais eficiente e também há muitas outras formas de configuração.

Ele já vem com uma API para PHP muito simples e fácil de usar, também com fácil integração para o codeigniter, você somente coloca ele na pasta library e pronto, está tudo certo. Com o Sphinx Search sua busca além de MUITO mais rápida será mais relevante. Existem até plugins para o WordPress como o WordPress Sphinx Search Plugin, não o utilizei ainda mas parece ser bem fácil de usar e configurar. Para mais informações sobre o Sphinx Search aconcelho o forum oficial e a documentação que não é tão completa mas já ajuda bastante.

Para min a grande vantagem do Sphinx Search em relação a outros servidores FullText é a integração nativa com o PHP e MySql.

Em breve irei criar um tutorial de como instalar e configurar o Sphinx Search para melhorar seus resultados de busca.

WordPress: Criando um e-commerce!

Vamos com um tutorial para criar um e-commerce com o wordpress que eu vi e resolvi compartilhar. No vídeo ele ensina a instala e configurar o WP-Ecommerce, que parece ser bastante fácil de mexer e configurar.

Isso nos mostra que o wordpress está cada vez mais longe de ser apenas um blog.

Segue o vídeo:

Por que utilizar o Codeigniter Reactor

Com o lançamento oficial do Codeigniter Reactor, muitos estão se perguntando qual versão utilizar: Codeigniter Reactor ou Codeigniter Core? A própria EllisLab recomenda o uso do Reactor ao invés do core, toda vez que você vir a palavra Codeigniter no site da ellislab, eles irão estar falando do Reactor, o Core será utilizado como base nos produtos comerciais da Ellislab deixando o Reactor na mão dos engineers e da comunidade.

Em minha opinião, é muito melhor utilizar a versão da comunidade que com certeza, será mais ativa e atualizada, não somente com novidades mas também com correção de bugs, os engineers estarão muito ativos nessas correções imediatas, e também estarão avaliando pulls da comunidade, eu mesmo dei um pull no github, e recebi com 2 dias uma resposta, no caso ele (Phill) já tinha corrigido o problema só não tinha “commitado” ainda.

O que vem em breve?

Eles já avisaram, em breve teremos uma forma nativa de fazer autenticação no Codeigniter, o que na minha opinião será muito bem vindo. Também existem planos para tornar o model mais “object like”, estão testando uma forma de fazer com que o active record retorne uma instância do model que ele represente, mas nada está concreto ainda quanto a isso. E uma coisa que eu acho bem interessante será a parte de comentários no user guide, ou seja nós poderemos adicionar conteúdo ao user guide, estilo php.net deixando não somente dúvidas como contribuições, enriquecendo e muito o conteúdo do user guide.

Para acompanhar as novidades é bom acompanhar o changelog, e saber o que está mudando e se você deve ou não migrar seus aplicativos atuais.

Dicas para utilizar a session do CodeIgniter

Hoje vou dar algumas dicas para utilizar a session do codeigniter, da forma que eu uso em meus projetos.

Utilize Banco de dados

Nunca utilize a session do CI como ela vem por padrão, pois a mesma é utilizada em cookies e só cabe 4kb de dados, ou seja é muito pouco para a maioria das aplicações. Eu gosto de deixar por padrão a mesma com banco de dados ex do config:

$config['sess_cookie_name']		= 'ci_session';
$config['sess_expiration']		= 7200;
$config['sess_encrypt_cookie']	= FALSE;
$config['sess_use_database']	=TRUE;
$config['sess_table_name']		= 'ci_sessions';
$config['sess_match_ip']		= FALSE;
$config['sess_match_useragent']	= TRUE;
$config['sess_time_to_update'] 	= 300;

E você não pode esquecer de criar a tabela em seu banco de dados, segue o código abaixo:

CREATE TABLE IF NOT EXISTS  `ci_sessions` (
session_id varchar(40) DEFAULT '0' NOT NULL,
ip_address varchar(16) DEFAULT '0' NOT NULL,
user_agent varchar(50) NOT NULL,
last_activity int(10) unsigned DEFAULT 0 NOT NULL,
user_data text DEFAULT '' NOT NULL,
PRIMARY KEY (session_id)
);

Utilize o FlashData

O recurso de flash data do CodeIgniter é muito interessante por exemplo para um cadastro, onde você precisa dar uma mensagem de erro ou uma mensagem de sucesso, onde você não precisará mais desta mensagem no futuro.

Veja um exemplo de como utilizar o flashdata

$this->session->set_flashdata('sucesso','Seu produto foi cadastrado com sucesso.');

e na view você pode simplesmente chamar sua varíavel

<h3><?php echo $this->session->flashdata('sucesso');?></h3>

Ps: Lembrando que o flashdata só estará disponível na próxima requisição.

Até hoje eu não tive problema algum utilizando a session do CodeIgniter, espero que estas dicas sejam uteis, e se alguém tiver alguma sugestão de post, por favor, faça nos comentários!

Exemplo de model e MY_Model do CodeIgniter

Hoje vou apenas deixar um exemplo de model, de um projeto meu.
vou deixar a minha MY_Model e o Model em si.
MY_Model

<?php

class MY_Model extends CI_Model {

    public function __construct() {
        parent::__construct();
    }

    protected function required($options = array()) {
        foreach ($options as $option) {
            if (!isset($this->{$option}))
                return false;
        }
        return true;
    }

}
<?php

class Opicionais_Model extends MY_Model {

    public $codigo_opicionais;
    public $nome;
    public $data_hora_inclusao;

    public function __construct() {
        parent::__construct();
    }

    public function get($options = array()) {
        if (isset($options['codigo_opicionais'])) {
            $this->db->where('codigo_opicionais', $options['codigo_opicionais']);
        }
        if (isset($options['nome'])) {
            $this->db->where('nome', $options['nome']);
        }
        if (isset($options['limit'])) {
            $this->db->limit($option['limit'][0], $option['limit'][1]);
        }
        if (isset($options['order_by'])) {
            $this->db->order_by($option['order_by']);
        }
        if (isset($options['array'])) {
            return$this->db->get('opicionais')->result_array();
        }
        return $this->db->get('opicionais')->result();
    }

    public function salvar() {
        $options = array(
            'nome',
        );
        $this->data_hora_inclusao = date('Y-m-d h:m:s');
        if ($this->required($options)) {
            if (!isset($this->codigo_opicionais)) {
                return $this->db->insert('opicionais', $this);
            } else {
                $this->db->where('codigo_opicionais', $this->codigo_opicionais);
                return $this->db->update('opicionais', $this);
            }
        } else {
            return false;
        }
    }

    public function count() {
        return $this->db->count_all('opicionais');
    }

    public function deletar($codigo_opicionais = '') {
        if (isset($this->codigo_opicionais)) {
            $this->db->where('codigo_opicionais', $this->codigo_opicionais);
            return $this->db->delete('opicionais');
        } else if (isset($codigo_opicionais)) {
            $this->db->where('codigo_opicionais', $codigo_opicionais);
            return $this->db->delete('opicionais');
        } else {
            return false;
        }
    }

}

Qualquer dúvida em relação ao funcionamento do model, pode deixar nos comentários! 🙂