私設SoS2オーナー応援BBS

新規発言一覧最新記事過去一覧検索ダウンロードページHOME

スレッド

└◇1864:
Re[3]:カードコレクションでのページ切り替え [moon] 08/18 20:08

 └◇1865:Re[4]:カードコレクションでのページ切り替え [YOUME] 08/19 08:32
  └◇1866:Re[5]:カードコレクションでのページ切り替え [YOUME] 08/26 10:57
   └◇1867:Re[6]:カードコレクションでのページ切り替え [YOUME] 08/26 11:57
    └◇1868:Re[7]:カードコレクションでのページ切り替え [moon] 08/26 20:32
     └◇1869:Re[8]:カードコレクションでのページ切り替え [moon] 08/26 21:13
      └◇1870:Re[9]:カードコレクションでのページ切り替え [YOUME] 09/01 10:30
       └◇1871:Re[10]:カードコレクションでのページ切り替え [moon] 09/01 13:13
        └◇1872:Re[11]:カードコレクションでのページ切り替え [YOUME] 09/27 08:15
         └◇1873:Re[12]:カードコレクションでのページ切り替え [moon] 09/27 09:34
          └◇1874:Re[13]:カードコレクションでのページ切り替え [YOUME] 09/27 19:25
           └◇1875:Re[14]:カードコレクションでのページ切り替え [moon] 09/27 21:11<-last


1864● Re[3]:カードコレクションでのページ切り替え[ moon ] 2015 08/18 20:08
> $startに開始位置(0〜)を入れる方法が分からず…
> これは別の場所に何かを追加した方が良いのでしょうか?

URLのクエリ部分に含める(sos2.cgi?start=0)かPOSTデータの中身として渡してください。

> ># ループ内の処理
>
> ここの部分に、
> ---------------------------------
略...
> ---------------------------------
> までの処理を入れる感じであってますでしょうか?

はい、そうです。

> 教えて頂いたこの方法でカテゴリ分けしていきたいなと思うのですが、その場合、どうリンクさせれば良いのか分からず…

例えば、以下のようにgrepで条件に合うものだけ抜き出すようにするとカテゴリーAだけの@fitemsになります。
@fitems = grep {
    ($item, $sts) = split(/△/, $_); # カード名とステータスに分割
    $card_name_hash{$item}->{'category'} eq 'カテゴリーA'; # カテゴリーが「カテゴリーA」かどうか
} @fitems;
コメントを書く(引用) | スレッド一覧


1865● Re[4]:カードコレクションでのページ切り替え[ YOUME ] 2015 08/19 08:32
おはようございます!

なるほど…!
教えて頂いた内容を元に考えて試してみます!
(また聞きに来てしまうかもですが…汗)

ありがとうございます!
コメントを書く(引用) | スレッド一覧


1866● Re[5]:カードコレクションでのページ切り替え[ YOUME ] 2015 08/26 10:57
おはようございます!

まずはループだけでも…と自分なりに試してはみたのですが、全く上手くゆかず…以下が現状の状態で、

# Sub Collection #

中略

require 'cardimg.pl';

if(@fitems){
    $start = $start < 0 ? 0 : $start > $#fitems ? $#fitems : $start; # 開始位置を調整
    $end = $start + 20; # 終了位置、1ページ最大20件の場合
    $end = $end > $#fitems ? $#fitems : $end; # 終了位置を調整
    foreach $items (@fitems[$start .. $end]){ # $startから$endの範囲をループさせる

#    @fitems = grep {
#    ($item,$sts) = split(/△/, $_);# カード名とステータスに分割
#    $card_name_hash{$item}->{'category'} eq '使い魔'; #カテゴリーが「カテゴリーA」かどうか
#    } @fitems;

($item,$sts) = split(/△/,$items);
$idd = int(substr($sts,11,3));
$pc = int(substr($sts,0,8));
if ($sts =~ /C0/) {$cde1 = "<font color=red>火</font>";}
if ($sts =~ /C1/) {$cde1 = "<font color=blue>水</font>";}
if ($sts =~ /C2/) {$cde1 = "<font color=yellow>雷</font>";}
if ($sts =~ /C3/) {$cde1 = "<font color=blown>土</font>";}
if ($sts =~ /C4/) {$cde1 = "<font color=green>風</font>";}
if ($sts =~ /C5/) {$cde1 = "<font color=gray>天</font>";}
if ($sts =~ /C6/) {$cde1 = "<font color=#8C008C>冥</font>";}
if ($sts =~ /C7/) {$cde1 = "<font color=powderblue>空</font>";}
print qq|<tr><td><img src="|, &get_card_image_path($item), qq|"><br><b>【$cde1】$item</b>\n|;
print qq|<IMG src=story/img/lin.gif border=0></td></tr>\n|;
}
}

