Vous êtes sur la page 1sur 17

Ento voc quer escrever um mdulo? Introduo Sempre houve um pouco de Voodoo nos mdulos associados ao Prestashop.

Isso tem sido principalmente uma questo de falta de documentao disponvel, mas nunca medo - esta srie de tutoriais tem o objetivo de introduzir a escrita de mdulo para os programadores PHP. Esta srie vai ajudar a construir o nosso prprio mdulo totalmente funcional que ir fornecer toda a funcionalidade padro que a base para muitos dos mdulos mais comuns. Tambm ir fornecer uma estrutura bsica que voc pode usar como um modelo para o seu prprio cdigo. Mais tarde artigos vo ajudar a criao de mdulos de pagamento e ampliar a interface de administrao, mas, inicialmente, vamos dar ateno para a classe de mdulos que tratam, principalmente, com a insero de contedo em suas pginas, este artigo demonstra os conceitos fundamentais bsicos de desenvolvimento para PrestaShop. Antes de comear Estes artigos requerem, pelo menos, um conhecimento bsico de PHP 5.xx e seus conceitos de programao orientada a objeto. altamente recomendado, devido forma como o Prestashop renderiza as pginas, que voc faa um desenvolvimento de lojas Prestashop, se voc no tiver feito (e se voc no tiver, ento por que no?). Para os efeitos destes artigos estaremos construindo os exemplos com base na verso de desenvolvimento atual (no momento da escrita 1.2.0.6), mas o cdigo vai ser suficientemente genrico que deve funcionar com qualquer verso do PrestaShop, certamente, a partir da verso 1.1 . Voc pode achar que til tambm para se familiarizar com as principais ferramentas de terceiros e bibliotecas que o Prestashop usa, e eu particularmente sugiro familiarizar-se com os fundamentos da Smarty. Note-se que o ncleo do Prestashop manipula a inicializao da classe de modelo, de modo a reas especficas para se familiarizar com a atribuio de variveis de modelo, a criao (e exibio) de arquivos de modelo, modificadores e funes do modelo. Arquitetura PrestaShop Fundamental para entender como funcionam os mdulos do Prestashop estar ciente de como as pginas do carrinho de compras foram feitas. A arquitetura global baseado no princpio de um MVC "Model", um "View" e um "Controller". Enquanto o Prestashop no estritamente adere a essa filosofia, um instrumento til para us-lo para visualizar como o aplicativo funciona. Modelos Modelos em Prestashop so fornecidos atravs de um conjunto de objetos estendidos de uma classe base "ObjectModel". A classe ObjectModel define o comportamento comum necessrio para encapsular as tabelas que compem a loja. Ele fornece a

funcionalidade CRUD(Create, Read, Update e Delete), bem como implementar a base de dados de validao e suporte multi-lingual. Por estender essa funcionalidade bsica, classes especficas so criadas para gerenciar os dados utilizados pela loja. Os modelos para prestashop so definidos na pasta classes/ e gerenciam todos os dados contidos no banco de dados (por exemplo, Categoria, Produto, Ordem, configurao, etc.) A conveno que cada classe armazenada em um arquivo php cujo nome corresponde ao nome da classe contida, assim Order.php por exemplo, contm a classe Order. Visualizaos A apresentao dos dados do nosso aplicativo de carrinho de compras tratado pelo Smarty. Usando uma viso que nos permite separar a lgica de negcio da apresentao. Em um ambiente MVC rigoroso, no deve haver tratamento de dados pela exibio, apenas a exibio de dados passados para ele de um controlador - e na maioria dos casos isso verdade para o Prestashop, embora alguns Ajax Javascript/ so utilizados por padro para executar o processamento de dados adicionais. Os arquivos de exibio para Prestashop so em geral armazenados na pasta themes/, com o conjunto especfico de arquivos de modelo a ser utilizado sendo selecionveis a partir da interface de administrao. Muitos mdulos tambm armazenam os seus prprios arquivos de modelo especfico dentro de sua prpria estrutura de diretrios. Controlador O controlador a lgica do negcio principal para uma "pgina" ou coleo de pginas relacionadas a ser exibido. Eles so responsveis por interagir com os "modelos" para recuperar dados, aplicar a lgica de negcio para os dados e enviar os resultados atravs de um ou mais "Views". No Prestashop estes esto contidos no diretrio raiz da instalao da loja, e correspondem s "pginas" principais que compem a loja virtual. OK, Ento, onde os mdulos se encaixam? Enquanto o texto acima descreve a funcionalidade central do prestashop, e suficiente para produzir um carrinho de compras, um pouco inflexvel em termos de adio de novas funcionalidades. Se, por exemplo, voc queria modificar a pgina inicial de sua loja apenas com a arquitetura acima, voc teria que modificar a pgina controlador diretamente para implementar a alterao. No s isso seria ruim em termos de manuteno do cdigo (voc teria que aplicar as alteraes e correes de bugs manualmente para todas as suas pginas controlador modificadas quando uma nova verso liberada), tambm exige um conhecimento bastante detalhado de programao para implementar as mudanas. A fim de criar um sistema de compras que seja facilmente extensvel e de fcil manuteno por um proprietrio da loja notcnicos, funcionalidades adicionais so inseridas ("HOOKED") na arquitetura acima atravs da insero especial "HOOK" no cdigo do

