Avaliação do Usuário

Estrela inativaEstrela inativaEstrela inativaEstrela inativaEstrela inativa
 


NOTA DE PUBLICAÇÃO

Este tutorial é uma tradução, com adaptação livre, do original Developing a Model-View-Controller (MVC) Component for Joomla!1.6 tutorial, de Christophe Demko, publicado no site de documentação do Joomla, o docs.joomla.org.

A tradução e publicação no Mabesi.com foi autorizada pelo próprio autor, com o qual entramos em contato, sendo a única condição imposta a de seguir as regras para documentação eletrônica do Joomla!, cuja licença pode ser encontrada em http://docs.joomla.org/JEDL., e que obriga, principalmente, a inclusão da informação da própria licença de uso e distribuição do documento, além de citar o nome do autor da obra original, o que fazemos com muito prazer.

 

USANDO O BANCO DE DADOS

 

Componentes normalmente gerenciam seu conteúdo usando o banco de dados. Durante a fase de instalação/desinstalação/atualização (install/uninstall/update) de um componente, você pode executar consultas SQL através do uso de arquivos de texto SQL.

Com o seu editor e gerenciador de arquivos preferido crie dois arquivos (idênticos), admin/sql/install.mysql.utf8.sql e admin/sql/updates/mysql/0.0.6.sql, contendo cada um deles:

DROP TABLE IF EXISTS `#__helloworld`;
 
CREATE TABLE `#__helloworld` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `greeting` varchar(25) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
 
INSERT INTO `#__helloworld` (`greeting`) VALUES
  ('Hello World!'),
  ('Good bye World!');

Este é o arquivo de instalação. Ele será executado se você incluir uma ordem apropriada no arquivo helloworld.xml:

<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="1.6.0" method="upgrade">

  <name>Hello World!</name>

  <!-- Os seguintes elementos são opcionais e sem restrição de formato -->
  <creationDate>July 2011</creationDate>
  <author>Plinio Mabesi</author>
  <authorEmail> plinio.mabesi (a) mabesi.com</authorEmail>
  <authorUrl> http://www.mabesi.com</authorUrl>
  <!-- Informações de Copyright apenas para exemplo!!! -->
  <copyright>Copyright © 2011 - Plinio Mabesi - All rights reserved</copyright>

  <license>Here you put any informations about license</license>
  <!-- O texto da versão fica registrado na tabela de componentes -->
  <version>0.0.6</version>

  <!-- A descrição é opcional e o padrão é o nome -->
  <description>Descrição do componente Hello World...</description>

  <install> <!-- Este trecho é executado na instalação -->
    <sql>
      <file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
    </sql>
  </install>
  <uninstall> <!-- Este trecho é executado na desinstalação -->
    <sql>
      <file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
    </sql>
  </uninstall>

  <update> <!-- Este trecho é executado em atualizações; Novo no Joomla! 1.6 -->
    <schemas>
      <schemapath type="mysql">sql/updates/mysql</schemapath>
    </schemas>
  </update>

  <!-- Seção de Cópia de Arquivos Principais do Site -->
  <!-- Perceba o atributo folder: Este atributo descreve a pasta de origem do
      pacote a partir da qual os arquivos são copiados para instalação,
      portanto os arquivos desta seção serão copiados da pasta /site/
      do pacote-->
  <files folder="site">
    <filename>index.html</filename>
    <filename>helloworld.php</filename>
    <filename>controller.php</filename>
    <folder>views</folder>>
    <folder>models</folder>
  </files>

  <administration>
    <!-- Seção Menu de Administração -->
    <menu>Hello World!</menu>
    <!-- Seção de Cópia de Arquivos Principais de Administração -->
    <!-- Perceba o atributo folder: Este atributo descreve a pasta de origem
      do pacote a partir da qual os arquivos são copiados para instalação,
      portanto os arquivos desta seção serão copiados da pasta /admin/
      do pacote -->
    <files folder="admin">
      <filename>index.html</filename>
      <filename>helloworld.php</filename>
      <!-- Seção de arquivos SQL -->
      <folder>sql</folder>
      <!-- tables files section -->
      <folder>tables</folder>
      <!-- models files section -->
      <folder>models</folder>
    </files>
  </administration>

</extension>

Faça o mesmo para o arquivo de desinstalação. Com o seu editor de arquivos favorito crie o arquivo admin/sql/uninstall.mysql.utf8.sql contendo:

DROP TABLE IF EXISTS `#__helloworld`;

ADICIONANDO UM NOVO TIPO DE CAMPO

Até agora nós usamos um tipo de campo codificado para exibir as mensagens. Porém agora precisamos usar nosso banco de dados para a escolher a mensagem a ser utilizada.
Altere o arquivo site/views/helloworld/tmpl/default.xml e coloque essas linhas:

 

addfieldpath="/administrator/components/com_helloworld/models/fields"
type="list"
default="1"
<option value="1">Hello World!</option>
<option value="2">Good bye World!</option>

 

O arquivo deverá, então, ficar como este:

<?xml version="1.0" encoding="utf-8"?>
<metadata>
  <layout title="COM_HELLOWORLD_HELLOWORLD_VIEW_DEFAULT_TITLE">
    <message>COM_HELLOWORLD_HELLOWORLD_VIEW_DEFAULT_DESC</message>
  </layout>
  <fields
    name="request"
    addfieldpath="/administrator/components/com_helloworld/models/fields"
  >
    <fieldset name="request">
      <field
        name="id"
        type="helloworld"
        label="COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_LABEL"
        description="COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_DESC"
      />
    </fieldset>
  </fields>
</metadata>