これだとループする部分のデータが表示されず…


> URLのクエリ部分に含める(sos2.cgi?start=0)かPOSTデータの中身として渡してください。

という部分も、本当にお恥ずかしいのですがどうすれば分からず…
コレクションファイルの呼び出し部分が

&input('radio','mode','collection','',"コレクションを見る<br>\n")if $mysp =~ /Cf/;

なので、これをどうにかするのかな?と思いつつ…
悩みに悩んだのですが余計に分からなくなってしまいました…

お手数をおかけしてしまい恐縮なのですが、お知恵を貸して頂けたら幸いです…!
コメントを書く(引用) | スレッド一覧


1867● Re[6]:カードコレクションでのページ切り替え[ YOUME ] 2015 08/26 11:57
申し訳ないです!訂正です!汗

> これだとループする部分のデータが表示されず…
↑別の場所の原因でした;

ただ、カテゴリも分けられない状態のままで、
ついでにカード画像が出なくなり…
ソースを見ると

<img src="cardimg/HASH(0x9d2a930)">

こんな感じの表示になっていました…
コメントを書く(引用) | スレッド一覧


1868● Re[7]:カードコレクションでのページ切り替え[ moon ] 2015 08/26 20:32
> <img src="cardimg/HASH(0x9d2a930)">
>
> こんな感じの表示になっていました…

以前作成したsub get_card_image_pathの内容が新しい%card_name_hashに合うように変更されていないのだと思います。
  my $image_file = exists($card_name_hash{$name}) ? $card_name_hash{$name}:'2011-12-23_1-246.gif';
    ↓
  my $image_file = exists($card_name_hash{$name}) ? $card_name_hash{$name}->{'image'} : '2011-12-23_1-246.gif';
    もしくは、より厳密に
  my $image_file = exists($card_name_hash{$name}) && exists($card_name_hash{$name}->{'image'}) ? $card_name_hash{$name}->{'image'} : '2011-12-23_1-246.gif';
とすれば良いと思います。
なお、カテゴリーに対しても同じようなサブルーチンを用意したほうが「$card_name_hash{$name}->{'category'}」のようなものを毎回書かなくて良くなるので楽になると思います。

> > URLのクエリ部分に含める(sos2.cgi?start=0)かPOSTデータの中身として渡してください。
>
> という部分も、本当にお恥ずかしいのですがどうすれば分からず…
> コレクションファイルの呼び出し部分が
>
> &input('radio','mode','collection','',"コレクションを見る<br>\n")if $mysp =~ /Cf/;
>
> なので、これをどうにかするのかな?と思いつつ…
> 悩みに悩んだのですが余計に分からなくなってしまいました…

オリジナルのsos2のリストページにはページ移動用のリンクがありますがあれと同じことです。
Aタグで実現するのであれば以下のようなHTMLが出力されるようにすれば良いです。(sos2.cgiのパスや表示テキストは適当です。)
---- ここから ----
<a href="sos2.cgi?mode=collection&start=0">0から</a>&nbsp;
<a href="sos2.cgi?mode=collection&start=20">20から</a>&nbsp;
<a href="sos2.cgi?mode=collection&start=40">40から</a>
---- ここまで ----
そうすれば$Fm{'start'}で値が取得できますので「my $start = int($Fm{'start'});」とでもすれば$startが作成できます。
コメントを書く(引用) | スレッド一覧


