Informática Numaboa - Tutoriais e Programação

Componente 1.5 MVC - Funcionalidade admin II

Qua

23

Jan

2008


22:31

  • Imprimir
(21 votos, média 4.71 de 5) 


Se você conseguiu sobreviver ao tsunami que foi até agora a criação do componente MVC, então este último tutorial da série não será problema. Aprenda a lidar com a tabela do componente para poder salvar, deletar e atualizar mensagens porque é só isto que está faltando.

Salvar um registro

Normalmente precisamos de alguns switches e da lógica para manipular várias situações como, por exemplo, optar entre uma query de inserção (INSERT) quando o registro for novo e uma query de atualização (UPDATE) quando o registro tiver sido editado. Também existem alguns complicadores na hora de obter dados dos formulários para incluí-los em queries.

Para nossa sorte, o framework do Joomla faz a maior parte do serviço. A classe JTable facilita nossa vida e nos possibilita lidar com tabelas sem ter que se preocupar com o SQL envolvido nas operações. Além disto, também facilita muito a transferência de dados de um formulário HTML para a base de dados.

Criando a classe Tabela

A classe JTable é uma classe abstrata da qual podemos derivar classes filhas para trabalhar com tabelas específicas. Para usá-la, basta criar uma classe que estenda a classe JTable, adicionar os campos da tabela como propriedades e sobrepor o construtor para especificar o nome da tabela e sua chave primária.

Nesta classe tabela definimos três campos: id, mensagem e published. Depois definimos um construtor que chama o construtor da classe mãe passando o nome da tabela (ola), o nome do campo que é a chave primária (id) e o objeto conector da base de dados.

Crie um novo diretório /administrator/components/com_ola/tables e coloque neste diretório o script ola.php mostrado acima.


Atualizando o modelo

O modelo, que funciona como um distribuidor de ferramentas de trabalho, precisa ser atualizado para fornecer uma função que possibilite salvar registros. Vamos chamar nosso método de salvar( ). Este método fará três coisas: associar os dados do formulário com o objeto TableOla, checar se o registro foi formado corretamente e armazenar os dados do registro na base de dados.

