Ir para conteúdo

POWERED BY:

Arquivado

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

WarLiKe

[Resolvido] /module/controller/action

Recommended Posts

Olá pessoal,

 

Sou iniciante em ZF e estou o dia inteiro tentando fazer o ZF carregar meu module dinamicamente de acordo com o que eu digito na URL

 

Ex:

 

www.meudominio.com.br/painel/login/index

 

painel = modulo;

login = controller;

index = action;

 

O controller e a action de acordo com meu script atual carregam . . . mas o module não ta . . . . sejá lá o que for q eu digito no modulo, ele carrega o modulo de painel.

 

minha estrutura de diretorio esta resumidamente assim:

 

app

 

----painel

-------controllers

-------model

-------views

 

----sites

-------controllers

-------model

-------views

 

library

 

etc . . .

 

meu bootstrap ta assim:

 

Zend_Loader::loadClass('Zend_Loader_Autoloader');
		
$autoloader = Zend_Loader_Autoloader::getInstance();
		
$autoloader->registerNamespace('Painel');
		 
$controlador = Zend_Controller_Front::getInstance();
		
$controlador->setDefaultModule('painel');
		
$router = $controlador->getRouter();
		
$route = new Zend_Controller_Router_Route('/:module/:controller/:action/*', array("module" => ":module", "controller" => "index",	"action" => "index"));

$router->addRoute('painel',$route);
		 
$controlador->throwExceptions(true);
		
$controlador->setControllerDirectory('./app/' . $controlador->getDefaultModule() . '/controllers');

coloquei só o necessário, o restante é de cookies e registro.

 

Olha lá no código . . . eu peço pra carregar o :module e nada . . . deve ser o $controlador->setDefaultModule('painel'); mas se eu tiro da erro ¬¬''

 

Alguém tem uma solução pra isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse seu "só o necessário" ainda tem coisa pra caramba :P

 

Tenta assim:

 

$dirs = array( 'admin'  => APPLICATION_PATH . 'admin'  . DS . 'controllers' . DS,
              'portal' => APPLICATION_PATH . 'portal' . DS . 'controllers' . DS
                 );

Zend_Controller_Front::getInstance()
     -> throwExceptions( TRUE )
     -> returnResponse( TRUE )
     -> setControllerDirectory( $dirs )
     -> setDefaultModule( 'portal' );

No caso, APPLICATION_PATH é minha constante que aponta para o diretório /application:

 

define( 'DS', DIRECTORY_SEPARATOR );
define( 'BASEPATH', getcwd() . DS );

define( 'APPLICATION_PATH', BASEPATH . 'application' . DS );

E ainda tem a questão da nomenclatura das classes.

 

Como viu, eu defini o módulo portal como sendo o padrão, isto é, para que ao acessar www.meusite.com, seja carregado o IndexController.php de /potal/controllers.

 

Essas classes, do módulo padrão, você nomeia igual ao nome do arquivo, porém, obviamente, sem a extensão.

 

Já as classes do módulos recebem o prefixo Nomedomodulo_, assim, a classe do arquivo /admin/controllers/IndexController.php deverá ser Admin_IndexController.

 

ATENÇÃO! Se você estiver programando no Windows lembre-se de que esse trambolho de[/b] sistema operacional (o qual ainda sou escravo também) é case-insensitive, então mesmo que não respeite o case das classes, vai funcionar.

 

Mas, quando transferir para o Servidor online, que normalmente é Linux, vai dar problema.

 

O ZF transforma os nomes das classes primeiro tudo para minúsculas, depois capitaliza elas, portanto:

 

class ADMIN_IndexController

Funcionará normalmente no Windows, mas no Linux não pois o correto seria:

 

class Admin_IndexController

 

Falo por experiência http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, primeiramente quero agradecer por estar dando essa força ai pra mim, como pode ver pelo código eu sou mesmo iniciante em ZF rs.

 

Vou postar como esta meu Bootstrap todo:

 

