DaRkShAfT 0 Denunciar post Postado Dezembro 13, 2010 Oi galera, Eu estou começando com ZF e para isso estou criando um site não muito complexo... Tenho a estrutura de arquivos e colocar o site a rular não foi grande problema... Cria-se o controller, a view e tá a andar... Agora gostaria era de uma ajudinha e umas luzes para continuar o trabalho :) Por exemplo, eu quero montar uma galeria do seguinte modo: - Um ficheiro de xml com os endereços das imagens e o titulo - Acedo ao ficheiro, leio as imagens e crio a galeria As minhas dúvidas, qual o melhor sitio para colocar o ficheiro xml, e onde vou concentrar toda a acção? Faço toda a operação no controller e envio o resultado para a view, posso criar outras funções no controller ou será melhor criar a minha classe galeria e depois aceder a mesma na action do controller? Já existe algumas funcionalidades na ZF que me facilitem o trabalho? Valeu[] Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Dezembro 13, 2010 Olá!!! Ficou meio difícil de entender exatamente o que você precisa, por causa das diferenças entre o português de Portugal e o nosso português, mas vamos tentar: ...qual o melhor sitio para colocar o ficheiro xml, e onde vou concentrar toda a acção? Acredito que o melhor local para ficar é dentro de uma pasta chamada Database, colocada dentro de application. Você pode colocar também dentro da pasta Models/Database. Faço toda a operação no controller e envio o resultado para a view, posso criar outras funções no controller ou será melhor criar a minha classe galeria e depois aceder a mesma na action do controller? Aí já é uma dúvida mais de MVC do que do Zend Framework propriamente dito. Seguindo os conceitos de abstração, você deveria fazer ORM desta galeria, independente de onde ela venha (XML, Banco de dados, arquivo de Texto, listagem externa...), sendo que o Controller não deve "conhecer" o seu XML. Quem deve fazer isto é o de Model (M do MVC). Espero ter ajudado. Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
DaRkShAfT 0 Denunciar post Postado Dezembro 13, 2010 Olá!!! Ficou meio difícil de entender exatamente o que você precisa, por causa das diferenças entre o português de Portugal e o nosso português, mas vamos tentar: ...qual o melhor sitio para colocar o ficheiro xml, e onde vou concentrar toda a acção? Acredito que o melhor local para ficar é dentro de uma pasta chamada Database, colocada dentro de application. Você pode colocar também dentro da pasta Models/Database. Faço toda a operação no controller e envio o resultado para a view, posso criar outras funções no controller ou será melhor criar a minha classe galeria e depois aceder a mesma na action do controller? Aí já é uma dúvida mais de MVC do que do Zend Framework propriamente dito. Seguindo os conceitos de abstração, você deveria fazer ORM desta galeria, independente de onde ela venha (XML, Banco de dados, arquivo de Texto, listagem externa...), sendo que o Controller não deve "conhecer" o seu XML. Quem deve fazer isto é o de Model (M do MVC). Espero ter ajudado. Carlos Eduardo Valeu Carlos, Peço desculpa pelas diferenças no português e deve-se notar ainda mais quando eu tento utilizar alguns termos brasileiros... Eu já estou a compreender, o controller recebe o pedido e invoca o model que vai tratar da parte de dados da aplicação, neste caso lê o ficheiro xml etc... a view é onde é apresentada a informação de modo a que o utilizador consiga compreender. Certo? Agora a minha dúvida está no seguinte, eu no controller invoco o model e este vai-me retornar por exemplo um array com as fotos da galeria, agora onde é que eu escrevo o loop que me permite criar o html? Faço isso no controller, ou na view? É porque assim a view vai ter alguma programação juntamente com html... Consegue compreender a minha dúvida? Thanks[] Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Dezembro 13, 2010 Faz o loop na view. Se quiser (ou se tiver muita programação dentro do loop), você pode criar um ViewHelper, só para não deixar a lógica toda dentro da view. Para passar alguma informação do controller para a view, faça assim: // no controller $this->view->variavel = $valor; // na view echo $this->variavel; Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
DaRkShAfT 0 Denunciar post Postado Dezembro 15, 2010 Oi cara, Então eu crio o model, e depois no controler dentro da action é que vou requesitar o model certo? Depois passo o resultado para a view? É assim que funciona? Pode dar-me um exemplo apesar de isto ser orm... Valeu [] Olha isto é o que eu fiz até agora... só para tentar compreender... eu vou postar aqui e assim você pode explicar-me melhor: meu ficheiro model <?php class Model_Gallery { private $path = "../application/database/"; private $file = "gallery.xml"; public function loadXml(){ // Load Xml file $path_file = $this->path.$this->file; $xml = simplexml_load_file($path_file); return $xml; } } meu controller <?php class GaleriaController extends Zend_Controller_Action { public function init() { /* Initialize action controller here */ } public function indexAction() { // Model Gallery $Model_Gallery = new Model_Gallery(); $xml = $Model_Gallery->loadXml(); $this->view->xml = $xml; } } meu view helper <?php class Zend_View_Helper_Gallery extends Zend_View_Helper_Abstract { public $columns=4; function gallery($xml){ //echo "Gallery"; } } e agora na minha view eu recebo o xml do controller e chamo o metodo gallery da view helper e passo o xml como atributo? É correcto assim? Valeu[] Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Dezembro 15, 2010 Certo. Então, vamos modificar algumas pequenas coisas: <?php class Model_Gallery { private $_path = "../application/database/"; private $_file = "gallery.xml"; public function fetchAll(){ // Load Xml file $path_file = $this->path.$this->file; $xml = simplexml_load_file($path_file); // aqui você pode montar um Array ou objeto com as propriedades que você vai precisar, dependendo de como está montado o seu XML // aí você retorna este array/objeto return $xml; } } Controller <?php class GaleriaController extends Zend_Controller_Action { public function init() { /* Initialize action controller here */ } public function indexAction() { // Model Gallery $gallery = new Model_Gallery(); $this->view->galeria = $gallery->fetchAll(); } } Porque eu modifiquei o nome do método? Porque hoje os dados podem estar em um XML, mas amanhã você pode ter isto em uma tabela do banco de dados, por exemplo. Aí, você teria que modificar o nome dos métodos dentro do controller, e para fazer sentido, mudar também o nome da variável dentro da view. Então, imaginando que você tenha no XML só uma propriedade, chamada caminho dentro do XML, na View você pode fazer assim: <div id="galeria"> <?php foreach($this->galeria as $imagem) : ?> <img src="<?php echo $imagem->caminho; ?>" /> <?php endforeach; ?> </div> Nunca trabalhei com XML, então não me lembro se assim dá pra acessar as propriedades, mas a ideia é esta. Veja o que consegue fazer aí e vai postando o progresso e a gente vai debatendo sobre a melhor solução. Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
DaRkShAfT 0 Denunciar post Postado Dezembro 15, 2010 Oi, Sim você está correcto, eu somente enviei um exemplo... Não vai ficar assim... Mas por acaso o retorno do simplexml é um objecto. Mas eu compreendi o seu ponto de vista ;) Eu já estou a compreender esta arquitectura... O Controller recebe o pedido, o model trata dos dados, e a view apresenta... Se eu no model quiser adicionar alguma class minha exterior, basta colocar em library e instanciar. No geral, depois na view vou buscar a informacao passada pelo controller(que recebe os dados do model) e neste caso passo para o helper view para ficar o html mais limpo! :) Valeu? [] Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Dezembro 15, 2010 No geral, depois na view vou buscar a informacao passada pelo controller(que recebe os dados do model) e neste caso passo para o helper view para ficar o html mais limpo! :) Só utilize view helper se for necessário. Para um laço simples (while ou foreach), EU não vejo necessidade. Tem pessoas que acham que nem o laço de repetição deve ficar na view, mas enfim... Aí depende de cada um. De resto, perfeito. Você pode instanciar uma classe externa sua no Controller também, sem maiores problemas. Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
DaRkShAfT 0 Denunciar post Postado Dezembro 20, 2010 No geral, depois na view vou buscar a informacao passada pelo controller(que recebe os dados do model) e neste caso passo para o helper view para ficar o html mais limpo! :) Só utilize view helper se for necessário. Para um laço simples (while ou foreach), EU não vejo necessidade. Tem pessoas que acham que nem o laço de repetição deve ficar na view, mas enfim... Aí depende de cada um. De resto, perfeito. Você pode instanciar uma classe externa sua no Controller também, sem maiores problemas. Carlos Eduardo Oi, Qual é o objecto responsável pelo headLink(), headScript(), etc. e como eu posso aceder a ele no controller de modo a efectuar apêndices de ficheiros só num determinado controller? É possível? Obrigado[] Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Dezembro 20, 2010 Na verdade eles são todos ViewHelpers, então, dentro do controller, estão dentro de $this->view. Vejamos alguns exemplos, todos dentro de um controller: // adicionando um arquivo script $this->view->headScript ()->appendFile ( $this->_request->getBaseUrl () . '/script/nome.js' ); // adicionando uma folha de estilo (não tenho certeza se é assim mesmo) $this->view->headLink()->prependStylesheet($this->_request->getBaseUrl (). 'estilos/estilo.css' ); // adicionando um headTitle específico para o controller $this->view->headTitle ()->append ( 'Título específico' ); // OU $this->view->headTitle ()->prepend ( 'Título específico' ); // adicionando um headMeta - description - para SEO $this->view->headMeta ( 'Descrição da página', 'description' ); // palavras-chave (keywords) para SEO $this->view->headMeta ( 'Palavras-chave', 'keywords' ); Para que isto funcione, no arquivo de layout você deve ter algo assim: // definindo um título base para todas as páginas $this->headTitle()->append('Nome Base'); // definindo o separador entre os títulos $this->headTitle()->setSeparator(' - '); // adicionando uma head meta http equiv $this->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=UTF-8'); // definindo um separador para as folhas de estilo e adicionando uma folha de estilo $this->headLink()->setSeparator(PHP_EOL) ->prependStylesheet($this->baseUrl('estilos/estilo.css')); // definindo separador para os arquivos script e incluindo um arquivo $this->headScript ()->setSeparator(PHP_EOL) ->prependFile ($this->baseUrl('script/jquery/jquery-1.4.2.min.js') ); // imprimindo todos os headers (titulo, meta, link e script); echo $this->headTitle(),PHP_EOL; echo $this->headMeta(),PHP_EOL; echo $this->headLink(),PHP_EOL; echo $this->headScript(); Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
DaRkShAfT 0 Denunciar post Postado Dezembro 20, 2010 Oi, Valeu! :) Eu já tinha chegado quase lá, somente não compreendi o porquê do separado... Eu posso submeter um formulário por exemplo para index/submit, e depois utilizar somente o controller submit e fazer um redirect novamente para a página index sem ter que criar uma view submit, certo? Vou criar um formulário para cadastrar e-mails para a newsletter... vamos ver como me safo :) [] Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Dezembro 20, 2010 ...somente não compreendi o porquê do separado... Depende de qual separador você fala. No caso do script e link, é só para o fonte (HTML) ficar mais bonitinho, pois fica um link/script em cada linha. No caso do Título, ele separa cada título pelo caracter que você definir ali. Então, um exemplo. Seu site se chama Site, você tem um controller Noticias e uma notícia que se chama A Notícia. Então, para que o título da página fique A Notícia - Notícias - Site, você faz assim: // Controller $this->view->headTitle ()->append ( 'Noticias' ); $this->view->headTitle ()->append ( 'A Notícia' ); // layout $this->headTitle()->append('Site'); echo $this->headTitle(); Eu posso submeter um formulário por exemplo para index/submit, e depois utilizar somente o controller submit e fazer um redirect novamente para a página index sem ter que criar uma view submit, certo? Olha, poder até pode, mas eu não gosto de fazer assim não. Veja aqui a forma que eu gosto de fazer. No caso, é um formulário de contato totalmente funcional, com validações e tudo mais. Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
DaRkShAfT 0 Denunciar post Postado Dezembro 27, 2010 OI, O projecto está correndo bastante bem e eu acho que estou trab bem... Tenho algumas dúvidas mas algumas vou deixar para quando tiver mais tempo! Trabalhar com o Jquery, ... :P Tem como aceder a um ficheiro fora da dir public na src da imagem? Tipo eu tenho um repositório de classes que coloquei dentro da pasta library, agora queria chamar um ficheiro que está dentro dessa dir, por exemplo, <img src="../library/thumbs/thumb.php?src=xx.jpg?w=150" /> para ele receber o parametro src e width e criar um thumb da imagem... Isto não dá certo pois não? Por uma lado isto não é muito correcto porque eu estou dizendo que fora de public tenho uma dir library, mas o utilizador não tem como aceder... No entanto eu não estou conseguindo aceder fora da dir public! :s Eu estou tentando isto para manter toda a parte logica do projecto fora de public! Outra dúvida é no Zend_Form, como é que posso definir uma mensagem de erro igual para todos os campos? Sem ter que definir campo a campo... Valeu[] Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Dezembro 27, 2010 Bom, só por uma questão de organização e facilidade para outras pessoas buscarem, vamos manter uma dúvida em cada tópico. Portanto, crie um tópico para cada uma das dúvidas que você tem. Outra coisa, quando for responder, utilize o botão "Responder" azul no final do tópico, ou então o campo de resposta rápida que fica logo abaixo deste botão "Responder". Como a dúvida inicial foi resolvida, vamos marcar este tópico como Resolvido. Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites