Автор Тема: Роутеры для многоязычности  (Прочитано 6161 раз)

0 Пользователей и 2 Гостей смотрят эту тему.

Оффлайн zedroxymur

  • Участник форума
  • Сообщений: 27
  • Карма: 13
Роутеры для многоязычности
« : Января 07, 2009, 03:22:59 »
Господа! спешу поделиться с вами 2х часовой работой - Дефаултный роутер для многоязычности (адаптированный роутер Module (Zend_Controller_Router_Route_Module))! :)
Принцип заключается в следующем:
Работает абсолютно так же как и дефайлтный роутер, только введена еще один дефаултный параметр - "lang" (Language).
В целом выглядит так - ':lang/:module/:controller/:action/*',
НО! если бы вы просто использовали

        $router
->addRoute('default'
            new 
Zend_Controller_Router_Route(
                
':lang/:module/:controller/:action/*',
                array(
                
	
'lang' => 'en',
                
	
'module' => 'default',
                
	
'controller' => 'index',
                
	
'action' => 'index',
                )
            )
        );

во всех линках всегда бы были определены дефаутные параметры. Например: http://apriori/ru/default/article/view/id/10.
Вопрос! Зачем кому то этот дефаултый мусор в виде языка, модуля и контроллера?...
Для этого я разширил и переписал некоторые методы дефаултного роутера Module (Zend_Controller_Router_Route_Module).
Поэтому теперь если указанные параметры в запросе совпадают с дефаутными параметрами, то они не добавляются в урл (хелпер). Т.е. не нужно постоянно передавать значение языка в хелпер!
Стоит еще также заметить, что параметр "lang" проверяется только по длине в 2 символа. Я посчитал эту проверку достаточной. Кто имеет другое мнение - исходники у вас, правьте на здоровье ;)
Сперва подумал подтягивать дефаултную локаль, а через нее реально проверять существование языка, но этот подход слишком медленный и не оправдывает способ.

Как использовать?

        $router
->removeDefaultRoutes();
        
$router->addRoute('default'
            new 
Zxm_Controller_Router_Route_MultilingualModule(
                array(
                
	
'lang' => 'ru',
                
	
'module' => 'default',
                
	
'controller' => 'index',
                
	
'action' => 'index',
                )
            )
        );


И ВСЕ! :)

Все тесты корректно отработали на примерах с дефаултным языком "ru":
http://apriori/
http://apriori/client
http://apriori/en/client
http://apriori/en/default/client
http://apriori/client/view/id/7
http://apriori/en/client/view/id/7

Файл роутера прилагается в аттаче и тут ;)

<?php
/**
 * Module Route with Multilingual
 *
 * Default route for module functionality with Multilingual
 */
