Sie sind auf Seite 1von 32

Coletnea Programador 1oomla!

Tutoriais de
desenvolvimento. Artigo nr 1 Objeto 1Database
Escrito pelo Julio Coutinho
O tamanho do texto
O Imprimir
O E-mail
QualiIique este item
O
O 1
O 2
O 3
O 4
O 5
(0 votos)
Estou terminando um componente MVC para o Joomla 1.5.
Foram meses de pesquisa, estudo e muita programao para
que o mesmo estivesse dentro dos padres utilizados pelo
Framework do Joomla e totalmente documentado.
O projeto tornou-se um grande desaIio ja que um dos pontos
chaves seria desenvolver o componente dentro dos padres
de projeto utilizados pelo Joomla e dentro do conceito de
MVC (model view controller) da programao orientada a
objetos.Alguns investimentos Ioram Ieitos, dentre eles a aquisio do livro Mastering
Joomla! 1.5 Extension and Framework Development que pode ser encontrado no
Amazon.com.

Inicio agora uma coletnea de artigos voltados para o desenvolvimento de componentes
para Joomla, seguindo todos os padres exigidos pelo seu Iramework. Ou seja, o
componente devera ser desenvolvido orientado a objetos (esquea a programao
procedural) e deveremos seguir os padres de projeto.

Esta coletnea sera longa, tecnica e voltada para programadores. Abordaremos os
capitulos mais importantes do livro dentro do escopo: " Development Ior Joomla". Ja
me perguntaram por qu Iazer isto, uma vez que sou um dos pioneiros no distrito
Iederal em desenvolvimento MVC para o Joomla 1.5. O que vou ganhar traduzindo e
compartilhando o conhecimento com todos, inclusive com os concorrentes? Minha
resposta: " No tenho concorrentes e sim parceiros. Para que serve o conhecimento se
no Ior compartilhado com o proximo? "

Vamos a luta... ;-)
O Banco de Dados
Este artigo detalha o papel do banco de dados no Joomla!. Ele deIine algumas regras,
que temos de acatar. Ele explica diIerentes maneiras em que podemos consultar a base
de dados. Tambem abrange brevemente a emulao do ADOdb disponivel para os
desenvolvedores que desejam entender as aplicaes existentes.

Joomla atualmente Ioi concebido para utilizar o SGBD (Sistema Gerenciador de Banco
de Dados) MySQL. No entanto, a arquitetura permite a implementao de outros
SGBD. Existe alguma incerteza em torno da questo do suporte a outras bases de dados,
devido a sintaxe utilizada nas consultas e Iunes que so especiIicas para o MySQL.

O Acleo de Dados

Grande parte dos dados que vemos em Joomla! e armazenado no banco de dados. Uma
instalao basica do Joomla 1.5.x tem 36 tabelas. Algumas delas esto relacionadas as
extenses e outras ao Iuncionamento do nucleo interno do Joomla!

Existe um esquema de dados oIiciais, que descreve as tabelas acima criadas durante a
instalao. Para obter mais inIormaes, por Iavor consulte: http://developer.joomla.org

Temos acesso a Base de Dados do Joomla! usando o objeto 1Database. A classe
1Database e uma classe abstrata, que e estendida para diIerentes SGBDs.

Atualmente, existem apenas dois SGBD incluidos no nucleo do Joomla! MySQL e
MySQLi. Temos acesso a classe global 1Database objeto usando 1Factory:

$db & 1Factory::getDBO();

stendendo a base de dados

Quando criamos extenses, geralmente queremos que elas armazenem dados de alguma
Iorma, na base de dados. Se estamos usando o banco de dados, e importante sabermos
estend-lo de Iorma correta. Mais inIormaes sobre este tema nos proximos artigos da
coletnea sobre desenvolvimento de componentes MVC para Joomla 1.5.

Prefixo das tabelas

Todas as tabelas possuem um preIixo, normalmente jos, que auxilia na utilizao de
um unico banco de dados para multiplos projetos em Joomla!. Quando vamos escrever
consultas SQL, para abstrairmos a variavel de preIixo da tabela, usamos um preIixo
simbolico que e substituido com o preIixo real em tempo de execuo. Normalmente, o
preIixo simbolico e # , mas podemos especiIicar outro preIixo alternativo, se
quisermos.

Convenes de Schemas

Quando criamos as tabelas de nossas extenses, devemos seguir algumas convenes
padronizadas. A conveno mais importante e o nome da tabela. Todas as tabelas
devem utilizar o preIixo de tabela e deve comear com o nome da extenso. Se a tabela
esta armazenando uma entidade especiIica, adicione o plural do nome da entidade ate o
Iinal do nome da tabela separados por um sublinhado. Por exemplo, uma tabela para
os itens da extenso' Minha Extenso', seria chamada de # __myExtension_items.

Todos os nomes dos campos da tabela devero ser minusculos e usar sublinhado como
separador de palavras; voc deve evitar o uso de sublinhados se eles no so
necessarios. Por exemplo, voc pode nomear o campo endereo de email como e-mail.
Se voc tivesse um campo para o email primario e outro para um e-mail secundario,
voc poderia chama-los de e-mail e emailsecundario; no ha razo para nomear o
campo do endereo de email principal como emailprincipal.

Se voc estiver usando como chave primria um registo de nome ID, voc deve
marc-lo como um campo do tipo INT - AUTO_INCREMENT - NOT NULL. Isto
permitir que voc use o Framework do 1oomla! de forma mais eficaz.

Campos Comuns
Podemos utilizar alguns campos comuns em nossas tabelas. O uso desses campos nos
permitira tirar partido das vantagens da estrutura do Joomla. Iremos discutir a Iorma de
implementar e manipular estes campos, utilizando a classe JTable, mais tarde nos
proximos artigos da coletnea sobre desenvolvimento de componentes MVC para
Joomla 1.5.

Publicao

Usamos publicao a Iim de determinar e a exibio de dados. 1oomla utiliza um
campo especial chamado published, do tipo tinyint (1), onde 0 no publicado e 1
publicado.

its

se quisermos manter controle do numero de vezes que um registro tenha sido visto,
podemos usar o campo especial hits, do tipo inteiro e com o valor padro 0.

Checagem
Para evitar que mais de um usuario tente editar um registro no mesmo momento,
podemos veriIicar os registros (um tipo de lock de registro). Usamos dois campos para
fazer isso, checked_out e checked_out_time. Checked_out, do tipo inteiro, tem o ID
do usurio que tenha sado do registro. Checked_out_time, do tipo datetime,
mantm a data e a hora em que o registro foi verificado. A data nula e o ID do
usurio registrado 0 se o registro no verificado.

Ordenando as Consultas

Muitas vezes queremos permitir que os administradores tenham a capacidade de
escolher a ordem em que aparecem os itens. A ordem do campo, do tipo inteiro, pode
ser usada para registros de numero sequencial para determinar a ordem em que eles so
exibidos. Este campo no precisa ser exclusivo e pode ser utilizado em conjunto com a
clausulas WHERE para Iormar grupos de ordenao.

Parmetros dos campos

Nos usamos um parmetro de campo, normalmente chamado de params, para armazenar
inIormaes adicionais sobre registros, o que e normalmente utilizado para armazenar
os dados e determinar como um registro sera exibido. Os dados contidos nestes campos
so codiIicadas como INI STRINGS (que lidamos com a classe JParameter). Antes de
utilizar um parmetro de campo, devemos analisar cuidadosamente os dados que
tencionamos alojar no campo. Os dados s devem ser armazenados em um campo de
parmetro se todos os critrios a seguir forem verdadeiros:
O No usado para classificar registros;
O No utilizados nas pesquisas;
O S existe para alguns registros; e
O No fazem parte de um relacionamento entre tabelas do banco de dados.

