Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Hamilcar

Módulos

Recommended Posts

Estou iniciando com o zendframework, criei uma estrutura do zend pela zendtool e dentro desta estrutura criei um modulo 'admin', estou tentando implementar o código de autenticação publicado no imastes, http://imasters.com.br/artigo/16900/zend/autenticacao_com_zend_framework/, o código chama tanto o principal que ficou em application, quanto o módulo admin que se encontra em 'application/modules/admin', o que acontece é que quando é criado a instancia do form de login, o zend não encontra o mesmo, criei o form no application e aí sim encontra, então eu acredito que seja alguma configuração que não estou conseguindo acertar, será que poderiam me ajudar, obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, toda vez que eu trabalho com módulo, eu elimino da pasta application os controllers e views, deixando tudo dentro da pasta modules mesmo. Imaginando que estamos falando em um site, temos o site (módulo default) e o painel administrativo (módulo admin). Então, a estrutura fica assim:

 

 

/appplication
     /configs
     /models
     /modules
          /admin
               /controllers
               /views
                  /scripts
          /default
               /controllers
               /views
                  /scripts
     /translate
     Bootstrap.php
/library
     /Zend
     /ZendX
/public
     /imagens
     /estilos
     /scripts
     index.php

Eu não utilizo uma pasta para os forms, porque em nenhum projeto meu que eu tenha desenvolvido até hoje, precisei utilizar um mesmo formulário em mais de um controller. Se no seu caso isto é necessário, eu sugiro que a estrutura esteja assim:

/appplication
     /configs
     /forms (ou outro nome que você quiser colocar)
     /models
     /modules
          /admin
               /controllers
               /views
                  /scripts
          /default
               /controllers
               /views
                  /scripts
     /translate
     Bootstrap.php
/library
     /Zend
     /ZendX
/public
     /imagens
     /estilos
     /scripts
     index.php

Lembrando que o Zend_Tool tem a opção de criar a pasta e o arquivo do form, com o método init(). Utilizando este método, creio que você não terá problemas com arquivos não localizados.

 

Uma pergunta, você está com o Zend_Autoload funcionando?

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Matias, obrigado por responder, estou querendo montar a estrutura e ainda estou pensando como ficará, qual a mais prática e menos problemática, a sua primeira estrutura é legal, com a estrutura que exemplifiquei, consegui fazer rodar o exemplo de autenticação com a ajuda do próprio Fernando, mas estou pensando e adotar esta estrutura com o site inteiro dentro de modules, a única alteração que ainda quero é de colocar a pasta library fora do projeto para ser usada por mais de um site, e colocar o index no mesmo nível de application e fora de public para que não precise redirecionar para a pasta public, não tenho certeza ainda, gostaria que me indicassem como proteger o diretório root, onde ficaria o index, e também as demais pastas, na estrutura que montei, só consegui rodar a aplicação quando coloquei o autoloader como abaixo:

 

protected function _initAutoload()
	{
 	return new Zend_Application_Module_Autoloader(array(
 	'namespace' => 'Admin_',
 	'basePath' => APPLICATION_PATH . '/modules/admin',
 	));
	}

tentei colocar como em um exemplo do Fábio que coloca 'autoloaderNamespace[]=modulo' sem resultado, talvez alguma coisa que fiz errado, então surgiu a dúvida, como colocar mais módulos com a função acima, obrigado mais uma vez.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos por partes:

 

a única alteração que ainda quero é de colocar a pasta library fora do projeto para ser usada por mais de um site

 

Olha, dá uma olhada em como o Zend Server faz. É exatamente o que você quer.

 

...e colocar o index no mesmo nível de application e fora de public para que não precise redirecionar para a pasta public

 

Aí já não sei o porque disto... Imaginemos que você contrata um provedor, que tem a seguinte estrutura, no raiz do FTP, onde public_html é o diretório raiz do site:

/logs
/public_html
/tmp
Imaginando a primeira estrutura que eu sugeri:

