2012-01-22 2 views
1

Я действительно застрял в создании маршрутов для своего приложения, и я считаю, что укоренение в CI очень запутывает , поэтому у меня есть некоторые страницы людей в каждой стране, и вы попадаете на эту страницу, выбирая страна в выпадающем списке на домашней странице Мне удается передавать данные с использованием метода POST, но проблема в том, что я не могу получить доступ к этим страницам напрямую с помощью URL-адреса, потому что их главный контроллер имеет доступ к db и генерирует их , так что пока все мои страницы имеют этот URLМаршрутизация в codeigniter:

www.site.com/country 

страна является контроллер

, но я хочу выглядеть так:

www.site.com/name-of-country/name-of-person 

любая идея, как это сделать?

ответ

1

Эти ответы не дают достаточно информации, и принятый ответ просто ужасна ...

Лучший способ справиться с этим было бы настроить маршрутизацию сделать следующее (если вы хотите контролировать страны, которые пользователи могут использовать:

это в вашем файле маршрутов:

foreach(array('country1', 'country2') as $country) { // array with allowed countries 
    $routes[$country.'/(:any)'] = "country/view/{$country}/$1"; 
    $routes[$country] = "country/view/{$country}"; 
} 

, что это делает принимает ваш массив разрешенных стран, а затем создает правила маршрутизации для каждой страны, так что если пользователь переходит к http://example.com/japan/naruto, это ro utes на адрес http://example.com/country/view/japan/naruto. Это предполагает, что «Япония» находится в вашем массиве «разрешенных стран».

Второй просто перенаправляет URL http://example.com/japan в http://example.com/country/view/japan

в контроллере country.php:

class Country extends CI_Controller { 
    function view($country, $username = false) { // $username=false allows you to show just a 'country' page if you want to 
    if ($username) { 
     $this->load->view('users_view', array('country' => $country, 'username' => $username)); 
    } else { 
    $this->load->view('countries_view', array('country' => $country)) 
    } 
    } 
} 

, что я сделал здесь позволило вам создать страницу только для страны, которая отображается, которая загружает countries_view.php из вашей папки просмотра или вы можете просмотреть страницу для пользователя, который загружает страницу users_view.php.

+0

- это работа, если у меня есть все страны всего мира? У меня есть имена графств, хранящиеся в базе данных, когда я активирую одну страну, она должна быть видимой пользователям. –

+0

Да, вам нужно поместить их в массив и запустить foreach() в этом массиве. –

+0

Таким образом, вы предпочитаете вручную поддерживать массив стран в вашем файле маршрутов, чем иметь базу данных (которая уже содержит ту же информацию), что ваш контроль доступа для вас? Теперь вы не только нарушили принцип DRY (не повторяйте себя) и принципы управления архитектурой MVC, на которой построен CodeIgniter, но вы сделали намного больше работы для себя. – njbair

3

Контроллеры в CI могут принимать аргументы, как обычные функции. Эти аргументы передаются как сегменты URL. Так что, если вы хотите напечатать:

www.site.com/name-of-country/name-of-person 

просто написать функцию, как это:

function Country($name_of_country, $name_of_person) { ... } 

Чтобы переадресовать от PostData, попробуйте следующее:

function Country($name_of_country, $name_of_person) { 
    if ($this->input->post('country') { 
    redirect('/country/' . $this->input->post('country')); 
    } 
} 

Для получения дополнительной информации, ознакомьтесь с official documentation on routing ,

+0

спасибо, что отлично, но как бы я сгенерировал этот URL-адрес, если пользователь shoos отправится на домашнюю страницу, а затем перейдите на страницу лиц, как это показать в URL-адресе? –

+0

Если вы хотите использовать форму для этого, вы можете добавить условие к своему контроллеру страны, который ищет посты и перенаправляет по мере необходимости. – njbair

+0

Да, вы правы, это может быть сделано путем перенаправления, я просто это понял, спасибо за вашу помощь :) –

2

Вы также можете установить это в файле routes.php с помощью некоторого регулярного выражения. Это зависит от того, как настроено ваше приложение и как контролируются ваши маршруты. Например, если вы это сделали:

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

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

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

Затем вы можете настроить эту логику в маршрутах файл, где она принадлежит. Если у вас есть файл маршрутов, вы должны использовать вместо того, чтобы пытаться выполнять маршрутизацию через контроллер.

Смежные вопросы