2012-05-28 2 views
0

Мне нужно перенаправить URL-адреса, подобные этому: http://mysite.com/store/store-name - http://mysite.com/stores/products/store-id. Обратите внимание, что мне нужно получить идентификатор магазина из базы данных. Так можно ли выполнять операции db в route.php?URL-адрес URL-адреса Codeigniter с именем продукта для идентификатора продукта

И в документации синтаксис представлен как $route['store/:any']. Как получить значение второго параметра здесь, который указан как :any.

ответ

4

На самом деле не существует ни хорошего, ни простого способа запуска запросов к базе данных по маршрутам. Однако вы можете иметь в начале функции контроллера проверку.

Я использую ваш store-name - это своего рода пуля продукта? В основном вы можете проверить, является ли значение числовым или нет, и если не найти по slug и затем перенаправить.

конфигурации/routes.php

$route["store/(.*)"] = 'stores/products/$1'; 
/*() and $1 together passes the values */ 

Контроллеры/stores.php

/* Class etc. */ 

function products($mix) { 

    if (is_numeric($mix)) 
     $int_id = $mix; 
    else { 

     $row = $this->get_where('products', array('slug' => $mix))->row(); 

     $this->load->helper('url'); 
     redirect("stores/products/{$row->id}"); 

    } 

    /* Do stuff with the $int_id */ 

} 

Это asumes, что у вас есть:

  • таблица с именем продукты
  • столбец с именем ID это ваши продукты ID
  • столбец с именем пробкового, что это основано на вашем store-name
+0

В этом случае я не получаю значение '$ mix'. – Stranger

+0

Вы добавили маршрут? Если вы это сделали, вы сможете получить значение '$ mix'. Попробуйте 'var_dump()' it? –

+0

Когда я делаю это, я получаю значение $ 1 только для значения mix, а не для правильного значения. – Stranger

0

Да, это просто, вам нужно только, чтобы показать идентификатор вместо имени, вы должны делать, как StoreName> Нажмите, чтобы посмотреть детали

Сделать это как

StoreID> Нажмите, чтобы посмотреть подробную информацию

и когда вы передаете параметр в базу данных, измените проверку MySQL, изменить его идентификатор вместо имени, что может быть какой-то, как «выберите yourRequiredColumn из table_name где идентификатор =». параметр.»

Спасибо

1

Может быть, я немного опоздал на вечеринку, но я могу иметь альтернативное предложение.

Я использую следующие для моих маршрутов:

http://mysite.com/store/1/store-name 

Причина в том, ...Исходя из вашего метода, если вы создаете

http://mysite.com/store/store-name 

, но затем после определенного периода времени (из которых без сомнения Google проиндексировал страницы) вы решаете для того, что когда-либо причине вы должны изменить название магазина, чтобы " Wonderful store name ", вы, естественно, смените вашу ссылку на

http://mysite.com/store/wonderful-store-name 

Что убивает ваш SEO и любые ссылки индекса.

Мое решение использовать http://mysite.com/store/1/store-name означает, что вы можете изменить store-name на все, что хотите, но оно всегда будет ссылаться на 1, что означает, что пользователь по-прежнему будет видеть связанную страницу.

1

Все, что угодно возможно с использованием маршрутов CodeIgniter. Его все так, как вы его кодируете. Маршрутизация в CI составляет действительно гибкий. Вы можете использовать регулярные выражения, помимо стандартных подстановочных знаков CI (: any) (: num). Вы даже можете добавить префиксы или суффиксы переменного пути, если вы должны, как:

$route['store/(:any)'] = "redircontroller/redirfunction/$1"; 
// for instance the namelookup method of the mystores controller 
$route['stores/products/(:any)'] = "mystores/namelookup/$1"; 

Вы получаете второй параметр (и третий и так далее), определив переменные в значении маршрута, которые получают передаются в контроллер метод, который вы определяете. Если «продукты» в вашем новом URL-адресе также являются вариантом, вы должны вместо этого использовать вместо этого выражение. Вы также можете вывести параметры из URL-адреса, используя класс URI ($ this-> uri-> segment (n)).

Однако вы не выполняете операции с базами данных в route.php. Вы выполняете операции с базой данных в контроллере, к которому вы направляетесь. Я предполагаю, что вам придется сопоставлять идентификатор магазина, используя все, что используется в URL-адресе в запросе. В любом случае путь, которым вы пользуетесь файлом маршрутов, - это путь, который пользователь увидит. Для того, чтобы сделать редирект вы должны принять исходный путь, а затем перенаправить пользователя на новый путь, как так:

// in some controller that's attached to the original url 
    public function redirfunct($var){ 
     $this->load->helper('url'); 
     redirect(base_url('stores/products/' . $var)); 
    } 

Я надеюсь, что это поможет.

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