1869● Re[8]:カードコレクションでのページ切り替え[ moon ] 2015 08/26 21:13
> オリジナルのsos2のリストページにはページ移動用のリンクがありますがあれと同じことです。
> Aタグで実現するのであれば以下のようなHTMLが出力されるようにすれば良いです。(sos2.cgiのパスや表示テキストは適当です。)

コレクションは個々のデータのためIDとパスワードを渡すのでしたね。
そうするとA要素だとまずいので、代わりにSELECT要素で選択してボタンでsubmitする、などの方法で実現してください。
コメントを書く(引用) | スレッド一覧


1870● Re[9]:カードコレクションでのページ切り替え[ YOUME ] 2015 09/01 10:30
教えて頂いた事を参考に、いろいろ試してみたのですが上手くいかず…

現状は以下な感じです…
-----------------------------------------
▼Sub Collection内

〜中略〜

require 'cardimg.pl';

#ループ処理
if(@fitems){
    $start = $start < 0 ? 0 : $start > $#fitems ? $#fitems : $start; # 開始位置を調整
    $end = $start + 5; # 終了位置
    $end = $end > $#fitems ? $#fitems : $end; # 終了位置を調整
    foreach $items (@fitems[$start .. $end]){ # $startから$endの範囲をループさせる
#ループ処理
#カテゴリ
    @fitems = grep {
    ($item,$sts) = split(/△/, $_);# カード名とステータスに分割
    $card_name_hash{$item}->{'category'} eq 'カテゴリーA'; #カテゴリーが「カテゴリーA」かどうか
    $card_name_hash{$item}->{'category'} eq 'カテゴリーB';
    $card_name_hash{$item}->{'category'} eq 'カテゴリーC';
    } @fitems;
#カテゴリ
($item,$sts) = split(/△/,$items);
$idd = int(substr($sts,11,3));
$pc = int(substr($sts,0,8));
if ($sts =~ /C0/) {$cde1 = "<font color=red>火</font>";}
if ($sts =~ /C1/) {$cde1 = "<font color=blue>水</font>";}
if ($sts =~ /C2/) {$cde1 = "<font color=yellow>雷</font>";}
if ($sts =~ /C3/) {$cde1 = "<font color=blown>土</font>";}
if ($sts =~ /C4/) {$cde1 = "<font color=green>風</font>";}
if ($sts =~ /C5/) {$cde1 = "<font color=gray>天</font>";}
if ($sts =~ /C6/) {$cde1 = "<font color=#8C008C>冥</font>";}
if ($sts =~ /C7/) {$cde1 = "<font color=powderblue>空</font>";}
#カード画像表示
print qq|<tr><td><img src="|, &get_card_image_path($item), qq|"><br><b>【$cde1】$item</b>\n|;
print qq|<IMG src=story/img/lin.gif border=0></td></tr>\n|;
#カード画像表示
}
}
print qq|<TR><TD>集めた数:<b>$fco</b>種</TD></TR>|;
print qq|</table>|;

-----------------------------------------
▼player_data内

print qq|<form method="$method" action="$cgiurl" target="_blank">\n|;
print qq|<input type="hidden" name="name" value="$nm"><input type="hidden" name="id" value="$id"><input type=hidden name=pass value="$ps">\n|;

if ($mysp =~ /Cf/){
&input('radio','mode','collection','',"コレクションを見る<br>\n");
print qq|   カテゴリー:\n|;
print qq|<select name="category">\n|;
print qq|<option value="カテゴリーA" selected>カテゴリーA\n|;
print qq|<option value="カテゴリーB">カテゴリーB\n|;
print qq|<option value="カテゴリーC">カテゴリーC\n|;
print qq|</select><br>\n|;
}

    &OKbuttoninform('n');
    &form('end');
-----------------------------------------
カテゴリごとに表示させ、かつカテゴリ内で5枚ずつページ切り替えしたいなと考えたのですが…

現状だと複数種類のカードを所持していても1種類しかカードが表示されない状態になってしまい…