xemplo de esquema

Imagine que temos uma extenso chamada "Minha Extenso" e uma entidade
denominada Ioobar. O nome da tabela e # myextensionIoobars. Este esquema
descreve o quadro:


Esta tabela utiliza todos os campos comuns e utiliza o campo ID como chave
primria do tipo INT AUTO INCREMENT. Quando chegar o momento de definir
as nossas prprias tabelas, temos de assegurar que usamos os tipos de dados
corretos: NOT NULL, AUTO INC, UNSIGNED e DEFAULT.

O script sql abaixo possui as instrues necessarias para a criao da tabela:

CREATE TABLE IF NOT EXISTS `#myextensionIoobar` (
`ID` int(11) NOT NULL,
`content` text NOT NULL,
`checkedout` int(10) unsigned NOT NULL deIault '0',
`checkedouttime` datetime NOT NULL deIault '0000-00-00 00:00:00',
`params` text NOT NULL,
`ordering` int(10) unsigned NOT NULL deIault '0',
`hits` int(10) unsigned NOT NULL deIault '0',
`published` tinyint(1) unsigned NOT NULL deIault '0',
PRIMARY KEY (`ID`)
) ENGINEMyISAM DEFAULT CHARSETUTF-8;
Ate o proximo artigo...
Artigo traduzido e adaptado por 1lio Coutinho. O original encontra-se no livro Mastering 1oomla!
1.5 Extension and Framework Development - 1ames Kennard, captulo 3 The Database

Coletnea Programador 1oomla! Tutoriais de
desenvolvimento. Artigo nr 2 Manipulando os dados
Escrito pelo Julio Coutinho
O tamanho do texto
O Imprimir
O E-mail
QualiIique este item
O
O 1
O 2
O 3
O 4
O 5
(0 votos)
Campos para registro de datas
Regularmente utilizamos campos do tipo datetime para
gravar a data e a hora em um determinado campo da tablea.
Quando usamos estes campos, precisamos estar atentos ao
eIeito dos Iusos horarios. Todas as datas e horarios devem
ser registradas em UTC 0 (GMT/Z).
Para exibio de datas e horarios podemos usar a classe
1Date. A classe 1Date nos permite Iacilmente analisar datas, bem como apresenta-las
em Iormatos padres de saida, com aplicao de compensao do Iuso horario.

idar com Requisitos de Multilinguagem
Caracteres Unicode usando UTF-8 - Ao contrario do ASCII e ANSII, Unicode e um
mutli-byte character set, que usa mais de oito bits (um byte) por cada caracter. Quando
usamos UTF-8, o comprimento do byte do caracter varia.
InIelizmente, as verses anteriores a 4.1.2, do MySQL assumem que os caracteres so
sempre de oito bits (um byte), o que gera alguns problemas. Para combater o problema
ao desenvolver um componente temos a capacidade de deIinir diIerentes arquivos SQL
(responsaveis pela criao e excluso das tabelas do componente) para servidores que
suportam e no suportam UTF-8. Geralmente os arquivos so nomeados como:
installutI8.sql e uninstallutI8.sql para servidores que suportam utI-8 e
installnoutI8.sql e uninstallnoutI8.sql para servidores que no suportam utI-8.

Em servidores MySQL que no suportam UTF-8, quando nos criamos campos, que
deIinem um comprimento para o caracter, estamos realmente deIinindo o tamanho em
bytes.
Entretanto, se tentarmos armazenar caracteres UTF-8 que so mais do que um byte,
podemos ultrapassar o tamanho do campo. Para combater isso, devemos aumentar o
comprimento do tamanho do campo para tentar acomodar strings UTF-8. Por exemplo,
um campo do tipo varchar (20) se torna um campo varchar (60) se usarmos UTF-8.
Devemos considerar o triplo do tamanho do campo, porque, embora no padro UTF-8
os caracteres podem ter mais de trs bytes, a maioria dos caracteres comuns possuem no
maximo trs bytes.
Isso levanta outra questo: se usarmos um campo do tipo varchar (100) em um servidor
MySQL, que no suporta UTF-8, teriamos que deIini-lo como um campo do tipo
varchar (300). Nos no podemos Iazer isso porque os campos do tipo varchar tm um
tamanho maximo de 255 caracteres. Logo a soluo seria tranIormar este campo em um
campo do tipo text e levar em conta que nestes casos, um campo do tipo varchar (100)
tornase-a um campo do tipo text.

Como um exemplo, a tabela #__content do nucleo do Joomla possui um campo
chamado titulo. Para os servidores MySQL que suportam UTF-8, o campo e deIinido
como: 'title' varchar (255) NOT NULL default para servidores MySQL que no
suportam UTF-8, o campo e deIinido como: 'title' text NOT NULL default
Devemos tambem estar cientes de que usar uma verso do MySQL que no suporte
UTF-8 aIetara a Iuno de manipulao de strings. Por exemplo, ordenar por um campo
do tipo string pode produzir resultados inesperados. Embora nos possamos superar isto
usando pos-processamento em nossos scripts usando a classe JString, a soluo
recomendada e a atualizao para a verso mais recente do MySQL.

Consultando a base de dados
Quando eIetuamos uma consulta, inIormamos ao objeto de consulta global 1Database o
tipo de consulta que queremos executar. Fazemos isso usando o mtodo setQuery();
Por exemplo:
$db & JFactory::getDBO();

$result &db-~setQuery($query);
Assim que tivermos deIinido a consulta que queremos executar, usaremos o mtodo
query() para executar a mesma. Isto e semelhante a usar a funo mysql_query () do
PHP. Se a consulta Ior bem sucedida e e um SELECT, SHOW, DESCRIBE,
EXPLAIN ou QUERY, um registro ou conjunto de registros sera devolvido. Se a
consulta Ior bem sucedida e no e um dos tipos de consulta acima, sera retornado
verdadeiro (true). Se a consulta Ialhar, sera devolvido Ialsa (Ialse).
$db & JFactory::getDBO();

iI (!$result $db-~setQuery($query))


// handle Iailed query
// use $table -~getError() Ior more inIormation
}


screvendo Consultas
Existem algumas regras que precisam ser obedecidas para construirmos consultas contra
a base de dados SQL.
O utilizar o simbolo # como preIixo no inicio do nome de todas as tabelas;
O utilizar o metodo nameQuote() para encapsular os elementos chamados pela
consulta; e
O utilizar o metodo Quote() para encapsular valores.
O preIixo simbolico garante o uso correto do preIixo de tabela para a atual instalao do
Joomla; uma alternativa para o preIixo simbolico # __ pode ser utilizado se Ior
necessario. nameQuote() garante que os elementos denominados sero encapsulados.
Quote() garante que os valores sero encapsulados.
Este exemplo demonstra a utilizao de todas estas regras.

$db JFactory::getDBO();

$query ' SELECT * FROM '

.$db-~nameQuote('#test')

.' WHERE '

.$db-~nameQuote('name')

.' '

.$db-~Quote('Some Name');

Se estivessemos usando um driver para uma base de dados MySQL ou MySQLi ,
$query seria igual ao seguinte comando SQL:

SELECT * FROM ' jostest ' WHERE ' name ' " Some Name ";


Recuperando Resultados da Base de Dados
Poderiamos usar o mtodo query() no resultado do processo. No entanto, e muito mais
Iacil usar um dos outros mtodos 1Database, que ira receber os resultados de uma
consulta em um numero de diIerentes Iormatos.
Para ajudar a explicar cada um dos metodos, utilizaremos como exemplo uma tabela
chamada # __test. A tabela tem dois campos:
O id , do tipo auto-increment, chave primaria; e
O name, do tipo varchar.
Abaixo temos o conjunto de registros existentes em nossa tabela e vamos utiliza-los
para Iins de demonstrao.

id name
1 Foo
2 Bar
Quais os metodos escolheremos para usar dependera de trs coisas: os dados que
queremos, o Iormato em que queremos os dado e nossa preIerncia pessoal.
Grande parte do nucleo Joomla preIere metodos que retornam objetos.

Para eIeitos destes exemplos no vamos nos incomodar com os mtodos nameQuote()
e Quote().

loadResult (): String - Carregando um resultado da consulta
Este metodo carrega o valor da primeira celula do conjunto de resultados. Se voc
selecionou todos os dados da nossa tabela, este metodo iria devolver o ID para o
primeiro registro, neste exemplo: 1.
Isto til quando se deseja acessar um nico campo em um nmero conhecido de
registros. Por exemplo, voc pode querer saber o nome do registro 2:

$query 'SELECT 'name' FROm '#test' WHERE 'id'2';
$db & JFactory::getDBO();
$db -~setQuery($query);
echo $db -~loadResult();

`` Resultado na tela ``
Bar

loadResultArray (numinarray: int ): array

Este metodo carrega uma coluna especiIica, no caso a numinarray. A coluna e
identiIicada pela sua posio logica no conjunto de resultados.

$query 'SELECT 'name' FROM '#test'';
$db &JFactory ::getDBO();
$db -~setQuery($query);
printr($db-~loadResultArray());

`` Resultado na tela ``
Array
(
0] > Foo
1] > Bar
)


loadAssoc():array
Este metodo carrega o primeiro registro como um array associativo usando a coluna
nomes da tabela como chave da matriz. Isto e util quando estamos tratando apenas de
um registo individual. Se a consulta retorna mais de um registro, o primeiro registro do
grupo de resultados sera utilizado:
$query 'SELECT * FROM '#test'';

$db & JFactory::getDBO();

$db-~setQuery($query);

printr($db-~loadAssoc());

`` Resultado na Tela ``
Array
(
id] > 1
name] > Foo
)


loadAssocist(Key: string "): array
Este metodo carrega um array de arrays associativos ou um array associativo de arrays
associativos. Se especiIicar o parmetro chave, a matriz retornada usa chaves do registro
como o array chave:
$query 'SELECT * FROM '#test'';
$db & JFactory::getDBO();
$db -~setQuery($query);
printr($db-~loadAssocList());

`` Resultado na Tela ``
Array
(
0] > Array
(
id] > 1
name] > Foo
)
1] > Array
(
id] > 2
name] > Bar
)
)


loadObject(): stdClass
Este metodo carrega o primeiro registro como um objeto utilizando as propriedades da
coluna nomes da tabela. Isto e util quando estamos apenas a tratar de um registo
individual. Se a consulta retorna mais de um registro, o primeiro registro do grupo de
resultados sera utilizado:
$query 'SELECT * FROM '#test'';
$db & JFactory::getDBO();
$db-~setQuery($query);
printr($db-~loadObject());

`` Resultado na Tela ``
stdClass Object
(
id] >1
name] > Foo
)


loadObjectList(Key: string "): array
Este metodo carrega um array de objetos stdClass ou um array associativo de objetos
stdClass. Se especiIicar o parmetro chave, a matriz retornada usa chaves do registro
como o array chave:
$query 'SELECT * FROM '#test'';
$db & JFactory::getDBO();
$db -~setQuery($query);
printr($db-~loadObjectList());

`` Resultado na Tela ``
Array
(
0] > stdClass Object
(
id] > 1
name] > Foo
)
1] > stdClass Object
(
id] >2
name] > Bar
)
)


loadRow (): array

Este metodo carrega o primeiro registro como uma matriz. Isto e util quando estamos
apenas a tratar de um registro individual. Se a consulta retorna mais de um registro, o
primeiro registro do grupo de resultados sera utilizado:

$query 'SELECT * FROM '#test'';
$db & JFactory::getDBO();
$db-~setQuery($query);
printr($db-~loadRow());

`` Resultado na Tela ``
Array
(
0] > 1

1] > Foo
)


loadRowist(Key:int):array
Este metodo carrega um array de arrays associativos ou um array de arrays. Se
especiIicar o parmetro chave, a matriz retornada usa a chave de registro da matriz
chave. Ao contrario dos outros metodos de carregamento de dados, a chave e a posio
logica da chave chave primaria no campo do conjunto de resultados:
$query 'SELECT * FROM '#test'';
$db & JFactory::getDBO();
$db -~setQuery($query);
printr($db-~loadRowList(0));

`` Resultado na Tela ``
Array
(
0] > Array
(
0] >1
1] >Foo
)

1] > Array

(
0] >2
1] >Bar
)
)

&sando ADOdb
ADOdb e uma camada de abstrao de dados do PHP liberada sob a licena BSD.
ADOdb suporta um grande numero de banco de dados. Joomla no utiliza ADOdb, mas
emula algumas Iuncionalidades do ADOdb em sua propria camada de abstrao de
dados.

Nos so devemos usar o metodo ADOdb em aplicaes cuja portabilidade depende de
ADOdb ou se estamos desenvolvendo extenses que queremos que Iuncionem como
aplicaes autnomas usando ADOdb.

Joomla usa a classe JRecordSet classe para emular a classe ADORecordSet do ADOdb.
A classe JRecordSet ainda no esta completa e no inclue todas as Iuncionalidades do
metodo ADORecordSet. Este exemplo mostra o uso basico da classe JRecordSet; $linha
e uma matriz:
$db & JFactory ::getDBO();
$rs $db-~Execute('SELECT * FROM #test');
WHILE ($row $rs-~IetchRow())

//processamento da variavel $row
}
Joomla nos Iornece a poderosa classe abstrata 1Table, com ela podemos realizar
muitas Iunes basicas nos registros existentes nas tabelas. Para cada tabela que
pretendemos utilizar a classe JTable, devemos criar uma nova subclasse.
Ao criar uma subClasse JTable devemos seguir algumas convenes especiIicas. Estas
convenes nos permitem integrar as nossas extenses em Joomla e o Framework do
Joomla.

Assumindo que estamos construindo um componente, nossas subclasses JTable devem
estar localizadas em arquivos separados dentro de um diretorio chamado tables, que por
sua vez devera estar dentro na raiz do diretorio administrativo do componente.
Ex:
com_myextension
admin
tables
myextension.php
O nome da classe da tabela devera ser igual ao da entidade existente no banco de dados.
Por exemplo: se existe uma tabela chamada minhaextensao, o nome do arquivo sera
minhaextensao.php.

Iremos utilizar o schema da tabela, que deIinimos anteriormente no primeiro artigo da
coletnea, para a entidade Ioobar na extenso 'My Extension ", para demonstrar a Iorma
como usamos a classe JTable em conjugao com uma tabela da base de dados. Voc
pode querer se Iamiliarizar com o schema antes de continuar.

