Передача переменных перед сегментом URI контроллера в CodeIgniter - PullRequest
2 голосов
/ 23 ноября 2011

Я хотел бы передать проверенные переменные на уровне сайта перед сегментом контроллера в URL.

Пример:

URL по умолчанию будет:

www.mysite.com/controller/method/variable/

Иногда я хотел бы также иметь такой URL-адрес, чтобы ссылаться на созданную пользователем субконфигурацию этого сайта (тема, меню, ...), чтобы пользователь мог делиться URL-адресом этого сайта, а другие могли бы видеть сайт его пользовательские конфигурации.

www.mysite.com/username/controller/method/variable

Здесь username - это пользовательская часть base_url . Он должен быть проверен по базе данных и установлен в качестве переменной сеанса, чтобы использовать его позже в моих контроллерах и изменить тему, например. Также все ссылки на сайте начнут использовать www.mysite.com/username как base_url после того, как сайт будет введен с этим именем пользователя в URL.

Одним из способов решения этой проблемы будет маршрутизация, например:

controller/method/variable_name1/variable_value1/user_conf/username

... и добавьте реализацию для каждого контроллера в моем проекте. Но это не элегантное решение.

Ответы [ 2 ]

2 голосов
/ 23 ноября 2011

Это то, что вы ищете:

$route['(:any)/(:any)'] = '$2/$1';

где все ваши определения функций имеют имя пользователя в качестве последнего параметра:

class Controller{function page(var1, var2, ..., varn, username){}}

Или, если вы хотите войти только на одной конкретной странице, вы можете сделать что-то вроде этого:

$route['(:any)/controller/page/(:any)'] = 'controller/page/$2/$1'; //This will work for the above class.

Или, если вы хотите это для ряда функций в контроллере, вы можете сделать это:

$route['(:any)/controller/([func1|func2|funcn]+)/(:any)'] = 'controller/$2/$3/$1';
1 голос
/ 23 ноября 2011

Поработав с этой проблемой в течение дня, я добавил в свой проект собственный класс маршрутизатора.Я работаю в CodeIgniter 2.0, поэтому расположение этого файла должно быть application/core/MY_Router.php

Мой код следующий:

class MY_Router extends CI_Router {

// --------------------------------------------------------------------

/**
 * OVERRIDE
 *
 * Validates the supplied segments.  Attempts to determine the path to
 * the controller.
 *
 * @access    private
 * @param    array
 * @return    array
 */
function _validate_request($segments)
{
    if (count($segments) == 0)
    {
        return $segments;
    }

    // Does the requested controller exist in the root folder?
    if (file_exists(APPPATH.'controllers/'.$segments[0].EXT))
    {
        return $segments;
    }

    $users["username"] = 1;
    $users["minu_pood"] = 2;
    // $users[...] = ...;
    // ...
    // Basically here I load all the 
    // possbile username values from DB, memcache, filesystem, ...
    if (isset($users[$segments[0]])) { 
        // If my segments[0] is in this set
        // then do the session actions or add cookie in my cast.
        setcookie('username_is', $segments[0], time() + (86400 * 7));
        // After that remove this segment so 
        // rounter could search for controller!
        array_shift($segments); 
        return $segments;
    }

    // So segments[0] was not a controller and also not a username...
    // Nothing else to do at this point but show a 404
    show_404($segments[0]);

}

}

...