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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

276閲覧

PHPでクッキーに応じて値を出力したい

aiankiba

総合スコア10

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2019/03/09 08:22

###実現したいこと
2つある.refineを1つにまとめ、cookieに応じたチェックを入れたいです。

###該当のソースコード
現在、2つの機能があります。

listというcookieに応じて、2つある.refineのどちらかに.currentを付与し、CSSでそれ(.refine.current)だけを表示しています。

➁さらにpostrefineuserrefineというcookieに応じてチェックを入れています。

そこで質問です。

この2つの.refineを1つにまとめたいと思ってまして、そのときに➀のようなクラス付与は不要になるわけですが、➁のチェックを入れる方法がわかりません。

html

1 2<?php 3// cokie「list」の値に応じて、class「.current」を出力する。 4$cookie_list=filter_var_array($_COOKIE,["list"=>FILTER_DEFAULT]); 5$title_list=(!is_null($cookie_list["list"]) and $cookie_list["list"]!=="")?$cookie_list["list"]:"post"; 6$class_list=['post'=>'', 'user'=>'']; 7$class_list[$title_list]="current"; 8// 記事の絞り込みで、cookie「postrefine」の値に「checked」を出力する。 9$cookie_postrefine=filter_var_array($_COOKIE,["postrefine"=>FILTER_DEFAULT]); 10$checked_postrefine=[ 11 "follow_post"=>preg_match("/(^| )follow_post(?= |$)/",$cookie_postrefine["postrefine"])?"checked":"", 12 "follow_user"=>preg_match("/(^| )follow_user(?= |$)/",$cookie_postrefine["postrefine"])?"checked":"", 13]; 14// ユーザーの絞り込みで、cookie「userrefine」の値に「checked」を出力する。 15$cookie_userrefine=filter_var_array($_COOKIE,["userrefine"=>FILTER_DEFAULT]); 16$checked_userrefine=[ 17 "follow_post"=>preg_match("/(^| )follow_post(?= |$)/",$cookie_userrefine["userrefine"])?"checked":"", 18 "follow_user"=>preg_match("/(^| )follow_user(?= |$)/",$cookie_userrefine["userrefine"])?"checked":"", 19]; 20?> 21 22<div> 23 <h4>ここにはいずれかの「.refine」が表示されます(「記事を絞り込む」か「ユーザーを絞り込む」か)</h4> 24 25 <div class="refine <?=$class_list["post"];?>"> 26 <p>記事を絞り込む</p> 27 <label> 28 <span>「フォロー中の記事」を表示する</span> 29 <input type="checkbox" value="postrefine_follow_post" <?=$checked_postrefine["follow_post"];?>> 30 </label> 31 <label> 32 <span>「フォロー中のユーザーが、執筆した記事」を表示する</span> 33 <input type="checkbox" value="postrefine_follow_user" <?=$checked_postrefine["follow_user"];?>> 34 </label> 35 </div> 36 37 <div class="refine <?=$class_list["user"];?>"> 38 <p>ユーザーを絞り込む</p> 39 <label> 40 <span>「フォロー中の記事を、執筆したユーザー」を表示する</span> 41 <input type="checkbox" value="userrefine_follow_post" <?=$checked_userrefine["follow_post"];?>> 42 </label> 43 <label> 44 <span>「フォロー中のユーザー」を表示する</span> 45 <input type="checkbox" value="userrefine_follow_user" <?=$checked_userrefine["follow_user"];?>> 46 </label> 47 </div> 48 49</div> 50 51<style> 52.refine:not(.current){display:none} 53.refine.current{display:block;} 54</style>

###解決のポイント
この2つの.refineを1つにまとめるために必要はことは
valueの値
checkedの有無
spanのテキスト
を変数として処理することだと思います。

###spanとvalueはできる
まずspanは問題なさそうなのでスルーします。

そしてvalueは次のようにできるでしょう。

value="postrefine_follow_post"
value="<?=$title_list;?>refine_follow_post"とすれば、
.refineを1つにまとめても問題ありません。

###checkedの有無ができない
しかしcheckedの有無ができません。

<?=$checked_postrefine["follow_post"];?>
<?=$checked_<?=$title_list;?>refine["follow_post"];?>としても、
おかしなことになってしまい、.refineを1つにまとめることはできません。

ここで躓いているのですが、どのようにしたら2つある.refineを1つにまとめながら、cookieに応じたチェックを入れることができるでしょうか?

長くなってしまって大変恐縮です。どなたか解決の糸口をご教示頂けましたら幸いでございます。よろしくお願い致します。

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

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

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

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

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

FKM

2019/03/09 10:13

PHPだけで処理しなければいけないのでしょうか?
aiankiba

2019/03/09 10:22

そうなんです。すみません。難しいでしょうか...
FKM

2019/03/09 10:25

いや、javascriptを使うほうが柔軟なだけで、できますよ
aiankiba

2019/03/09 10:44 編集

javascriptですと、まずチェックが無い状態で読み込まれ、一瞬の後にチェックが入る。という流れになるじゃないですか。この一瞬が納得いかなくて…笑
guest

回答1

0

結論からいうと、.currentというクラス名付与によって要素を見せ隠しするなら、最初からif文をhtmlに埋め込めば解決すると思います。

html

1<? if(表示を制御する判定文)):?> 2<div class="refine <?=$class_list["post"];?>"> 3 <p>記事を絞り込む</p> 4 <label> 5 <span>「フォロー中の記事」を表示する</span> 6 <input type="checkbox" value="postrefine_follow_post" <?=$checked_postrefine["follow_post"];?>> 7 </label> 8 <label> 9 <span>「フォロー中のユーザーが、執筆した記事」を表示する</span> 10 <input type="checkbox" value="postrefine_follow_user" <?=$checked_postrefine["follow_user"];?>> 11 </label> 12 </div> 13<? else: ?> 14<div class="refine <?=$class_list["user"];?>"> 15 <p>ユーザーを絞り込む</p> 16 <label> 17 <span>「フォロー中の記事を、執筆したユーザー」を表示する</span> 18 <input type="checkbox" value="userrefine_follow_post" <?=$checked_userrefine["follow_post"];?>> 19 </label> 20 <label> 21 <span>「フォロー中のユーザー」を表示する</span> 22 <input type="checkbox" value="userrefine_follow_user" <?=$checked_userrefine["follow_user"];?>> 23 </label> 24 </div> 25<? endif; ?> 26

あと、preg_matchの中の正規表現が本当に実現したい通りになっていますでしょうか。

投稿2019/03/09 12:38

FKM

総合スコア3633

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

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

aiankiba

2019/03/09 13:00

まぁ..たしかに出力は1つになりますね。ただテンプレート側を1つにしたかったんですよね。(書いてなくてごめんなさいですけど。) preg_matchありがとうございます。確認しておきます。
FKM

2019/03/09 14:42

テンプレートを一つにしたいのなら、valueのフラグ値に変数を埋め込み明示的に切り替えるという手もありです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問