controlador, que podem ser explorados pelo usurio-instalador "plugins" (que o Prestashop se refere como "mdulos"). Neste caso, esses mdulos tm a capacidade de produo de contedos adicionais ou modificados, adicionar novas funcionalidades (lgica de negcio) para os controladores e recolher informaes. Mdulos de pagamento so uma classe especfica de mdulo, mas mesmo eles engancham tambm no padro de controladores, a fim de fornecer caminhos alternativos de execuo de cdigo. Extenses do painel de Administrao, operam de forma totalmente diferente e o processo muito mais parecido com a adio de controladores adicionais, por isso deve ser discutido separadamente. Felizmente, a arquitetura do mdulo em Prestashop nos fornece uma maneira bastante simples de adio de uma interface administrativa para todos os mdulos, mas no mais complexo dos casos este o melhor mtodo a utilizar. Resumo Depois de ler este artigo voc deve estar familiarizado com os blocos bsicos que vo juntos para fazer o carrinho de compras Prestashop. Na prxima parte deste tutorial, vamos olhar para o nosso primeiro mdulo de codificao usando esses conceitos e comear a estender o Prestashop.

Criando um mdulo bsico Introduo Nesta segunda parte da srie, vamos procurar criar o nosso primeiro mdulo Prestashop bsico que pode ser controlado a partir do Back Office. A classe Mdulo Similar classe base ObjectModel, todos os mdulos Prestashop so estendidos a partir de uma classe base comum usado para definir a sua funcionalidade bsica. A classe "Module" fornece a interface entre as telas de administrao e seu mdulo, bem como o fornecimento e a internacionalizao "HOOK" e a funcionalidade de gerenciamento. Convenes de codificao Antes de podermos escrever o nosso primeiro cdigo, h mais um elemento que precisa ser considerado - o da classe, mdulo de diretrio e nomes de arquivos No Prestashop, os mdulos devem estar localizados dentro do diretrio modules/ abaixo do seu diretrio base de instalao da loja. Alm disso, o diretrio do mdulo e o arquivo de origem de classe deve ser chamado em letras minsculas, com o mesmo nome que o mdulo de classe que ns escolhemos. Observe que o nome do mdulo de classe em si no tem que ser minsculo (por conveno de nomes de classe usam "Camelcase"), mas essencial que a pasta que reside no arquivo de origem siga essa conveno. Um mdulo "vazio" Nesta parte do tutorial, vamos criar um mdulo chamado "TutorialFirst", que demonstra os cdigos obrigatrios exigidos para criar o nosso primeiro mdulo. O primeiro passo criar nosso diretrio no servidor com o nome "tutorialfirst". Precisamos ento criar o arquivo de classe principal do mdulo dentro deste diretrio e inserir o seguinte cdigo: 01 02 03 04 05 06 07 08 09 10 <?php class TutorialFirst extends Module { function __construct() { $this->name = 'tutorialfirst'; parent::__construct(); $this->tab = 'eCartService.net Tutorials'; $this->version = '0.1.0';

11 $this->displayName = $this->l('First Tutorial Module'); $this->description = $this->l('Our very first module - it does 12 absolutely nothing at all.'); 13 } 14 } 15 // End of: tutorialfirst.php Ns salvamos esse arquivo como "tutorialfirst.php" no diretrio do mdulo e faremos o upload para o nosso servidor. Embora o cdigo acima no parece muito, realmente cheio de graas a funcionalidade para a classe base que se estende. Uma vez que voc enviou para o seu site de desenvolvimento voc ser capaz de ver o mdulo listadas sob o ttulo de grupo "Tutoriais eCartService.net" e agora voc pode instalar e desinstalar. Vamos olhar o que estamos fazendo neste cdigo, e por qu. 1 $this->name = 'tutorialfirst'; 2 parent::__construct(); Estas duas primeiras linhas no construtor da classe esto preocupadas com a configurao das propriedades bsicas do mdulo e que garanta a adequada herana de funcionalidade exigida da classe base. Primeiro, precisamos definir o nome "interno" do mdulo - note que este tambm segue a conveno de nomeao para o diretrio do mdulo e arquivo de definio de classe principal, e novamente o nome da classe em letra minscula. Uma vez feito isso ns podemos chamar o construtor da classe pai para lhe permitir configurar as outras propriedades internas necessrias do mdulo para ns. Em seguida, definimos as propriedades que sero usadas na apresentao de nosso mdulo de Back Office. 1 $this->tab = 'eCartService.net Tutorials'; 2 $this->version = '0.1.0'; 3 $this->displayName = $this->l('First Tutorial Module'); $this->description = $this->l('Our very first module - it does 4 absolutely nothing at all.'); A varivel de membro $this->tab define como desejamos que o nosso mdulo ser classificado pelo Back Office na lista de mdulos. Em geral, escolheria uma das categorias da norma ("Advertisement", por exemplo, 'Products', 'Tools', 'blocks', etc) no entanto, inteiramente importante que voc deseje usar essa propriedade, e, no caso de estes exemplos, eu escolhi para agruplos sob o ttulo "Tutoriais eCartservice.net". A varivel membro $this->version nos permite exibir a verso atual do mdulo na lista de mdulos, que permitem aos usurios identificar visualmente qual a verso do nosso mdulo que est usando. Isso tambm pode ser til para que nos permitem