A classe e chamada TableFoobar e esta localizada no arquivo
JPATHCOMPONENTADMINISTRATOR.DS. "tables". DS '. Foobar.php'. A
primeira coisa que devemos Iazer em nossa classe e deIinir as propriedades publicas. As
propriedades publicas esto diretamente relacionadas com os campos e devem ter
exatamente os mesmos nomes. Nos usamos estas propriedades como um "buIIer" para
armazenar registros individuais.
A segunda coisa que precisamos Iazer e deIinir o construtor. Para utilizar o mtodo
1Table::getInstance(), que deve ter prioridade sobre o construtor JTable, com um
construtor que tem um unico parmetro reIerenciado, o objeto do banco de dados.
A terceira coisa que precisamos Iazer e anular o mtodo check(). Este metodo e
utilizado para validar o conteudo do "buIIer", retornando um resultado Booleano. Se a
validao com o metodo check() Ialhou, usamos o metodo setError() para deIinir uma
mensagem que explica o motivo pelo qual a validao Ialhou.

/**

* #myextensionIoobars table handler
*
*/

class TableFoobar extends JTable


/** var int Primary key */
var $id null;
/** var string Content */
var $content null;
/** var int checked-out owner */
var $checked-out null;
/** var string Checkedouttime */
var $checkedouttime null;
/** var string Parameters */
var $params null;
/** var int Order Position */
var $ordering null;
/** var int Number oI views */
var $hits null;

/**
* Constructor
*
* param database Database object
*/

Iunction construct( &$db )

parent::construct('#myextensionIoobars', 'id', $db);
}

/**
* validation
*
* return boolean true iI buIIer is valid
*/

Iunction check()

iI(!this-~content)

$this-~setError(JText::('Your Foobar must contain some content'));
return Ialse;
}
return true;
}
Agora que criamos a nossa classe TableFoobar o que Iazemos com ela? Bem, antes de
tudo, precisamos de instanciar o objeto TableFoobar usando o mtodo esttico
1Table:: getInstance().
JTable::addIncludePath(JPATHCOMPONENTADMINISTRATOR.DS. 'tables');

$table JTable::getInstance('Ioobar' , 'Table');

Note que em vez de incluir o arquivo Ioobar.php, dizemos ao JTable onde esta o
diretorio contendo o arquivo. Quando JTable vem para criar uma instncia do objeto
TableFoobar, se a classe no os deIiniu, ele ira procurar em todos os caminhos do
JTable para incluir um arquivo chamado Ioobar.php.
Ate o proximo artigo...
Artigo traduzido e adaptado por 1lio Coutinho. O original encontra-se no livro Mastering 1oomla!
1.5 Extension and Framework Development - 1ames Kennard, captulo 3 The Database
Coletnea Programador 1oomla! Tutoriais de
desenvolvimento. Artigo nr 3 CRUD
Escrito pelo Julio Coutinho
O tamanho do texto
O Imprimir
O E-mail
QualiIique este item
O
O 1
O 2
O 3
O 4
O 5
(0 votos)
CR&D (CRA1 RAD &PDA1 D1 )

e o nome dado para as quatro tareIas mais comuns de
manipulao de dados: Criar, Ler, Atualizar e Excluir
registros. Vamos acompanhar um registro atraves de seu
curto tempo de vida com 'CRUD' .

Ao longo de todo o exemplo sobre 'CRUD' usaremos a
varivel $tabela reIerindo-se a uma instncia da classe
TableFoobar e a variavel $id reIere-se a identiIicao do
registro que estamos gerenciando.

Neste exemplo, criamos um novo registro.
A variavel $tabela e uma instncia da classe TableFoobar.
$table-~reset();

$table-~set('content', "Lorem ipsum dolor sit amet");

$table-~set('ordering', $table-~getNextOrder());

iI($table -~check())

iI (!table-~store())

// handle Iailed store
// use $table-~getError() Ior an explanation
}
}
else

// handle Iailed check
// use $table-~getError() Ior an explanation
}

O mtodo reset() garante que o buIIer da tabela esta vazio. O metodo retorna todas as
propriedades para seus valores padro especiIicado pela classe. O mtodo
getNextOrder() determina o proximo espao na ordenao dos registros. Se no
existirem registos, este sera o nr 1.

Caso o mtodo check() retorne Ialso, devemos ter alguma movimentao no lugar. Na
maioria dos casos o uso de um redirecionamento e apresentao de uma mensagem de
erro para o metodo check() sera suIiciente.
Vamos arrumar o nosso exemplo. Alguns dos campos tm valores deIinidos na tabela, o
buIIer so contera dados apos o registro ser criado. Quando nos criamos um novo
registro, porque a classe sabe qual e a chave primaria da tabela, as propriedades do
buIIer da chave primaria e automaticamente atualizada.

Aps o exemplo anterior o buffer da varivel $tabela fica parecido com isto:

id] > 1

content] > Lorem ipsum dolor sit amet

checked_out] >

checked_out_time] >

params] >

ordering] >

hits] > 0

Apos armazenar o novo registro, o banco de dados pode garantir que o buIIer esta vazio.
Este exemplo carrega o novo registro da tabela para o buIIer.

Agora, o buffer ser similar a este:

id] > 1

content] > Lorem ipsum dolor sit amet

checked_out] > 0

checked_out_time] > 0000-00-00 00:00:00

params] >

ordering] > 1

hits] > 0

Em vez de carregar os registos recentemente adicionados, poderiamos modiIicar a
classe TableFoobar para que os valores padro correspondessem diretamente aos
valores padro da tabela no banco de dados. Desta Iorma, reduzimos as consultas ao
banco de dados e no temos de recarregar o registro.

No entanto, alguns dos valores so dependentes do banco de dados e teriamos que
modiIicar o construtor e substituir o mtodo reset(). Por exemplo, o valor padro do
campo checked_out_time $db->getNullDate(), e no podemos usar isso quando
deIinimos parmetros.

A Iorma como o buIIer da tabela atualizada Iica depois de criar o novo registro e
exatamente a mesma que gostariamos de carregar (ler) qualquer registo existente. Este
exemplo mostra como estamos carregando um registro para o buIIer:

iI (!$table-~load($id))


// handle unable to load
// use $table-~getError() Ior as explanation

}
Bem, estamos a todo vapor atraves deste CRUD. Em seguida iremos atualizar um
registro existente. Existem duas maneiras de atualizar um registro. Podemos inserir os
dados atualizados para o buIIer e atualizar o registro. Alternativamente, nos podemos
carregar o registro, inserir os dados atualizados para o buIIer, e atualizar o registro. Este
exemplo mostra como vamos implementar a primeira opo que e a mais simples:

// set values

$table-~reset();

$table-~setVar('id', $id);

$table-~setVar('content', JRequest::getString('content'));

iI ($table-~check())

iI(!table-~store())

//handle Iailed update
// use $table-~getError() Ior an explanation
}
}
else

//handle invalid input
// use $table-~getError() Ior an explanation
}
Se este SQL Ialhar, nos no sabemos ainda se e devido a um ID invalido ou um
problema mais complexo na hora da gravao. Ha um equivoco que precisamos estar
conscientes quando se utiliza o mtodo store(). Ele so atualiza os valores que no so
nulos; podemos Iora-lo a atualizar Nulos, passando um parmetro verdadeiro para o
metodo store(). O problema com isto e que precisamos de ter o registro carregado na
memoria para que no sobrescrever nada com valores nulos. Este exemplo mostra como
podemos implementar este SQL.

iI ($table-~load($id))

// handle Iailed load
// use $table-~getError() Ior an explanation
}
else


$table-~setVar('content', JRequest::getString('content'));
iI($table-~check())

iI(!$table-~store(true))

// handle Iailed update
// use $table-~getError() Ior an explanation
}
}
else


// handle invalid input
// use $table-~getError() Ior an explanation
}
}

