0

CodeIgniter に基づいたカスタム ブログに取り組んでいます。URLを達成した時点でいくつかの問題が発生しました:

/blog/view/1/my-very-first-post

id と "/view" を削除したいのですが、満足できません。

それが私のコントローラーの外観です:

  function index($postId=null)
        {
            $this->view($postId=null);
        }


        function view($postId, $str_slug = '')
        {
                $data['title'] = ucfirst("Blog");
                $data['post'] = $this->posts->get_posts($postId);
                if($postId !== null)
                {
                        $this->load->view('templates/head', $data);
                        $this->load->view('templates/header', $data);
                        $this->load->view('posts/single_view', $data);
                        $this->load->view('templates/footer',$data);         
                } else {
                        $this->load->view('templates/head', $data);
                        $this->load->view('templates/header', $data);
                        $this->load->view('posts/index', $data);
                        $this->load->view('templates/footer',$data);
                }

                $row = $this->db->get_where('posts', array('id' => $postId))->row();

                if ($row and ! $str_slug) {

                    $str_slug = url_title($row->title, 'dash', TRUE);
                    redirect("blog/view/{$postId}/{$str_slug}");

                }               
        }

これを達成するための最良の方法は何ですか?

ありがとう!!アダム

4

2 に答える 2

2

_remap()メソッドを探していると思います。ここで詳細を読むことができます: http://ellislab.com/codeigniter/user-guide/general/controllers.html#remapping

コードは次のようになります。それでも必要な場合は、 get_posts_by_slug() メソッドを実装する必要があります。

public function _remap($slug) {
    $data['title'] = ucfirst("Blog");
    $data['post'] = $this->posts->get_posts_by_slug($slug);

    if($slug !== null)
    {
            $this->load->view('templates/head', $data);
            $this->load->view('templates/header', $data);
            $this->load->view('posts/single_view', $data);
            $this->load->view('templates/footer',$data);         
    } else {
            $this->load->view('templates/head', $data);
            $this->load->view('templates/header', $data);
            $this->load->view('posts/index', $data);
            $this->load->view('templates/footer',$data);
    }

    $row = $this->db->get_where('posts', array('slug' => $slug))->row();
}

更新: @AdamLesniak さん、ブログの投稿やニュース記事へのパーマリンクを保存するのは一般的に良い設計です。これにより、タイトルやその他の揮発性のデータ構造に依存せずにアクセスできるようになります。

しかし、別のアプローチとして、個人的には、これは素晴らしいシステムだと思います。

http://localhost/blog/my-news-article-title-permalink/3

主な問題は、スラッグ/パーマリンクをどこかに保存しないと、誰かが記事のタイトルを変更したときに悲しくなることです. たとえば、「He​​llo World First Blog Post」という私の記事は、次の場所からアクセスできます。

http://localhost/blog/hello-world-first-blog-post

「初めての投稿」への変更:

http://localhost/blog/first-post-i-ever-made

では、最初の URL はどうなるでしょうか。アクセスできなくなります。検索エンジンや誰かのリンクから Web サイトにアクセスしたユーザーは、あなたのコメントを見ることができなくなり、代わりに回避したい 404 ページが表示されます。

パーマリンクを単独で使用する際の問題は、パーマリンクが一意であることを確認する必要があり、そのために追加の制約を設定する必要があることです。

あなたができるいくつかのトリックがありますが、それらにはすべて落とし穴があります. たとえば、前述のシステムを使用して、URL の末尾に一意の識別子を貼り付けることができます。

http://localhost/blog/hello-world/3

また、タイトルが変更されても、スラッグを使用して検索を行うのではなく、一意の識別子に依存しているため、あまり気にしません。

http://localhost/blog/first-post-i-ever-made/3

しかし、この種のシステムは URL ( Uniform Resource Locator)の考え方に反するという意見を見てきました。始めたばかりの頃に使用しましたが、柔軟なシステムであることが証明されました。少なくとも実験するのは間違いなくいいことです。

BBC は、記事が属するカテゴリとエントリの一意の識別子を保持することで、上記の変形を行います。

http://www.bbc.co.uk/news/business-24511283

基本的に、記事のタイトルは変更される可能性がありますが、記事のカテゴリは決して変更されないことを知っているため、一般的なトピックであるビジネスと一意の識別子24511283 のみを保持します。

最後に、最もスケーラブルなソリューションであるため、次の形式を生成することをお勧めします。

http://localhost/blog/permalink/unique-id

上記の形式では、特異性を保証するために重要な一意の識別子と、すべての検索エンジンの使いやすさのためのパーマリンクを使用できます。記事のタイトルが変更された場合は、更新されたタイトルをページのユーザーに表示しますが、URL が変更されないように、パーマリンクには何もしません。

URL で ID も使用することで、パーマリンクを複数回使用できることが確実になり、システムは引き続き正しくスケーリングされます。

于 2013-10-13T19:46:01.430 に答える