-- Sanjay - e11 Online <[EMAIL PROTECTED]> wrote
(on Wednesday, 06 December 2006, 09:46 AM +0530):
> It will be great to have this functionality. Could you please let me know by
> when this functionality will be incorporated?

I'm working on it today; I should have it into subversion in the next 12
hours (depends on my work schedule). I'll drop a note to the list when
it's available.

> We are into product development and we require to run the different version of
> the same application on one web server.  Right now it didn't seem possible to
> me. Is there any other way by which I can achieve this or I have to wait for
> the module functionality to be incorporated?

Much of this can actually be achieved now. You can specify classes in
subdirectories with the current MVC. As an example:

    * Controller directory layout:
      controllers/
        Admin/
          NewsController.php
        User/
          NewsController.php

    * Then, to specify:
      * Admin version of news controller: /admin-news/view
        Calls AdminNewsController::viewAction()
      * User version of news controller: /user-news/view
        Calls UserNewsController::viewAction()

After the code changes, you'll be able to do URLs like the following:

    * RewriteRouter route of ':module/:controller/:action': 
        /admin/news/view
        /user/news/view
    * Basic router:
        /news/view/module/admin
        /news/view/module/user

> -------------------------------------------------------------------------------
> From: Shekar C Reddy [mailto:[EMAIL PROTECTED]
> Sent: Tuesday, December 05, 2006 5:13 AM
> To: Zend Framework General; [EMAIL PROTECTED]
> Cc: Subject: [fw-general] Re: Controllers in sub-directories (modules) - Some
> generic ideas for B/C
> 
> I guess, we can add the setControllerMap() to all the 3 situations and
> setModuleMap()/setControllerToModuleMap() to subdirectories/subdomain
> situations to offer the maximum features to everyone.
>  
> Shekar
> 
> 
>  
> On 12/4/06, Shekar C Reddy <[EMAIL PROTECTED]> wrote:
> 
> 
>     Back-trace:
> 
>     http://www.nabble.com/Controllers-in-subdirectories-tf2746071s16154.html
>     http://www.nabble.com/Controllers-in-subdirectories-tf2746071s16154.html
> 
>     I've hacked the Front, Dispatcher and Router classes of the standard
>     dispatcher/router to accomplish mapping subdomains to modules but it is 
> too
>     messy because I had to extend 3 classes. Please sync the old router along
>     with the RewriteRouter when controllers-in-subdirectories changes are
>     incorporated in order to be able to over-ride the part of the code that
>     returns the module name in a clean way in the standard router. Here are
>     some ideas that are  generic enough to not break backwards compatibility:
> 
>     If the _subdirectories variable is set to true, the first parameter in the
>     basic router would be 'module', followed by controller and action
>     parameters. Or, if the set _domain variable is subtracted from the
>     HTTP_HOST, the remainder would be the subdomain which - in turn - would be
>     the module. Otherwise, the code would behave as it is now - controller
>     first, action next:
> 
>     if ( $request->isSubdirectories())
>     {
>        $module = $path[0];
>        $controller = $path[1];
>        //
>        if ( $module )
>           $controller = $module . '_' . $controller;
>        //
>        $action = isset($path[2]) ? $path[2] : null;
>     }
>     else
>     {
>        $domain = $request->getDomain();
>        //
>        if ( $domain )             // Subdomain matching to module - more
>     options here
>        {
>           $module = remainder from subtracting $domain from strtolower
>     (HTTP_HOST) and the '.' separator
>           $controller = $path[0];
>           //
>           //////////////////////////////////
>           // THIS ARE VERY, VERY IMPORTANT!!
>           $moduleMap = $request->getModuleMap();                 // Default:
>     'www' => ''
>           //
>           // Invokes a different controller
>           // Useful for eg: developing/testing a new controller (copy), etc.
>           $controllerMap = $request->getControllerMap();
>           //
>           // Exceptional controllers that 'modify' the $module
>           $controllerToModuleMap = $request->getControllerToModuleMap();
>           //////////////////////////////////
>           //
>           if ( isset( $controllerMap[ $controller ] )
>              $controller = $controllerMap[ $controller ];        // A 
> different
>     controller
>           //
>           if ( isset( $moduleMap[ $module ] )
>              $module = $moduleMap[ $module ];         // Maybe the 'www', no
>     subdomain specified, etc.
>           elseif ( isset( $controllerToModuleMap[ $controller ] )
>              $module = $controllerToModuleMap[ $controller ];    // A 
> different
>     module
>           //
>           if ( $module )
>              $controller = $module . '_' . $controller;
>           //
>           $action = isset($path[1]) ? $path[1] : null;
>        }
>        else           // Old fashioned - no subdirectories or subdomains
>        {
>           $controller = $path[0];
>           $action = isset($path[1]) ? $path[1] : null;
>        }
>     }
> 
> 
>     The formatControllerName method should be ehnanced to ignore
>     directory-separators in the controller name:
> 
>     public function formatControllerName($unformatted)
>     {
>        if ( $this->_subdirectories || $this->_domain )
>        {
>           $unformatted = str_replace(array('-', '_', '.'), ' ', strtolower
>     ($unformatted));
>           $unformatted = preg_replace('[^a-z0-9 ]', ' ', $unformatted);
>           $unformatted = str_replace(' ', DIRECTORY_SEPARATOR, ucwords
>     ($unformatted));
>           //
>           return $unformatted . 'Controller';
>        }
>        //
>        return ucfirst($this->_formatName($unformatted)) . 'Controller';
>     }
> 
> 
>     Further, the Zend::loadClass/loadFile methods could be duplicated in the
>     Zend_Controller_Dispatcher class that would ignore directory-separators in
>     controller names:
> 
>     if ( $this->_subdirectories || $this->_domain )
>     {
>        self::loadClass($className, $this->_directory);
>        $className = str_replace( DIRECTORY_SEPARATOR, '_', $className );
>     }
>     else
>        Zend::loadClass($className, $this->_directory);
> 
> 
>     Here is another enhancement to improve performance in
>     Zend_Controller_Dispatcher::_dispatch() method that gets invoked twice
>     (regex) - once with $performDispatch false and the next time with true:
> 
>     if ( $this->_className )
>     {
>         $className = $this->_className;        // Second pass -
>     $performDispatch = true
>         $this->_className = '';
>     }
>     else      // First pass - $performDispatch = false
>     {
>         $className = 
> $this->formatControllerName($action->getControllerName());
>         $this->_className = $className;        // Store it to improve
>     performance by re-using this var next-time when $performDispatch is true!
>     }
>     //
>     ...
>     ...
> 
> 
>     Maybe, there are better ways and ideas (refer to Rob's suggestion, too) in
>     this regard.
> 
>     Excuse me if I referred to any obsolete classes.
> 
>     http://framework.zend.com/issues/browse/ZF-617
> 
> 
>     Regards,
> 
>      
>     Shekar
> 
> 

-- 
Matthew Weier O'Phinney
PHP Developer            | [EMAIL PROTECTED]
Zend - The PHP Company   | http://www.zend.com/

Reply via email to