A ultima ao que ira ocorrer no ciclo da vida de um registro qualquer e a supresso.
Apagar um registro utilizando a subclasse 1Table e muito Iacil. Este exemplo mostra
como excluir um registro.

iI(!$table-~delete($id))

// handle Iailed delete
}

Se no passamos um ID para o mtodo delete(), o ID no buIIer sera utilizado. E
importante ter em mente que, se voc passar um ID do buIIer, o ID do buIIer sera
atualizado.

Se estamos excluindo um registro que tem relaes com outras tabelas, podemos
veriIicar se ha dependncias usando o mtodo canDelete(). O metodo canDelete() tem
um parmetro, um array bidimensional que permite a "deleo em cascata". O interior
dos arrays deve conter as chaves, idIield, nome, joinIield, e label.
O idIield e o nome da chave primaria na tabela relacionada;
O nome e o nome da tabela relacionada;
O joinIield e o nome da chave estrangeira na tabela relacionada; e
O label e a descrio da relao com a utilizao na mensagem de erro se Iorem
encontrados quaisquer dependncias.

Imagine que existe uma outra tabela chamada # __myextension_children; esta tabela
tem uma chave primria chamada childid e uma chave estrangeira chamada
parent, que esta relacionada com o campo id que a chave primria da tabela
#__myextension_foobars. Neste exemplo, verificaremos que no existem registros
dependentes na tabela #__myextension_children antes de excluir um registro da
tabela # __myextension_foobars.

$join1 array('idIield' ~ 'childid',
' name ' ~ ' #myextensionchildren' ,
' joinIield ~ ' parent' ,
' label ' ~ ' children ' );
$joins array($join1);
iI ($table-~canDelete($id, $joins))

iI (!table-~delete($id))

//handle Iailed delete
// use $table-~getError() Ior an explanation
}
}
else

// handle dependent records, cannot delete
// use $table-~getError() Ior an explanation
}
Nos podemos deIinir mais de um ponto de juno, por exemplo, se tivesse havido uma
outra tabela chamada # myextensionillegitimatechildren tambem poderiamos ter
deIinido esta na varivel $joinsarray.

$join1 array ('idIield' ~ 'childid',
'name ' ~ '#myextensionchildren',
'joinIield' ~ 'parent',
'label' ~ 'children');

$join2 array ('idIield' ~ 'ichildid' ,
'name' ~ '#myextensionillegitimatechildren',
'joinIield' ~ 'parent',
'label' ~ 'illegitimate Children');

$joins array ($join1, $join2);

**
O nome da chave primaria e chaves estrangeiras em todas as tabelas no devem ser os
mesmos que os nomes de quaisquer outras areas em qualquer das outras tabelas. Caso
contrario, a consulta passara a ser ambigua e o metodo ira sempre retornar Ialso.
**

Manipulao Comum de Campos
Vamos retroceder um pouco, antes de matar nosso registro Nossa tabela inclui todos os
campos comuns e como mencionado anteriormente JTable Iornece-nos alguns metodos
uteis para lidar especiIicamente com os campos. Ao longo de todo o exemplo a variavel
$tabela reIere-se a uma instncia da classe TableFoobar e a variavel $id reIere-se a
identiIicao do registro que estamos a tratar.

Publishing
Para publicar e desmarque a publicao dos dados podemos utilizar o metodo publish().
Este metodo publica e despublica varios registros de uma so vez. Se a tabela inclui um
campo checkedout, podemos assegurar que o registro so e marcado para o usuario
atual. Este exemplo publica um registro.

$publishIds array ($id);
$user & JFactory :: getUser();
iI(!$table-~publish($publishIds, 1, $user-~get('id')))

// handle unable to publish record
// use $table -~getError() Ior an explanation
}
O primeiro parmetro e um array de chaves de registros queremos publicar ou
despublicar. O segundo parmetro e o novo valor publicado, 0 no publicado, 1
publicados, o que e opcional, por deIault e 1. O parmetro Iinal, tambem opcional, e
utilizado apenas quando o campo checkedout existe. Apenas campos que no so
controlados para Iora ou so controladas pelo usuario especiIicado pode ser atualizado.

O metodo retorna true se a publicao, Ioi bem sucedida. Isto no e o mesmo que dizer
que todos os registros especiIicados Ioram atualizados. Por exemplo, se um determinado
registro e controlado por um usuario diIerente, o registro no sera atualizado, mas o
metodo ira retornar true.

its

Para incrementar o campo hits que podemos usar o metodo hit(). Neste exemplo,
deIinimos no buIIer o registro ID e usamos o mtodo hit().

$table -~set('id', $id);
$table -~hit();
Como alternativa, podemos especiIicar o ID quando usamos o metodo hit(). Se escolher
Iazer isso, e preciso lembrar que o ID do buIIer sera atualizado para combinar o ID do
hit.

$table -~hit($id);


Checando
Antes de comearmos a checagem de registros, primeiro precisamos veriIicar se um
registro ja Ioi veriIicado. Lembre-se que quando um registro Ior veriIicado no devemos
permitir que qualquer outro usuario possa modiIicar o registro. Podemos utilizar o
metodo isCheckOut() para Arquivar isso. Neste exemplo, nos testamos para ver se
algum usuario, que no o atual, tem saida para o registro:

$table-~load($id);
$user & JFactory::getUser();
iI ($table-~isCheckedOut($user-~get('id')))

// handle record is already checked-out
}

Uma vez que temos um determinado registro, podemos usar o metodo checkout() para
veriIicar o registro. Neste exemplo, Iazemos o check-out do registro para o usuario
atual, o que deIine um campo checkedout para a identiIicao do usuario e do
checkedoutime campo para a hora atual.

$table-~load($id);
$user & JFactory::getUser();
iI (!$table-~checkout($user-~get('id')))

//handle Iailed to checkout record
}
Agora que temos veriIicado um registro de saida, precisamos saber como Iazer a
checagem de entrada e para isso usamos o metodo checkin(). Este exemplo veriIica em
um registro, o que ira deIinir se o campo data e nulo para um checkedouttime:

$table -~load($id);
$user $JFactory::getUser();
iI (!$table -~ checkin($user-~get('id')))

// handle Iailed to checkin record
}

Nos so devemos veriIicar registros de entrada e saida para os usuarios registrados. Para
um estudo mais abrangente do sistema de check-out utilizado pelo Joomla voc devera
acessar o artigo sobre sistema de controle que sera explicado brevemente.

Ordenao de registros
Quando queremos ordenar os itens, a JTable da-nos uma serie de metodos uteis. O
primeiro destes e o metodo reorder(). Este metodo veriIicar cada registro e move os
mesmos para o Iim de cada conjunto de dados ate que as eventuais lacunas na ordem
sejam removidas. Neste exemplo, vamos reorganizar nossa tabela:
$table-~reorder();
Muito simples, mas para os registros mais complicados em nossas tabelas poderiam
haver grupos dentro dos registros. Para lidar com isso podemos utilizar o metodo
reorder()com um parmetro para restringir os registros. Imagine que a nossa tabela
tambem tem um campo chamado grupo, neste exemplo, iremos reordenar os registros
do grupo 1:

$db & $table::getDBO();
$where $db-~nameQuote('group').' 1';
$table -~reorder($where);
Repare que temos objeto do banco de dados a partir da variavel $tabela no pelo
JFactory; isso garante que estamos usando o driver de dados correto para o servidor de
banco de dados que a variavel $tabela esta usando. Embora este no e um problema
importante, como Joomla comea a apoiar outros SGBDs, pode haver ocasies em que
o resultado seja inconsistente tendo em vista o uso de um driver de banco de dados
diIerente da base de dados principal.