お知恵を貸して頂けたら幸いです…!
コメントを書く(引用) | スレッド一覧


1871● Re[10]:カードコレクションでのページ切り替え[ moon ] 2015 09/01 13:13
> カテゴリごとに表示させ、かつカテゴリ内で5枚ずつページ切り替えしたいなと考えたのですが…
>
> 現状だと複数種類のカードを所持していても1種類しかカードが表示されない状態になってしまい…

「@fitems = grep 〜」は$startと$endに影響を与える必要があるので「if(@fitems)」よりも前に行ってください。
あと、grepの結果は最後に評価された値で決まるので比較処理を並べるのではなく渡されてきたカテゴリー($Fm{'category'})との比較を行うだけで良いです。
コメントを書く(引用) | スレッド一覧


1872● Re[11]:カードコレクションでのページ切り替え[ YOUME ] 2015 09/27 08:15
おはようございます!
入院したりでバタバタしてしまって中途半端なとこで止まってしまっていましたが、やっと体調が落ち着いてきたので戻ってきましたー!

いろいろ試したり考えたりしたのですが、

player_data内で

#コレクションファイル
if ($mysp =~ /Cf/){
&input('radio','mode','collection','',"コレクションを見る<br>\n");
print qq|   カテゴリー:\n|;
print qq|<select name="category">\n|;
print qq|<option value="カテゴリA" selected>カテゴリA\n|;
print qq|<option value="カテゴリB">カテゴリB\n|;
print qq|<option value="カテゴリC">カテゴリC\n|;
print qq|</select><br>\n|;
}
#コレクションファイル

こんな感じにして、ここで選択したカテゴリだけを、表示させたいと思うのですが方法が全く分からず…
そもそもこの指定の仕方で良いのかどうかも不安ではあるのですが…汗

現在のSub Collectionの中は、

