Как отправить данные в метод индекса Code Igniter Controller? - PullRequest
1 голос
/ 20 марта 2012

Я попытался закодировать идентификатор журнала в URL-адресе моего приложения Code Igniter и получить его в моем контроллере. Моя конечная цель - получить доступ к странице http://mysite.com/journal/3 и получить доступ к странице, содержащей сведения о журнале с идентификатором 3.

В моем файле контроллера journal.php у меня есть

<?php
if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class Journal extends Controller {
    public function index($journalId) {
        $data['journalId'] = $journalId;
        $this->view->load('journalPage', $data);
    }
}
?>

В моем файле journalPage.php у меня есть

This event has ID <?= $journalId ?>.

Я написал это правило в моем файле rout.php.

$route['journal/(:num)'] = 'journal/$1';

Вот файл .htaccess в моей общедоступной папке html.

<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1 [QSA,L]
</IfModule>

Однако, когда я захожу на mysite.com/journal/3, я получаю ошибку 404. Почему?

Ответы [ 3 ]

3 голосов
/ 20 марта 2012
$route['journal/(:num)'] = 'journal/index/$1';

(:num) will become invalid if you encode

Edit: Если вы используете класс шифрования CI для кодирования вашего идентификатора (бессмысленно) вам нужно будет изменить его, чтобы убедиться, что строка безопасна для URI.

1 голос
/ 09 апреля 2012

Прежде всего: вам не нужно создавать пустой конструктор (это должно [ничего!]). Если вы хотите загрузить некоторые библиотеки, помощники или модели в начале всех функций для этого контроллера, то это необходимо, в противном случае это не так.

Другой совет: старайтесь не передавать параметры функции контроллера. Вы можете перехватывать и манипулировать значениями URI с помощью класса URI CodeIgniter.

Просто сделайте это:

<?php
if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class Journal extends CI_Controller
{
    public function index()
    {
        $data['journalId'] = $this->uri->segment(2);
        $this->view->load('journalPage', $data);
    }
}

Вам лучше взглянуть на класс URI. Это довольно просто удобно! http://codeigniter.com/user_guide/libraries/uri.html

PS: Не нужно ничего исправлять на маршрутах.

Hug

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

Исходя из того, что я вижу выше, это просто ошибка для начинающих при маршрутизации CI.

У вас .htaccess в порядке (вы просто удаляете index.php из URL).

В других 2шаги (у вас есть проблема в вашем контроллере и в вашем конфиге маршрутов).

Сначала в контроллере, при создании нового контроллера вы должны расширить CI_Controller Для краткости, вот так должен выглядеть ваш файл journal.php:

<?php
if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class Journal extends CI_Controller {
    public function __construct() {
        parent::__construct(); // This is MUST!
    }
    public function index($journalId) {
        $data['journalId'] = $journalId;
        $this->view->load('journalPage', $data);
    }
}

Теперь, когда вы обновили это, мы переходим к конфигурации маршрутов.

Строка конфигурации, которую вы только что написали, может сбить с толку CI, ни больше, ни меньше.

Структурамаршрута CI должен выглядеть следующим образом:

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

Это перенаправит весь трафик из журнала / [ID] в контроллер с именем journal, в метод с именем index с параметром [ID].

Youнеобходимо определить индексную часть в маршрутизации.

Попробуйте, и все должно работать нормально.Приветствия.

...