DaRkShAfT 0 Denunciar post Postado Maio 4, 2011 Oi Galera, Estou aqui com uma dificuldade.. Acl.php class Plugin_Controller_Acl extends Zend_Acl { private $_auth = null; public function __construct() { $this->_auth = Zend_Auth::getInstance(); // add the roles $mdl_UserRoles = new Model_UserRoles(); $roles = $mdl_UserRoles->getUserRoles(); ... UserRoles.php class Model_UserRoles extends Zend_Db_Table_Abstract { protected $_name = 'user_roles'; const SUPERUSER_ROLE = 'superadmin'; public function getUserRoles() { ... } } Como é que eu posso requisitar o model UserRoles na class Acl sem me dar o seguinte erro: Fatal error: Uncaught exception 'Zend_Db_Table_Exception' with message 'No adapter found for Model_UserRoles' <_< Isto supostamente acontece porque quando é chamada a class Acl ainda não existe um dbAdapter... então como posso resolver isto? Eu posso criar um adapter no model, mas estava a pensar no seguinte, para ficar algo bem feito, eu vou ter que colocar os params da database num xml e criar o adapter a partir dai, porque se nao quando mudar os parms tenho que actualizar em dois lados... Solucoes? [] Compartilhar este post Link para o post Compartilhar em outros sites
Ghean 0 Denunciar post Postado Maio 7, 2011 Você pode criar em seu bootstrap protected function _initDb() { $this->config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/application.ini', 'production'); $db = Zend_Db::factory($this->config->resources->db); Zend_Db_Table_Abstract::setDefaultAdapter($db); Zend_Registry::set('db', $db); } E no seu model public function getUserRoles()() { $select = $this->getAdapter()->select(); ... } Compartilhar este post Link para o post Compartilhar em outros sites
DaRkShAfT 0 Denunciar post Postado Maio 7, 2011 Você pode criar em seu bootstrap protected function _initDb() { $this->config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/application.ini', 'production'); $db = Zend_Db::factory($this->config->resources->db); Zend_Db_Table_Abstract::setDefaultAdapter($db); Zend_Registry::set('db', $db); } E no seu model public function getUserRoles()() { $select = $this->getAdapter()->select(); ... } Oi, Assim que puder vou experimentar... Eu resolvi a situação no momento utilizando uma solução parecida colocando o código no metodo __construct() da class UserRoles... :ermm: Mas vou fazer essa situação porque parece-me mais correcta! Thanks[] :joia: Oi, Olha na realidade eu já tinha isto a funcionar(bootstrap.php): protected function _initDb() { $this->bootstrap( 'config' ); // Get config resource $config = $this->getResource( 'config' ); // Setup database $dbAdapter = Zend_Db::factory( $config->database->adapter, $config->database->params->toArray() ); $dbAdapter->setFetchMode( Zend_Db::FETCH_OBJ ); $dbAdapter->query( "SET NAMES 'utf8'" ); $dbAdapter->query( "SET CHARACTER SET 'utf8'" ); Zend_Db_Table_Abstract::setDefaultAdapter( $dbAdapter ); // Return it, so that it can be stored by the bootstrap return $dbAdapter; } No entanto quando faço $select = $this->getAdapter()->select(); no metodo getUserRoles() ele retorna o mesmo erro: Fatal error: Uncaught exception 'Zend_Db_Table_Exception' with message 'No adapter found for Model_UserRoles' in C:\Program Files\Zend\ZendServer\share\ZendFramework\library\Zend\Db\Table\Abstract.php:754 Stack trace: #0 C:\Program Files\Zend\ZendServer\share\ZendFramework\library\Zend\Db\Table\Abstract.php(739): Zend_Db_Table_Abstract->_setupDatabaseAdapter() #1 C:\Program Files\Zend\ZendServer\share\ZendFramework\library\Zend\Db\Table\Abstract.php(268): Zend_Db_Table_Abstract->_setup() #2 C:\Program Files\Zend\Apache2\htdocs\IgestCMS_v101\application\models\LibraryAcl.php(10): Zend_Db_Table_Abstract->__construct() #3 C:\Program Files\Zend\Apache2\htdocs\IgestCMS_v101\application\Bootstrap.php(28): Model_LibraryAcl->__construct() #4 C:\Program Files\Zend\ZendServer\share\ZendFramework\library\Zend\Application\Bootstrap\BootstrapAbstract.php(665): Bootstrap->_initAutoLoad() #5 C:\Program Files\Zend\ZendServer\share\ZendFramework\library\Zend\Application\Bootstrap\BootstrapAbstract.php(618): Zend_Application_Bootstrap_Boot in C:\Program Files\Zend\ZendServer\share\ZendFramework\library\Zend\Db\Table\Abstract.php on line 754 :angry: Atenção, eu acho que sei porque é que isto não funciona! Eu carrego a class Model_LibraryAcl no _initAutoLoad() do bootstrap.php, ou seja, neste caso o _initDb ainda não foi carregado! Acho que a solução foi a que eu criei... na class UserRoles no metodo __construct() chamar o Zend_Db::factory() e criar um dbAdapter para essa class... :P [] Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Maio 8, 2011 Acho que com uma modificação você soluciona os dois problemas. Você alega que cria o Acl no _initAutoLoad(). Sugiro que você crie o Navigation + Acl no _initNavigation(). Veja se resolve os dois problemas. Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
DaRkShAfT 0 Denunciar post Postado Maio 9, 2011 Acho que com uma modificação você soluciona os dois problemas. Você alega que cria o Acl no _initAutoLoad(). Sugiro que você crie o Navigation + Acl no _initNavigation(). Veja se resolve os dois problemas. Carlos Eduardo Oi, Eu julgo que sei onde está o problema, não sei é como resolver! :angry: Em relação ao erro Zend_Db_Table_Exception, faz todo o sentido isto acontecer! Então eu crio o _initDb no Bootstrap, e chamo o Acl no Bootstrap, conclusão se o Acl for chamado antes do _initDb ainda não existe nenhum adapter definido.... Não sei se os metodos são chamados pela ordem que estão dentro da class, se são metodos ja definidos... se fosse pela ordem, provavelmente conseguia resolver o problema... Em relação ao Zend_Navigation(), ele funciona correcto, acontece que eu em vez de fazer o render do navigation: $this->navigation()->menu()->render(); faço o seguinte: $this->navigation()->menu()->setPartial( array( 'partials/navigation.phtml', 'admin' ) ); e depois no partial é que vou listar o container da minha maneira, neste caso o container contém toda a navegação do site, ou seja os menus não são filtrados! Não sei como filtrar, e se dá para filtrar... :mellow: Está a entender? [] Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Maio 9, 2011 Certo... Então, três perguntas: Em qual método você cria o Model_Acl? Em qual método você USA o Model_Acl? Em qual método você cria o navigation? Poste os códigos destes métodos, no Bootstrap. Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
DaRkShAfT 0 Denunciar post Postado Maio 9, 2011 Certo... Então, três perguntas: Em qual método você cria o Model_Acl? Em qual método você USA o Model_Acl? Em qual método você cria o navigation? Poste os códigos destes métodos, no Bootstrap. Carlos Eduardo Eu tenho o seguinte: // Init AutoLoad protected function _initAutoLoad() { // Add autoloader empty namespace $autoLoader = Zend_Loader_Autoloader::getInstance(); $resourceLoader = new Zend_Loader_Autoloader_Resource( array( 'basePath' => APPLICATION_PATH, 'namespace' => '', 'resourceTypes' => array( 'AdminForm' => array( 'path' => 'modules/admin/forms/', 'namespace' => 'AdminForm_', ), 'DefaultForm' => array( 'path' => 'modules/default/forms/', 'namespace' => 'DefaultForm_', ), 'Model' => array( 'path' => 'models/', 'namespace' => 'Model_') ), )); // Register Plugin Authentication AccessCheck $this->_acl = new Model_LibraryAcl; $this->_auth = Zend_Auth::getInstance(); $fc = Zend_Controller_Front::getInstance(); $fc->registerPlugin( new My_Plugin_Controller_AccessCheck( $this->_acl, $this->_auth ) ); // Add acl to the registry so it is available sitewide $registry = Zend_Registry::getInstance(); $registry->set( 'acl', $this->_acl ); // Return it so that it can be stored by the bootstrap return $autoLoader; } ou seja, eu estou iniciando o ACL no metodo _initAutoLoad() e registando ai mesmo o plugin que controla as permissoes My_Plugin_Controller_AccessCheck. o zend_navigation é criado no seguinte metodo: // Init View protected function _initView() { $view = new Zend_View; $view->setEncoding( 'utf-8' ); // Add it to the ViewRenderer $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper( 'ViewRenderer' ); $viewRenderer->setView( $view ); // Add View Helper Path $view->addHelperPath( "My/View/Helper", "My_View_Helper" ); $view->addHelperPath( "My/View/Helper/Admin", "My_View_Helper_Admin" ); $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer(); $viewRenderer->setView( $view ); Zend_Controller_Action_HelperBroker::addHelper( $viewRenderer ); // Start MVC Zend_Layout::startMvc( array( 'layoutPath' => APPLICATION_PATH . '/modules/default/layouts/scripts', 'layout' => 'default', // default deve ser o nome do arquivo. Ex: default.phtml 'pluginClass' => 'My_Plugin_Layout_SetLayout' // é aqui onde acontece a magia ) ); // Zend Navigation $navContainerConfig = new Zend_Config_Xml( APPLICATION_PATH . '/data/navigation.xml', 'nav' ); $navContainer = new Zend_Navigation( $navContainerConfig ); if ( $this->_auth->hasIdentity() ) { $mdl_UserRoles = new Model_UserRoles; $identity = $this->_auth->getStorage()->read(); $role = $mdl_UserRoles->getRole( $identity->role_id ); $role = strtolower( $role['namespace'] ); }else { $role = "guest"; } $view->navigation( $navContainer )->setAcl( $this->_acl ) ->setRole( $role ); // return it, so that it can be stored by the bootstrap return $view; } [] Compartilhar este post Link para o post Compartilhar em outros sites