**[[質問箱5/89]] [#g65d1637]
#author("2018-03-11T21:46:04+09:00;2012-11-07T13:12:41+09:00","","")
**[[質問箱/5089]] [#g65d1637]
|RIGHT:70|LEFT:410|c
|~カテゴリ|デザイン・CSS・スキン|
|~サマリ|ユーザーがskinを変更できるようにしたい|
|~バージョン|1.4.7|
|~投稿者|[[F.C.]]|
|~状態|完了|
|~投稿日|&new{2012-02-15 (水) 17:22:31};|
***質問 [#tb9b366b]
こんにちは、いつもお世話になっています。

スマホ版Pukiwikiを作ろうと思っているのですが、それだけであれば、UAを判別してskinファイルを切り替えれば済む話です。
しかし、スマホユーザーの中にはPC版サイトをスマホから見たいと思っていらっしゃる方もいるかと思うので、skinファイルをユーザーが変更できるようにする機能が欲しいです。

そこで、PukiWiki公式サイトを検索したら、以下のskin.inc.phpが出てきました。

[[dev:BugTrack/634]]

このページに掲載されている通りに「default.ini.php」「html.php」「func.php」の3箇所を修正し、pluginフォルダにskin.inc.phpをアップロードして、Menubarに
 #skin
と書きましたが、バージョンが古いためか分かりませんがうまくいきませんでした(私が使用しているのは1.4.7ですが、そのページでは1.4.3をもとに説明されています)。
差分に示されている部分も若干記述が違っていたので、変更箇所を間違えた可能性もあります。

できれば、現行の1.4.7に「ユーザーがskinを変更できる機能」を追加する手順をご教授いただければ幸いです。
回答よろしくお願いします。

***回答 [#h0907535]
- [[質問箱/275]]や[[質問箱4/502]]はユーザーから変更できない(設置者の指定で固定)から、あまり参考にならないですよね --  &new{2012-02-15 (水) 20:33:59};
- [[質問箱/275]]や[[質問箱/4502]]はユーザーから変更できない(設置者の指定で固定)から、あまり参考にならないですよね --  &new{2012-02-15 (水) 20:33:59};
- 回答ありがとうございます。そうですね、あくまでユーザーが変更できないと意味がないので…。私がもっとPHPに詳しければ参考になるかもしれませんが... -- [[F.C.]] &new{2012-02-15 (水) 20:51:25};
- ひとまず、その3箇所の改造だけでは実質なにも変わりません。(他の名前でもかまわないですが)skinプラグインを使ってglobal変数のskin_fileを変えることでユーザーが他のスキンを呼び出せるようにするというのがその改造で提示されている方法です。あと、1.4.4でkeitai.ini.phpが追加されたので、そのあたりをうまく処理しないと携帯からのアクセスではエラーが出るかもしれません。 --  &new{2012-02-15 (水) 21:45:04};
- 回答ありがとうございます。質問に不備があったので少し訂正させていただきました。3つのファイルを修正してskin.inc.phpをアップロードして、Menubarに#skinを挿入しましたが、うまくいきませんでした。1.4.3ではkeitai.ini.phpがなかったんですか^^; それは知りませんでした。確かにそれを考慮する必要がありそうです。 -- [[F.C.]] &new{2012-02-15 (水) 21:58:45};
- 自分なりに色々試行錯誤してみたところ、何とかなりそうです。その為には、skin.inc.phpをskinファイル内で直接実行する必要があるのですが、それがうまくいきません。skinファイルに
 if (exist_plugin_convert('skin'))
  echo do_plugin_convert('skin',pukiwiki);
と記述しましたが、駄目でした(上の例ではskinをpukiwiki.skin.phpに切り替える)。 -- [[F.C.]] &new{2012-02-16 (木) 00:41:37};
- とりあえず[[dev:BugTrack2/262]]。大概の場合はこれでエラーを回避できるんですが、skinプラグインのようにをglobal変数を出力に反映させるようなハックでは、それが確定する(今回のだとlib/html.phpの変更箇所)よりも前に呼び出さないとロードするskinファイルを変えられなくなりますよ。 --  &new{2012-02-16 (木) 20:04:03};
- いろいろと改造しまくりの派生版のなので、専用化していて参考になるかは怪しいですが。[[plus:Plugin/skin.inc.php]] --  &new{2012-02-17 (金) 22:50:35};
- 回答ありがとうございます。かなり強引な方法にはなりましたが、以下の方法で無事に解決しました。ただ、当方php初心者なので何かと問題がありそうです・・・-- [[F.C.]] &new{2012-02-20 (月) 10:24:52};

+pukiwiki.ini.php
--「$agents」で、「default」→「$set_skin」に全て変更。
--「$agents」の直前に以下を追加。
 //skinの切り替え
 if( isset($_COOKIE['skin']) ){ // クッキーがあれば読み出し
 	$usr_skin=$_COOKIE['skin'];
 }else{//なければ
 	$expire = time() + 2592000; //cookie(skin)の有効期限(30日)
 	setcookie('skin', 'sp', $expire);//skin切り替え用のcookieをセット
 }
 if($usr_skin=='pc'){
 	$set_skin='default';
 }else{
 	$set_skin='s_phone';
 }
+skinディレクトリにスマホ用のスキン(s_phone.ini.php)を作成。
+default.ini.phpをコピーしたs_phone.ini.phpを作成し、スキンファイルの設定を先程作成したものに変更。
+以下のsetskin.phpをホームディレクトリにアップロード。
setskin.php
 <?php
 	$ref = $_SERVER['HTTP_REFERER'];//リファラー(訪問元URL)を変数$refに格納
 	$expire = time() + 2592000; //cookieの有効期限(30日)
 	setcookie('skin', 'sp', $expire);
 
 	if($_COOKIE['skin'] == 'sp'){//元のskinがスマホ用ならPC用に変更
 		$skin='pc';
 	}elseif($_COOKIE['skin'] == 'pc'){//元のskinがPC用ならスマホ用に変更
 		$skin='sp';
 	}
 
 	setcookie('skin', $skin, $expire);//cookieをセット
 
 	header("Location: $ref");//元のページへリダイレクト
 ?>
+setskin.phpへのリンクを切り替える2つのスキンファイル内に設置。
このリンクをクリックすると、スキンが切り替わります。どちらのスキンを選択したかはクッキーに保存されます。
- ↑だと初回にアクセスしたときに必ずspのスキンが当たってしまうと思うのですが、Cookieが無い際に通常のUA判定を行えないでしょうか? --  &new{2012-07-06 (金) 09:17:53};
-- 脆弱性を指摘されたので削除しておきます。


//#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Site admin: PukiWiki Development Team

PukiWiki 1.5.3+ © 2001-2020 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u12. HTML convert time: 0.167 sec.

OSDN