/appplication
     /configs
     /models
     /modules
          /admin
               /controllers
               /views
                  /scripts
          /default
               /controllers
               /views
                  /scripts
     /translate
     Bootstrap.php
/library
     /Zend
     /ZendX
/logs
/public_html
     /imagens
     /estilos
     /scripts
     index.php
/tmp
Veja que fazendo desta forma, todo o seu conteúdo que estava fora de public (application que não deve ficar acessível) não fica acessível pela URL, já que o DOCUMENT_ROOT fica em public_html. E sabe qual o melhor desta estrutura? Se você utiliza na sua máquina como estava na primeira sugestão e coloca no servidor como eu sugeri agora, você não precisa mudar NADA no projeto... NADA MESMO!!! Sabe porque? Olha só como é o APPLICATION_PATH definido pelo ZF.

defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
Então, o ZF pega o path completo a partir do index.php, volta um diretório e pega a pasta application. E todos os outros caminhos dentro do ZF são relativos a este, então, fica 100% show de bola assim.

 

Na minha opinião, a melhor estrutura é a montada pelo Zend_Tool mesmo, colocando o site todo em modules.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

No meu caso, o servidor configura os site assim, se temos 2 sites, site1.com e site2.com, a estrutura fica assim:

 

/logs/

/mail/

site1.com/

site2.com/

 

então da maneira que eu quero o index vai ficar dentro do diretório do site e será chamado direto, agora a library eu gostaria de colocar no mesmo nível dos sites.

Compartilhar este post


Link para o post
Compartilhar em outros sites

No meu caso, o servidor configura os site assim, se temos 2 sites, site1.com e site2.com, a estrutura fica assim:

 

/logs/

/mail/

site1.com/

site2.com/

 

Certo. Então, para colocar o index fora da pasta public, você precisa modificar o APPLICATION_PATH dentro do index.php, retirando o ../.

 

 

agora a library eu gostaria de colocar no mesmo nível dos sites.

 

Você tem acesso ao php.ini? Se tiver, adicione este caminho ao include_path. Se não tiver ao php.ini, modifique no index.php o caminho para library. Então, seu index.php ficaria mais ou menos assim:

Estrutura de pastas:

/logs/
/mail/
/site1.com/
	/appplication
	     /configs
	     /models
	     /modules
	          /admin
	               /controllers
	               /views
	                  /scripts
	          /default
	               /controllers
	               /views
	                  /scripts
	     /translate
	     Bootstrap.php
	/library
	/public
	     /imagens
	     /estilos
	     /scripts
	index.php
site2.com/
	/appplication
	     /configs
	     /models
	     /modules
	          /admin
	               /controllers
	               /views
	                  /scripts
	          /default
	               /controllers
	               /views
	                  /scripts
	     /translate
	     Bootstrap.php
	/library
	/public
	     /imagens
	     /estilos
	     /scripts
	index.php
index.php

<?php

// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../../library'),
    get_include_path(),
)));

/** Zend_Application */
require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap()
            ->run();

O problema de utilizar assim é que a pasta application fica disponível para acesso direto pela URL, o que é um problema. Para bloquear o acesso, você pode utilizar .htaccess, com deny for all (acho que é assim).

 

O que você pode fazer também é colocar o seu CMS em módulos fora, no mesmo caminho que a library e compartilhar ele entre os seus projetos, trabalhando com rotas. Por exemplo, você monta um módulo de notícias, que vai ser compartilhado entre todos os sites. Se quiser pensar nesta hipótese, sugiro dar uma olhada na lógica utilizada pelo TomatoCMS, que é feito em Zend Framework. Eu não gosto dele, acho muito lento, mas, pode ser que te ajude.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

É isto mesmo que quero, já coloquei a primeira aplicação para começar alguns testes na estrutura e por enquanto está normal, preciso realmente de proteger as pastas, pois dão acesso direto, qualquer dúvida posto novamente, obrigado a todos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.