class Ik_Controller_Router_Route_MultilingualModule extends Zend_Controller_Router_Route_Module
{
    
/**
     * Language key
     * @var string
     */
    
protected $_languageKey 'lang';    

    
/**
     * Constructor
     *
     * @param array $defaults Defaults for map variables with keys as variable names
     * @param Zend_Controller_Dispatcher_Interface $dispatcher Dispatcher object
     * @param Zend_Controller_Request_Abstract $request Request object
     */
    
public function __construct(array $defaults = array(),
                
Zend_Controller_Dispatcher_Interface $dispatcher null,
                
Zend_Controller_Request_Abstract $request null)
    {
        
$this->_defaults $defaults;

        if (isset(
$request)) {
            
$this->_request $request;
        } else {
            
$this->_request Zend_Controller_Front::getInstance()->getRequest();
        }

        if (isset(
$dispatcher)) {
            
$this->_dispatcher $dispatcher;
        } else {
            
$this->_dispatcher Zend_Controller_Front::getInstance()->getDispatcher();
        }
        
        if (!
array_key_exists($this->_languageKey$defaults) || strlen($defaults[$this->_languageKey]) != 2) {
            throw new 
Zend_Controller_Router_Exception('Default language is not specified.');
        }
    }    
    
    
/**
     * Matches a user submitted path. Assigns and returns an array of variables
     * on a successful match.
     *
     * If a request object is registered, it uses its setModuleName(),
     * setControllerName(), and setActionName() accessors to set those values.
     * Always returns the values as an array.
     *
     * @param string $path Path used to match against this routing map
     * @return array An array of assigned values or a false on a mismatch
     */
    
public function match($path$partial false)
    {
        
$this->_setRequestKeys();

        
$values = array();
        
$params = array();

        if (!
$partial) {
            
$path trim($pathself::URI_DELIMITER);
        } else {
            
$matchedPath $path;
        }        
        
        if (
$path != '') {

            
$path explode(self::URI_DELIMITER$path);

            if (
$this->_defaults[$this->_languageKey] && strlen($path[0]) == 2) {
                
$values[$this->_languageKey] = array_shift($path);
            }

            if (
count($path) && !empty($path[0]) && $this->_dispatcher && $this->_dispatcher->isValidModule($path[0])) {
                
$values[$this->_moduleKey] = array_shift($path);
                
$this->_moduleValid true;
            }

            if (
count($path) && !empty($path[0])) {
                
$values[$this->_controllerKey] = array_shift($path);
            }

            if (
count($path) && !empty($path[0])) {
                
$values[$this->_actionKey] = array_shift($path);
            }

            if (
$numSegs count($path)) {
                for (
$i 0$i $numSegs$i $i 2) {
                    
$key urldecode($path[$i]);
                    
$val = isset($path[$i 1]) ? urldecode($path[$i 1]) : null;
                    
$params[$key] = (isset($params[$key]) ? (array_merge((array) $params[$key], array($val))): $val);
                }
            }
        }

        if (
$partial) {
            
$this->setMatchedPath($matchedPath);
        }        
        
        
$this->_values $values $params;
        
//Zend_Debug::dump($this->_values + $this->_defaults);
        
return $this->_values $this->_defaults;
    }

    
/**
     * Assembles user submitted parameters forming a URL path defined by this route
     *
     * @param array $data An array of variable and value pairs used as parameters
     * @param bool $reset Weither to reset the current params
     * @return string Route path with user submitted parameters
     */
    
public function assemble($data = array(), $reset false$encode true$partial false)
    {
        if (!
$this->_keysSet) {
            
$this->_setRequestKeys();
        }

        
$params = (!$reset) ? $this->_values : array();

        foreach (
$data as $key => $value) {
            if (
$value !== null) {
                
$params[$key] = $value;
            } elseif (isset(
$params[$key])) {
                unset(
$params[$key]);
            }
        }

        
$params += $this->_defaults;

        
$url '';

        if (
array_key_exists($this->_languageKey$data)) {
            if (
$params[$this->_languageKey] != $this->_defaults[$this->_languageKey]) {
                
$language $params[$this->_languageKey];
            }
        } elseif (
array_key_exists($this->_languageKey$this->_values) && 
                  
$this->_defaults[$this->_languageKey] != $this->_values[$this->_languageKey]) {
            
$language $this->_values[$this->_languageKey];
        }
        unset(
$params[$this->_languageKey]);
        
        if (
$this->_moduleValid || array_key_exists($this->_moduleKey$data)) {
            if (
$params[$this->_moduleKey] != $this->_defaults[$this->_moduleKey]) {
                
$module $params[$this->_moduleKey];
            }
        }
        unset(
$params[$this->_moduleKey]);

        
$controller $params[$this->_controllerKey];
        unset(
$params[$this->_controllerKey]);

        
$action $params[$this->_actionKey];
        unset(
$params[$this->_actionKey]);
        
        foreach (
$params as $key => $value) {
            
$key = ($encode) ? urlencode($key) : $key;
            if (
is_array($value)) {
                foreach (
$value as $arrayValue) {
                    
$arrayValue = ($encode) ? urlencode($arrayValue) : $arrayValue;
                    
$url .= '/' $key;
                    
$url .= '/' $arrayValue;
                }
            } else {
                if (
$encode$value urlencode($value);
                
$url .= '/' $key;
                
$url .= '/' $value;
            }
        }

        if (!empty(
$url) || $action !== $this->_defaults[$this->_actionKey]) {
            if (
$encode$action urlencode($action);
            
$url '/' $action $url;
        }

        if (!empty(
$url) || $controller !== $this->_defaults[$this->_controllerKey]) {
            if (
$encode$controller urlencode($controller);
            
$url '/' $controller $url;
        }

        if (isset(
$module)) {
            if (
$encode$module urlencode($module);
            
$url '/' $module $url;
        }

        if (isset(
$language)) {
            if (
$encode$language urlencode($language);
            
$url '/' $language $url;
        }

        return 
ltrim($urlself::URI_DELIMITER);
    }
}

« Последнее редактирование: Апреля 29, 2010, 17:59:50 от zedroxymur »

Оффлайн san

  • Администратор
  • Герой
  • *****
  • Сообщений: 1750
  • Карма: 80
  • zf infected
    • Развитие личности от Александра Махомета
Re: Дефаултный роутер для многоязычности
« Ответ #1 : Января 07, 2009, 12:47:43 »
+1  в карму :)

Оффлайн hemper

  • Новичок
  • *
  • Сообщений: 1
  • Карма: 1
Re: Дефаултный роутер для многоязычности
« Ответ #2 : Февраля 19, 2009, 22:12:01 »
А не проще использовать 2 роутера ?

$routeDefaults  = array(
    
'language' => 'ru'
    
'module' => 'default'
    
'controller' => 'index'
    
'action' => 'index'
);
$router->addRoute('default_no_language', new Zend_Controller_Router_Route(
    
':module/:controller/:action/*',
    
$routeDefaults
))->addRoute('default', new Zend_Controller_Router_Route(
    
':language/:module/:controller/:action/*',
    
$routeDefaults,
    array(
       
'language' => 'ru|en'
    
)
));

Оффлайн rusk

  • Team
  • Опытный
  • ***
  • Сообщений: 96
  • Карма: 10
    • Alexey Suhih
Re: Дефаултный роутер для многоязычности
« Ответ #3 : Февраля 20, 2009, 12:27:06 »
Все бы ничего, только это актуально, если вы не пишете собственные роутеры для модулей.
Поэтому я написал свой роутер.

<?php
class Dropper_Controller_Router_Route_Multilingual extends Zend_Controller_Router_Route 
{
    protected 
$_defaultLanguage;    

	
public static function 
getInstance(Zend_Config $config)
    {
        
$reqs = ($config->reqs instanceof Zend_Config) ? $config->reqs->toArray() : array();
        
$defs = ($config->defaults instanceof Zend_Config) ? $config->defaults->toArray() : array();
        return new 
self($config->route$defs$reqs);
    }
    
    public function 
__construct($route$defaults = array(), $reqs = array())
    {
        
$route trim($route$this->_urlDelimiter);
        
$this->_defaults = (array) $defaults;
        
        if (!isset(
$this->_defaults['lang'])) {
        
	
$config Zend_Registry::get('config');
        
	
//Load default language from config
        
	
$this->_defaults['lang'] = $config->app->lang;
        }
        
        
$this->_defaultLanguage $this->_defaults['lang'];
        
$this->_requirements = (array) $reqs;

        if (
$route != '') {
            foreach (
explode($this->_urlDelimiter$route) as $pos => $part) {
                if (
substr($part01) == $this->_urlVariable) {
                    
$name substr($part1);
                    
$this->_parts[$pos] = (isset($reqs[$name]) ? $reqs[$name] : $this->_defaultRegex);
                    
$this->_variables[$pos] = $name;
                } else {
                    
$this->_parts[$pos] = $part;
                    if (
$part != '*'$this->_staticCount++;
                }
            }
        }
    }
    
	
public function 
match($path)
    {

        
$pathStaticCount 0;
        
$values = array();

        
$path trim($path$this->_urlDelimiter);
       
	
 
        
$path explode($this->_urlDelimiter$path);
        
        
//If first part of path is 2 symbols
    
	
if (
strlen($path[0]) == 2) {
        
	
//Language detected
            
$language $path[0];
            unset(
$path[0]);
        } else {
        
	
$language $this->_defaultLanguage;
        }
        
        
$path implode($this->_urlDelimiter$path);
        if (
$path != '') {

            
$path explode($this->_urlDelimiter$path);
	
	
	

            foreach (
$path as $pos => $pathPart) {

                
// Path is longer than a route, it's not a match
                
if (!array_key_exists($pos$this->_parts)) {
                    return 
false;
                }
                
                
// If it's a wildcard, get the rest of URL as wildcard data and stop matching
                
if ($this->_parts[$pos] == '*') {
                    
$count count($path);
                    for(
$i $pos$i $count$i+=2) {
                        
$var urldecode($path[$i]);
                        if (!isset(
$this->_wildcardData[$var]) && !isset($this->_defaults[$var]) && !isset($values[$var])) {
                            
$this->_wildcardData[$var] = (isset($path[$i+1])) ? urldecode($path[$i+1]) : null;
                        }
                    }
                    break;
                }

                
$name = isset($this->_variables[$pos]) ? $this->_variables[$pos] : null;
                
$pathPart urldecode($pathPart);

                
// If it's a static part, match directly
                
if ($name === null && $this->_parts[$pos] != $pathPart) {
                    return 
false;
                }

                
// If it's a variable with requirement, match a regex. If not - everything matches
                
if ($this->_parts[$pos] !== null && !preg_match($this->_regexDelimiter '^' $this->_parts[$pos] . '$' $this->_regexDelimiter 'iu'$pathPart)) {
                    return 
false;
                }

                
// If it's a variable store it's value for later
                
if ($name !== null) {
                    
$values[$name] = $pathPart;
                } else {
                    
$pathStaticCount++;
                }
                
            }

        }

        
// Check if all static mappings have been matched
        
if ($this->_staticCount != $pathStaticCount) {
            return 
false;
        }
	
	
$values['lang'] = $language;
        
$return $values $this->_wildcardData $this->_defaults;

        
// Check if all map variables have been initialized
        
foreach ($this->_variables as $var) {
            if (!
array_key_exists($var$return)) {
                return 
false;
            }
        }

        
$this->_values $values;
        
        return 
$return;

    }
    
	
public function 
assemble($data = array(), $reset false$encode false)
    {
	
	
$front Dropper_Controller_Front::getInstance();
        
$lang $front->getRequest()->getParam('lang'$this->_defaultLanguage);
    
	
if (isset(
$urlOptions['lang'])) {
	
	
	
$lang $urlOptions['lang'];
        }
        
    
	
if (
$lang == $this->_defaultLanguage) {
	
	
	
$lang false;
	
	
}
	
	
$url parent::assemble($data$reset$encode);
        if (
$lang) {
        
	
$url $lang $this->_urlDelimiter $url;
        
	

        }
        
        
$url trim($url$this->_urlDelimiter);
        if (
$url) {
        
	
$url .= $this->_urlDelimiter;
        }
        return 
$url;
        
    }
}


В конструкторе используется язык, указанный в конфиге, если язык не передан параметром.

Вот основной конфиг

...
;Default 
language
app
.lang ru
;Allowed locales
app
.locales.ru ru_RU
app
.locales.uk uk_UA
app
.locales.en en_GB
app
.locales.de de_DE


В бутстрапе

$router 
$this->_frontController->getRouter();
	
	
//Override default route
	
	
$router->addRoute(
	
	
	
'default',
	
	
	
new 
Dropper_Controller_Router_Route_Multilingual(
	
	
	
	
':module/:controller/:action/*'
	
	
	
	
array(
	
	
	
	
	
'module' => 'index',
	
	
	
	
	
'controller' => 'index',
	
	
	
	
	
'action' => 'index',
	
	
	
	
	
'lang' => $config->app->lang
	
	
	
	
)
	
	
	
)
	
	
);


Потом в плагине в routeStartup() добавляю роутеры модулей, которые беруться из конфигов модулей

;Routes
;;Article
routes
.article.type "Dropper_Controller_Router_Route_Multilingual"
routes.article.route "article/:id/:url/"
routes.article.defaults.module article
routes
.article.defaults.controller index
routes
.article.defaults.action article
routes
.article.defaults.url ''
routes.article.reqs.id "\d+"
;;Category
routes
.article-category.type "Dropper_Controller_Router_Route_Multilingual"
routes.article-category.route "/article/category/:id/"
routes.article-category.defaults.module article
routes
.article-category.defaults.controller category
routes
.article-category.defaults.action index
routes
.article-category.reqs.id "\d+"
;;Comment
routes
.article-comment.type "Dropper_Controller_Router_Route_Multilingual"
routes.article-comment.route "/article/comments/:id/*"
routes.article-comment.defaults.module article
routes
.article-comment.defaults.controller comment
routes
.article-comment.defaults.action index
routes
.article-comment.reqs.id "\d+"
Лучше сделать и пожалеть, чем не сделать и потом пожалеть еще больше.

Оффлайн Decoder

  • Участник форума
  • Сообщений: 6
  • Карма: 0
Re: Дефаултный роутер для многоязычности
« Ответ #4 : Мая 26, 2009, 17:55:01 »
Кстати тут с выходом 1.8 получилось так, что в цепочке этот роутер не срабатывает. То есть допустим:


$router 
= new Zend_Controller_Router_Rewrite();

$router->removeDefaultRoutes();

// Default

$mainHostRoute = new Zend_Controller_Router_Route_Hostname(
	
'test1.ru',
	
array(
'module' => 'default')
);

$router->addRoute('default'$mainHostRoute->chain(
	
new 
Zend_Controller_Router_Route(':controller/:action/*',
	
	
array(
	
	
        
'controller' => 'index',
	
	
        
'action' => 'index'
	
	
)
	
)
));

$router->addRoute('service'$mainHostRoute->chain(
	
new 
Dropper_Controller_Router_Route_Multilingual('service',
	
	
array(
	
	
	
'controller' => 'service',
	
	
	
'action' => 'info',
	
	
	
'lang' => 'ru'
  
	
	
)
  
	
)
	

));


Кто-нибудь встречался с этой проблемой?

Оффлайн IgorN

  • Team
  • Герой
  • ***
  • Сообщений: 2097
  • Карма: 47
    • Мой сайт
Re: Дефаултный роутер для многоязычности
« Ответ #5 : Июня 11, 2009, 17:57:59 »
Тоже использую самописный роутер для многоязычности. Решение топикстартера понравилось.
Мой сайт: http://igor-negrutsa.info/
Я знаю только то,что ничего не знаю, а многие не знают даже этого.

Оффлайн san

  • Администратор
  • Герой
  • *****
  • Сообщений: 1750
  • Карма: 80
  • zf infected
    • Развитие личности от Александра Махомета
Re: Роутеры для многоязычности
« Ответ #6 : Июля 03, 2009, 12:22:52 »
Роутер Kosik-a

<?php
/**
 * CyEngine
 * 
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://framework.zend.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@zend.com so we can send you a copy immediately.
 *
 * @package    CyEngine
 * @copyright  Copyright (c) 2007-2008 Constantine Yurevich (http://php.webconsulting.by)
 * @license    http://framework.zend.com/license/new-bsd       New BSD License
 */
 
/** Zend_Controller_Router_Route */
require_once 'Zend/Controller/Router/Route.php';
 
 
class 
CyEngine_Controller_Router_Route_Multilingual extends Zend_Controller_Router_Route
{
    
/**
     * Language prefixes that should be detected by router
     *
     * @var array
     */
    
protected static $_languagePrefixes = array('en''ru');
 
 
    
/**
     * Static function
     * Sets prefixes that should be detected by router
     *
     * @param array $prefixes
     */
    
public static function setLanguagePrefixes(array $prefixes
    {
        
self::$_languagePrefixes $prefixes;
    }
 
    
/**
     * Matches a user submitted path with parts defined by a map. Assigns and
     * returns an array of variables on a successful match.
     *
     * @param string $path Path used to match against this routing map
     * @return array|false An array of assigned values or a false on a mismatch
     */
    
public function match($path)
    {
        
$path trim($path$this->_urlDelimiter);
 
        
$pathParts explode($this->_urlDelimiter$path2);
 
        if(
in_array($pathParts[0], self::$_languagePrefixes)) {
            
$path = (sizeof($pathParts) > 1) ? $pathParts[1] : '';
            
$currentLanguage $pathParts[0];
        } else {
            
$currentLanguage $this->_defaults['lang'];
        }
 
        
$params parent::match($path);
        if(
$params) {
            
$params array_merge($params, array('lang' => $currentLanguage));
        }
 
        return 
$params;
    }
 
 
    
/**
     * Assembles user submitted parameters forming a URL path defined by this route
     *
     * @param  array $data An array of variable and value pairs used as parameters
     * @param  boolean $reset Whether or not to set route defaults with those provided in $data
     * @return string Route path with user submitted parameters
     */
    
public function assemble($data = array(), $reset false)
    {
        if(isset(
$data['lang'])) {
            
$lang $data['lang'];
            unset(
$data['lang']);
            
$assemble parent::assemble($data$reset);
            if(
in_array($langself::$_languagePrefixes)) {
            
	
if(
$lang != $this->_defaults['lang']) {
            
	
    
$assemble implode($this->_urlDelimiter, array($lang$assemble));
            
	
}
            }
            return 
$assemble;
        } else {
            return 
parent::assemble($data$reset);
        }
    }
}


А сейчас опишу, как же этим роутером пользоваться.
Во-первых, необходимо задать перечень используемых в url языковых префиксов с помощью статической функции setLanguagePrefixes().
Во-вторых, как и стандартный зендовский роут - его надо создать и добавить с список роутеров:

CyEngine_Controller_Router_Route_Multilingual::setLanguagePrefixes(array('en''ru''ua'));
 
$defaultRoute = new CyEngine_Controller_Router_Route_Multilingual(
	
':module/:controller/:action/*'
	
array(
'lang' => 'en''module' => 'default''controller' => 'index''action' => 'index')
);
$router->addRoute('default'$defaultRoute);


Как видим, в шаблоне роутера уже не надо указывать часть “:lang/”. Параметр “‘lang’ => ‘en’” является необязательным и определяет, какой язык будет языком “по умолчанию”. Т.е. для этого языка не обязателен будет префикс в url.

Оффлайн igor1212

  • Участник форума
  • Сообщений: 17
  • Карма: 0
Re: Роутеры для многоязычности
« Ответ #7 : Августа 09, 2009, 04:01:21 »
Здравствуйте,

Подскажите пожалуйста что не так делаю?

Сохранил файл  library/CyEngine/Controler/Router/Route/Multilingua.php

в файле с роутами прописываю

CyEngine_Controller_Router_Route_Multilingual::setLanguagePrefixes(array('en''ru''ua'));
 
$defaultRoute = new CyEngine_Controller_Router_Route_Multilingual':module/:controller/:action/*', array('lang' => 'en''module' => 'default''controller' => 'index''action' => 'index')
);
$router->addRoute('default'$defaultRoute);


Выскакивает ошибка:

Цитировать
Fatal error: Declaration of CyEngine_Controller_Router_Route_Multilingual::assemble() must be compatible with that of Zend_Controller_Router_Route_Interface::assemble() in /home/sitename/domains/public_html/library/CyEngine/Controller/Router/Route/Multilingual.php on line 97


ВОзможно требуеться отдельно прописывать его в Bootstrap как прописываються плагины ? Прошу совета по данной проблеме.
« Последнее редактирование: Августа 09, 2009, 04:07:24 от igor1212 »

Оффлайн IgorN

  • Team
  • Герой
  • ***
  • Сообщений: 2097
  • Карма: 47
    • Мой сайт
Re: Роутеры для многоязычности
« Ответ #8 : Августа 10, 2009, 18:58:57 »
Multilingua.php а случайно "l" не забыли? может Multilingual.php  надо? Сам использовал этот роутер как базовый для своего, работает у меня на разных версиях зф
Мой сайт: http://igor-negrutsa.info/
Я знаю только то,что ничего не знаю, а многие не знают даже этого.

Оффлайн cleannoise

  • Новичок
  • *
  • Сообщений: 1
  • Карма: 0
Re: Роутеры для многоязычности
« Ответ #9 : Сентября 14, 2009, 17:20:36 »
Пытался использовать Роутер Kosik-a....
и Выскакивает аналогичная ошибка как и у igor1212

Подскажите в чем может быть проблема?

Оффлайн san

  • Администратор
  • Герой
  • *****
  • Сообщений: 1750
  • Карма: 80
  • zf infected
    • Развитие личности от Александра Махомета
Re: Роутеры для многоязычности
« Ответ #10 : Сентября 22, 2009, 09:55:56 »
Пытался использовать Роутер Kosik-a....
и Выскакивает аналогичная ошибка как и у igor1212

Подскажите в чем может быть проблема?

Судя по всему изменились параметры метода assemble, нужно в переопределенном методе также изменить

Оффлайн stfalcon

  • Team
  • Герой
  • ***
  • Сообщений: 897
  • Карма: 44
  • Добрый сокольничий ^_~
    • My name is Tanasiychuk Stepan і це мій блог
Re: Роутеры для многоязычности
« Ответ #11 : Сентября 22, 2009, 16:56:58 »
Вот так работает
    /**
     * Assembles user submitted parameters forming a URL path defined by this route
     *
     * @param  array $data An array of variable and value pairs used as parameters
     * @param  boolean $reset Whether or not to set route defaults with those provided in $data
     * @return string Route path with user submitted parameters
     */
    
public function assemble($data = array(), $reset false$encode false)
    {
        if(!isset(
$data['lang']) && Zend_Registry::get('lang')) {
            
$data['lang'] = Zend_Registry::get('lang');
        }

        if(isset(
$data['lang'])) {
            
$lang $data['lang'];
            unset(
$data['lang']);
            
$assemble parent::assemble($data$reset$encode);
            if(
in_array($langself::$_languagePrefixes)) {
            
	
if(
$lang != $this->_defaults['lang']) {
            
	
    
$assemble implode($this->_urlDelimiter, array($lang$assemble));
            
	
}
            }
            return 
$assemble;
        } else {
            return 
parent::assemble($data$reset);
        }
    }

Оффлайн stfalcon

  • Team
  • Герой
  • ***
  • Сообщений: 897
  • Карма: 44
  • Добрый сокольничий ^_~
    • My name is Tanasiychuk Stepan і це мій блог
Re: Роутеры для многоязычности
« Ответ #12 : Сентября 22, 2009, 16:58:47 »
кстати кто-то пробовал как ведет себя роутер Косика если в апликухе есть другие роутеры? мне кажется без chain'a они работать не будут. а если чайнить, то нужно имена роутеров по всему приложенияю менять. или я не прав?

Оффлайн san

  • Администратор
  • Герой
  • *****
  • Сообщений: 1750
  • Карма: 80
  • zf infected
    • Развитие личности от Александра Махомета
Re: Роутеры для многоязычности
« Ответ #13 : Сентября 22, 2009, 17:04:35 »
кстати кто-то пробовал как ведет себя роутер Косика если в апликухе есть другие роутеры? мне кажется без chain'a они работать не будут. а если чайнить, то нужно имена роутеров по всему приложенияю менять. или я не прав?
я использовал его и помимо него было много роутов, все без chain обошлось