CodeIgniter: я могу перечислить элементы, но не могу их загрузить

My

Приложение/.htaccess

RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

Приложение/config/routes.php

$route['default_controller'] = "news";
$route['404_override'] = '';

Приложение/модели/news_model.php

<?php
class News_model extends CI_Model {

    public function __construct()
    {
        $this->load->database();
    }

    public function get_news($slug = FALSE)
    {
        if ($slug === FALSE)
        {
            $query = $this->db->get('news');
            return $query->result_array();
        }

        $query = $this->db->get_where('news', array('slug' => $slug));
        return $query->row_array();
    }
}
?>

Приложения/контроллеры/news.php

<?php
class News extends CI_Controller {

    public function __construct()
    {
        parent::__construct();
        $this->load->model('news_model');
    }

    public function index()
    {
        $data['news'] = $this->news_model->get_news();
        $data['title'] = 'News archive';

        $this->load->view('templates/header', $data);
        $this->load->view('news/index', $data);
        $this->load->view('templates/footer');
    }


    public function view($slug)
    {
        echo $slug;
        $data['news_item'] = $this->news_model->get_news($slug);
        var_dump($data);
        if (empty($data['news_item']))
        {
            show_404();
        }

        $data['title'] = $data['news_item']['title'];

        $this->load->view('templates/header', $data);
        $this->load->view('news/view', $data);
        $this->load->view('templates/footer');
    }
}
?>

Приложения/представления/index.php:

<?php foreach ($news as $news_item): ?>
    <?php var_dump($news_item); ?>
    <h2><?php echo "<pre>"; echo $news_item['title'] ?></h2>
    <div id="main">
        <?php echo $news_item['text'] ?>
    </div>
    <p><a href="news/<?php echo $news_item['slug'] ?>">View article</a></p>

<?php endforeach ?>

И приложения/представления/view.php

<?php
echo '<h2>'.$news_item['title'].'</h2>';
echo $news_item['text'];

Проблема в том, что я вижу индекс (в котором перечислены мои новости), но когда я нажимаю на ссылку-слаг, он пытается перейти к:

/news/slug1

И выдает ошибку не найдено..

Что мне здесь не хватает?


person Toni Michel Caubet    schedule 07.05.2013    source источник
comment
вставьте свой контроллер новостей   -  person raidenace    schedule 07.05.2013
comment
Я редактировал. это в вопросе сейчас! спасибо   -  person Toni Michel Caubet    schedule 07.05.2013
comment
проблема проста, slug1 становится вашим действием, и поскольку у вас нет такого действия, вы получаете ошибку. Установите свой URL как news/view/slug1, и он будет работать   -  person Twisted1919    schedule 07.05.2013
comment
Запрошенный URL-адрес /demo/news/view/noticia1 не найден на этом сервере.... (/demo/ папка моего проекта на локальном хосте)   -  person Toni Michel Caubet    schedule 07.05.2013
comment
Контроллеру вашей модели требуется parent::__construct().   -  person Rocket Hazmat    schedule 07.05.2013
comment
он уже есть в контроллере (как я его выложил..)   -  person Toni Michel Caubet    schedule 07.05.2013
comment
Ваш .htaccess сейчас в Application/.htaccess? Это неправильное место. Он должен находиться в папке вашего проекта (в вашем случае /demo/).   -  person Rocket Hazmat    schedule 07.05.2013
comment
У меня была такая же проблема... Я думаю, что это опечатка. Я изменил <a href="news/ на <a href="view/ и все заработало нормально.   -  person gloomy.penguin    schedule 16.10.2013


Ответы (3)


Ссылка должна быть:

 <p><a href="/news/view/<?php echo $news_item['slug'] ?>">View article</a></p>