identificar verses velhas e ultrapassadas de mdulo mais tarde, usando um site de distribuio externa do mdulo. As duas ltimas variveis membro so usados para exibir informaes sobre o nosso mdulo na lista de mdulos, e so bastante auto-explicativo. Note no entanto que estas esto sendo definidas usando o Mdulo de funo de classe $this->l() no entanto, ao invs de apenas ser designado diretamente como strings estticas. A funo de membro l() da (classe base) implementa o suporte ao idioma, e permite que o dono da loja possa fornecer tradues. A verso em Ingls do texto que queremos mostrar passado para esta funo e, quando definido desta forma o proprietrio da loja pode usar a opo Ferramentas-> Tradues no Back Office para traduzi-las para a linguagem de sua escolha. O envolvimento de qualquer texto esttico usado em nosso mdulo com esta funo permite que a funcionalidade de traduo deva ser usado para todo o texto esttico dentro dos mdulos que no dependente da linguagem. Resumo Depois de ler este artigo voc deve ser capaz de criar um novo mdulo que pode ser listados e controlado a partir do Back Office e, opcionalmente, o Prestashop possa exibir essa informao na prpria lngua do dono da loja. Na prxima parte deste tutorial, vamos procurar expandir o nosso primeiro mdulo para permitir a configurao, e com base nessa configurao, a sada de vdeo em uma rea especificada de uma pgina.