<?php
include 'Zend/Loader.php';
include 'Zend/Session.php';

class Bootstrap{
	public function __construct(){
		
		Zend_Loader::loadClass('Zend_Loader_Autoloader');
		
		Zend_Loader_Autoloader::getInstance()->registerNamespace('Painel');
		
		$SSID = isset($_COOKIE['ssid']) ? $_COOKIE['ssid'] : false;
		if(empty($SSID)) $SSID = false;
		if($SSID){
			Zend_Session::setId($SSID);
		}
		else {
			$SSID = md5(uniqid(date('d/m/Y H:i:s') . $_SERVER['HTTP_USER_AGENT']));
			Zend_Session::setId($SSID);
		}
		Zend_Session::start();
		
		setcookie('ssid', $SSID, time() + (SESSION_TIME_LIMIT * 60));
		
		$dirs = array(
		'portal'  => APPLICATION_PATH  . 'portal'  . DS . 'controllers' . DS);
		
		Zend_Controller_Front::getInstance()
		->returnResponse(true)
		->throwExceptions(true)
		->setControllerDirectory($dirs)
		->setDefaultModule('portal');
			
		$conexao = new Zend_Db_Adapter_Mysqli(array('host' => CON_HOST, 'username' => CON_USER, 'password' => CON_PASS, 'dbname' => CON_DB, 'port' => 3306));
		
		$authAdapter = new Painel_Auth_Adapter_Login($conexao, 'md5(?)');
		
		Zend_Registry::getInstance()->set('conexao',	$conexao);
		Zend_Registry::getInstance()->set('auth',	$authAdapter);
		 
		Zend_Controller_Front::getInstance()->dispatch();
	}
}

Dentro da minha pasta app (application) tenho minha pastinha controllers como diz ali na variável dirs e tem um arquivo chamado IndexController.php assim:

 

<?php
class Portal_IndexController extends Zend_Controller_Action{
	public function indexAction(){		
		$this->view->texto= 'Olá Mundo!';
	}
}

As constantes estão num arquivo config.php incluida dentro da Index.

 

O namespace painel é de uma pastinha dentro da library.

 

quando rodo a aplicação da um erro que estou tentando resolver aqui.

Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller class ("IndexController")' in F:\Web\zend\library\Zend\Controller\Dispatcher\Standard.php:346 Stack trace: #0 F:\Web\zend\library\Zend\Controller\Dispatcher\Standard.php(256): Zend_Controller_Dispatcher_Standard->loadClass('IndexController') #1 F:\Web\zend\library\Zend\Controller\Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #2 F:\Web\zend\app\Bootstrap.php(42): Zend_Controller_Front->dispatch() #3 F:\Web\zend\index.php(20): Bootstrap->__construct() #4 {main} thrown in F:\Web\zend\library\Zend\Controller\Dispatcher\Standard.php on line 346

Tem idéia do que pode ser?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa . . . . resolvi isso aqui

 

era esse returnResponse(true)

 

eu tirei e começou a rodar direito

 

vou testar mais aqui o restante (outros módulos)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aew ImageStudio

 

Deu certinho agora XD

 

O engraçado é que eu adicionei um módulo de teste chamado "teste"

 

e nos controllers de teste eu tenho que colocar Teste_IndexController extends . . . . . (exemplo)

 

e na do portal que é a default não posso colocar se não da erro (Portal_IndexController)

 

Mas tudo bem, o importante é que ta funcionando como eu queria . . . . vlw mesmo a ajuda cara XD

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom que resolveu, mas devo mencionar que essa sua observação foi considerada na minha resposta, na parte referente à nomenclatura de classes que eu fiz questão de incluir pois tive o mesmo problema quando migrei meu Bootstrapp para Orientado a Objetos.

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

É verdade cara . . . axo q deixei passar essa observação sem querer hehe . . foi mal!

 

Mas é isso aew . . . vlw mesmo =]

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.