Sanjay,

Use svn and virtual hosting, we regularily keep multiple versions of the same 
site running on different subdomains on a single server. One head-level vhost 
and one that is updated to a marked release tag. 

You dont need (and i dont suggest) using pathing for this.

Kevin
  ----- Original Message ----- 
  From: Sanjay - e11 Online 
  To: 'Zend Framework General' 
  Cc: [EMAIL PROTECTED] ; [EMAIL PROTECTED] 
  Sent: Tuesday, December 05, 2006 9:16 PM
  Subject: RE: [fw-general] Re: Controllers in sub-directories (modules) - Some 
generic ideas for B/C


  Hi,

  It will be great to have this functionality. Could you please let me know by 
when this functionality will be incorporated?

  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?

  Sanjay Aggarwal



------------------------------------------------------------------------------
  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

Reply via email to