Armazenamento de configurao do mdulo Introduo Na terceira parte desta srie vamos ver como podemos armazenar dados de configurao para os mdulos no banco de dados do Prestashop, e como ns podemos permitir que os usurios interajam com esses dados para controlar o comportamento do mdulo. Tambm vamos tocar brevemente sobre como podemos gerar a sada do nosso mdulo para fornecer retorno visual das mudanas de configurao. Gerenciando as configuraes de usurio Vamos chamar esse mdulo de "TutorialSecond" para que possamos novamente necessitar de criar um novo diretrio do mdulo e arquivo de classe - que ser nomeado "tutorialsecond" e "tutorialsecond.php", respectivamente. O arquivo de classe (tutorialsecond.php) deve conter o seguinte: 01 <?php 02 class Tutorialsecond extends Module 03 { 04 private $_html = ''; 05 06 function __construct() 07 { 08 $this->name = 'tutorialsecond'; 09 parent::__construct(); 10 11 $this->tab = 'eCartService.net Tutorials'; 12 $this->version = '0.1.0'; $this->displayName = $this->l('Second Tutorial 13 Module'); $this->description = $this->l('Our second module - A 14 "Hello world" redux'); 15 } 16 17 public function getContent() 18 { 19 20 } 21 22 private function _displayForm() 23 { 24 25 } 26

27 } 28 // End of: tutorialsecond.php Voc vai perceber que temos implementado duas novas funes de membro ::getContent() e ::_displayForm(). Se voc fizer o upload do arquivo para o servidor e instalar este mdulo, nesta fase, voc ver uma nova opo na tela da lista de mdulos para o mdulo TutorialSecond. Haver agora um link ">>Configure" na entrada do mdulo, clicando embora ir apenas retornar um Voltar a pgina Office. A presena da funo de membro getContent() responsvel por isso, uma vez que fornece a interface entre o nosso mdulo e o Back Office. Alm dessas duas novas funes, temos tambm acrescentado a varivel de membro privado $_html, que usaremos neste artigo para criar a produo necessria para exibir no Back Office. Armazenar e recuperar dados de configurao O Prestashop fornece uma "configurao" de classe que oferece vrias funes de membro para manipular os dados de configurao, mas as duas funes-chave que sero os mais usados so: 1 Configuration::updateValue($key, $values, $html = false); 2 Configuration::get($key, $id_lang = NULL); A funo configuration::updateValue() permite armazenar uma opo de configurao no banco de dados (opcionalmente em vrios idiomas, caso em que o parmetro $values sero uma matriz) e a funo Configuration::get() permite recuperar dados de configurao para um idioma padro selecionado ou loja. Vamos ignorar os parmetros que possuem valores padro por enquanto, mas vamos revisar o parmetro $html na funo configuration::updateValue() no prximo artigo, enquanto vemos o objecto de validao de formulrio. Implementao da tela de configurao Em nosso arquivo de origem, criamos uma funo de membro privado _displayForm(). Isto totalmente opcional, como todo o cdigo de interface pode ser colocada na funo de membro getContent(), no entanto, altamente recomendvel que voc separe isso por uma questo de fcil manuteno de cdigo. Ns vamos criar um formulrio simples dentro desta funo a partir com a qual podemos capturar a entrada do proprietrio da loja. 01 private function _displayForm() 02 { 03 $this->_html .= ' 04 <form action="'.$_SERVER['REQUEST_URI'].'" method="post"> 05 <label>'.$this->l('Message to the world').'</label> 06 <div class="margin-form">

07 08

<input type="text" name="our_message" /> </div> <input type="submit" name="submit" value="'.$this09 >l('Update').'" class="button" /> 10 </form>'; 11 } Voc pode ver que a funo _displayForm() simplesmente adiciona o cdigo do formulrio padro html para a nossa varivel de membro $_html, com o formulrio alvo sendo $_SERVER['REQUEST_URI']. A arquitetura do Back Office dar a rota para a nossa funo membro ::getContent da classe para nos assegurar quando o formulrio for enviado. Estamos prximos de precisar adicionar o cdigo ao nosso getContent() para realmente mostrar o form e asegurar o envio do formulrio:. 01 public function getContent() 02 { 03 if (Tools::isSubmit('submit')) 04 { Configuration::updateValue($this->name.'_message', 05 Tools::getValue('our_message')); 06 } 07 08 $this->_displayForm(); 09 10 return $this->_html; 11 } Primeira a funo getContent() usa a classe "Tools" do Prestashop para testar se estamos tratando a ao POST do formulrio, ou se esta funo est sendo chamada de outro modo isto , um clique no link "Configure" na lista de mdulo - o parmetro o nome que demos ao nosso boto "update" no formulrio. Se a funo est sendo chamada diretamente pelo Back Office (no qual Tools::isSubmit(submit) ir retornar false), ento chamamos a funo de renderizao do form que criamos acima e retorna a sada, capturado na varivel $this->_html, para o Back Office para mostrar. Se a funo est sendo chamada como resultado da nossa publicao do form, ento, podemos armazenar o nosso parmetro de configurao no banco de dados com o valor inserido no nosso formulrio. Voltamos a usar a classe Tools para obter o valor da varivel de formulrio usando Tools::getValue(our_message) onde 'our_message' o nome do campo de entrada no nosso formulrio.

