Jquery com MTV(MVC) - Jquery MTVe

"Model-view-controller (MVC) é um modelo de desenvolvimento de Software, atualmente considerado uma "arquitetura padrão" utilizada na Engenharia de Software." - Fonte: http://pt.wikipedia.org/wiki/MVC

Nada é mais problemático nos dias de hoje quanto a falta de padronização nos projetos. Após uma procura na internet encontrei alguns frameworks MVC para javascript, mas, nenhum me agradou. Alguns me pareceram bem completos, mas, não me atendiam muito bem.

Achei de bom senso criar um próprio, coloquei algumas ideias no papel e cheguei a uma primeira versão. Ele deveria ser leve, de fácil utilização e o mais simples possível.

Tentei aproximar ao máximo a forma do Framework Django trabalhar, e cheguei a seguinte estrutura:

  • Model
  • Template
  • View
  • events
Surge então o jQuery MTVe, farei uma pequena demostração sobre seu funcionamento.

Primeiramente, entre na página no GitHub do projeto serão necessários os arquivos que estão dentro da pasta src.

Model:

Nosso modelo irá fazer uma requisição na graph api do Facebook. Ela terá dois atributos. Um será chamado "me" ele armazenará o meu username e outro chamado "base" que será utilizado para requisitar dados de perfil de outros usuários.

var model = $.Model({
  me : 'carlos.maniero',
  base : 'http://graph.facebook.com/',
  profile : function() { return this.load('GET', this.base + this.me ); },
  find_profile : function(username) { return this.load('GET', this.base + username ); },
});

O método "profile" retorna os dados do meu perfil e o find_profile retorna os dados de um usuário qualquer.

O método load:
Como você deve ter percebido ambos os métodos do modelo utilizam o método load. Ele é o método responsável em fazer as requisições via Ajax. E possui os seguintes parâmetros:

  • type: GET ou POST
  • url: Endereço da requisição
  • data: Json com dados a serem enviados
  • options: Opções do método jQuery.ajax
O método get:

Para chamar um método ou acessar um atributo, usa-se o método get.
Exemplos:

model.get('me');
model.get('profile')();

 

Template:


O método template usa o jQuery.tmpl, ele ainda não está em faze final, mas, está bem estável. Então esse será o conteúdo do nosso template:
HTML: https://github.com/carlosmaniero/jQuery-MTVe/blob/master/demos/demo1.tmpl


Os arquivos de template podem ser salvos com a extensão tmpl ou escrito em forma de texto, no exemplo salvaremos em um arquivo .tmpl.

Javascript:
var template = $.Template({
  profile : 'demo1.tmpl'
});

Renderizando um template:
Para renderizar um template, basta utilizar o método método get passando como parâmetros o nome do atributo e o objeto que será usado para substituir no template.

Exemplo:
template.get('profile',json);

View (Controlador):

"O controlador (controller) recebe a entrada de dados e inicia a resposta ao utilizador ao invocar objetos do modelo, e por fim uma visão baseada na entrada. Ele também é responsável pela validação e filtragem da entrada de dados." - Fonte: http://pt.wikipedia.org/wiki/MVC

Vamos ao javascript:

var view = $.View({
 profile : function(){
   var data = $.parseJSON(model.get('profile')());
   $("table").append(template.get('profile',data));
 },
 find_profile : function(username){
   var data = $.parseJSON(model.get('find_profile')(username));
   $('table').append(template.get('profile',data));
 }
});

Events:

Nos eventos ficarão todas as função que serão usadas em nossos elementos.

Javascript:

var events = $.Events({
  profile : function(evt){
    evt.preventDefault();
    view.get("profile")();
    $(this).attr('disabled','true');
  },
  find_profile : function(evt){
    evt.preventDefault();
    var username = $("input[name=username]").val();
    view.get("find_profile")(username);
  }
});
$("#button_profile").click(events.get('profile'));
$("#button_find_profile").click(events.get('find_profile'));
Como eu disse anteriormente ele é bem simples, porém, bastante útil.

O exemplo completo você encontra na pasta demos do projeto.

PHP - Long Polling

Long Polling é uma técnica utilizada para se obter dados e informações em "tempo real" sem que haja uma requisição por parte do usuário.

Como isso é possível? 
Existem algumas formas disso ser feito, nesse artigo, abordaremos o Long Polling.

Criaremos nesse artigo um pequeno chat, lembre-se que o intuito do artigo não é ensinar a fazer um chat, e sim, demostrar o funcionamento do Long Polling.

Vamos ao nosso arquivo poll.php, ele será responsável em trazer novas mensagens que foram enviadas pelo chat.

set_time_limit(0);

function poll($cur_line){
 // Lê arquivo
 $data = file_get_contents('chat.txt');
 $lines = explode("\n", $data);
 
 // Verifica se o número de linha é igual a linha atual ou se a linha 0 está vazia
 if(count($lines) == $cur_line || empty($lines[0])){
  // Coloca o script para dormir por 1 segundo
  sleep(1); 
  return poll($cur_line);
 }else{
  $ret = array();
  $ret['lines'] = array();
  // Coloca somente as linhas que não foram lidas no vetor
  for($cur_line;$cur_line < count($lines); $cur_line++){
   $ret['lines'][] = $lines[$cur_line];
  }
  // Adciona a linha atual no vetor
  $ret['cur_line'] = $cur_line;
  // Encoda o vetor em json
  return json_encode($ret);
 }
}
echo poll($_POST['cur_line']);

Entendendo o poll.php

No arquivo poll há uma função que recebe como parâmetro o $cur_line, essa é a linha atual do chat. Cada mensagem estará em uma linha de um arquivo .txt.  
Sem muito segredo, a função poll lê o arquivo chat.txt e verifica se há novas linhas no arquivo, caso negativo, ele coloca o programa para dormir durante 1 segundo, isso é muito importante para amenizar o gargalo de processamento.

Caso haja novas linhas, ele coloca as novas linhas em um vetor que é encodado para json.

Javascript:

var cur_line = 0;
var poll;
function get_messages(){
 poll = $.ajax({
 type: "POST",
 url: "poll.php",
 data: { 'cur_line' : cur_line },
 dataType: "json",
 success: function(json, textStatus, jqXHR) {
  cur_line = json.cur_line;
  
  // Insere linhas na tela 
  for(i=0;i' + json.lines[i] + '');
   $("#chat #chat-content .messages").prepend(line);
  }
  
 },
 complete: function(){ 
  get_messages();
 },
 timeout: 30000
 });
}

A função get_messages envia um post para o arquivo poll.php e imprime em uma lista o resultado(json) retornado e atualiza o número de linhas carregadas, que vem no json retornado.

Eu sempre recomendo que a conexão seja interrompida de tempo em tempo. No meu caso dixei o timeout em 30 segundos. Isso evita que, em caso de erros, o servidor fique com o processo travado.

Quando requisição é completada, eu chamo a função get_messages novamente, fazendo com que sempre haja uma conexão ativa com o servidor.

Com o Long Polling o chat sempre estará trazendo as novas mensagens de forma rápida, sem precisar ficar enviando milhares de requisições para o servidor.

Se quiser o projeto completo, eu subi no github.
Segue o link: https://github.com/carlosmaniero/Php-long-polling
Demonstração: http://www.livrodeoracao.com.br/dev/chat/index.php