« Léo » 0 Denunciar post Postado Outubro 26, 2009 Fala Galera, Estou tentando começar a aprender o Zend Framework. Tentei fazer um teste simples, extendendo a classe Zend_Db_Table_Abstract da seguinte maneira: class UsuariosModel extends Zend_Db_Table_Abstract { protected $_name = 'usuarios'; } Salvei este código em: application/models/UsuariosModel.php No entanto, quando o instancio no controller, é retornado o erro: Fatal error: Class 'UsuariosModel' not found in C:\wamp\www\zend\application\controllers\exemploController.php on line 26 Salvei no lugar certo? É preciso utilizar algum tipo de include? O bootstrap não dá conta disso? Desde já, agradeço! Abs Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Outubro 26, 2009 Tópico Movido PHP http://forum.imasters.com.br/public/style_emoticons/default/seta.gif Zend Framework Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Outubro 26, 2009 Como está o seu bootstrap? Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
« Léo » 0 Denunciar post Postado Outubro 26, 2009 Opa, desculpa. Não tinha achado a seção do Zend. bootstrap.php <?php # Configura as constantes APPLICATION_PATH e APPLICATION_ENVIRONMENT acaso # elas não tenham sido configuradas no index.php. defined('APPLICATION_PATH') or define('APPLICATION_PATH', dirname(__FILE__)); defined('APPLICATION_ENVIRONMENT') or define('APPLICATION_ENVIRONMENT', 'development'); set_include_path( APPLICATION_PATH . '/../library' . PATH_SEPARATOR . get_include_path() ); # Configura o autoload do Zend Framework /*require_once "Zend/Loader.php"; Zend_Loader::registerAutoload();*/ require_once 'Zend/Loader/Autoloader.php'; Zend_Loader_Autoloader::getInstance(); # Captura a instância única do Zend_Controller_Front, que implementa o Design Pattern Sigleton. $frontController = Zend_Controller_Front::getInstance(); # Configura o diretório dos controllers $frontController->setControllerDirectory(APPLICATION_PATH . '/controllers'); # Configura o ambiente de execução do projeto. $frontController->setParam('env', APPLICATION_ENVIRONMENT); # Limpa as variáveis globais. (somente o $frontController) unset($frontController); index.php (public) <?php /** * Constante que aponta para o diretório application * também utilizada para incluir o diretório library no include_path do php */ define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application/')); /** * Inclui o bootstrap.php. Atquivo responsável pela configuração * do projeto. */ try { require '../application/bootstrap.php'; /** * Dispacho da controller. Dispara a execução dos controllers e actions. */ Zend_Controller_Front::getInstance()->dispatch(); } catch (Exception $exception) { echo '<html><body><center>' . 'An exception occured while bootstrapping the application.'; if (defined('APPLICATION_ENVIRONMENT') && APPLICATION_ENVIRONMENT != 'production' ) { echo '<br /><br />' . $exception->getMessage() . '<br />' . '<div align="left">Stack Trace:' . '<pre>' . $exception->getTraceAsString() . '</pre></div>'; } echo '</center></body></html>'; exit(1); } Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Outubro 26, 2009 Na verdade está faltando bastante coisa no teu bootstrap. Dá uma olhada nos tutoriais do Fabyo. http://forum.imasters.com.br/index.php?/forum/240-artigos-tutoriais-e-materias-zend-framework/ Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
« Léo » 0 Denunciar post Postado Outubro 27, 2009 Olá Matias, Desculpe, mas fiquei enrolado com os arquivos q tenho que colocar no diretorio application e o q fica no public. Não consegui entender nada. Poderia me explicar o q ponho onde? Abs Compartilhar este post Link para o post Compartilhar em outros sites
srnetcave 1 Denunciar post Postado Outubro 27, 2009 Como você está instanciando no controller? acho que o que está acontecendo é o seguinte, quando você instancia no controller, como sua classe esta dentro de Application/models você tb tem que incluir o caminho no nome da sua classe, ficando portanto; class Model_Usuarios extends Zend_Db_Table_Abstract { } isso deve passar para o controller que seu arquivo esta dentro da pasta models... Compartilhar este post Link para o post Compartilhar em outros sites
jpraminelli 3 Denunciar post Postado Outubro 27, 2009 na pasta models você coloca todos as classes que farao referencia as tabelas do seu banco de dados para criar um modelo , dentro da pasta models você pode utilizar assim Usuario.php class Usuarios extends Zend_Db_Table{ protected $_name = 'usuarios'; //aqui deve ser o mesno nome da tabela (inclusive obedecendo maiusculas) } dai pra você poder utilizar esta classe dentro dos controladores IndexController.php class IndexController extends Zend_Controller_Action { /** * The default action - show the home page */ public function init(){ Zend_Loader::loadClass('Usuarios'); } public function indexAction() { //aqui você coloca os comandos } } Compartilhar este post Link para o post Compartilhar em outros sites
srnetcave 1 Denunciar post Postado Outubro 28, 2009 jpraminelli, que versão do Zend Framework você está usando? se fizer da maneira que eu postei anteriormente, não tem necessidade de chamar o Zend_Loader. vou postar novamente. dentro da pasta models em Application/models. Você cria suas classes. Exemplo da tree. Application -configs -controllers -forms -layouts -models --Usuarios.php -modules Usuarios.php <?php class Model_Usuarios extends Zend_Db_Table_Abstract { protected $_name = 'users'; public function getUsers() { $result = $this->fetchAll(); return $result->toArray(); } } IndexController.php <?php class IndexController extends Zend_Controller_Action { public function indexAction() { $user = new Model_Usuarios(); $this->view->user = $user; } } aqui vai um exemplo de como chamar na view index.phtml <?php echo $this->user();?><br/> Compartilhar este post Link para o post Compartilhar em outros sites
« Léo » 0 Denunciar post Postado Outubro 28, 2009 Fala srnetcave, Quanto a sua 1ª resp: "quando você instancia no controller, como sua classe esta dentro de Application/models..." O Tutorial que havia lido, dizia que todos os nomes de controllers devem terminar com "Controller". Não está certo? Ja na 2ª resp: você utilizou a classe dentro do IndexController, assim como eu estou tentando utilizar, mas nao funciona. O Matias havia falado q meu bootstrap estava faltando muita coisa e daí deveria vir o erro. Quanto a resp do jpraminelli, já vi que tem ocmo usar classes sem carrega-las manualmente. Gostaria de fzer assim... Estou utilizando a versão 1.91 Poderiam me passar exemplos de bootstrap? E o que devo colocar no index do "public" e no do application? Obrigado pela atenção de todos. Abs Compartilhar este post Link para o post Compartilhar em outros sites
« Léo » 0 Denunciar post Postado Outubro 28, 2009 srnetcave, Fiz exatamente como sugeriu, mas continuo recebendo o erro: Fatal error: Class 'Model_Usuarios' not found in C:\wamp\www\zend\application\controllers\exemploController.php on line 5 Segue como estão meus arquivos agora: Usuarios application/controllers/ExemploController.php (controller p/ testes) <?php class ExemploController extends Zend_Controller_Action { public function indexAction () { $user = new Model_Usuarios(); $this->view->user = $user; } } application/models/Usuarios.php class Model_Usuarios extends Zend_Db_Table_Abstract { protected $_name = 'usuarios'; public function getUsers() { $result = $this->fetchAll(); return $result->toArray(); } } application/views/scripts/exemplo/index.phtml <?php echo $this->user();?><br/> Ainda estou fazendo algo errado? Abs Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Outubro 28, 2009 Olha, o problema está no seu bootstrap. Veja dica do Fabyo neste post. require_once 'Zend/Loader/Autoloader.php'; Zend_Loader_Autoloader::getInstance()->setFallbackAutoloader(true); http://forum.imasters.com.br/index.php?/topic/343336-zendframework-1-8-0/ Eu não gosto de colocar Model_NomeDaClasse. O que o ZF faz. Ele entende o _ como novo diretório. Então, se você chama a classe Model_Usuarios, o ZF procura no seu include_path a pasta Model e o arquivo Usuarios, contendo a classe Model_Usuarios. Eu utilizo esta lógica somente para forms (que eu crio uma pasta para todos os forms) e para filters. Sugiro que você corrija o seu include_path, seguindo o tutorial do Fabyo também. <?php if(version_compare(phpversion(), 5) === '-1'){ die('Versão do PHP não compativel'); } define('DS', DIRECTORY_SEPARATOR); define('PS', PATH_SEPARATOR); define('BASEPATH', getcwd() . DS); set_include_path('.' . PS . BASEPATH . 'library' . DS . PS . BASEPATH . 'includes' . DS . PS . BASEPATH . 'application' . DS . 'controllers' . DS . 'plugins' . DS . PS . BASEPATH . 'application' . DS . 'models' . DS . PS . get_include_path()); require 'library/Zend/Loader.php'; Zend_Loader::registerAutoload(); Zend_Controller_Front::getInstance() ->throwExceptions(TRUE) ->setControllerDirectory(BASEPATH . 'application' . DS . 'controllers' . DS) ->dispatch(); http://forum.imasters.com.br/index.php?/topic/284116-zend-framework/ Neste tutorial, ele utiliza o autoloader no formato que funcionava antes da versão 1.8. A partir desta, funciona como ele colocou na outra citação. Fazendo desta forma, você cria o arquivo Usuarios e a classe Usuarios dentro da pasta models (que está incluída no seu include_path). Ao tentar instancia-la, o Autoloader vai procurar o arquivo Usuarios dentro do seu include_path, contendo a classe Usuarios. Sugiro também que leia todos os outros tutos do Fabyo, pois eles explicam de uma forma simples e objetiva alguns recursos do ZF. Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
srnetcave 1 Denunciar post Postado Outubro 29, 2009 Leo, se você utiliza o Zend Tool para criar seus projetos, ele ja cria o bootstrapper com as configurações basicas para o funcionamento que expliquei acima. mas ai vai um exemplo do bootstrapper. public/index.php bootstrapper - exemplo bem simples <?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(); Compartilhar este post Link para o post Compartilhar em outros sites
« Léo » 0 Denunciar post Postado Outubro 29, 2009 Galera, testei todas as sugestões dadas e não consigo nenhum resultado. =/ Tentei baixar os arquivos do Fabyo alterando o autoloader e nd tmb... Ainda sendo bem chato (rs), Procurei como utilizar o Zend_tool, mas não consegui. Poderiam me ajudar? Vlw pela atenção Abs Compartilhar este post Link para o post Compartilhar em outros sites
srnetcave 1 Denunciar post Postado Outubro 30, 2009 Galera, testei todas as sugestões dadas e não consigo nenhum resultado. =/ Tentei baixar os arquivos do Fabyo alterando o autoloader e nd tmb... Ainda sendo bem chato (rs), Procurei como utilizar o Zend_tool, mas não consegui. Poderiam me ajudar? Vlw pela atenção Abs Leo, você está utilizando eclipse com pdt? se estiver. veja se quando você for instanciar a classe no Controller se o auto insert localiza a classe. outra coisa normalment seu ZF funciona?e quanto ao Zend Tool? você precisa adicionar o ZFTool Path no seu Enviroment_Path se você estiver utilizando windows. utilização basica do ZF Tool. navegue até a pasta do servidor ex. c:\wamp\www\ depois use; zf create project testeisso criara um projeto teste dentro da pasta c:\wamp\www\testese você utiliza eclipse apenas crie um novo projeto de mesmo nome (ex. teste), o eclipse dira que ja existe um projeto com nome de teste, apenas de ok e o eclipse importa seu projeto. você ainda tem que copiar a Zend Library para dentro da pasta library no seu projeto, eu prefiro assim, mas se você preferir tb pode adicionar a library no include_path do seu php, da uma olhada no manual do ZF. outra coisa, não sei se você tem problema em qualquer projeto no zf ou se o problema apenas acontece neste projeto, mas verifique a configuração do seu apache, mais precisamente descomente a linha abaixo LoadModule rewrite_module modules/mod_rewrite.so se o problema insistir, poste seus arquivos (apenas os arquivos, deixe a library de fora), e tambem poste versão do php, apache, OS e software que esta utilizando para programar. Compartilhar este post Link para o post Compartilhar em outros sites
srnetcave 1 Denunciar post Postado Outubro 30, 2009 Certo, aqui vai um exemplo que criei, substitua os arquivos do seu projeto por estes. Mysql db CREATE TABLE IF NOT EXISTS `users` ( `id` int(5) NOT NULL AUTO_INCREMENT, `user` varchar(100) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `user` (`user`) ) ENGINE=MyISAM; depois insira alguns valores para teste INSERT INTO `users` (`id`, `user`) VALUES (1, 'admin'), (2, 'guest'), (3, 'jack'), (4, 'daniels'), (5, 'white'), (6, 'horse'); Application/configs/application.ini [production] phpSettings.display_startup_errors = 0 phpSettings.display_errors = 0 includePaths.library = APPLICATION_PATH "/../library" bootstrap.path = APPLICATION_PATH "/Bootstrap.php" bootstrap.class = "Bootstrap" resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" resources.layout.layout = "layout" resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts" resources.view[] = resources.db.adapter = PDO_MYSQL resources.db.params.host = localhost resources.db.params.username = root resources.db.params.password = resources.db.params.dbname = test [staging : production] [testing : production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 [development : production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 Bootstrap public/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(); Bootstrap Application/Bootstrap.php <?php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { protected function _initAutoload() { $moduleLoader = new Zend_Application_Module_Autoloader(array( 'namespace' => '', 'basePath' => APPLICATION_PATH)); return $moduleLoader; } } Model Applicaion/models/Usuarios.php <?php class Model_Usuarios extends Zend_Db_Table_Abstract { protected $_name = 'users'; public function getUsers() { $result = $this->fetchAll(); return $result; } } IndexController Application/controllers/IndexController.php <?php class IndexController extends Zend_Controller_Action { public function init() { /* Initialize action controller here */ } public function indexAction() { $func = new Model_Usuarios(); $result = $func->getUsers(); $this->view->result = $result; } } index.phtml Application/views/scripts/index.phtml <?php foreach ($this->result as $results):?> <?php echo $this->escape($results['user']);?><br/> <?php endforeach;?> se mesmo assim nao funcionar, da um toque ai. Compartilhar este post Link para o post Compartilhar em outros sites
« Léo » 0 Denunciar post Postado Outubro 31, 2009 Fala srnetcave, Consegui utilizar o zend_tool e sobrescrevi os arquivos criados por ele pelos que me orientou e ...... FINALMENTE FUNCIONOOOOU!!! =) Tive apenas que comentar o trecho: ;resources.layout.layout = "layout" ;resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts" Pois nao sei utilizar estes recursos ainda... Mt obrigado cara.... com crtza voltarei a importuna-los novamente com outras questões. =) Se já tiverem alguma dica para iniciantes, pf me falem!!! Comprei o livro "Zend Framework" da novatec, mas parece estar meio desatualizado (2008 - v 1.5) Abs a todos Compartilhar este post Link para o post Compartilhar em outros sites
srnetcave 1 Denunciar post Postado Novembro 1, 2009 Fala Léo, bom saber que funcionou. qualquer coisa da um toque ai falou. Compartilhar este post Link para o post Compartilhar em outros sites