質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Catalyst

Catalystは、Perlで書かれたオープンソースのウェブアプリケーションフレームワークです。 Ruby on Rails、Springなどのフレームワークに強い影響を受けています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

1回答

371閲覧

HTMLのコードをもっとコンパクトにまとめたい。

fff.claypool

総合スコア12

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Catalyst

Catalystは、Perlで書かれたオープンソースのウェブアプリケーションフレームワークです。 Ruby on Rails、Springなどのフレームワークに強い影響を受けています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/07/01 01:14

編集2022/01/12 10:55

年月を表示させるプルダウンを作成しております。
要件は下記の通りです。

+++++++++++++++++++++++++++++++++++++++++++
1.当月から半年前までの年月と翌月の年月を表示させる。
2.ただし、201805以前の年月はプルダウンに表示させないようにする。
+++++++++++++++++++++++++++++++++++++++++++

上記要件を満たすコードを書いたところ、HTMLが下記のような長いコードになってしまいました。

HTML

1 <div class="form-group"> 2 <label for="number" class="control-label col-xs-5">年月</label> 3 <div class="col-xs-3"> 4 <select class="form-control" id="number" name="yyyymm"> 5 <option value="">選択してください</option> 6 [% IF (last_2month == 201805) %] 7 <option value="[% last_1month %]">[% last_1month %]</option> 8 <option value="[% this_month %]">[% this_month %]</option> 9 <option value="[% after_1month %]">[% after_1month %]</option> 10 [% ELSIF (last_3month == 201805) %] 11 <option value="[% last_2month %]">[% last_2month %]</option> 12 <option value="[% last_1month %]">[% last_1month %]</option> 13 <option value="[% this_month %]">[% this_month %]</option> 14 <option value="[% after_1month %]">[% after_1month %]</option> 15 [% ELSIF (last_4month == 201805) %] 16 <option value="[% last_3month %]">[% last_3month %]</option> 17 <option value="[% last_2month %]">[% last_2month %]</option> 18 <option value="[% last_1month %]">[% last_1month %]</option> 19 <option value="[% this_month %]">[% this_month %]</option> 20 <option value="[% after_1month %]">[% after_1month %]</option> 21 [% ELSIF (last_5month == 201805) %] 22 <option value="[% last_4month %]">[% last_4month %]</option> 23 <option value="[% last_3month %]">[% last_3month %]</option> 24 <option value="[% last_2month %]">[% last_2month %]</option> 25 <option value="[% last_1month %]">[% last_1month %]</option> 26 <option value="[% this_month %]">[% this_month %]</option> 27 <option value="[% after_1month %]">[% after_1month %]</option> 28 [% ELSIF (last_6month == 201805) %] 29 <option value="[% last_5month %]">[% last_5month %]</option> 30 <option value="[% last_4month %]">[% last_4month %]</option> 31 <option value="[% last_3month %]">[% last_3month %]</option> 32 <option value="[% last_2month %]">[% last_2month %]</option> 33 <option value="[% last_1month %]">[% last_1month %]</option> 34 <option value="[% this_month %]">[% this_month %]</option> 35 <option value="[% after_1month %]">[% after_1month %]</option> 36 [% ELSE %] 37 <option value="[% last_6month %]">[% last_6month %]</option> 38 <option value="[% last_5month %]">[% last_5month %]</option> 39 <option value="[% last_4month %]">[% last_4month %]</option> 40 <option value="[% last_3month %]">[% last_3month %]</option> 41 <option value="[% last_2month %]">[% last_2month %]</option> 42 <option value="[% last_1month %]">[% last_1month %]</option> 43 <option value="[% this_month %]">[% this_month %]</option> 44 <option value="[% after_1month %]">[% after_1month %]</option> 45 [% END %] 46 </select> 47 </div> 48 </div>

もっと簡潔に済む方法があればご教示いただけますと幸いです。
よろしくお願いいたします。

Contoroller

perl

