Google App Engineでの次の記事、前の記事処理
2008/10/31 09:09:01
前回の記事ではページング処理をしましたが、今度は詳細頁での「次の画像へ」「前の画像へ」をやってみたいと思います。この処理のやり方を知りたくて一週間ほどググって探しましたが、どないしてもみつかりません。
この処理って何て言うのか誰かご存知ですかねぇ~?
以下詳細。
今回のもページ処理なんですが、いわゆるよくあるページング処理のように1ページ10件表示で次ページ、前のページや[1 2 3 4 5]のようにダイレクトにページにとべるみたいなものではなくて、ある1件の表示ページで「次の記事」「前の記事」へとジャンプできる処理方法です。
一覧ページに例えば、投稿日が新しいもの順に
→A記事へ[投稿日08/10/24]
→B記事へ[投稿日08/10/18]
→C記事へ[投稿日08/10/06]
という風に各記事詳細へリンクが張られていたとします。
「B記事」の前の記事は「A記事」で、次の記事は「C記事」です。
それぞれの記事の詳細を表示する場合は固有ID「?id=419」クエリをつけて詳細ページでデータひっぱって表示なんてことが普通だと思います。
でも詳細記事にはいった後はIDだけでデータをひっぱってきているので、一覧においての「前の記事」「次の記事」の因果関係はまったくないわけ。
見る側としては「A記事」見て「B記事」見て「C記事」見てやっぱりもう一回「B記事」見てと記事間を移動しながら見れるのが使い勝手がいいわけで、詳細記事見たらいちいち一覧に戻って違う記事のリンクをクリック!なんてのは面倒くさいわけなのです。
私の知っている拙い範囲内でのデータベースの性質上、DBテーブル内でのレコードの並びは変更を加える度に適宜かわることからも、レコード同士の因果関係はないだろうし、SQLでそれらを補うやり方はないだろうし、スマートなやり方はやっぱりないんだろうなぁ~と漠然と思っていた。
でも仕事での経験上でも、雑多なWebアプリで見ることが多いことからでも、そういった仕様は需要があって簡単なやり方があるはずだ、コードは公開されているはずだ!
で、調べる。調べる。調べる。
ほんとにないんですよ、そういう記事が。
これはもう自分の調べ方が悪いんだとそう思うより他ないわけです、ハイ。
・・・
とりあえず今できる精一杯のコードです。
Google App Engineで画像アップローダで、ほんまはいらんのですが画像の詳細頁を付け足して、「新しい画像」「古い画像」というリンクをつけて詳細頁同士をつなげてみます。
画像の詳細データを抽出表示するのは簡単ですね。
問題はリンク周りです。
ここでは、この詳細の記事が一覧においての何行目のレコードにあたるのかを算出します。
具体的には一覧ページと同じクエリを発行して、全件回しながら、抽出されたkey()とこの詳細頁記事のkey()が同じになった時に「the_num」に何行目かを代入してループを抜け出します。
(全件回さなくてもこの詳細頁記事が一覧抽出クエリにおいて何行目のレコードなのかが一発でわかれば、それが調べれれば、問題解決なのに)
何行目のレコードかわかれば後は簡単。
条件分岐しながら、GQLのクエリ発行+配列指定抽出コンボで「新しい画像」「古い画像」のつまり両隣(ちょっと表現おかしいけどニュアンスで)のkey()を取得してリンクを生成するだけ。
PHPでも同じようなやり方をしてきたんですけど、誰か解じゃなくてもいいですから調べるキーワード、この処理の呼び方でもいいですから教えてくれないかなぁ~
一覧ページに例えば、投稿日が新しいもの順に
→A記事へ[投稿日08/10/24]
→B記事へ[投稿日08/10/18]
→C記事へ[投稿日08/10/06]
という風に各記事詳細へリンクが張られていたとします。
「B記事」の前の記事は「A記事」で、次の記事は「C記事」です。
それぞれの記事の詳細を表示する場合は固有ID「?id=419」クエリをつけて詳細ページでデータひっぱって表示なんてことが普通だと思います。
でも詳細記事にはいった後はIDだけでデータをひっぱってきているので、一覧においての「前の記事」「次の記事」の因果関係はまったくないわけ。
見る側としては「A記事」見て「B記事」見て「C記事」見てやっぱりもう一回「B記事」見てと記事間を移動しながら見れるのが使い勝手がいいわけで、詳細記事見たらいちいち一覧に戻って違う記事のリンクをクリック!なんてのは面倒くさいわけなのです。
私の知っている拙い範囲内でのデータベースの性質上、DBテーブル内でのレコードの並びは変更を加える度に適宜かわることからも、レコード同士の因果関係はないだろうし、SQLでそれらを補うやり方はないだろうし、スマートなやり方はやっぱりないんだろうなぁ~と漠然と思っていた。
でも仕事での経験上でも、雑多なWebアプリで見ることが多いことからでも、そういった仕様は需要があって簡単なやり方があるはずだ、コードは公開されているはずだ!
で、調べる。調べる。調べる。
ほんとにないんですよ、そういう記事が。
これはもう自分の調べ方が悪いんだとそう思うより他ないわけです、ハイ。
・・・
とりあえず今できる精一杯のコードです。
Google App Engineで画像アップローダで、ほんまはいらんのですが画像の詳細頁を付け足して、「新しい画像」「古い画像」というリンクをつけて詳細頁同士をつなげてみます。
class Detail(webapp.RequestHandler):
def get(self):
"""アップロード済み画像詳細"""
key = self.request.get("key")
photo = Photo_Upload.get(key)
output_html = """<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>画像アップローダ</title>
</head>
<body>
<h1>画像アップローダ</h1>
<br>
<a href="/list">戻る</a>
<br>
<br>
<table border="1" width="400">"""
output_html += "<tr>\n"
output_html += "<td><a href=\"/img/"+str(photo.key())+"\" target=\"_blank\">\n"
output_html += "<img src=\"/img/"+str(photo.key())+"\" width=\"100\"></a></td>\n"
output_html += "<td>元ファイル名:"+str(photo.filename)+"<br>\n"
output_html += "サイズ:"+str(math.ceil(photo.size / 1024))+" KB<br>\n"
output_html += "横幅:"+str(photo.width)+" pix<br>\n"
output_html += "縦幅:"+str(photo.height)+" pix<br>\n"
output_html += "MIMEタイプ:"+str(photo.mimetype)+"<br></td>\n"
output_html += "</tr>\n"
output_html += """
</table>
<br>
<table width="400">
<tr>"""
pics = Photo_Upload.all().order('-date')
last_num = pics.count() - 1
i = 0
for pic in pics:
if pic.key() == photo.key():
the_num = i
break
i = i + 1
if the_num > 0:
pic1 = db.GqlQuery("select * from Photo_Upload ORDER BY date DESC")[the_num-1]
if pic1 is not None:
output_html += "<td align=\"left\">"
output_html += "<a href=\"/detail?key="+str(pic1.key())+"\">< 新しい画像</a></td>\n"
if the_num < last_num:
pic2 = db.GqlQuery("select * from Photo_Upload ORDER BY date DESC")[the_num+1]
if pic2 is not None:
output_html += "<td align=\"right\">"
output_html += "<a href=\"/detail?key="+str(pic2.key())+"\">古い画像 ></a></td>\n"
output_html += """</tr>
</table>
<br>
<br>
<a href="/list">戻る</a>
</body>
</html>"""
self.response.out.write(output_html)画像の詳細データを抽出表示するのは簡単ですね。
問題はリンク周りです。
pics = Photo_Upload.all().order('-date')
last_num = pics.count() - 1
i = 0
for pic in pics:
if pic.key() == photo.key():
the_num = i
break
i = i + 1ここでは、この詳細の記事が一覧においての何行目のレコードにあたるのかを算出します。
具体的には一覧ページと同じクエリを発行して、全件回しながら、抽出されたkey()とこの詳細頁記事のkey()が同じになった時に「the_num」に何行目かを代入してループを抜け出します。
(全件回さなくてもこの詳細頁記事が一覧抽出クエリにおいて何行目のレコードなのかが一発でわかれば、それが調べれれば、問題解決なのに)
何行目のレコードかわかれば後は簡単。
if the_num > 0:
pic1 = db.GqlQuery("select * from Photo_Upload ORDER BY date DESC")[the_num-1]
if pic1 is not None:
output_html += "<td align=\"left\">"
output_html += "<a href=\"/detail?key="+str(pic1.key())+"\">< 新しい画像</a></td>\n"
if the_num < last_num:
pic2 = db.GqlQuery("select * from Photo_Upload ORDER BY date DESC")[the_num+1]
if pic2 is not None:
output_html += "<td align=\"right\">"
output_html += "<a href=\"/detail?key="+str(pic2.key())+"\">古い画像 ></a></td>\n"条件分岐しながら、GQLのクエリ発行+配列指定抽出コンボで「新しい画像」「古い画像」のつまり両隣(ちょっと表現おかしいけどニュアンスで)のkey()を取得してリンクを生成するだけ。
PHPでも同じようなやり方をしてきたんですけど、誰か解じゃなくてもいいですから調べるキーワード、この処理の呼び方でもいいですから教えてくれないかなぁ~