Voc pode ver que eu adicionei o nome do nosso mdulo para o incio do nome do item de configurao - isto para garantir que a chave de configurao nica, porque o espao para essas chaves so compartilhados por toda a loja. Uma vez que temos dados armazenados, nossa configurao do formulrio exibido novamente, pronto para mais entrada, se necessrio. Mdulo de sada em uma pgina Ns agora temos um mtodo de capturar entradas da prpria loja e salv-la no banco de dados, portanto, o prximo passo bvio seria fazer algo com ele, por exemplo exibi-lo em uma pgina. Na parte 1 da srie falamos de "hooks" em relao aos mdulos, adicionando funcionalidade. Para poder utiliz-lo precisamos dizer que o nosso mdulo PrestaShop gostaria de conectar com o front office e fazemos isso usando a seguinte funo (definido na classe base Module): 1$this->registerHook($hook_name); O parmetro $hook_name refere-se a um dos diversos pontos que o ncleo do Prestashop permite que os mdulos retirem, inserem e/ou processem os dados, mas por enquanto vamos usar um em particular - "leftcolumn', o que nos permite adicionar contedo na coluna da esquerda de todas as pginas. A fim de inicializar o gancho precisamos adicionar o seguinte em nossa classe: 1 public function install() 2 { 3 parent::install(); 4 5 if (!$this->registerHook('leftColumn')) 6 return false; 7 } Isto diz ao Prestashop para executar nosso mdulo gancho quando ele est retornando o contedo para a coluna da esquerda de todas as pginas. Estamos prximos da necessidade de adicionar uma funo para lidar com o retorno de gancho. A conveno o nome da funo como o nome do gancho precedido de "hook": 1 public function hookLeftColumn() 2 { return '<div class="block"><h4>'. Configuration::get($this3 >name.'_message') . '</h4></div>'; 4 } No nosso exemplo simples, ns temos apenas o nosso envolvimento no parmetro de configurao em uma marcao HTML

padro, para que ele seja exibido corretamente em nossa pgina. Se voc j tiver instalado o mdulo, voc deve desinstalar e reinstalar agora para garantir que o gancho ser registrado corretamente com o ncleo Prestashop. Agora voc pode inserir um valor na tela de configurao para o mdulo - por exemplo, 'Ol Mundo', e ser inserido como o ttulo de uma caixa na coluna da esquerda de sua loja. O cdigo completo para o segundo exemplo deve agora estar como: 01 <?php 02 class Tutorialsecond extends Module 03 { 04 private $_html = ''; 05 06 function __construct() 07 { 08 $this->name = 'tutorialsecond'; 09 parent::__construct(); 10 11 $this->tab = 'eCartService.net Tutorials'; 12 $this->version = '0.1.0'; $this->displayName = $this->l('Second Tutorial 13 Module'); $this->description = $this->l('Our second module - A 14 "Hello world" redux'); 15 } 16 17 public function install() 18 { 19 parent::install(); 20 21 if (!$this->registerHook('leftColumn')) 22 return false; 23 } 24 25 public function getContent() 26 { 27 if (Tools::isSubmit('submit')) 28 { Configuration::updateValue($this->name.'_message', 29 Tools::getValue('our_message')); 30 } 31 32 $this->_displayForm(); 33

34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

return $this->_html; } private function _displayForm() { $this->_html .= ' <form action="'.$_SERVER['REQUEST_URI'].'" method="post"> <label>'.$this->l('Message to the world').'</label> <div class="margin-form"> <input type="text" name="our_message" /> </div> <input type="submit" name="submit" value="'. $this->l('Update').'" class="button" /> </form>'; }

public function hookLeftColumn() { return '<div class="block"><h4>'. 51 Configuration::get($this->name.'_message') . '</h4></div>'; 52 } 53 54 } 55 // End of: tutorialsecond.php Resumo Neste artigo iremos estender o nosso primeiro mdulo para incluir uma forma de configurao bsica e usar uma funo de gancho para mostrar a sada do nosso mdulo na coluna da esquerda de nossas pginas. Na prxima parte desta srie, vamos procurar melhorar a facilidade de configurao, em algo que poderia ser usada em uma implementao real do mdulo. Isto incluir a validao da entrada do usurio para o formulrio, e preencher os campos do formulrio conforme o caso com base na configurao atual e mostrar os erros do mdulo e avisos nas telas de Back Office.

