nabeo56BLOG

開発とかプログラムとか

Webアプリ養成読本の実践(3)のつづき2

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

投稿の表示

ルーティング追記
$ pwd
/vagrant/work/app
$ vim lib/Tinitter/Route.php

以下を追記

$app->get('/page/:page_num', '\Tinitter\Controller\TimeLine:show');
showメソッド修正
$ vim lib/Tinitter/Controller/TimeLine.php
<?php
namespace Tinitter\Controller;
use \Tinitter\Model\Post as M_Post;
class TimeLine
{
  public function show($page_num = 1)
  {
    $app = \Slim\Slim::getInstance();
    list($post_list, $next_page_is_exist) = M_Post::getByPage(10, $page_num);

    $app->render(
      'TimeLine/show.twig',
      [
        'post_list' => $post_list,
        'page_num'  => $page_num,
        'next_page_is_exist' => $next_page_is_exist
      ]
    );
  }
}
getByPageメソッド実装
$ vim lib/Tinitter/Model/Post.php
<?php
namespace Tinitter\Model;
class Post extends \Illuminate\Database\Eloquent\Model
{
  static function getByPage($per_page, $page_num)
  {
    // スキップする件数を計算
    $offset = $per_page * ($page_num - 1);

    // 投稿を取得、次ページの存在判定用に1件多く取得
    $post_list = static::orderBy('id', 'DESC')
                   ->take($per_page+1)
                   ->skip($offset)
                   ->get()->all();

    // 次ページの存在をチェック
    if (count($post_list) > $per_page) {
      array_pop($post_list); // 確認用の1件を捨てる
      $next_page_is_exist = true;
    } else {
      $next_page_is_exist = false;
    }

    return [$post_list, $next_page_is_exist];
  }
}

投稿を繰り返し表示

ページャーテンプレート作成
$ vim templates/_Parts/Pager.twig
{% autoescape true %}
<div class="text-center">
  <ul class="pagination pagination-lg">
    {% if page_num > 1 %}
      {% if (page_num - 1) == 1 %}
        <li class="active">
          <a href="/" class="prev">&laquo;</a>
        </li>
      {% else %}
        <li class="active">
          <a href="/page/{{page_num - 1}}" class="prev">&laquo;</a>
        </li>
      {% endif %}
    {% endif %}

    <li><span class="page-num">{{page_num}}</span></li>

    {% if next_page_is_exist %}
      <li class="active">
        <a href="/page/{{page_num + 1}}" class="next">&laquo;</a>
      </li>
    {% endif %}
  </ul>
</div>
{% endautoescape %}
show.twig修正
$ vim templates/TimeLine/show.twig
{% extends "frame.twig" %}
{% block content %}
{% autoescape true %}

{% if page_num == 1 %}
  {% include "_Parts/Form.twig" %}
{% endif %}

{% include "_Parts/Pager.twig" %}

{% for post in post_list %}
  <div class="postcell">
    <div class="body">{{ post.body|nl2br }}</div>
    <div class="info">
      post by <span class="nickname"> {{ post.nickname }}</span>
      <span class="date">({{ post.created_at }})</span>
    </div>
  </div>
{% endfor %}

{% include "_Parts/Pager.twig" %}

{% endautoescape %}
{% endblock %}

トップページへの最新投稿表示

http://localhostへアクセス 下部に最新リスト10件が表示された。