SlideShare a Scribd company logo
Beginning Zend Framework Or: How I learned to stop worrying and love the framework. Part 1: Setting up
Preparing Zend Framework Download ZF1.9 svn co  http://framework.zend.com/svn/framework/standard/tags/release-1.9.1/library/Zend Add directory containing Zend to php.ini as part of the path.
Alternately, check out the framework into your pear directory.
Preparing ZF Contd. Check out bin (Zend Tool) svn co  http://framework.zend.com/svn/framework/standard/tags/release-1.9.1/bin Copy zf.php and zf.sh to a directory in your path (/usr/bin)
Rename zf.sh to zf and make it executable
Using Zend_Tool to set up your project Create a directory to house your projects mkdir projects Enter directory cd projects Create a project using the zf script zf create project  {projectname}
Add project to apache This can vary widely with OS and version, so you're mostly on your own.
Make the DocumentRoot the “public” directory within your  {projectname}  directory.
After reloading apache, you should be able to go to the site you just set up and see the default zend framework page!
Normal Application Setup Normally we would have the domain set up to point directly to the “public” directory Keeps php code from being directly accessible
NO php should go in public folder unless it’s simple and framework is overkill for it Except for index.php
Directory Structure /application application files…more in a moment /library framework files ( /library/Zend )
Extra classes/libraries used by the app /public index.php, html/js/images/etc, anything that should be directly accessible by the browser /tests unit tests… another time maybe
Application Directory Bootstrap.php Specific application – framework setup configs Application .ini file (soon) controllers Holds controller classes (gasp!) models Holds model classes (double-gasp!) views You get one guess what goes in here…
Wrong, not classes, simple php+html files.
index.php Prepares include path
Specifies application configuration
Load & run bootstrap
Create a database/table Use whatever tools you're used to CREATE TABLE `user` ( `user_id` INT NOT NULL AUTO_INCREMENT , `username` VARCHAR( 255 ) NOT NULL , `email` VARCHAR( 128 ) NOT NULL , `password` VARCHAR( 32 ) NOT NULL , `salt` VARCHAR( 32 ) NOT NULL , `api_key` VARCHAR( 32 ) NOT NULL , `api_secret` VARCHAR( 32 ) NOT NULL , `user_type` TINYINT NOT NULL , PRIMARY KEY ( `user_id` ), UNIQUE KEY `username` (`username`) )
Add database to app config Edit application/configs/application.ini # Database resources.db.adapter = "pdo_mysql" resources.db.params.host = "localhost" resources.db.params.username = "zfclass" resources.db.params.password = "zfclass" resources.db.params.dbname =  "zfclass_ {yourname} " resources.db.isDefaultTableAdapter = true
application.ini Note that application.ini has multiple sections Production, Staging, Development
Defined in .htaccess
Can be used to specify different databases for different environments
Configuring the layout What's a layout? 2-step way of providing “overall” layout to your app
View result html will be placed as “content” in layout
Layout can house dynamic links for header js, css, etc
Easily reached from controller or view.
Layout Contd. Create directory application/layouts and application/layouts/scripts
Add the following to your application.ini: #layout resources.layout.layout = "layout" resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
Module Layouts We're making an admin module
Let's load a specific admin layout for it
class Plugin_ModuleLayout extends Zend_Controller_Plugin_Abstract  { public function preDispatch(Zend_Controller_Request_Abstract $request) { $module = strtolower($request->getParam('module')); $layout = Zend_Layout::getMvcInstance(); if ($layout->getMvcEnabled()) { switch($module) { case 'default': break; default: $layout->setLayoutPath(APPLICATION_PATH . '/modules/' . $module . '/layouts/scripts'); break; } } } } application/plugins/ModuleLayout.php
Enable the plugin Edit application/Bootstrap.php public function _initLayouts() { Zend_Layout::startMvc(); $this->getPluginResource('frontcontroller') ->getFrontController() ->registerPlugin(new Plugin_ModuleLayout()); }
Application general layout applications/layouts/scripts/layout.phtml <?php echo $this->doctype() ?> <html> <head>     <?php echo $this->headTitle() ?>     <?php echo $this->headLink() ?>     <?php echo $this->headStyle() ?>     <?php echo $this->headScript() ?> </head> <body>     <?php echo $this->layout()->content ?> </body> </html>
Create a User model application/models/DbTable/User.php <?php class Model_DbTable_User extends Zend_Db_Table { protected $_name = 'user'; protected $_primary = 'user_id';
User Model Cont'd public function addUser($username, $email, $password, $user_type=1) { // generate unique id for the password salt $salt = strtolower(uniqid(rand(), true)); // and finally...one more for their initial api 'secret' key $api_secret_key = strtolower(uniqid(rand(), true)); // create a password hash to save in the database $hashed_pwd = strtolower(md5($password . $salt));
User Model... $data = array( 'username' => $username, 'email' => $email, 'password' => $hashed_pwd, 'salt' => $salt, 'user_type' => $user_type ); return $this->insert($data); }
User Model... function updateUser($id, $email, $password=null, $user_type=1) { $where = array('user_id = ?' => (int)$id); $data = array('email' => $email,'user_type'=>$user_type); if ($password !== null){ // generate unique id (again) for the password salt $salt = strtolower(uniqid(rand(), true)); $hashed_pwd = strtolower(md5($password . $salt)); $data['salt']=$salt; $data['password']=$hashed_pwd; } $this->update($data, $where); } } // End class
Autoloader Allow us to call our model class without having to include it manually In application/Bootstrap.php public function _initAutoload() { $autoloader = new Zend_Application_Module_Autoloader( array( 'namespace'=>'', 'basePath'=>APPLICATION_PATH ) ); return $autoloader; }
Database Profiling in Firebug! Still in Bootstrap.php public function _initDbprofile() { if($this->getEnvironment() == 'development') { $profiler = new Zend_Db_Profiler_Firebug('All DB  Queries'); $db = $this->getPluginResource('db'); $db = $db->getDbAdapter(); $profiler->setEnabled(true); $db->setProfiler($profiler); } }
URL Structure Defaults to Index controller & Index action /public/{controller}/{action}

More Related Content

What's hot (20)

ODP
Creating fast, dynamic ACLs in Zend Framework
Wim Godden
 
ODP
Creating fast, dynamic ACLs in Zend Framework (Zend Webinar)
Wim Godden
 
PDF
Django
Ivan Widodo
 
PPT
Ant
sundar22in
 
PDF
Rails 3 overview
Yehuda Katz
 
PPT
Hack in the Box Keynote 2006
Mark Curphey
 
PPT
Php frameworks
Anil Kumar Panigrahi
 
PDF
Error Reporting in ZF2: form messages, custom error pages, logging
Steve Maraspin
 
PDF
Moving from Django Apps to Services
Craig Kerstiens
 
PDF
Drupal 8 Services And Dependency Injection
Philip Norton
 
PDF
The effective use of Django ORM
Yaroslav Muravskyi
 
ODP
Perl5i
Marcos Rebelo
 
PDF
Drupal 8 Services
Philip Norton
 
PDF
Getting Into Drupal 8 Configuration
Philip Norton
 
PDF
Zend ACL Basics
Mindfire Solutions
 
KEY
Content Driven Zend_Acl in the Model Layer
Jeroen Keppens
 
PDF
深入淺出 MVC
Jace Ju
 
PDF
PhpBB meets Symfony2
Fabien Potencier
 
PDF
OSCON Google App Engine Codelab - July 2010
ikailan
 
PDF
Symfony2 - OSIDays 2010
Fabien Potencier
 
Creating fast, dynamic ACLs in Zend Framework
Wim Godden
 
Creating fast, dynamic ACLs in Zend Framework (Zend Webinar)
Wim Godden
 
Django
Ivan Widodo
 
Rails 3 overview
Yehuda Katz
 
Hack in the Box Keynote 2006
Mark Curphey
 
Php frameworks
Anil Kumar Panigrahi
 
Error Reporting in ZF2: form messages, custom error pages, logging
Steve Maraspin
 
Moving from Django Apps to Services
Craig Kerstiens
 
Drupal 8 Services And Dependency Injection
Philip Norton
 
The effective use of Django ORM
Yaroslav Muravskyi
 
Drupal 8 Services
Philip Norton
 
Getting Into Drupal 8 Configuration
Philip Norton
 
Zend ACL Basics
Mindfire Solutions
 
Content Driven Zend_Acl in the Model Layer
Jeroen Keppens
 
深入淺出 MVC
Jace Ju
 
PhpBB meets Symfony2
Fabien Potencier
 
OSCON Google App Engine Codelab - July 2010
ikailan
 
Symfony2 - OSIDays 2010
Fabien Potencier
 

Similar to Zend Framework 1.9 Setup & Using Zend_Tool (20)

ODP
CodeIgniter PHP MVC Framework
Bo-Yi Wu
 
ODP
Introduction to Zend Framework
Michelangelo van Dam
 
PDF
Intro To Mvc Development In Php
funkatron
 
PPT
Create a web-app with Cgi Appplication
olegmmiller
 
PPTX
Zend framework
Prem Shankar
 
PPTX
Extend sdk
Harsha Nagaraj
 
PPT
Zend - Installation And Sample Project Creation
Compare Infobase Limited
 
ODP
Exploring Symfony's Code
Wildan Maulana
 
PDF
Having Fun with Play
Clinton Dreisbach
 
PDF
Unit testing after Zend Framework 1.8
Michelangelo van Dam
 
PDF
Utilization of zend an ultimate alternate for intense data processing
Career at Elsner
 
ODP
Building Web Services with Zend Framework (PHP Benelux meeting 20100713 Vliss...
King Foo
 
PDF
Drupal Day 2012 - Automating Drupal Development: Make!les, Features and Beyond
DrupalDay
 
PPTX
Валентин Мацвейко та Владислав Мойсеєнко — D8: Migrate Yourself: code->module...
LEDC 2016
 
PPTX
Migrate yourself. code -> module -> mind
Valentine Matsveiko
 
PPTX
Childthemes ottawa-word camp-1919
Paul Bearne
 
PPT
Zend Framework
Hao Chen 陈浩
 
PDF
Modular Test-driven SPAs with Spring and AngularJS
Gunnar Hillert
 
PDF
Introduction to Zend framework
Matteo Magni
 
PPTX
WordPress Structure and Best Practices
markparolisi
 
CodeIgniter PHP MVC Framework
Bo-Yi Wu
 
Introduction to Zend Framework
Michelangelo van Dam
 
Intro To Mvc Development In Php
funkatron
 
Create a web-app with Cgi Appplication
olegmmiller
 
Zend framework
Prem Shankar
 
Extend sdk
Harsha Nagaraj
 
Zend - Installation And Sample Project Creation
Compare Infobase Limited
 
Exploring Symfony's Code
Wildan Maulana
 
Having Fun with Play
Clinton Dreisbach
 
Unit testing after Zend Framework 1.8
Michelangelo van Dam
 
Utilization of zend an ultimate alternate for intense data processing
Career at Elsner
 
Building Web Services with Zend Framework (PHP Benelux meeting 20100713 Vliss...
King Foo
 
Drupal Day 2012 - Automating Drupal Development: Make!les, Features and Beyond
DrupalDay
 
Валентин Мацвейко та Владислав Мойсеєнко — D8: Migrate Yourself: code->module...
LEDC 2016
 
Migrate yourself. code -> module -> mind
Valentine Matsveiko
 
Childthemes ottawa-word camp-1919
Paul Bearne
 
Zend Framework
Hao Chen 陈浩
 
Modular Test-driven SPAs with Spring and AngularJS
Gunnar Hillert
 
Introduction to Zend framework
Matteo Magni
 
WordPress Structure and Best Practices
markparolisi
 
Ad

Recently uploaded (20)

PDF
How do you fast track Agentic automation use cases discovery?
DianaGray10
 
PDF
AI Agents in the Cloud: The Rise of Agentic Cloud Architecture
Lilly Gracia
 
PDF
Kit-Works Team Study_20250627_한달만에만든사내서비스키링(양다윗).pdf
Wonjun Hwang
 
PDF
Transforming Utility Networks: Large-scale Data Migrations with FME
Safe Software
 
PDF
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
PDF
UiPath DevConnect 2025: Agentic Automation Community User Group Meeting
DianaGray10
 
PDF
Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
PDF
Peak of Data & AI Encore AI-Enhanced Workflows for the Real World
Safe Software
 
PDF
NASA A Researcher’s Guide to International Space Station : Physical Sciences ...
Dr. PANKAJ DHUSSA
 
PDF
“Computer Vision at Sea: Automated Fish Tracking for Sustainable Fishing,” a ...
Edge AI and Vision Alliance
 
PDF
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
PPTX
Mastering ODC + Okta Configuration - Chennai OSUG
HathiMaryA
 
PDF
Staying Human in a Machine- Accelerated World
Catalin Jora
 
PDF
ICONIQ State of AI Report 2025 - The Builder's Playbook
Razin Mustafiz
 
PDF
What’s my job again? Slides from Mark Simos talk at 2025 Tampa BSides
Mark Simos
 
PPT
Ericsson LTE presentation SEMINAR 2010.ppt
npat3
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PDF
“Voice Interfaces on a Budget: Building Real-time Speech Recognition on Low-c...
Edge AI and Vision Alliance
 
PPTX
Seamless Tech Experiences Showcasing Cross-Platform App Design.pptx
presentifyai
 
PPTX
Designing_the_Future_AI_Driven_Product_Experiences_Across_Devices.pptx
presentifyai
 
How do you fast track Agentic automation use cases discovery?
DianaGray10
 
AI Agents in the Cloud: The Rise of Agentic Cloud Architecture
Lilly Gracia
 
Kit-Works Team Study_20250627_한달만에만든사내서비스키링(양다윗).pdf
Wonjun Hwang
 
Transforming Utility Networks: Large-scale Data Migrations with FME
Safe Software
 
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
UiPath DevConnect 2025: Agentic Automation Community User Group Meeting
DianaGray10
 
Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
Peak of Data & AI Encore AI-Enhanced Workflows for the Real World
Safe Software
 
NASA A Researcher’s Guide to International Space Station : Physical Sciences ...
Dr. PANKAJ DHUSSA
 
“Computer Vision at Sea: Automated Fish Tracking for Sustainable Fishing,” a ...
Edge AI and Vision Alliance
 
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
Mastering ODC + Okta Configuration - Chennai OSUG
HathiMaryA
 
Staying Human in a Machine- Accelerated World
Catalin Jora
 
ICONIQ State of AI Report 2025 - The Builder's Playbook
Razin Mustafiz
 
What’s my job again? Slides from Mark Simos talk at 2025 Tampa BSides
Mark Simos
 
Ericsson LTE presentation SEMINAR 2010.ppt
npat3
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
“Voice Interfaces on a Budget: Building Real-time Speech Recognition on Low-c...
Edge AI and Vision Alliance
 
Seamless Tech Experiences Showcasing Cross-Platform App Design.pptx
presentifyai
 
Designing_the_Future_AI_Driven_Product_Experiences_Across_Devices.pptx
presentifyai
 
Ad

Zend Framework 1.9 Setup & Using Zend_Tool

  • 1. Beginning Zend Framework Or: How I learned to stop worrying and love the framework. Part 1: Setting up
  • 2. Preparing Zend Framework Download ZF1.9 svn co http://framework.zend.com/svn/framework/standard/tags/release-1.9.1/library/Zend Add directory containing Zend to php.ini as part of the path.
  • 3. Alternately, check out the framework into your pear directory.
  • 4. Preparing ZF Contd. Check out bin (Zend Tool) svn co http://framework.zend.com/svn/framework/standard/tags/release-1.9.1/bin Copy zf.php and zf.sh to a directory in your path (/usr/bin)
  • 5. Rename zf.sh to zf and make it executable
  • 6. Using Zend_Tool to set up your project Create a directory to house your projects mkdir projects Enter directory cd projects Create a project using the zf script zf create project {projectname}
  • 7. Add project to apache This can vary widely with OS and version, so you're mostly on your own.
  • 8. Make the DocumentRoot the “public” directory within your {projectname} directory.
  • 9. After reloading apache, you should be able to go to the site you just set up and see the default zend framework page!
  • 10. Normal Application Setup Normally we would have the domain set up to point directly to the “public” directory Keeps php code from being directly accessible
  • 11. NO php should go in public folder unless it’s simple and framework is overkill for it Except for index.php
  • 12. Directory Structure /application application files…more in a moment /library framework files ( /library/Zend )
  • 13. Extra classes/libraries used by the app /public index.php, html/js/images/etc, anything that should be directly accessible by the browser /tests unit tests… another time maybe
  • 14. Application Directory Bootstrap.php Specific application – framework setup configs Application .ini file (soon) controllers Holds controller classes (gasp!) models Holds model classes (double-gasp!) views You get one guess what goes in here…
  • 15. Wrong, not classes, simple php+html files.
  • 18. Load & run bootstrap
  • 19. Create a database/table Use whatever tools you're used to CREATE TABLE `user` ( `user_id` INT NOT NULL AUTO_INCREMENT , `username` VARCHAR( 255 ) NOT NULL , `email` VARCHAR( 128 ) NOT NULL , `password` VARCHAR( 32 ) NOT NULL , `salt` VARCHAR( 32 ) NOT NULL , `api_key` VARCHAR( 32 ) NOT NULL , `api_secret` VARCHAR( 32 ) NOT NULL , `user_type` TINYINT NOT NULL , PRIMARY KEY ( `user_id` ), UNIQUE KEY `username` (`username`) )
  • 20. Add database to app config Edit application/configs/application.ini # Database resources.db.adapter = &quot;pdo_mysql&quot; resources.db.params.host = &quot;localhost&quot; resources.db.params.username = &quot;zfclass&quot; resources.db.params.password = &quot;zfclass&quot; resources.db.params.dbname = &quot;zfclass_ {yourname} &quot; resources.db.isDefaultTableAdapter = true
  • 21. application.ini Note that application.ini has multiple sections Production, Staging, Development
  • 23. Can be used to specify different databases for different environments
  • 24. Configuring the layout What's a layout? 2-step way of providing “overall” layout to your app
  • 25. View result html will be placed as “content” in layout
  • 26. Layout can house dynamic links for header js, css, etc
  • 27. Easily reached from controller or view.
  • 28. Layout Contd. Create directory application/layouts and application/layouts/scripts
  • 29. Add the following to your application.ini: #layout resources.layout.layout = &quot;layout&quot; resources.layout.layoutPath = APPLICATION_PATH &quot;/layouts/scripts&quot;
  • 30. Module Layouts We're making an admin module
  • 31. Let's load a specific admin layout for it
  • 32. class Plugin_ModuleLayout extends Zend_Controller_Plugin_Abstract { public function preDispatch(Zend_Controller_Request_Abstract $request) { $module = strtolower($request->getParam('module')); $layout = Zend_Layout::getMvcInstance(); if ($layout->getMvcEnabled()) { switch($module) { case 'default': break; default: $layout->setLayoutPath(APPLICATION_PATH . '/modules/' . $module . '/layouts/scripts'); break; } } } } application/plugins/ModuleLayout.php
  • 33. Enable the plugin Edit application/Bootstrap.php public function _initLayouts() { Zend_Layout::startMvc(); $this->getPluginResource('frontcontroller') ->getFrontController() ->registerPlugin(new Plugin_ModuleLayout()); }
  • 34. Application general layout applications/layouts/scripts/layout.phtml <?php echo $this->doctype() ?> <html> <head>     <?php echo $this->headTitle() ?>     <?php echo $this->headLink() ?>     <?php echo $this->headStyle() ?>     <?php echo $this->headScript() ?> </head> <body>     <?php echo $this->layout()->content ?> </body> </html>
  • 35. Create a User model application/models/DbTable/User.php <?php class Model_DbTable_User extends Zend_Db_Table { protected $_name = 'user'; protected $_primary = 'user_id';
  • 36. User Model Cont'd public function addUser($username, $email, $password, $user_type=1) { // generate unique id for the password salt $salt = strtolower(uniqid(rand(), true)); // and finally...one more for their initial api 'secret' key $api_secret_key = strtolower(uniqid(rand(), true)); // create a password hash to save in the database $hashed_pwd = strtolower(md5($password . $salt));
  • 37. User Model... $data = array( 'username' => $username, 'email' => $email, 'password' => $hashed_pwd, 'salt' => $salt, 'user_type' => $user_type ); return $this->insert($data); }
  • 38. User Model... function updateUser($id, $email, $password=null, $user_type=1) { $where = array('user_id = ?' => (int)$id); $data = array('email' => $email,'user_type'=>$user_type); if ($password !== null){ // generate unique id (again) for the password salt $salt = strtolower(uniqid(rand(), true)); $hashed_pwd = strtolower(md5($password . $salt)); $data['salt']=$salt; $data['password']=$hashed_pwd; } $this->update($data, $where); } } // End class
  • 39. Autoloader Allow us to call our model class without having to include it manually In application/Bootstrap.php public function _initAutoload() { $autoloader = new Zend_Application_Module_Autoloader( array( 'namespace'=>'', 'basePath'=>APPLICATION_PATH ) ); return $autoloader; }
  • 40. Database Profiling in Firebug! Still in Bootstrap.php public function _initDbprofile() { if($this->getEnvironment() == 'development') { $profiler = new Zend_Db_Profiler_Firebug('All DB Queries'); $db = $this->getPluginResource('db'); $db = $db->getDbAdapter(); $profiler->setEnabled(true); $db->setProfiler($profiler); } }
  • 41. URL Structure Defaults to Index controller & Index action /public/{controller}/{action}
  • 46. URL Routing You can create your own url structures using Zend_Controller_Router_* Many options Static
  • 47. Regex
  • 50. Create Admin Module Use zf tool zf create module admin Enable module in application.ini Add to [production] area
  • 51. resources.frontController.moduleDirectory = APPLICATION_PATH “/modules” Copy application/layout/scripts/layout.phtml to application/modules/admin/layouts/scripts/layout.phtml
  • 52. Create User Controller zf create controller user false admin
  • 53. One small bug in zf tool: Rename admin/controllers/UserController.php to Admin_UserController.php
  • 54. Rename class in file to Admin_UserController
  • 55. Create Action zf create action createuser user 1 admin
  • 56. Open User controller file in an editor...
  • 57. public function createuserAction() { // create form $form = new Zend_Form(); $form->setMethod('post'); $form->addElement('text','username', array( 'label' =>'User name', 'required'=>true, 'filters'=>array('StringTrim') )); $form->addElement('password','password',array( 'label'=>'Password', 'required'=>true, 'filters'=>array('StringTrim') )); $form->addElement('text','email',array( 'label'=>'Email address', 'required'=>true, 'filters'=>array('StringTrim'), 'validators'=>array('EmailAddress') )); Create a form programatically!
  • 58. $form->addElement('captcha','captcha',array( 'label'=>'Enter the letters below', 'required'=>true, 'captcha'=>array( 'captcha'=>'Figlet', 'wordLen'=>5, 'timeout'=>300 ) )); $form->addElement('submit','Save',array( 'ignore'=>true, 'label'=>'Save New User' )); // End form
  • 59. $request = $this->getRequest(); if($request->isPost()) { if($form->isValid($request->getPost())) { $data = $form->getValues(); $user = new Model_DbTable_User(); if($user->addUser( $data['username'], $data['email'], $data['password'],2)) // 2 for admin { $this->view->message = 'User created'; } else { $this->view->message = 'Something bad happened.'; } } } $this->view->form = $form; } // End function
  • 60. Create View application/modules/admin/views/scripts/user/createuser.php <?php if(isset($this->message)) { ?><h1><?=$this->message ?></h1><?php } ?> Create your new user. <?php $this->form->setAction($this->url()); echo $this->form; ?>
  • 61. Create your user! You should now be able to head to http://{yoursite}/admin/user/createuser
  • 63. Create a login action Close the user controller file in your editor
  • 64. zf create action login user 1 admin
  • 65. Open it back up and find the loginAction method
  • 66. public function loginAction() { $form = new Zend_Form(); $form->setMethod('post'); $form->addElement('text','username', array( 'label' =>'User name', 'required'=>true, 'filters'=>array('StringTrim') )); $form->addElement('password','password',array( 'label'=>'Password', 'required'=>true, 'filters'=>array('StringTrim') )); $form->addElement('submit','submit',array( 'label'=>'Login', 'ignore'=>true ));
  • 67. $request = $this->getRequest(); $data = $request->getPost(); if($request->isPost() && $form->isValid($data)) { $u = new Model_DbTable_User(); $auth = new Zend_Auth_Adapter_DbTable($u->getAdapter() ,'user','username','password', &quot;MD5(CONCAT(?,salt)) AND user_type=2&quot; ); $auth->setIdentity($data['username'])->setCredential( $data['password'] ); $mainauth = Zend_Auth::getInstance(); $result = $mainauth->authenticate($auth); if($result->isValid()) { $this->view->message = 'You are now logged in.'; } else { $m = $result->getMessages(); $this->view->message = $m[0]; } } $this->view->form = $form; }// End function
  • 68. Create a logout action Try the initial part yourself to create the action method. public function logoutAction() { $auth=Zend_Auth::getInstance(); $auth->clearIdentity(); $this->_redirect('/admin/user/login'); }
  • 69. Create a login “helper” Edit application/modules/admin/views/helpers/LoginLink.php <?php class Admin_View_Helper_LoginLink extends Zend_View_Helper_Abstract { public function loginLink() { $auth = Zend_Auth::getInstance(); $front = Zend_Controller_Front::getInstance(); if($auth->hasIdentity()) { $username = $auth->getIdentity(); return &quot;Hello, $username [<a href='&quot;.$front->getBaseUrl(). &quot;/admin/user/logout'>Logout</a>]&quot;; } else { return '[<a href=&quot;'.$front->getBaseUrl(). '/admin/user/login&quot;>Login</a>]'; } } }
  • 70. Add login helper to layout Edit application/modules/admin/layouts/scripts/layout.phtml Add before echo content: <div id= &quot;login&quot; > <?php echo $this->loginLink();?> </div> This calls the LoginLink helper we created before. Try it out: http://{yoursite}/admin/user/login
  • 71. Enough for now If we got this far at the meeting, I'm amazed.
  • 72. If not, I can continue at the next meeting.