Validao de formulrio e de Segurana Introduo Apesar de ser suficientemente funcional para aquilo que faz, o mdulo que criamos na Parte 2 nos apresenta algumas questes a considerar na implementao real dos mdulos para estender o Prestashop. Em determinada entrada do usurio que ns capturamos com nosso formulrio, foi escrito diretamente para a entrada de configurao, sem qualquer verificao para determinar se ele era vlido, nem levamos em conta o tipo de dados que est sendo digitado. Neste tutorial, vamos olhar para a questo geral de verificao de formulrio de entrada e de segurana, tanto para o Back Office e Front Office e formas de entrada do usurio, bem como procurando melhorar o nosso cdigo funcional e esteticamente. A classe Configuration revisitado Na Parte 3, que abordou superficialmente um parmetro adicional que pode ser passado para o mtodo da classe Configuration::updateValue() . Se voc chamar a funo ter a seguinte forma: 1updateValue($key, $values, $html = false); Na Parte 3, que ignorou o parmetro $html e permitiu que a funo usasse o valor padro de "false". Ao fazer isso, realmente, inadvertidamente, acrescentou o primeiro elemento de segurana e validao para nosso cdigo. Quando definido como "false" o mtodo updateValue() realmente pr-processa o valor a ser escrito usando o seguinte cdigo ($string is the input value passed to the function): 1$string = strip_tags(nl2br2($string)); Voc pode testar inserindo um pouco de HTML na tela de configurao para o mdulo que criamos na Parte 3. Voc ver que todas as tags de html em sua entrada so removidos. Ns poderamos modificar o mdulo TutorialSecond para permitir a entrada de html no formulrio, alterando a linha 29 no arquivo de origem para: 1 Configuration::updateValue($this->name.'_message', Tools::getValue('our_message', true));

Isto ilustra o princpio fundamental de que precisamos empregar todo o nosso prprio cdigo para garantir que ele seja seguro e funcione de maneira previsvel. Felizmente o Prestashop nos fornece algumas ferramentas que podemos usar em nosso cdigo para torn-lo mais seguro e robusto.

Validao O Prestashop nos fornece uma classe chamada Validate, que podemos usar para determinar se qualquer entrada do usurio que aceitamos vlido ou no. A lista de funes de membro bastante grande, mas vale a pena reproduzir alguns deles aqui para ilustrar o ponto - para obter uma lista completa voc deve consultar o arquivo classes/Validate.php na sua distribuio Prestashop. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 isEmail($email); isFloat($float); isUnsignedFloat($float); isCleanHtml($html); isDate($date); isBool($bool); isPhoneNumber($phoneNumber); isPostCode($postcode); isInt($int); isUnsignedInt($int); isUnsignedId($id); isNullOrUnsignedId($id); isUrl($url); isAbsoluteUrl($url); isFileName($name);

