phpurlzend-frameworkrouteszend-route

How to set routing in Zend Framework 1.12


My aim is to have product links like:

domain.com/test-product
domain.com/second-test-product

instead of:

domain.com/products/product/id/5
domain.com/products/product/id/123

Info about each product is get in ProductsController in productAction().

It works fine:

ProductsController:

 public function productAction() {
     $products = new Application_Model_DbTable_Products();
     $nicelink = $this->_getParam('nicelink', 0);
     $this->view->product = $products->fetchRow($products->select()->where('product_nicelink = ?', $nicelink));
     // nicelink is always unique
 }

The link to this method looks like:

    for ($i=0; $i < count($this->products); $i++) {
       echo '<a href="' .$this->baseUrl. '/' .$this->products[$i]->product_nicelink. '">LINK</a>';
}

Info about each product is displayed in product.phtml view:

<?php echo $this->escape($this->product->product_name); ?>

And my Bootstrap.php file:

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

    protected function _initRoutes() {

        $router = Zend_Controller_Front::getInstance()->getRouter();
        include APPLICATION_PATH . "/configs/routes.php";

        //$frontController  = Zend_Controller_Front::getInstance();

        $route = new Zend_Controller_Router_Route_Regex(
            '(.+)',
            array(
                'controller' => 'products',
                'action'     => 'product'
            ),
            array(
                1 => 'nicelink',
            ),
            '%s.html'
        );
        $router->addRoute('profileArchive', $route);
    }
}

However, this solution has 1 major disadvantage: all other links such as

domain.com/contact
domain.com/about-us

are not working (probably due to the Bootstrap file). How to fix the problem in order to make another links work and maintain current product links?


Solution

  • The issue is that you are matching all routes to product action in products controller. Probably you want to keep using the default routes in zend 1, which match "contact" and "about-us" to the corresponding actions in your default controller.

    If you check "Zend_Controller_Router_Rewrite" function "addDefaultRoutes()" and "route()", you can see that the default routes will be checked after any custom ones.

    The simplest solution, looking on what you are asking would be to match any routes that end with "-product":

    $route = new Zend_Controller_Router_Route_Regex(
            '(.+)\-product',
            array(
                'controller' => 'products',
                'action'     => 'product'
            ),
            array(
                1 => 'nicelink',
            ),
            '%s.html'
        );
    

    In this case nicelink should take values "test" and "second-test" in your corresponding examples.