У меня возникают трудности с Codeigniter. Я пытаюсь получить данные из данных MySQL, передав ID записи как часть URL-адреса
URL должен быть
локальный /site_folder/страница /page_title/2
В приведенном выше URL-адресе отображается имя контроллера, а 2 - первичный идентификатор записи в базе данных (это может быть любое число от 1 до 9999).
Мой контроллер включает в себя следующее:
public function index()
{
$this->load->helper('url');
$this->load->model('pages_model');
$id = $this->uri->segment(3,1);
if (empty($id))
{
show_404();
}
$data['page'] = $this->pages_model->get_page($id);
$this->load->view('page',$data);
}
Мой.htaccess содержит это
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php/$0 [PT,L]
Когда я вхожу в localhost/site_folder/page/page_title/2
в адресную строку, он выдает 404.
Тем не менее, когда я вхожу в localhost/site_folder/page
он показывает запись базы данных по умолчанию, как показано во втором значении segment(3,1)
выше.
Итак, как мне изменить файл.htaccess для работоспособного переписывания?
Я пробовал следующее, но никто не работал для меня:
Вы можете попробовать использовать функцию _remap
как описано в документации CI. Https://ellislab.com/codeigniter/user-guide/general/controllers.html
Функция _remap
если она существует в контроллере, представляет собой функцию, которая вызывается перед любым методом класса, и в этой функции вы можете проверить параметры, отправленные в функцию, и в соответствии с этим вызовом использовать любой метод контроллера.
Для вашего примера, поскольку я предполагаю, что page_title является динамическим, вы можете либо установить регулярное выражение для его проверки, либо, как в следующем примере, проверить, не существует ли метода, а затем рассматривать его как заголовок страницы (это означает, что вы должны быть уверены, что не быть заголовком страницы и именем метода в этом контроллере с тем же именем)
public function _remap($method, $params = array())
{
if (!method_exists($this, $method))
{
// assume this is a page_title and run the index method
$this->index($method, $params);
}
else {
// means that method exists then run that method
$this->$method( $params);
}
}
Также помните, что это означает, что вы должны учитывать при использовании метода индексного заголовка 404, когда кто-то просто набирает случайную строку, которую контроллер будет рассматривать как page_title.