Monday, July 15, 2013

Change meta tags in zend framework layout

Steps to change meta tags in zend framework layout

It would recommend setting a view variable for the keywords. For example, in your bootstrap.php you could define default keywords as follows:

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

    protected function _initDoctype() {

        $this->bootstrap('view');
        $view = $this->getResource('view');
        $view->doctype('XHTML1_STRICT');
        $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
        $viewRenderer->setView($view);
        $view->headTitle('Techinfo Tricks Solutions')->setSeparator(' :: ');
        $view->keywords = 'Techinfo Tricks Web Solutions';

    }

In layout.phtml we would have then:

<?php echo $this->headMeta()->appendName('keywords', $this->keywords); ?>

Finally, in your views (or actions) you could change the Meta keywords simply by changing the keywords view variable:

// in an action
$this->view->keywords = 'new kewords';

//or in a view
<?php $this->keywords = 'new kewords'; ?>



For example some thing like this

public function aboutusAction()
{
       $this->view->keywords = 'About US';

Setting a default page title in Zend Framework and modifying per action

Specifying the Page Title

The site or business name as part of the page title and then we are adding additional information based on the location or page within the site. As an example, the techinfotricks.com website includes the string " techinfotricks.com " on all pages, and the prepends information based on the page: "About US - techinfotricks.com ". Within Zend Framework, the headTitle() view helper can help simplify this task.

The headTitle() helper allows you to aggregate content for the <title> tag.

You can control the order using prepend() and append(), and provide a separator to use between segments using the setSeparator() method.

Typically, you should specify any segments common to all pages in your bootstrap, similar to how we define the doctype. In this case, we'll define a _initPlaceholders() method for operating on all the various placeholders, and specify an initial title as well as a separator.

    class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
    {
        // ...    
        protected function _initDoctype()
      { 
        $this->bootstrap('view');
        $view = $this->getResource('view');
        $view->doctype('XHTML1_STRICT');
        $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
        $viewRenderer->setView($view);
        $view->headTitle('Techinfo Tricks Solutions')->setSeparator(' :: ');
       }
        // ...
    }

Within a view script, we might want to add another segment:

// place after other segments
<?php $this->headTitle()->append('Some Page'); ?>
   
// place before
<?php $this->headTitle()->prepend('Some Page'); ?>


In our layout, we will simply echo the headTitle() helper:
<?php echo $this->doctype() ?>
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <?php echo $this->headTitle(); ?>        
        <link rel="stylesheet" type="text/css" href="<?php echo $this->baseUrl('css/stylesheet.css'); ?>" />           </head>
    <body>
       .............................
       .............................
       .............................
    </body>
</html>

This will generate the following output:
    <!-- If append() was used: -->
  <title>Techinfo Tricks Solutions :: Some Page</title>
    
    <!-- If prepend() was used: -->
<title>Some Page :: >Techinfo Tricks Solutions </title> 

Another way to modifying the title in the action on controller.

public function aboutusAction()
{
    $this->view->headTitle()->prepend('About US');
}
 

This will generate the following output:

<title> Techinfo Tricks Solutions :: About US</title>




Monday, July 8, 2013

Authenticating Users in Zend Framework


Authentication example

First create a table in your database by executing the following sql query.

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(100) NOT NULL,
  `password` varchar(50) NOT NULL,
  `email` varchar(100) NOT NULL,
  `status` int(2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


Next step to create a model against this table in your application/model/ directory.

I am creating Users.php and writing the following code in it.

    <?
class Application_Model_DbTable_Users extends Zend_Db_Table_Abstract
{
    /** Table name */
    protected $_name    = 'users';
    protected $_primary = 'id';      
}
    ?>


Now create a controller named AuthController.php in application/controllers/ directory and place the following code in it

class AuthController extends Zend_Controller_Action

{

    public function loginAction()
    {
    }  
    public function logoutAction()
    {
    }
    public function homeAction()
    {
    }
}


Now create templates files for actions. Go application/views/scripts and create a folder named “auth” and create three files in application/views/scripts/auth named

    login.phtml
    logout.phtml
    home.phtml



In LoginForm.php, write the following code

<?php
class Application_Form_LoginForm extends Zend_Form
{
    public function init()
    {
        $username = $this->createElement('text','username');
        $username->setLabel('Username: *')->setRequired(true);
               
        $password = $this->createElement('password','password');
        $password->setLabel('Password: *')->setRequired(true);
               
        $signin = $this->createElement('submit','signin');
        $signin->setLabel('Sign in')->setIgnore(true);
       
        $this->addElements(array($username,$password,$signin,));
    }
}
?>


So in AuthController.php, write the following code

<?php
class Admin_AuthController extends Zend_Controller_Action
{
    public function homeAction()
    {
        $this->_helper->layout->setLayout('admin');
        $storage = new Zend_Auth_Storage_Session();
        $data = $storage->read();
        if(!$data){
            $this->_redirect('admin/auth/login');
        }
        $this->view->username = $data->username;               
    }
   
    public function loginAction()
    {
        $this->_helper->layout->setLayout('admin');       
        $form = new Admin_Form_LoginForm();
        $this->view->form = $form;
        if($this->getRequest()->isPost()){
            if($form->isValid($_POST)){
                $data = $form->getValues();
                $auth = Zend_Auth::getInstance();
                $dbAdapter = Zend_Db_Table::getDefaultAdapter();
                $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
                $authAdapter->setTableName('users')
                            ->setIdentityColumn('username')
                            ->setCredentialColumn('password');
                $authAdapter->setIdentity($data['username'])
                            ->setCredential($data['password']);
                $result = $auth->authenticate($authAdapter);
                if($result->isValid()){
                    $storage = new Zend_Auth_Storage_Session();
                    $storage->write($authAdapter->getResultRowObject());
                    $this->_redirect('admin/auth/home');
                } else {
                    $this->view->errorMessage = "Invalid username or password. Please try again.";
                }        
            }
        }
    }
       
    public function logoutAction()
    {
        $storage = new Zend_Auth_Storage_Session();
        $storage->clear();
        $this->_redirect('admin/auth/login');
    }   
}
?>


open views/scripts/auth/home.phtml and write the following code.

    Welcome <?=$this->username?>,<br>

    Home page content .......
    .....
   <br>
 
  <a href=”<?=$this->url(array(’controller’=>’auth’,'action’=>’logout’))?>”>Logout</a>

Login functionality is get ready to use.


Friday, July 5, 2013

Hide controller name from URL


To override your default route and prevent you from visiting controllers and modules that are opened via

URLs

like: example.com/controller/action to example.com/action

Place below mention code in your /application/Bootstrap.php file:

public function _initCustomRoute()
{
    $router = Zend_Controller_Front::getInstance()->getRouter();
    $route = new Zend_Controller_Router_Route(':action', array(
        'module'     => 'default',
        'controller' => 'index'
    ));
    $router->addRoute('default-override', $route);

}