1sub fuga_diary { 2 my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); 3 4 my $last_6month = sprintf("%04d%02d", $year + 1900, $mon - 5); 5 my $last_5month = sprintf("%04d%02d", $year + 1900, $mon - 4); 6 my $last_4month = sprintf("%04d%02d", $year + 1900, $mon - 3 ); 7 my $last_3month = sprintf("%04d%02d", $year + 1900, $mon - 2); 8 my $last_2month = sprintf("%04d%02d", $year + 1900, $mon - 1); 9 my $last_1month = sprintf("%04d%02d", $year + 1900, $mon ); 10 my $this_month = sprintf("%04d%02d", $year + 1900, $mon + 1); 11 my $after_1month = sprintf("%04d%02d", $year + 1900, $mon + 2) 12 13 my %result_diary = ( 14 'last_6month' => $last_6month, 15 'last_5month' => $last_5month, 16 'last_4month' => $last_4month, 17 'last_3month' => $last_3month, 18 'last_2month' => $last_2month, 19 'last_1month' => $last_1month, 20 'this_month' => $this_month, 21 'after_1month' => $after_1month, 22 ); 23 24 return \%result_diary; 25}

Logic

Perl

1sub index :Path :Args(0) { 2 my ( $self, $c ) = @_; 3 $c->stash->{template} = "hoge.tt"; 4 my $fuga_logic = $c->model("Logic::Hogehoge"); 5 6 my $result_diary = $fuga_logic->fuga_diary; 7 8 9 $c->stash->{last_6month} = $result_diary->{last_6month}; 10 $c->stash->{last_5month} = $result_diary->{last_5month}; 11 $c->stash->{last_4month} = $result_diary->{last_4month}; 12 $c->stash->{last_3month} = $result_diary->{last_3month}; 13 $c->stash->{last_2month} = $result_diary->{last_2month}; 14 $c->stash->{last_1month} = $result_diary->{last_1month}; 15 $c->stash->{this_month} = $result_diary->{this_month}; 16 $c->stash->{after_1month} = $result_diary->{after_1month}; 17}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

htmlが長くなる原因は、htmlでロジックを記述しているからですね。

fuga_diaryが返す結果を、「半年前~来月の月のうち、201806以降の月」とすればよいのでは?
で、htmlにその配列を渡して、ループで表示すればどうでしょうか?

Perlを全然知らないので、あっているか分かりませんが、以下のような感じです。

perl

1sub fuga_diary { 2 my @result_diary = (); 3 4 my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); 5 6 for ($i = -1; $i <= 6; ++$i) { 7 // これだと、今月が201901になったらうまくいきませんが、とりあえず無視します 8 $month = sprintf("%04d%02d", $year + 1900, $mon - $i); 9 if ($month == "201805") { 10 last; 11 } 12 push @result_diary, $month; 13 } 14 return @result_diary; 15}

↑の結果をhtmlに渡せば、htmlはただ配列の中身を出力するように書けば済みます。

htmlで使われているテンプレートエンジンはtemplate-toolkitというやつでしょうか。
だとしたら、たぶんこのような書き方になると思います。
www.template-toolkit.org#section_FOREACH

html

1 2<div class="form-group"> 3 <label for="number" class="control-label col-xs-5">年月</label> 4 <div class="col-xs-3"> 5 <select class="form-control" id="number" name="yyyymm"> 6 <option value="">選択してください</option> 7 8 [% FOREACH month IN result_dialy %] 9 <option value="[% month %]">[% month %]</option> 10 [% END %] 11 12 </select> 13 </div> 14 </div>

投稿2018/07/01 03:20

編集2018/07/01 03:23
hernia_orz

総合スコア58

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fff.claypool

2018/07/01 06:05 編集

ご回答頂きありがとうございます! ロジックの返り値@result_diaryの値に関しては問題ないのですが、下記コードを書いたところ配列の値の数が代入されてしまい、年月が代入されませんでした。 ---------------------------------------------------- $c->stash->{month} = @result_diary; ---------------------------------------------------- ここで、年月が代入されるようにするためにはどのようなコードを書けばいいでしょうか?
fff.claypool

2018/07/01 06:20

上記、下記コードにて解決いたしました。 ----------------------------------------------------------- foreach my $r (@result_diary){ $c->stash->{month} = $r; } -----------------------------------------------------------
fff.claypool

2018/07/01 06:44 編集

下記のような書き方だとプルダウンに適切な値が表示されません。 -------------------------------------------------------------------------------- [% FOREACH month IN result_diary %] <option value="[% month %]">[% month %]</option> [% END %] --------------------------------------------------------------------------------
KojiDoi

2018/07/01 16:47

>上記、下記コードにて解決いたしました。 本当にこれで解決していますか? これではmonthには$result_diary[$#result_diary]しか渡らないと思います。たぶん$c->stash->{month} = \@result_diaryではないでしょうか。catalylistは知らないのでデリファレンスの方法は分かりませんが…。
KojiDoi

2018/07/01 17:13

分かったような気がするので、もう一つの質問の方に回答しておきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問