Essas linhas introduzem um novo tipo de campo e dizem ao Joomla para procurar a definição do campo na pasta /administrator/components/com_helloworld/models/fields.

Com o seu editor de arquivos favorito crie o arquivo admin/models/fields/helloworld.php contendo:

<?php
// No direct access to this file
// Sem acesso direto ao arquivo
defined('_JEXEC') or die;
 
// import the list field type
// importando a lista de tipos de campo
jimport('joomla.form.helper');
JFormHelper::loadFieldClass('list');
 
/**
 * HelloWorld Form Field class for the HelloWorld component
 */
class JFormFieldHelloWorld extends JFormFieldList
{
  /**
   * The field type.
   * O tipo de campo.
   *
   * @var    string
   */
  protected $type = 'HelloWorld';
 
  /**
   * Method to get a list of options for a list input.
   * Método para obter a lista de opções para uma entrada de lista.
   *
   * @return  array    An array of JHtml options.
   */
  protected function getOptions() 
  {
    $db = JFactory::getDBO();
    $query = $db->getQuery(true);
    $query->select('id,greeting');
    $query->from('#__helloworld');
    $db->setQuery((string)$query);
    $messages = $db->loadObjectList();
    $options = array();
    if ($messages)
    {
      foreach($messages as $message) 
      {
        $options[] = JHtml::_('select.option', $message->id, $message->greeting);
      }
    }
    $options = array_merge(parent::getOptions(), $options);
    return $options;
  }
}

O novo tipo de campo exibe uma lista drop-down de mensagens para você escolher. Você pode ver o resultado dessa mudança na seção de gerenciamento de menu para o item helloworld.


EXIBINDO A MENSAGEM ESCOLHIDA

Quando um item de menu deste componente é criado/atualizado, o Joomla armazena o identificador da mensagem. O modelo HelloWorldModelHelloWorld agora deve processar a mensagem de acordo com este identificador e os dados armazenados no banco de dados.

Altere o arquivo site/models/helloworld.php:

<?php
// No direct access to this file
// Sem acesso direto ao arquivo
defined('_JEXEC') or die('Restricted access');
 
// import Joomla modelitem library
// importando a biblioteca modelitem do Joomla
jimport('joomla.application.component.modelitem');
 
/**
 * HelloWorld Model
 */
class HelloWorldModelHelloWorld extends JModelItem
{
  /**
   * @var string msg
   */
  protected $msg;
 
  /**
   * Returns a reference to the a Table object, always creating it.
   * Retorna uma referência ao objeto Table, sempre criando-o.
   *
   * @param  type  The table type to instantiate
   * @param  string  A prefix for the table class name. Optional.
   * @param  array  Configuration array for model. Optional.
   * @return  JTable  A database object
   * @since  1.6
   */
  public function getTable($type = 'HelloWorld', $prefix = 'HelloWorldTable', 
                                                                      $config = array())
  {
    return JTable::getInstance($type, $prefix, $config);
  }
  /**
   * Get the message
   * Obtem a mensagem
   * @return string The message to be displayed to the user
   */
  public function getMsg() 
  {
    if (!isset($this->msg)) 
    {
      $id = JRequest::getInt('id');
      // Get a TableHelloWorld instance
      $table = $this->getTable();
 
      // Load the message
      $table->load($id);
 
      // Assign the message
      $this->msg = $table->greeting;
    }
    return $this->msg;
  }
}

O modelo agora procura a classe TableHelloWorld para obter a mensagem. Esta classe de tabela deve ser definida no arquivo admin/tables/helloworld.php:

<?php
// No direct access
// Sem acesso direto
defined('_JEXEC') or die('Restricted access');
 
// import Joomla table library
// importando a biblioteca table
jimport('joomla.database.table');
 
/**
 * Hello Table class
 */
class HelloWorldTableHelloWorld extends JTable
{
  /**
   * Constructor
   * Construtor
   *
   * @param object Database connector object
   */
  function __construct(&$db) 
  {
    parent::__construct('#__helloworld', 'id', $db);
  }
}

Você não deve notar qualquer diferença, mas se você acessar o banco de dados deve ver uma tabela chamada jos_helloworld com duas colunas: id e saudação. Deve ver também duas entradas: Hello World! e Good bye World.

EMPACOTANDO O COMPONENTE

Este deve ser o conteúdo atual do seu diretório de código:

  • helloworld.xml
  • site/index.html
  • site/helloworld.php
  • site/controller.php
  • site/views/index.html
  • site/views/helloworld/index.html
  • site/views/helloworld/view.html.php
  • site/views/helloworld/tmpl/index.html
  • site/views/helloworld/tmpl/default.xml
  • site/views/helloworld/tmpl/default.php
  • site/models/index.html
  • site/models/helloworld.php
  • admin/index.html
  • admin/helloworld.php
  • admin/sql/index.html
  • admin/sql/install.mysql.utf8.sql
  • admin/sql/uninstall.mysql.utf8.sql
  • admin/sql/updates/index.html
  • admin/sql/updates/mysql/index.html
  • admin/sql/updates/mysql/0.0.1.sql
  • admin/sql/updates/mysql/0.0.6.sql
  • admin/models/index.html
  • admin/models/fields/index.html
  • admin/models/fields/helloworld.php
  • admin/tables/index.html
  • admin/tables/helloworld.php

Crie um arquivo compactado do conteúdo deste diretório e instale -o usando o gerenciador de extensões do Joomla! 1.6.
Você pode adicionar um item de menu deste componente usando o gerenciador de menus no back-end.

Componente MVC para Joomla 1.6 - Parte 05                               Componente MVC para Joomla 1.6 - Parte 07

{jcomments on}

Seja social. Compartilhe!