プロジェクト

全般

プロフィール

Backport(バックポート) #2513

Yuya Watanabe さんが約13年前に更新

 
 h3. 概要 

 フレンドリストやコミュニティリストは、3x3の9面表示を行うパーツ apps/pc_frontend/templates/_partsNineTable.php を用いて表示している。 

 管理画面の「デザイン設定」、「ホーム画面ガジェット設定」では、フレンドリストなどの9面表示を行うガジェットに対して、「表示する行数・列数」を設定できる。 

 表示できるアイテム数が十分ある場合に、 

 * 6行1列と設定していると、1行x1列の表示となる 
 * 1行6列と設定していると、6行x6列の表示となり、2行目以降は空となる 
 ** アイテム数が十分であっても、DBからアイテムを取得する際に設定値の「行数x列数」個しか取得しないようにアクションファイルが記述されている(_partsNineTable を呼んでいる側が行っている実装であり、実装によってはこの限りではない) 
 * 3行2列と設定していると、2行x2列の表示となる(報告のケース) 

 h3. 原因 

 apps/pc_frontend/templates/_partsNineTable.php の行数部分のループは http://trac.openpne.jp/changeset/9630 で書かれているが、実際に表示する行数 $row を算出する式が誤っている。 

 <pre> 
 11:<?php $row = ceil(count($options->list) / $options->row) ?> 
 12-<?php for ($i = $j = 1; $row >= $i; $i++): ?> 
 </pre> 

 (取得したアイテム数)を(設定した行数)で割った値の小数部を切り上げた値を「表示する行数」としているのは明らかにおかしい。 

 * http://trac.openpne.jp/changeset/9630 
 * http://trac.openpne.jp/changeset/10286#file13 
 * http://trac.openpne.jp/changeset/10609 

 h3. 修正方針 

 <pre> 
 <?php $row = ceil(count($options->list) / $options->row) ?> 
 </pre> 

 を 

 <pre> 
 <?php $row = min($options->row, ceil(count($options->list) / $options->col)) ?> 
 </pre> 

 のように変更する。 ceil(x) は、実数 x に対して、x の次に大きい整数値を(float型で)返す関数である。具体例と併せてこの修正の意味を示しておく。 

 * 2行5列で表示させたい場合: 
 ** アイテムが10件取得できれば、min(2行, ceil(10件 / 5列)) = 2 となり、表示は2行となる 
 ** アイテムが4件しかなければ、min(2行, ceil(4件 / 5列)) = min(2, ceil(0.8)) = min(2, 1) = 1 となり、表示は1行となる(1行5列) 
 * 3行3列で表示させたい場合: 
 ** アイテムが9件取得できれば、min(3行, ceil(9件 / 3列)) = 3 となり、表示は3行となる 
 ** アイテムが5件しかなければ、min(3行, ceil(5件 / 3列)) = min(3, ceil(1.666)) = min(3, 2) = 2 となり、表示は2行となる(2行3列) 
 ** アイテムが1件しかなければ、min(3行, ceil(1件 / 3列)) = min(3, ceil(0.333)) = min(3, 1) = 1 となり、表示は1行となる(1行3列) 

 『表示行数 = ceil(アイテム数, 設定列数)』という式でもよさそうだが、概要で示したとおり「アイテム数が十分であっても、DBからアイテムを取得する際に設定値の「行数x列数」個しか取得しないようにアクションファイルが記述されている」のは実装側の判断であって、partsNineTable を使用する箇所で取得するアイテム数が「行数x列数」以下になる保証はないため、『表示行数 = min(設定行数, ceil(アイテム数, 設定列数))』と記述しておくことにする。 

 h3. 仕様について 

 取得できたアイテム数、設定された行数、設定された列数、このそれぞれについて、実際に表示される行数列数が何になるべきかについては、2系および修正前の3系から以下のように判断します。 

 * 3行3列の場合: 
 ** アイテム1個:1行3列 
 ** アイテム1個〜3個:1行3列 
 ** アイテム4個:2行3列 
 ** アイテムk個(k<=9):ceil(k/3)行3列 
 * r行c列の場合: 
 ** アイテム1個:1行c列 
 ** アイテムk個(k<=c):1行c列 
 ** アイテムk個(c<k<=r*c):ceil(k/c)行c列 

 ここで示したいことは端的に言うと、アイテム数に応じて「空の行は作らない」が「空の列は作りうる」ということである。 

 h3. 補足 

 $row に ceil() の返り値が代入されることがあり、その場合 float 型になってしまうがこのチケットでは特に気にしないことにする。 $row は int 型を想定するといった修正や、このファイルの可読性を向上させることは現時点のソースコードに対しては可能だと思われる。そうした修正については対応するのであれば別チケットで行う。 

 h3. 報告 

 http://sns.openpne.jp/communityTopic/6408 より転記 

 <pre> 
 3.6beta5 【ガジェット】ナインテーブルを2x3にしたら3個目が表示されない。 

 画像を見てもらうとわかると思いますが、横2縦3にしたときに3番目のデータが表示されない。 


 ↓余談 
 それとコミュニティのトップのコミュニティメンバー(ナインテーブル)もガジェットで編集できるようにしてほしいです。 
 </pre> 

 h2. もともと記載されていた内容 

 openpne3.6「 _partsNineTable.php」の rowとcolの関係を正しく表示できていない 

 http://sns.openpne.jp/diary/26976 より転記 

 h3. トピック 

 <pre> 
 _partsNineTable.php 
 の11行目 
 <?php $row = ceil(count($options->list) / $options->row) ?> 
 は 
 <?php $row = ceil(count($options->list)) ?> 
 じゃないとrowとcolの関係を正しく表示しない。 

 low=1 col=6 
 とか 
 </pre>

戻る