Voc pode se lembrar anteriormente que usamos o metodo getNextOrder(). Este metodo
diz-nos que a proxima posio disponivel e da ordem. Tal como acontece com o
mtodo reorder(), temos a opo de especiIicar agrupamentos. Imagine que a nossa
tabela tambem tem um campo chamado grupo, neste exemplo, temos a proxima posio
disponivel nos registros do grupo 1:

$db & $table::getDBO();
$where $db-~nameQuote('group') . ' 1';
$nextPosition $table-~getNextOrder($where);
Por ultimo nos podemos usar o metodo move() para mover em uma posio um registro
para cima ou para baixo. Neste exemplo, vamos mover um registro ate o Iim:

$table -~load($id);
$table -~move(-1);
Mais uma vez, temos a opo de especiIicar agrupamentos. Imagine que a nossa tabela
tambem tem um campo chamado grupo, neste exemplo, vamos mover um registro e
estabelecer a ordem no grupo 1:

$db & $table::getDBO();
$where $db-~nameQuote('group').' 1 ';
$table -~ load($id);
$table -~move(1, $where) ;


Parmetro Campos
A classe JTable no nos Iornece qualquer metodos especiais para lidar com campos de
parmetro INI. O buIIer da classe JTable e projetado para ser preenchido com os dados
brutos, que sero armazenados no banco de dados.

Para lidar com um campo que utilize parmetros da classe JParameter. A primeira coisa
que precisamos Iazer e criar um novo objeto JParameter e, se estamos a consultar e
gravar, analisar os parmetros dos dados existentes.

A classe 1Parameter e uma classe estendida da classe JRegistry; a classe JRegistry sera
explicada em breve. Este exemplo mostra como podemos analisar dados usando a string
INI da classe JParameter:

$params new JParameter($table-~params);

Uma vez que temos um objeto JParameter, podemos acessar e modiIicar os dados no
objeto usando os mtodos get() e set():

$value $params -~get('someValue');
$params -~set('someValue', $value);
Podemos devolver os dados a uma string usando o mtodo INI ToString():

$table-~params $params-~ToString();

Tambem podemos utilizar a classe JParameter em conjunto com um arquivo de
metadados XML para deIinir os valores que poderiam ser uma explorao em String
INI . Este exemplo mostra como nos criamos um novo objeto JParameter e carregamos
em um arquivo XML; a variavel $caminho e o caminho completo para um arquivo
XML maniIesto:

$params new JParameter('FooBar', $pathToXMLFile);
Publicaremos em breve uma descrio completa explicando como deIinir um arquivo de
metadados XML. Podemos utilizar o metodo render() para a saida de elementos de
Iormulario preenchido com os valores de parmetros (como estes so montados e
deIinido no arquivo XML):

echo $params -~ render('params');

Data de Campos
DiIerentes servidores de banco de dados usam diIerentes Iormatos de data e hora para
armazenar datas e horarios. E importante usarmos o Iormato do banco de dados que esta
sendo utilizado para guardar datas e horarios correntes.

InIelizmente, no ha atualmente nenhuma maneira de garantir que estamos usando o
Iormato especiIico para o banco de dados que esta sendo usado. Em vez disso, temos de
assumir que o banco de dados MySQL e baseado. Isto signiIica que temos de armazenar
datas no Iormato YYYY-MM-DD HH:MM:SS

A maneira mais Iacil de Iazer isso e utilizar a classe JDate. o objeto JDate e usado para
analisar e representar valores de data e hora. Nos usamos o metodo toMySQL() para
garantir que o valor e Iormatado apropriadamente:

// import JDate class

Jimport('joomla.utilies.date');

//get current date and time (unix timestamp)

$myDate gmdate();

// create JDate object

$jdate new JDate($myDate);

// create query using toMySQL()