Como exemplo, podemos usar a funco isCleanHtml() a partir da lista acima como um teste para o mdulo para prevenir XSS (cross site scripting) - de maneira que podemos permitir a entrada html com segurana. Validao dos dados do nosso formulrio Como antes, vamos criar um novo mdulo com base na verso anterior. Por que no tentar modificar a classe Tutorialsecond para criar o mdulo Tutorialthird? Se voc preferir no, ento s expandir e copiar o cdigo abaixo, conforme apropriado! 01 <?php 02 class Tutorialthird extends Module 03 { 04 private $_html = ''; 05 06 function __construct() 07 { 08 $this->name = 'tutorialthird'; 09 parent::__construct(); 10 11 $this->tab = 'eCartService.net Tutorials';

12 13

$this->version = '0.1.0'; $this->displayName = $this->l('Third Tutorial Module'); $this->description = $this->l('Our third module 14 Security and Validation'); 15 } 16 17 public function install() 18 { 19 parent::install(); 20 21 if (!$this->registerHook('leftColumn')) 22 return false; 23 } 24 25 public function getContent() 26 { 27 if (Tools::isSubmit('submit')) 28 { Configuration::updateValue($this->name.'_message', 29 Tools::getValue('our_message')); 30 } 31 32 $this->_displayForm(); 33 34 return $this->_html; 35 } 36 37 private function _displayForm() 38 { 39 $this->_html .= ' <form action="'.$_SERVER['REQUEST_URI'].'" 40 method="post"> <label>'.$this->l('Message to the 41 world').'</label> 42 <div class="margin-form"> 43 <input type="text" name="our_message" /> 44 </div> <input type="submit" name="submit" value="'. 45 $this->l('Update').'" class="button" /> 46 </form>'; 47 } 48 49 public function hookLeftColumn() 50 {

return '<div class="block"><h4>'. Configuration::get($this->name.'_message') . '</h4></div>'; 52 } 53 54 } 55 // End of: tutorialthird.php 51 A primeira etapa do processo consiste em modificar a nossa getContent() para adicionar a etapa de validao: 01 public function getContent() 02 { 03 if (Tools::isSubmit('submit')) 04 { 05 $this->_postValidation(); 06 07 if (!sizeof($this->_postErrors)) 08 { Configuration::updateValue($this->name.'_message', 09 Tools::getValue('our_message')); $this->_html .= '<div class="conf confirm">'.$this10 >l('Settings updated').'</div>'; 11 } 12 else 13 { 14 foreach ($this->_postErrors AS $err) 15 { $this->_html .= '<div class="alert error">'. 16 $err.'</div>'; 17 } 18 } 19 } 20 21 $this->_displayForm(); 22 23 return $this->_html; 24 } Ns tambm precisamos adicionar uma declarao para a varivel membro $_postErrors que ns introduzimos no incio da nossa definio de classe, por exemplo 1 class Tutorialthird extends Module 2 { 3 private $_html = '';

private $_postErrors = array();

O fluxo de lgica quando postarmos dados por getContent() agora ns chamarmos _Validation() para testar as reas apresentadas e definir a nossa matriz $_postErrors com mensagens de erro. Se houver erros, podemos apresent-los antes da reapresentao do formulrio. Se as verificaes de validao so passadas, ento vamos mostrar uma mensagem "sucesso" para dar um feedback visual que a configurao foi atualizada. Um teste simples XSS na funo _Validation() para o nosso exemplo poderia ser: 1 private function _postValidation() 2 { 3 if (!Validate::isCleanHtml(Tools::getValue('our_message'))) $this->_postErrors[] = $this->l('The message you entered 4 was not allowed, sorry'); 5 } Obviamente voc no est limitado a usar os testes fornecidos pela classe Validate, e voc tambm pode aplicar vrios testes para cada campo apresentado - para testar comprimento etc. O princpio bsico o mesmo em todos os casos, no importa quo complexa seus requisitos validao so. Resumo Neste artigo, ns melhoramos a nossa forma de manipulao atravs da adio de validao de entrada do usurio para aumentar a segurana e/ou confiabilidade. Ns tambm adicionamos um feedback visual quando a configurao foi atualizada com xito. Na parte final desta srie, vamos adicionar alguns toques finais cosmticos a nossa forma de padronizar a interface e melhorar a usabilidade. Vamos tambm procurar melhorar e estender o "modelo" do mdulo que criamos.

Fonte: http://www.ecartservice.net/24072009/writing-your-own-prestashopmodule-part-1/ http://www.ecartservice.net/24072009/writing-your-own-prestashopmodule-part-2/ http://www.ecartservice.net/24072009/writing-your-own-prestashopmodule-part-3/ http://www.ecartservice.net/24072009/writing-your-own-prestashopmodule-part-4/ traduo: Geraldo Sergio Silveira Elvira

Vous aimerez peut-être aussi