Русскоязычный форум, посвященный фреймворку Kohana
http://forum.kohanaframework.su/

Генератор ссылок на основе роутов
http://forum.kohanaframework.su/viewtopic.php?f=38&t=676
Страница 1 из 1

Автор:  WinterSilence [ 12 июн 2013, 19:45 ]
Заголовок сообщения:  Генератор ссылок на основе роутов

Использовать жестко заданные ссылки не очень верно т.к. роуты могут изменить URL, соответственно придется везде вылавливать и менять ссылки, строить же ссылки непосредственно с помощью Route::url() неудобно, да и выглядит не читабельно(длинно). Поэтому я сделал вот такой метод-хэлпер, которой еще и кеширует результаты:
Код:
/**
 * Create a cache tag(id) using the attributes methods.
 *
 * @return  string
 */
public static function tag()
{
   return serialize(func_get_args());
}

/**
 * Create URL based on route. This is a shortcut for: Route::url. URL cached.
 *
 *     CMS::url('route:default'); // Home page
 *     CMS::url(''); // Current URL
 *     CMS::url('route:current,action:delete,id:2'); // Based on current route
 *     CMS::url('controller:article,action:list,page:2'); // Based on default route
 *     CMS::url('route:articles,controller:article,action:list,page:2');
 *
 * @param   string   $params       String with route params
 * @param   boolean  $escape_html  Convert url special characters to HTML entities?
 * @param   boolean  $lower_case   Convert url to lower case?
 * @param   mixed    $protocol     Protocol string or boolean, adds protocol and domain
 * @return  string
 * @uses    Request, Route, HTML, Text, UTF8
 * @uses    CMS::tag
 * @throws  CMS_Exception
 */
public static function url($params_str, $escape_html = TRUE, $lower_case = TRUE, $protocol = NULL)
{
   if (empty($params_str))
   {
      // Get current page URL
      $url = Request::initial()->url($protocol);
   }
   else
   {
      // Try load URL from cache
      if (Kohana::$caching)
      {
         $tag = CMS::tag('url', $params_str, $escape_html, $lower_case, $protocol);
         
         if ($url = Kohana::cache($tag))
         {
            return (string) $url;
         }
      }
      
      // Modify URL string in JSON and convert in array
      $url = str_replace(array(',', ':'), array('","', '":"'), $params_str);
      if ($params = json_decode('{"'.$url.'"}', TRUE, 2))
      {
         $route = isset($params['route']) ? $params['route'] : 'default';
         unset($params['route']);
         
         if ($route == 'current')
         {
            $request = Request::current();
            
            $params = array_merge($request->param(), $params);
            $params += array(
               'directory'  => $request->directory(),
               'controller' => $request->controller(),
               'action'     => $request->action(),
            );
            
            $route = Route::name($request->route());
         }
         
         $url = Route::url($route, $params, $protocol);
      }
      else
      {
         // Use links in format: 'option:value,option2:value2'
         throw new CMS_Exception('Wrong url format: :url', array(':url' => $params_str));
      }
   }
   
   // Use URL modificators
   $url  = ($escape_html ? HTML::chars($url) : $url);
   $url  = ($lower_case ? UTF8::strtolower($url) : $url);
   $url  = str_replace('\\', '/', $url).'/';
   $url  = Text::reduce_slashes($url);
   
   // Save result URL in cache
   if ( ! empty($params_str) AND Kohana::$caching)
   {
      Kohana::cache($tag, $url, Date::DAY);
   }
   
   return $url;
}

Страница 1 из 1 Часовой пояс: UTC + 4 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/