# Sub Collection #
sub collection {
@rcdlines = &get_user("$Fm{'id'}");
@collines = &get_coll("$Fm{'id'}");
&header;
&splititem('F');

…中略…

require 'cardimg.pl'; # ループ中で毎回requireするのは無駄なので場所はforeach以前が良い

#カテゴリ
    @fitems = grep {
    ($item,$sts) = split(/△/, $_);# カード名とステータスに分割
    $card_name_hash{$item}->{'category'} eq 'カテゴリーA'; #カテゴリーが「カテゴリーA」かどうか
    $card_name_hash{$item}->{'category'} eq 'カテゴリーB';
    $card_name_hash{$item}->{'category'} eq 'カテゴリーC';
    } @fitems;
#カテゴリ

        foreach $items (@fitems) {
($item,$sts) = split(/△/,$items);
$idd = int(substr($sts,11,3));
$pc = int(substr($sts,0,8));
if ($sts =~ /C0/) {$cde1 = "<font color=red>火</font>";}
if ($sts =~ /C1/) {$cde1 = "<font color=blue>水</font>";}
if ($sts =~ /C2/) {$cde1 = "<font color=yellow>雷</font>";}
if ($sts =~ /C3/) {$cde1 = "<font color=blown>土</font>";}
if ($sts =~ /C4/) {$cde1 = "<font color=green>風</font>";}
if ($sts =~ /C5/) {$cde1 = "<font color=gray>天</font>";}
if ($sts =~ /C6/) {$cde1 = "<font color=#8C008C>冥</font>";}
if ($sts =~ /C7/) {$cde1 = "<font color=powderblue>空</font>";}
#カード画像表示
print qq|<tr><td><img src="|, &get_card_image_path($item), qq|"><br><b>【$cde1】$item</b>\n|;
print qq|<IMG src=story/img/lin.gif border=0></td></tr>\n|;
#カード画像表示
}
…中略…

こんな感じになっているのですが、これだとカテゴリ分けもされずコレクションしたカードの先頭の1枚しか表示されない感じで…

player_data内で選択されたカテゴリだけを表示させる場合、どのような記述が必要なのか、どうしても分からず…汗

いつも頼ってしまって申し訳ないです…
ご教授いただけたら幸いです!
コメントを書く(引用) | スレッド一覧


1873● Re[12]:カードコレクションでのページ切り替え[ moon ] 2015 09/27 09:34
> こんな感じにして、ここで選択したカテゴリだけを、表示させたいと思うのですが方法が全く分からず…
> そもそもこの指定の仕方で良いのかどうかも不安ではあるのですが…汗

それで良いと思います。

選択したカテゴリだけを表示するのは前回の返信で書いた
> > あと、grepの結果は最後に評価された値で決まるので比較処理を並べるのではなく渡されてきたカテゴリー($Fm{'category'})との比較を行うだけで良いです。
のことであり、
> #カテゴリ
>     @fitems = grep {
>     ($item,$sts) = split(/△/, $_);# カード名とステータスに分割
>     $card_name_hash{$item}->{'category'} eq 'カテゴリーA'; #カテゴリーが「カテゴリーA」かどうか
>     $card_name_hash{$item}->{'category'} eq 'カテゴリーB';
>     $card_name_hash{$item}->{'category'} eq 'カテゴリーC';
>     } @fitems;
> #カテゴリ
この部分の「$card_name_hash〜」の3行を「$card_name_hash{$item}->{'category'} eq $Fm{'category'};」にするということです。

あと、
> …中略…
>
> require 'cardimg.pl'; # ループ中で毎回requireするのは無駄なので場所はforeach以前が良い
>
> #カテゴリ
略...
> #カテゴリ
>
>         foreach $items (@fitems) {
上記を見た限り、
・「foreach $items (@fitems[$start .. $end]){」が「foreach $items (@fitems) {」に戻っている。
・「require 'cardimg.pl';」と「#カテゴリ 〜 #カテゴリ」が
  > if(@fitems){
  >   $start = $start < 0 ? 0 : $start > $#fitems ? $#fitems : $start; # 開始位置を調整
  >   $end = $start + 5; # 終了位置
  >   $end = $end > $#fitems ? $#fitems : $end; # 終了位置を調整
  の前ではない?

> こんな感じになっているのですが、これだとカテゴリ分けもされずコレクションしたカードの先頭の1枚しか表示されない感じで…

1種類(カテゴリーC)だけしか表示されないのはわかりますが、1枚しか表示されないというのは提示されたコードをざっと見ただけでは原因がわかりませんでした。
コメントを書く(引用) | スレッド一覧


1874● Re[13]:カードコレクションでのページ切り替え[ YOUME ] 2015 09/27 19:25
ご解説ありがとうございます!

早速、以下のようにしてみたのですが、これであっていますでしょうか…?
(Sub Collection内の全てになります)

# Sub Collection #
sub collection {
@rcdlines = &get_user("$Fm{'id'}");
@collines = &get_coll("$Fm{'id'}");
&header;
&splititem('F');

print qq|<center><b>+$nmのコレクション+</b><br>\n|;
print qq|<TABLE border="0" cellspacing="0" cellpadding="0"><TBODY><TR><TD valign="bottom"><FONT color="#897a76" size="1"><IMG src="img/F2_001.gif" width="9" height="9"></FONT></TD><TD valign="bottom"><FONT color="#897a76" size="1"><IMG src="img/F2_002.gif" width="130" height="9"><IMG src="img/e-icon_004.gif" width="16" height="16"><IMG src="img/F2_002.gif" width="130" height="9"></FONT></TD><TD valign="bottom"><FONT color="#897a76" size="1"><IMG src="img/F2_003.gif" width="9" height="9"></FONT></TD></TR><TR><TD background="img/F2_008.gif" align="middle"><FONT size="1"><IMG src="img/kuroko.gif" width="3" height="3"></FONT></TD><TD bgcolor="#cac4b0" width="276">|;
print qq|<table>|;
require 'cardimg.pl'; # ループ中で毎回requireするのは無駄なので場所はforeach以前が良い

#カテゴリ
    @fitems = grep {
    ($item,$sts) = split(/△/, $_);# カード名とステータスに分割
    $card_name_hash{$item}->{'category'} eq $Fm{'category'};
    } @fitems;
#カテゴリ

#ループ処理
if(@fitems){
    $start = $start < 0 ? 0 : $start > $#fitems ? $#fitems : $start; # 開始位置を調整
    $end = $start + 3; # 終了位置、1ページ最大20件の場合
    $end = $end > $#fitems ? $#fitems : $end; # 終了位置を調整

    foreach $items (@fitems[$start .. $end]){ # $startから$endの範囲をループさせる
#ループ処理

($item,$sts) = split(/△/,$items);
$idd = int(substr($sts,11,3));
$pc = int(substr($sts,0,8));
if ($sts =~ /C0/) {$cde1 = "<font color=red>火</font>";}
if ($sts =~ /C1/) {$cde1 = "<font color=blue>水</font>";}
if ($sts =~ /C2/) {$cde1 = "<font color=yellow>雷</font>";}
if ($sts =~ /C3/) {$cde1 = "<font color=blown>土</font>";}
if ($sts =~ /C4/) {$cde1 = "<font color=green>風</font>";}
if ($sts =~ /C5/) {$cde1 = "<font color=gray>天</font>";}
if ($sts =~ /C6/) {$cde1 = "<font color=#8C008C>冥</font>";}
if ($sts =~ /C7/) {$cde1 = "<font color=powderblue>空</font>";}
#カード画像表示
print qq|<tr><td><img src="|, &get_card_image_path($item), qq|"><br><b>【$cde1】$item</b>\n|;
print qq|<IMG src=story/img/lin.gif border=0></td></tr>\n|;
#カード画像表示
}
}
print qq|<TR><TD>集めた数:<b>$fco</b>種</TD></TR>|;
print qq|</table>|;
print qq|</TD><TD background="img/F2_004.gif" align="middle"><FONT size="1"><IMG src="img/kuroko.gif" width="3" height="3"></FONT></TD></TR><TR><TD><FONT color="#897a76" size="1"><IMG src="img/F2_007.gif" width="9" height="9"></FONT></TD><TD><FONT color="#897a76" size="1"><IMG src="img/F2_006.gif" width="276" height="9"></FONT></TD><TD><FONT color="#897a76" size="1"><IMG src="img/F2_005.gif" width="9" height="9"></FONT></TD></TR></TBODY></TABLE></center>\n|;
}

ただこれだと、どのカテゴリを選択しても、カードが1枚も表示されず…
他にも何か追記等々しなくてはいけないのかなと思いつつも解決策が分からず…

何度も聞きにきてしまって申し訳ないです…
コメントを書く(引用) | スレッド一覧


1875● Re[14]:カードコレクションでのページ切り替え[ moon ] 2015 09/27 21:11
コードをすべて見たわけではありませんが、

> 早速、以下のようにしてみたのですが、これであっていますでしょうか…?

前回返信した内容については意図通りに修正されていると思います。

> ただこれだと、どのカテゴリを選択しても、カードが1枚も表示されず…

どこが原因なのかはprintで変数の値を出力するなどしてデバッグしてください。
例えば、「@fitems = grep 〜;」の上下で「print 'fitems=', scalar(@fitems);」を実行。
  → grep前が0件なら、ファイル上で0件もしくは&splititem('F');が間違っている可能性がある。
    → ファイルとsub splititemを確認。
  → grep前が1件以上でgrep後が0件なら、%card_name_hashの定義が間違っているか$Fm{'category'}が正しく渡されてきていない可能性がある。
    → 「print 'category=', $Fm{'category'};」を実行。
      → 意図した値なら、$Fm{'category'}は正しく渡ってきているということなので%card_name_hashの定義を確認。
      → 意図しない値なら、select要素として出力させている部分のHTMLを確認。
このようにして、変数の値がどこでどのように変化していくのかを把握しておいたほうが良いです。

あと、$startに初期値が設定されていないのでページ選択ができないですね。
ページ選択する場合はNo.1868と1869で返信した内容を参考にしてください。
コメントを書く(引用) | スレッド一覧

CGIROOM