Как построить привязку в CodeIgniter, где вы хотите изменить переменную, которая уже присутствует в URI? - PullRequest
1 голос
/ 23 марта 2012

Обычно я бы просто использовал параметры URL GET, но CodeIgniter, похоже, не нравится им, и ни одна из вспомогательных функций URL не предназначена для них, поэтому я пытаюсь сделать это «способом CodeIgniter».

Я хотел бы создать страницу, на которой модель может принимать несколько различных параметров URI, ни один из которых не обязательно присутствует, и ни один из них не должен быть в каком-либо определенном порядке, как обычная строка запроса URL с параметрами get.

Допустим, у меня есть следующий URL:

http://example.com/site/data/name/joe/

Здесь, не считая контроллера или метода, будет один параметр:

$params = $this->uri->uri_to_assoc(1);
print_r($params);
// output
array( [name] => [joe] )

Если бы я хотел изменить 'joe'для «луча» я мог бы сделать это:

echo anchor('name/ray');

Достаточно просто, но что, если есть больше параметров и положение параметров меняется?Например:

http://example.com/site/data/town/losangeles/name/joe/
http://example.com/site/data/age/21/name/joe/town/seattle

Можно ли просто захватить URL-адрес и вывести его только с измененным параметром 'name'?

Редактировать: В соответствии с рекомендациями LandonsЯ взял его скрипт и настроил его как вспомогательную функцию url, создав файл:

application/helpers/MY_url_helper.php

По сути, я переписал функцию current_url (), чтобы при желании принять массив параметров, которые будут подставлены в текущий URI,Если вы не передадите массив, функция будет работать как изначально:

function current_url($vars = NULL)
{
    $CI =& get_instance();

    if ( ! is_array($vars))
    {
        return $CI->config->site_url($CI->uri->uri_string());
    }
    else
    {
        $start_index = 1;

        $params = $CI->uri->uri_to_assoc($start_index);

        foreach ($vars as $key => $value)
        {
            $params[$key] = $value;
        }

        $new_uri = $CI->uri->assoc_to_uri($params);
        return $CI->config->site_url($new_uri);
    }
}

Работает нормальноЯ думаю, что суть в том, что мне не нравится 'CodeIgniter Way', и я буду смотреть на смешивание сегментированных URL-адресов со строками запросов или другой структурой в целом.

Ответы [ 2 ]

1 голос
/ 23 марта 2012

Почему бы не использовать встроенный в URI класс CodeIgniter? Это позволяет вам выбрать соответствующие сегменты из URL, который вы могли бы использовать для создания привязки. Однако, если вы не создали собственные маршруты, это будет означать, что ваши методы должны будут принимать больше параметров.

Чтобы использовать URI Class , в вашем методе должно быть следующее:

echo anchor($this->uri->segment(3).'/ray');

Предполагается, что / site / data / name являются специфичными для CodeIgniter (/ controller / method / parameter)

Теперь, я думаю, это было бы намного проще, если бы вы использовали маршруты . Ваш маршрут будет выглядеть так:

$route['site/data/name/(:any)'] = 'site/data/$1';

По сути, ваш URL может быть настолько подробным и конкретным, насколько вы хотите, но в вашем коде функция намного чище, а параметры довольно наглядны. Ваш метод будет определен так:

function data($name) { }

Чтобы расширить ваш маршрут для приема дополнительных параметров, ваш маршрут для примера URL "http://example.com/site/data/age/21/name/joe/town/seattle", который вы указали, будет выглядеть следующим образом:

$route['site/data/age/(:num)/name/(:any)/town/(:any)'] = 'controller/data/$1/$2/$3';

И ваша функция будет выглядеть так:

function data($age, $name, $town) { }
1 голос
/ 23 марта 2012

Вы можете использовать метод assoc_to_uri(), чтобы вернуть его в формат URI:

<?php

// The segment offset to use for associative data (change me!)
$start_index = 1;

// Parse URI path into associative array
$params = $this->uri->uri_to_assoc($start_index);

// Change the value you want (change me!)
$params['name'] = 'ray';

// Convert back to path format
$new_uri = $this->uri->assoc_to_uri($params);

// Prepend the leading segments back to the URI
for ($i=1; $i<$start_index; $i++)
{
    $new_uri = $this->uri->segment($i).'/'.$new_uri;
}

// Output anchor
echo anchor($new_uri);

Я бы рекомендовал обернуть это в какую-нибудь вспомогательную функцию.Удачного кодирования!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...