person raidenace    schedule 07.05.2013
comment
Запрошенный URL-адрес /demo/news/view/noticia2 не найден на этом сервере. (/demo/ — папка проекта) - person Toni Michel Caubet; 07.05.2013
comment
Нет! должно быть <a href="<?php echo site_url('news/view/'.$news_item['slug'])?>">Link</a>. Это если вы хотите сделать это правильно. - person Twisted1919; 07.05.2013
comment
@ToniMichelCaubet Ваш htaccess должен оставаться в демо-папке, хорошо? - person Twisted1919; 07.05.2013
comment
@ Twisted1919: При работе с разделенными структурами в CI это не обязательно. Но да, site_url() — это функция по умолчанию для получения пути к сайту, хороший момент. - person raidenace; 07.05.2013
comment
@Raidenace - да, имеет значение, когда ваш проект не находится в корневом каталоге. - person Twisted1919; 07.05.2013
comment
@ToniMichelCaubet: Корень вашего документа указывает на папку установки CI на сервере? - person raidenace; 07.05.2013
comment
с '‹?php echo site_url('news/view/'.$news_item['slug'])?›' скрипт падает в цикле... - person Toni Michel Caubet; 07.05.2013
comment
@ Twisted1919: Нет, это не так, потому что в этом случае три установки CI, которые я поддерживаю уже более четырех лет, были бы сломаны повсюду. И site_url просто получает то, что установлено в вашей конфигурации, поэтому в любом случае у него нет внутреннего механизма разрешения. - person raidenace; 07.05.2013
comment
@ToniMichelCaubet - вы видели мой комментарий о том, куда должен идти htaccess? - person Twisted1919; 07.05.2013
comment
@Raidenace - может быть, вы все-таки правы, я не работаю с CI уже более двух лет, так что я могу ошибаться. - person Twisted1919; 07.05.2013
comment
@ Twisted1919: нет проблем, на самом деле я на какое-то время забыл о site_url, спасибо за напоминание .. Посмотрим, сможем ли мы помочь ОП поднять его материал! Тони, что вам дает echo site_url()? - person raidenace; 07.05.2013
comment
@ToniMichelCaubet - htaccess выглядит нормально, но он не в том месте, переместите его в демо-папку, рядом с файлом index.php - person Twisted1919; 07.05.2013
comment
index.php находится в /application/views/news/index.php, тогда я должен поместить его в новости? - person Toni Michel Caubet; 07.05.2013
comment
.htaccess должен находиться в вашей корневой папке. Это папка, в которой находится файл index.php вместе с такими папками, как system и application. - person raidenace; 07.05.2013
comment
Действительно? Я только что сказал вам, поместите его в папку demo, где находится папка вашего приложения, на том же уровне, что и основной файл index.php. Имеет смысл ? - person Twisted1919; 07.05.2013
comment
@ Twisted1919: Меня тоже смутило то, что сказал ОП... :| - person raidenace; 07.05.2013
comment
А также, ваше приложение разбилось при использовании site_url(), потому что site_url(), если я правильно помню, загружается через вспомогательную функцию URL. поэтому вам нужно будет загрузить вспомогательный URL-адрес в свой контроллер или автоматически загрузить его, чтобы использовать его в своих представлениях. - person Twisted1919; 07.05.2013
comment
Ладно, Тони, похоже, что-то не так. давайте немного отступим. Сначала введите весь URL-адрес в качестве ссылки и сначала убедитесь, что он работает. Как http://localhost/whatever_is_here/news/views/id. Затем в любом случае проверьте site_url, чтобы увидеть, какую часть полного рабочего URL-адреса он разрешает. Затем проверьте, каких частей не хватает. Эта информация будет необходима для достижения правильного решения - person raidenace; 07.05.2013
comment
@ToniMichelCaubet - я опубликовал обновленный htaccess, попробуйте этот - person Twisted1919; 07.05.2013
comment
Я подумал, что было бы более продуктивно, если бы я загрузил проект... www53.zippyshare. com/v/12049811/file.html - person Toni Michel Caubet; 07.05.2013
comment
Twisted1919 хорошее замечание. Тони, вы можете добавить помощника в массив конфигурации автозагрузки, если его еще нет - person raidenace; 07.05.2013
comment
Как это? $autoload['помощник'] = массив('url'); (не помогло... :( - person Toni Michel Caubet; 07.05.2013
comment
теперь работает!!!! Я не совсем уверен, в чем была проблема, потому что я думаю, что их может быть несколько... - person Toni Michel Caubet; 07.05.2013

Предполагая, что ваш CI находится в папке /demo:
попробуйте этот htaccess:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /demo/

#Needed for CodeIgniter
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|pub|tmp|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 [L]

</IfModule>

Ваше действие должно быть доступно по URL вида:
http://localhost:8080/demo/news/view/slug-here
и NOT по адресу:
http://localhost:8080/demo/news/slug-here

person Twisted1919    schedule 07.05.2013
comment
Вы обновили свой код htaccess? я не вижу его обновленным в предоставленном вами архиве. - person Twisted1919; 07.05.2013
comment
Да, я сделал... ты опубликовал это потом... :P - person Toni Michel Caubet; 07.05.2013

Метод index контроллера должен быть:

public function index()
{
    $data['news'] = $this->news_model->get_news();
    $data['title'] = 'News archive';

    $this->load->view('templates/header', $data);
    $this->load->view('view', $data);
    $this->load->view('templates/footer');
}

и ссылка на статью должна быть:

<p><a href="news/index/<?php echo $news_item['slug'] ?>">View article</a></p>
person kodmanyagha    schedule 07.05.2013
comment
Вы ничего не меняли в методе index. Кроме того, для этого предназначен метод view. - person Rocket Hazmat; 07.05.2013
comment
конечно поменял. Посмотрите внимательно: $this-›load-›view('view', $data); - person kodmanyagha; 08.05.2013