$query 'SELECT * FROM #example WHERE date '.$jdate-~toMySQL();
Ate o proximo artigo...
Artigo traduzido e adaptado por 1lio Coutinho. O original encontra-se no livro Mastering 1oomla!
1.5 Extension and Framework Development - 1ames Kennard, captulo 3 The Database
Coletnea Programador 1oomla! Tutoriais de
desenvolvimento. Artigo nr 4 O MVC
LscrlLo pelo !ullo CouLlnho
O Lamanho do LexLo
O mprlmlr
O Lmall
Cuallflque esLe lLem
O
O
O
O
O
O
% voLos)
O Mvc {MOuL vlw cON1kOLLk )
uma unlca exLenso desenvolvlda para o [oomla fequenLemenLe
e uLlllzada por vrlos usurlos e pode ser lnsLalada em dlferenLes
pro[eLos

Sem o MvC ou uma soluo semelhanLe provavelmenLe
Lerlamos que acabar dupllcando grandes pores de cdlgo
fonLe Ao lldarmos com vlses P1ML e xML cada uma das quals dever conLer elemenLos
especlflcos da vlso sLo e exLremamenLe lneflclenLe e e provvel que resulLe em lncoernclas
enLre as vlses

MVC um padro de pro[eto (des|gn pattern) e nos permlLe crlar o cdlgo lndependenLe da
lnLerface sLo e conseguldo aLraves da separao do acesso aos dados no banco de dados
(MCDLL) apresenLao (VILW) e a camada lglca do slsLema (CCN1kCLLLk)sLo slgnlflca que
podemos reuLlllzar qualquer parLe de um componenLe baseado em MvC sem afeLar ouLras
parLes do componenLe
LxlsLem Lrs parLes fundamenLals para o padro de pro[eLo MvC o mode|o a v|so e o
contro|ador C conLrolador e a vlso podem ser conslderados como uma fuso enLre a camada
lglca do slsLema e a camada de acesso aos dados no banco de dados
O moJelo
O modelo e a parte do componente que encapsula os dados da aplicao. Na maioria das
vezes vai Iornecer rotinas para administrar e manipular dados. O modelo deve conter
metodos para adicionar, eliminar e atualizar inIormaes dos olas na base de dados.
Tambem deve conter metodos para obter a lista de olas existentes. De modo geral, a
tecnica de acesso aos dados deve ser encapsulada no modelo. Desta Iorma, se uma
aplicao Ior transIerida de um sistema que usa banco de dados para um sistema que usa
arquivos texto para guardar as inIormaes, o unico elemento que precisa ser alterado
sera o modelo - a vista e o controlador no precisam ser modiIicados. (Ionte: numaboa)
O modelo e utilizado para manipular dados. Na maioria dos casos, os dados sero
provenientes do banco de dados, entretanto, podemos utilizar qualquer Ionte de dados.
Um modelo simples Ioi projetado para trabalhar com multiplos registros e no
representa um registro simples.

Na maioria dos casos o modelo permite modiIicar os dados, isto e conseguido usando
metodos, que deIinem processos de negocios. Os metodos que deIinem negocios so
essencialmente voltados a camada logica que deIine o comportamento dos dados.

Modelos nunca so conscientes de controladores ou vises. E importante lembrar isto,
porque muitas vezes isto nos ajuda a compreender melhor como e o Iuncionamento do
componente MVC.
vlxdo
A vista e a parte do componente usada para transIormar e preparar os dados do modelo
para que possam ser apresentados de alguma Iorma, geralmente numa pagina HTML. O
controlador retira os dados do modelo e os entrega para a vista. Esta, por sua vez,
alimenta templates com estes dados para que possam ser apresentados ao usuario. A
vista no modiIica os dados de nenhuma Iorma, apenas os apresenta. (Ionte: numaboa)
A viso deIine como apresentamos os dados. Em joomla, quando queremos exibir
HTML, utilizamos esquemas (uma Iorma de modelo). Isto da-nos uma camada extra de
controle e nos permite deIinir varios modelos para a mesma viso.

Os dados que apresentamos em uma perspectiva provm de um ou mais modelos.
Estes modelos so automaticamente associados viso pelo controlador.

Vses nunca alteram dados. Todas as alteraes de dados so concludas dentro do
controlador.
O controluJor
O controlador e responsavel pelas respostas as aes dos usuarios. No caso de uma
aplicao web, uma ao de usuario (geralmente) e a solicitao de uma pagina. O
controlador vai determinar qual solicitao Ioi Ieita e vai responder de acordo Iazendo
com que o modelo manipule os dados necessarios para depois passa-los para a vista
para que possam ser mostrados. (Ionte: numaboa)
O controlador o crebro por trs da operao. Parte da camada de apresentao,
o controlador analisa dados de entrada e toma as medidas necessrias para
produzir o resultado, apresentando a produo.

O controlador seleciona os modelos requisitados e executa as modiIicaes necessarias.
O controlador determina o os modelos que sero associados com a viso. Em alguns
casos, uma viso no sera exigida e sera iniciado um redirecionamento para o
controlador.

O controlador executa a ao que sera exibir os dados atraves da viso ou redirecionar a
ao. Para exibir os dados o controlador instancia uma viso e, opcionalmente, um ou
mais modelos associados com a viso.
Considere o controlador como o jogador de meio de campo.
C MvC e uma esLruLura padro de sofLware que pode ser usada para organlzar o cdlgo de
forma que a lglca de Lrabalho flque separada da apresenLao dos dados ALe esLe ponLo no
e mulLo dlferenLe do que [ vlmos nos LuLorlals anLerloresLxlsLe um padro semelhanLe ao
MvC chamado Ller archlLecLure L lmporLanLe no confundlr os dols Ller archlLecLure esL
mals preocupado com a camada de dados o MvC se concenLra mals na camada de
apresenLao Malores lnformaes sobre o padro Ller archlLecLure podem ser acessadas
em hLLp//enwlklpedlaorg/wlkl/MulLlLler_archlLecLure

Cada parLe do MvC e represenLado no [oomla por uma c|asse abstracta IMode| Iv|ew e
IContro||er LsLas classes esLo locallzadas na blblloLeca [oomlaappllcaLloncomponenL e so
responsvels pela lmplemenLao do MvC
O !Model para o modelo
O !vlew para a vlsLa e
O !ConLroller para o conLrolador

Ate o proximo artigo...
Artigo traduzido e adaptado por 1lio Coutinho. O original encontra-se no livro Mastering 1oomla!
1.5 Extension and Framework Development - 1ames Kennard, captulo 4 Component Design
Tutorial componente MVC para 1oomla - Artigo nr 5
Levantamento de Requisitos
Escrito pelo Julio Coutinho
O tamanho do texto
O Imprimir
O E-mail
QualiIique este item
O
O 1
O 2
O 3
O 4
O 5
(0 votos)
Neste artigo iremos comear o desenvolvimento do nosso
novo componente MVC para Joomla 1.5.x. Voc deve ler os
outros artigos da coletnea para Iamiliarizar-se com os
termos e com o nivel de diIiculdade da mesma.
Desenvolver um componente MVC para Joomla, exige mais
do que simplesmente "Iuar no codigo". Logica de
programao, orientao a objetos, conhecimento de PHP e
SQL so alguns dos pre-requisitos para encarar este desaIio.
Noso componente servira para cadastrar os dependentes de usuarios de um determinado
segmento e depois, via modulo no Irontend, listar os aniversariantes do dia com a opo
de enviar um email e carto comemorativo.
Vamos comear?
1) Levantamento de requisitos
O levantamento de requisitos e uma das principais etapas deste processo, pois e neste
momento que sera deIinido o que sera Ieito e o que no sera Ieito no projeto.
Geralmente ocorrem reunies e pos o "brainstorm" (chuva de ideias), o resultado sera o
"brieIing", que nada mais e do que os dados necessarios para desenvolver o projeto.
Levantamento de requisitos e Iundamental em qualquer projeto, seja web ou no. Sem
ele, no poderemos continuar o processo.
Quando Ior participar da reunio ou reunies, leve um bloco de anotaes e registre
tudo o que Ior discutido. Lembre-se que o tecnico e voc. Para o usuario, tudo e muito
simples, um sisteminha, uma lojinha web, um quadradinho, e por ai vai...
Voc tecnico tem que levantar questes relativas a segurana, prazos e custos dentre
outras, para que se tenha uma ideia da viabilidade do projeto. A relao custo x
beneIicio e primordial para que o projeto saia da prancheta.
No entre no merito da questo: "Da pra Iazer?" Aprendi que na inIormatica, "da pra
Iazer" qualquer coisa e existem 03 (trs) Iatores complicadores:
1. A limitao tecnica - se voc no tem capacidade tecnica para desenvolver o
projeto, Iaa uma parceria com quem pode desenvolver ou busque se capacitar.
O NHS ( na hora sai ), no Iunciona neste caso;
2. A limitao tecnologica - se o provedor no suporta a tecnologia que sera
implantada, no caso especiIico de projetos web, no adianta culpar a aplicao
ou buscar uma saida milagrosa, mude de provedor.
3. A limitao Iinanceira - se no existe recurso Iinanceiro para bancar o
desenvolvimento do projeto, no ha projeto.
Dica do Cout: "No comece a desenvolver o projeto antes do levantamento de
requisitos".
Proximo artigo: Documento de Viso
Sucesso!
Tutorial componente MVC para 1oomla - Artigo nr 6
Documento de viso
Escrito pelo Julio Coutinho
O tamanho do texto
O Imprimir
O E-mail
QualiIique este item
O
O 1
O 2
O 3
O 4
O 5
(0 votos)
Documento de Viso
O " Documento de Viso " Iornece uma base de alto nivel
delimitando o escopo para Iuturo detalhamento dos
requisitos do projeto. O documento de viso captura
restries de design e requisitos de nivel muito elevado para
que o leitor possa compreender o sistema a ser
desenvolvido. Ele Iornece inIormaes para o processo de
aprovao do projeto e, portanto, esta intrinsecamente
relacionado ao servio a ser entregue. Ele comunica os principais questionamentos
relacionados ao projeto e Iunciona como um regulador com base no qual todas as
decises Iuturas devero ser validadas.
dentificao do problema

Uma das principais partes do documento e a identiIicao do problema, que deve
envolver todas as partes envolvidas. Primeiramente devem ser detalhadas as bases do
projecto. E apresentado um resumo do problema para o qual se pretende encontrar uma
soluo viavel, disponibilizando uma breve explicao das situaes que levaram a
deciso para avanar com o projecto, deIinindo as razes da origem do problema, o
historial que envolve a organizao e a descrio de eventuais solues que tenham sido
aplicadas no passado para a resoluo da situao.

Em seguida so identiIicados todos os stakeholders envolvidos no sistema, sendo estes
reconhecidos por um nome, um titulo ou uma regra. Para cada um, devero ser
avaliadas as necessidades e quais os problemas do sistema actual, sendo ainda
assimiladas quais as alternativas que estes identiIicam. Estes so os intervenientes do
sistema, e a quem se destina o sistema.

Devera tambem ser deIinida uma lista dos utilizadores, sendo estes identiIicados por um
nome, um codigo ou uma outra regra qualquer, sendo que, se o seu numero Ior muito
grande, pode tornar-se ineIiciente a sua identiIicao, podendo ser agrupados em grupos
menores coerentes entre si. As necessidades de cada um deles devero ser descritas com
algum detalhe.

A seguir, devem tambem ser ilustrados os Iactores que podero evidenciar-se como
eventuais ameaas para o sucesso do nosso projecto. Estes devero ser identiIicados
numa sesso de brainstorming com todos os elementos da equipa. Pode identiIicar
Iactores externos que possam causar qualquer tipo de impacto negativo, ou problemas
que possam causar atrasos na entrega Iinal.

Por Iim deve ser elaborada uma lista das previses que os stakeholders, os utilizadores
ou os elementos da equipes Iizeram. Ilustra todas as situaes que se esto a prever ter
de enIrentar e para as quais se vai procurar encontrar solues. (*)
'iso da soluo

A viso da soluo Iornece inIormaes sobre um possivel caminho para solucionar o
problema ja identiIicado. Primeiramente deIine-se uma indicao, que visa descrever o
que a soluo do projecto vira a Iornecer. Ela deve explicar qual o proposito do projecto
e esclarecer a razo pela qual se vai despender tempo, dinheiro e recursos para o seu
desenvolvimento. Esta seco devera ser escrita depois de se ter Ialado com todos os
utilizadores e stakeholders, e de se ter conscincia de quais as suas necessidades. Por
esta altura ja se deve ter uma ideia mais ao menos concreta de como o projecto devera
vir a ser elaborado. Esta viso deve ser acompanhada pelo levantamento de dominio em
que se insere a soluo, atraves de uma analise de dominio.

A seguir e criada uma lista de caracteristicas, sendo que, cada caracteristica identiIica
uma area do soItware que tem como Iuno, Iornecer um conjunto de servios que
venham a prover a soluo para um dos requisitos. O numero de caracteristicas
identiIicadas num projecto estara dependente do nivel de detalhe com que se pretende
eIectuar a analise e do numero de caracteristicas esto combinadas numa so. Convem
que o numero de caracteristicas no seja demasiado grande, pois pode conduzir a que se
torne demasiado maudo para quem o vai ler. Demasiadas caracteristicas trazem para o
projecto um grau de complexidade muito grande, podendo inclusive tornar a sua
estimativa irreal, uma vez que cada uma destas implica tempo e esIoro para o seu
desenvolvimento. Cada uma devera ser descrita num paragraIo, identiIicada com um
nome, seguida de uma breve descrio que devera indicar qual a Iuncionalidade que vai
Iacultar. Se existir alguma inIormao que um utilizador ou um stakeholder julgue
crucial, esta devera ser incluida, detalhando a implicao que tem no sistema.

Uma Iase intermediaria opcional e a criao de niveis. No caso do projecto vir a ser
eIectuado em varias Iases, ou de ser constituido por varios lanamentos, deve-se
detalhar quais as tareIas a serem eIectuadas na Iase actual.

Por Iim so deIinidas as capacidades que Ioram identiIicadas, mas que por alguma razo
no vo ser implementadas nesta entrega do produto. (*)
oomla! Development - nivelando conhecimentos
Escrito pelo Julio Coutinho
O tamanho do texto
O Imprimir
O E-mail
QualiIique este item
O
O 1
O 2
O 3
O 4
O 5
(0 votos)
O objetivo deste primeiro artigo do Modulo de desenvolvimento de
extenses MVC do video-curso de Joomla! e nivelar o nosso conhecimento e
mostrar os pre-requisitos necessarios para que voc possa aproveitar ao
maximo esta serie.

E preciso deixar bem claro que para desenvolver uma extenso MVC, voc deve
dominar varias disciplinas relacionadas ao webdesign e programao. Caso contrario,
voc no passara de nosso componente.

O nosso componente ira possibilitar que os internautas solicitem oramentos online via
Irontend do website e os mesmos Iicaro registrados em nossa base de dados,
permitindo, atraves do backend, consultas e gerao de relatorios diversos, inclusive
com graIicos, em .pdI e .xls.

Componente

Componente e um programa que roda integrado ao CMS Joomla, extendendo as
Iuncionalidades do mesmo e para desenvolver um componente, voc precisa saber
programar. No precisa ser um programador expert, se Ior dente-de-leite, eu sou, ja esta
bom. Porem a tempo para tudo na vida e antes de sair "programando por ai", e hora de
aprender.

Antes de programar e preciso saber o que e logica de programao. Quando Iiz o meu
primeiro curso de logica, em 1994, para comear a programar em "clipper"lembro que o
proIessor comeou com a Irase: "Logica, ou voc tem ou no tem e se tiver lembre-se
que cada pessoa tem a sua!" Doidera ne? Na Iaculdade Iiz logica I e logica II e mais
uma vez me vi envolvido com esta velha questo e resolvi n algoritmos com
"chinezinhos" com varios se-para-ento. Busque por apostila de logica de programao
no google, existem varias gratuitas.

O proximo passo e aprender PHP que e uma linguagem de programao voltada para
web e a base do nosso CMS. Temos excelentes Ionte de conhecimento como por
exemplo: website da linguagem , manual do PHP(`) e varios livros que podero ajuda-
lo(a) nesta caminhada.
O PHP basico (eu recomendo o guia completo)
O PHP avanado (eu recomendo os do Juliano Niederauer)
(`) depois que baixar o manual, clique no icone do mesmo, com boto direito do mouse
busque propriedades e desbloqueie o arquivo para Iuncionar.
Aprendeu PHP? Chegou o momento de incrementar o seu conhecimento e aventurar-se
na orientao a objetos. Se a logica e complicada, quem dira a abstrao. Recomendo o
livro PHP ProIissional para inicio de conversa.

O seu programa utilizara um banco de dados e no nosso caso iremos usar o SGBD
MySql. Lembre-se que voc deseja desenvolver um componente para o Joomla e sera
preciso colocar a mo na massa e conhecer a linguagem do banco de dados. Quer uma
dica? Comece pelo livro Aprenda SQL em 24 horas. O titulo e mentiroso, mas o livro e
muito bom.
Ajax, sim, e Iundamental conhecer Ajax, que nada tem haver com aquele negocio que a
mame usa na cozinha e tambem no e uma linguagem de programao. Ajax
(Asynchronous Javascript And XML) e um novo conceito na utilizao do javascript ,
que possibilita inumeras vantagens para sua aplicao web. E interessante conhecer a
biblioteca Jquery para desenvolvimento com javascript.

Bem, acho que podemos Ialar de Joomla agora e aconselho que voc leia os artigos
publicados em nosso Portal, na area Joomla Development para comear a Iamiliarizar-
se com o Iramework e adquira, se desejar, os seguintes livros:
O ProIessional Joomla
O Mastering Joomla (disponivel na Amazom, mas chega rapidinho)
O Joomla avanado

Quem foi que disse que ia ser moleza?

Costumo dizer a meus alunos que o melhor investimento e aquele que voc Iaz
adquirindo livros e digo isto de corao. Tenho mais de 100 (cem) livros que Iui
comprando ao longo desta minha jornada na web que comeou, de Iorma autodidata, no
ano de 2.000 quando resolvi migrar do desenvolvimento "desktop - standalone" para o
"web". O livro Aprenda SQL em 24 horas, lanado naquele ano, Ioi um dos primeiros.
Todos os meus livros Iorma lidos, alguns relidos e nenhum esquecido.
Ate o proximo artigo, no qual iremos abordar os meios auxiliares de desenvolvimento.

Das könnte Ihnen auch gefallen