Маршрутизация в коде: \ - PullRequest
1 голос
/ 22 января 2012

Я действительно застрял в создании маршрутов для своего приложения, и мне кажется, что рутирование в CI очень запутанно, поэтому у меня есть несколько страниц людей в каждой стране, и вы попадаете на эту страницу, выбирая страну в раскрывающемся списке вНа домашней странице мне удается передать данные с помощью метода POST, но проблема в том, что я не могу получить доступ к этим страницам напрямую по URL, потому что их основной контроллер делает доступ к БД и генерирует их, поэтому на данный момент все мои страницы имеют этот URL * 1001.*

www.site.com/country 

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 22 января 2012

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

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

просто напишите свою функцию так:

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

Чтобы перенаправить из постданных, попробуйте это:

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

Для получения дополнительной информации ознакомьтесь с официальной документацией по маршрутизации .

2 голосов
/ 23 января 2012

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

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

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

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

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

1 голос
/ 07 февраля 2012

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

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

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

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, он направляет на URL http://example.com/country/view/japan/naruto. Это предполагает, что «japan» находится в вашем массиве «позволенных стран».

Второй просто маршрутизируетurl http://example.com/japan to 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.

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