setId((int)$array[0]); } /** * Método para definir o identificador do olá * * @access public * @param int Identificador olá * @return void */ function setId($id) { // Define id e limpa os dados $this->_id = $id; $this->_dados = null; } /** * Método para obter um olá * @return objeto com dados */ function &getDados() { // Carrega os dados if (empty( $this->_dados )) { $query = 'SELECT * FROM #__ola '. ' WHERE id = '.$this->_id; $this->_db->setQuery( $query ); $this->_dados = $this->_db->loadObject(); } if (!$this->_dados) { $this->_dados = new stdClass(); $this->_dados->id = 0; $this->_dados->mensagem = null; $this->_dados->published = null; } return $this->_dados; }

Adicionar:

/** * Método para armazenar um registro * * @access public * @return boolean True se bem sucedido */ function salvar() { $row =& $this->getTable(); $dados = JRequest::get( 'post' ); // Ligar campos do formulário com a tabela ola if (!$row->bind($dados)) { $this->setError($this->_db->getErrorMsg()); return false; } // Garantir que o registro é válido if (!$row->check()) { $this->setError($this->_db->getErrorMsg()); return false; } // Armazenar a tabela ola na base de dados if (!$row->store()) { $this->setError($this->_db->getErrorMsg()); return false; } return true; } } ?>

A primeira linha obtém uma referência ao objeto tabela. Se usarmos a convenção de nomes não é preciso indicar o nome do objeto tabela - a classe JModel sabe como encontrá-lo. Chamamos nossa classe de TableOla (o modelo sabe que se trata de uma tabela) e a colocamos num arquivo chamado ola.php (se a classe é TableOla o arquivo deve se chamar ola.php) no diretório tables (o diretório das classes de tabela).

A segunda linha obtém os dados do formulário. O JRequest possibilita obter todas as variáveis que foram submetidas através do método 'POST'. Elas chegam até nós na forma de um array associativo.

O restante do código é fácil: ligamos, checamos e armazenamos. O método bind( ) copia os valores do array para as propriedades correspondentes do objeto tabela. Neste caso, ele pega os valores de id, mensagem e published e os copia para o nosso objeto TableOla.

O método check( ) verifica os dados. Na classe JTable, este método apenas retorna true. No atual estágio, este método não está servindo para nada, mas é bom deixá-lo aí. Caso seja preciso fazer alguma verificação futuramente, este método torna possível fazer uma checagem de dados na nossa classe TableOla sobrepondo-o com um método personalizado.

O método store( ) pega os dados do objeto tabela e os armazena na base de dados. Se id for igual a 0 (zero), ele cria um novo registro (INSERT), caso contrário ele atualiza o registro indicado (UPDATE).


Adicionando a tarefa ao controlador

Já temos nosso objeto tabela e o modelo sabe da sua existência. Agora só falta o "jogador de meio de campo" dar as coordenadas. Vamos adicionar o método save( ) ao nosso controlador /controllers/ola.php:

registerTask( 'add', 'edit' ); } /** * mostrar o formulário de edição * @return void */ function edit() { JRequest::setVar( 'view', 'ola' ); JRequest::setVar( 'layout', 'formulario' ); JRequest::setVar( 'hidemainmenu', 1); parent::display(); }

Adicionar:

/** * salvar um registro (e redirecionar para a página principal) * @return void */ function save() { $modelo = $this->getModel('ola'); if ($modelo->salvar()) { $msg = JText::_( 'Mensagem Salva!' ); } else { $msg = JText::_( 'Erro ao Salvar Mensagem' ); } // Redirecionar $link = 'index.php?option=com_ola'; $this->setRedirect($link, $msg); } } ?>

O que fizemos foi pegar nosso modelo e disparar seu método salvar( ). Depois redirecionamos para obter a tela com a lista de mensagens com um aviso que deve ser mostrado no topo da página.

Salvar
Fig. 1 - Sucesso ao salvar

Deletar registros

Para implementar esta funcionalidade vamos ter que mexer adivinhe onde? No modelo, para dispormos de um método que faça isto, e no controlador ola para que ele possa controlar esta tarefa. Não vou repetir o código completo do modelo e do controlador - vou apenas mostrar as funções que devem ser adicionadas.

Atualizando o modelo

No modelo /models/ola.php vamos pegar as id dos registros que devem ser deletados e depois passá-los para a classe TableOla para que faça o serviço:

/** * Método para deletar registro(s) * * @access public * @return boolean True se bem sucedido */ function deletar() { $cids = JRequest::getVar( 'cid', array(0), 'post', 'array' ); $row =& $this->getTable(); foreach($cids as $cid) { if (!$row->delete( $cid )) { $this->setError( $row->getErrorMsg() ); return false; } } return true; }

Chamamos o método JRequest::getVar( ) para obter os dados da requisição. Depois chamamos o método $row->delete( ) para deletar a(s) linha(s). Guardando os erros no modelo torna possível recuperá-los mais tarde se assim o quisermos.

A tarefa deletar no controlador

Esta tarefa é parecida com a salvar:

/** * remover registro(s) * @return void */ function remove() { $modelo = $this->getModel('ola'); if(!$modelo->deletar()) { $msg = JText::_( 'Erro: Uma ou Mais Mensagens não puderam ser deletadas' ); } else { $msg = JText::_( 'Mensagem(s) Deletada(s)' ); } $this->setRedirect( 'index.php?option=com_ola', $msg ); }

Cancelar operações

Só falta mais um detalhe: dizer ao controlador o que deve ser feito caso uma operação de edição ou de adição de novo registro seja cancelada. Adicione este método ao controlador ola:

/** * cancela edição / novo registro * @return void */ function cancel() { $msg = JText::_( 'Operação Cancelada' ); $this->setRedirect( 'index.php?option=com_ola', $msg ); }

Hora do abraço

Despois desta maratona, nosso componente com_ola finalmente ficou pronto.

É a hora de partir pro abraço biggrin biggrin biggrin

E aqui está o componente Olá Pessoal versão 1.6, prontinho para ser instalado.

Índice da série de tutoriais Componente 1.5 MVC

  1. Componente 1.5 - Padrão MVC
  2. Componente 1.5 MVC - Frontend
  3. Componente 1.5 MVC - Frontend II
  4. Componente 1.5 MVC - A tabela
  5. Componente 1.5 MVC - Interface Admin
  6. Componente 1.5 MVC - Funcionalidade admin
  7. Componente 1.5 MVC - Funcionalidade admin II

Referência

http://dev.joomla.org/component/option,com_jd-wiki/Itemid,/id,components:hello_world_mvc4/">Hello World MVC 2 Component - Admin interface

mfx brokerручка ру официальный сайтменю никас харьков матовый экраналександр лобановскийпрофессиональный наборотзывы никас