ホーム > フォーラム > 質問箱 > その他Ver.(本文に記述) > XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず)

XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず)
投稿者: souhalt | 投稿日時: 2008/10/26 8:37 | 閲覧: 27028回
souhalt
XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず)

XCL2.1 でテーマチェンジャー・モジュールが使えるという情報があるので、試用しています。

引用:
e.g. 「旧システムモジュールをインストール」する必要があるが「Cube2.1で」使える

Xoops Users Group Japan - themechangerモジュールの使い方教えて


「モジュールごとにテーマを設定」ということはしておらず、
「ユーザーが自分のテーマを持てる」という用途 (ログイン後の初期テーマ設定) を想定しています。
しかし、期待した動作になりません。対策を御教授していただけると幸いです。
なお、X2 (XOOPS 2.0.16a JP) の場合は、期待した動作になります (JPEx では未確認) 。

[使用ファイル]
cf. テーマチェンジャー 2.6

テーマチェンジャー | DOWNLOADS | Amethyst Blue


cf. XCL: XOOPS Cube Legacy 2.1.6 RC

XOOPS Cube Legacy 2.1.6 RCリリース | XOOPS Cube日本サイト


cf. X2: XOOPS 2.0.16a JP (zip)

XOOPS Cubeダウンロード | XOOPS Cube日本サイト


[構成]
XOOPS_ROOT_PATH は、実際にはディレクトリ名のリネームにより切り替えています。
他のモジュールの影響を排除するため、最低限の構成にしています。

1. localhost 環境で AMP (apache/mysql/php) を動作可能に
2. XCL または X2 を解凍し、html の下を XOOPS_ROOT_PATH (DocumentRoot) の下にコピー
3. テーマチェンジャーを解凍し、modules 以下と themes 以下を XOOPS_ROOT_PATH の下にコピー
4. XCL の場合、XOOPS_ROOT_PATH/modules の下に X2 の html/modules/system 以下をコピー
5. XCL または X2 をインストール
6. XCL の場合、「システム管理」モジュールをインストール
7. 「テーマチェンジャー」モジュールをインストール
8. 「テーマチェンジャー」モジュールの「テーマ選択」ブロックをインストール(XCL)/表示オン(X2)
9. 設定で「デフォルト・サイトテーマ」を z_changeable_theme に、「選択可能なテーマ」を全選択

[操作]
1. 任意のユーザでログインした状態でトップページ (XOOPS_URL/) 等を表示
2. 「テーマ選択」ブロック内のリストボックスで現状と異なるテーマを選択
3. 「このテーマを常に使う」のチェックをオン
4. (XOOPS_DB_PREFIX_users テーブルの該当ユーザの theme フィールド値を phpMyAdmin 等で確認)
5. 「送信」ボタンをクリックし、テーマが切り替わったことを確認
6. (XOOPS_DB_PREFIX_users テーブルの該当ユーザの theme フィールド値を phpMyAdmin 等で確認)
7. ログアウト
8. 同じユーザで再ログインし、切り替え後のテーマになっていることを確認

[現象]
XCL の場合、「テーマチェンジャー」モジュールの「テーマ選択」ブロックでテーマを切り替え、
ログアウト、同じユーザで再ログイン後に、切り替え後のテーマになりません。
(対応する theme フィールド値も、変化せず)

X2 の場合、同様の操作で切り替え後のテーマになります (期待した動作) 。
(対応する theme フィールド値も、切り替え後のテーマに変化)

[xoops環境 - local/Windows]
デバッグモード: 「PHPデバグ」に設定
XOOPS_ROOT_PATH = D:/homepage
XOOPS_URL = http://localhost
XOOPS Cube Legacy 2.1.6 RC, XOOPS 2.0.16a JP
mysql 4.0.27
php 5.2.4
apache 2.2.6
Windows XP HE SP3, IE6

[調査概要]
● X2 の場合、期待した動作になる。
● get method に替えると動作する。
● 何故か mainfile.php の中身が2度実行されている。
● $_POST の入力パラメータが消える段階は、XCube_Delegate() を呼び出す所。
● 入力部だけでなく、出力 (記録) 部も動作していない。

自力で調査して分かったのはここまでです。

調査内容は以下参照。

(続く)

コメント(14)

新しいものから | 古いものから | ネスト表示 | RSS feed
Re: XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず) 
投稿者: souhalt | 投稿日時: 2008/10/26 8:39
souhalt
Re: XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず)

(続き)

X2 の場合、入力パラメータを記録する調査用パッチを適用し、テーマ切り替えの操作をすると、
再ログイン後に切り替え後のテーマになります (期待した動作) 。
(対応する theme フィールド値も、切り替え後のテーマに変化)
ログファイルを見ると、$_POST に入力パラメータがセットされています (期待した動作) 。
$_SERVER['REQUEST_METHOD'] と xoops_getenv('REQUEST_METHOD') に、'POST' がセットされています。

XCL の場合、同様の操作で切り替え後のテーマになりません。
(対応する theme フィールド値も、変化せず)
ログファイルを見ると、$_POST に入力パラメータがセットされていません。
$_SERVER['REQUEST_METHOD'] と xoops_getenv('REQUEST_METHOD') に、何故か 'GET' がセットされています。

● X2 の場合、期待した動作になる。

[調査#1 - テーマ入力部]
下は、入力パラメータを記録する調査用パッチです。

XOOPS_ROOT_PATH/modules/theme_changer/blocks/theme.php: line 34
	$current_theme = $xoopsConfig['theme_set'];
$ELF = XOOPS_ROOT_PATH.'/!ERR_LOG.txt';
error_log("\r\n--- theme.php #1 ----------------------------\r\n",3,$ELF);
error_log("\t\$_SERVER['HTTP_HOST']\r\n",3,$ELF);
$zo = $_SERVER['HTTP_HOST'];
$zv = gettype($zo).' '.var_export($zo,TRUE);
error_log("$zv\r\n",3,$ELF);

error_log("\t\$_SERVER['PHP_SELF']\r\n",3,$ELF);
$zo = $_SERVER['PHP_SELF'];
$zv = gettype($zo).' '.var_export($zo,TRUE);
error_log("$zv\r\n",3,$ELF);

error_log("\t\$_POST\r\n",3,$ELF);
$zo = $_POST;
$zv = gettype($zo).' '.var_export($zo,TRUE);
error_log("$zv\r\n",3,$ELF);

error_log("\t\$_GET\r\n",3,$ELF);
$zo = $_GET;
$zv = gettype($zo).' '.var_export($zo,TRUE);
error_log("$zv\r\n",3,$ELF);

error_log("\t\$_SERVER['REQUEST_METHOD']\r\n",3,$ELF);
$zo = $_SERVER['REQUEST_METHOD'];
$zv = gettype($zo).' '.var_export($zo,TRUE);
error_log("$zv\r\n",3,$ELF);

error_log("\t\$_SERVER['QUERY_STRING']\r\n",3,$ELF);
$zo = $_SERVER['QUERY_STRING'];
$zv = gettype($zo).' '.var_export($zo,TRUE);
error_log("$zv\r\n",3,$ELF);

error_log("\t xoops_getenv('REQUEST_METHOD')\r\n",3,$ELF);
$zo = xoops_getenv('REQUEST_METHOD');
$zv = gettype($zo).' '.var_export($zo,TRUE);
error_log("$zv\r\n",3,$ELF);

error_log("\t xoops_getenv('QUERY_STRING')\r\n",3,$ELF);
$zo = xoops_getenv('QUERY_STRING');
$zv = gettype($zo).' '.var_export($zo,TRUE);
error_log("$zv\r\n",3,$ELF);
	$block = array();

AFTER;

X2 で操作後のログファイル (XOOPS_ROOT_PATH/!ERR_LOG.txt):
--- theme.php #1 ----------------------------
	$_SERVER['HTTP_HOST']
string 'localhost'
	$_SERVER['PHP_SELF']
string '/index.php'
	$_POST
array array (
  'xoops_theme_select' => 'phpkaox',
  'holdtheme' => '1',
)
	$_GET
array array (
)
	$_SERVER['REQUEST_METHOD']
string 'POST'
	$_SERVER['QUERY_STRING']
string ''
	 xoops_getenv('REQUEST_METHOD')
string 'POST'
	 xoops_getenv('QUERY_STRING')
string ''


XCL で操作後のログファイル (XOOPS_ROOT_PATH/!ERR_LOG.txt):
--- theme.php #1 ----------------------------
	$_SERVER['HTTP_HOST']
string 'localhost'
	$_SERVER['PHP_SELF']
string '/index.php'
	$_POST
array array (
)
	$_GET
array array (
)
	$_SERVER['REQUEST_METHOD']
string 'GET'
	$_SERVER['QUERY_STRING']
string ''
	 xoops_getenv('REQUEST_METHOD')
string 'GET'
	 xoops_getenv('QUERY_STRING')
string ''


(続く)
Re^2: XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず) 
投稿者: souhalt | 投稿日時: 2008/10/26 8:41
souhalt
Re^2: XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず)

(続き)

XCL の場合、post method の代わりに get method で入力パラメータを送信する調査用パッチを追加し、
テーマ切り替えの操作をすると、入力パラメータが受信できています。
ログファイルを見ると、$_GET に入力パラメータがセットされています。
$_SERVER['REQUEST_METHOD'] と xoops_getenv('REQUEST_METHOD') に、'GET' がセットされています。
$_SERVER['QUERY_STRING'] と xoops_getenv('QUERY_STRING') に、入力パラメータがセットされています。

● get method に替えると動作する。

[調査#2 - テーマ入力部 - get method]
下は、post method の代わりに get method で入力パラメータを送信する調査用パッチです。

XOOPS_ROOT_PATH/modules/theme_changer/blocks/theme.php: line 39 (行番号はオリジナルファイルを基準)
//	$block['content'] .= '<div style="text-align: center;"><form action="http://'.$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"].'" method="post">';
	$block['content'] .= '<div style="text-align: center;"><form action="http://'.$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"].'" method="get">';

AFTER;

XCL で操作後のログファイル (XOOPS_ROOT_PATH/!ERR_LOG.txt) - get method:
--- theme.php #1 ----------------------------
	$_SERVER['HTTP_HOST']
string 'localhost'
	$_SERVER['PHP_SELF']
string '/index.php'
	$_POST
array array (
)
	$_GET
array array (
  'xoops_theme_select' => 'default',
  'holdtheme' => '1',
)
	$_SERVER['REQUEST_METHOD']
string 'GET'
	$_SERVER['QUERY_STRING']
string 'xoops_theme_select=default&holdtheme=1'
	 xoops_getenv('REQUEST_METHOD')
string 'GET'
	 xoops_getenv('QUERY_STRING')
string 'xoops_theme_select=default&holdtheme=1'


(続く)
Re^3: XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず) 
投稿者: souhalt | 投稿日時: 2008/10/26 8:43
souhalt
Re^3: XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず)

(続き)

XCL の場合、theme.php の get method パッチを post method に戻し、
mainfile.php と XCube_Controller.class.php にも theme.php と同様のパッチを適用し、
テーマ切り替えの操作をすると、次のことが分かりました。

● 何故か mainfile.php の中身が2度実行されている。
● $_POST の入力パラメータが消える段階は、XCube_Delegate() を呼び出す所。

チェックポイント通過フロー:
1. mainfile.php #1 (1回目)
2. XCube_Controller.class.php #1 (1回目)
3. $_POST の入力パラメータが消える (XCube_Delegate)
4. mainfile.php #1 (2回目)
5. XCube_Controller.class.php #1 (2回目)
6. XCube_Controller.class.php #2
7. theme.php #1

[調査#3 - テーマ入力部]
下は、mainfile.php と XCube_Controller.class.php の調査用パッチです。

XOOPS_ROOT_PATH/core/XCube_Controller.class.php: line 346
	function _setupUser()
	{
$ELF = XOOPS_ROOT_PATH.'/!ERR_LOG.txt';
error_log("\r\n--- XCube_Controller.class.php #1 -----------\r\n",3,$ELF);
:
(略: 以下 theme.php のパッチと同様)
:
		$this->mSetupUser->call(new XCube_Ref($this->mRoot->mContext->mUser), new XCube_Ref($this), new XCube_Ref($this->mRoot->mContext));
error_log("\r\n--- XCube_Controller.class.php #2 -----------\r\n",3,$ELF);
:
(略: 以下 theme.php のパッチと同様)
:
	}

AFTER;

XOOPS_ROOT_PATH/mainfile.php: line 98
    //
$ELF = XOOPS_ROOT_PATH.'/!ERR_LOG.txt';
error_log("\r\n--- mainfile.php #1 -------------------------\r\n",3,$ELF);
:
(略: 以下 xoops_getenv() 部分を除き theme.php のパッチと同様)
:
    if (!defined('_LEGACY_PREVENT_LOAD_CORE_') && XOOPS_ROOT_PATH != '') {

AFTER;

XCL で操作後のログファイル (XOOPS_ROOT_PATH/!ERR_LOG.txt):
--- mainfile.php #1 -------------------------
	$_SERVER['HTTP_HOST']
string 'localhost'
	$_SERVER['PHP_SELF']
string '/index.php'
	$_POST
array array (
  'xoops_theme_select' => 'default',
  'holdtheme' => '1',
)
	$_GET
array array (
)
	$_SERVER['REQUEST_METHOD']
string 'POST'
	$_SERVER['QUERY_STRING']
string ''

--- XCube_Controller.class.php #1 -----------
	$_SERVER['HTTP_HOST']
string 'localhost'
	$_SERVER['PHP_SELF']
string '/index.php'
	$_POST
array array (
  'xoops_theme_select' => 'default',
  'holdtheme' => '1',
)
	$_GET
array array (
)
	$_SERVER['REQUEST_METHOD']
string 'POST'
	$_SERVER['QUERY_STRING']
string ''
	 xoops_getenv('REQUEST_METHOD')
string 'POST'
	 xoops_getenv('QUERY_STRING')
string ''

--- mainfile.php #1 -------------------------
	$_SERVER['HTTP_HOST']
string 'localhost'
	$_SERVER['PHP_SELF']
string '/index.php'
	$_POST
array array (
)
	$_GET
array array (
)
	$_SERVER['REQUEST_METHOD']
string 'GET'
	$_SERVER['QUERY_STRING']
string ''

--- XCube_Controller.class.php #1 -----------
:
(略: $_POST に入力パラメータがセットされていない)
:
--- XCube_Controller.class.php #2 -----------
:
(略: $_POST に入力パラメータがセットされていない)
:
--- theme.php #1 ----------------------------
:
(略: $_POST に入力パラメータがセットされていない)
:

AFTER;

(続く)
Re^4: XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず) 
投稿者: souhalt | 投稿日時: 2008/10/26 8:44
souhalt
Re^4: XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず)

(続き)

X2 の場合、$_POST を無視してテーマを切り替える調査用パッチを適用し、
「このテーマを常に使う」のチェックをオフにしてテーマ切り替えの操作をすると、
再ログイン後に切り替え後のテーマになります。
(対応する theme フィールド値も、切り替え後のテーマに変化)

XCL の場合、同様の操作で切り替え後のテーマになりません。
(対応する theme フィールド値も、変化せず)

● 入力部だけでなく、出力 (記録) 部も動作していない。

[調査#4 - テーマ出力 (記録) 部]
下は、$_POST を無視してテーマを切り替える調査用パッチです。

XOOPS_ROOT_PATH/modules/theme_changer/blocks/theme.php: line 61
//	if( isset( $_POST['holdtheme'] ) ){
	if (is_object($xoopsUser)) {
//		$otema = $_POST['xoops_theme_select'];
		$otema = $current_theme;

AFTER;
Re: Re^4: XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず) 
投稿者: Marijuana | 投稿日時: 2008/10/27 15:49 | 親コメント: #19208
Marijuana
色々苦労してるようですが
引用:
「モジュールごとにテーマを設定」ということはしておらず、
「ユーザーが自分のテーマを持てる」という用途 (ログイン後の初期テーマ設定) を想定しています。

これだけならXCLDBに入れたプリロードでどうでしょう?
ゲストもクッキーに保存しちゃうので不要ならそこの処理は削除で

<?php
class SaveTheme extends XCube_ActionFilter
{
  function postFilter()
  {
    if ($this->mRoot->mContext->mUser->isInRole('Site.RegisteredUser')) {
      $xUser =& $this->mRoot->mContext->mXoopsUser;
      if ( isset($_SESSION['xoopsUserTheme']) && is_object($xUser) && $xUser->get('theme') != $_SESSION['xoopsUserTheme'] ) {
        $handler =& xoops_gethandler('user');
        $edituser =& $handler->get($xUser->get('uid'));
        $edituser->set('theme', $_SESSION['xoopsUserTheme']);
        $handler->insert($edituser, true);
      }
    } else {
      if ( isset($_SESSION['xoopsUserTheme']) ) {
        if ( isset($_COOKIE['MySelectTheme']) && $_COOKIE['MySelectTheme'] != $_SESSION['xoopsUserTheme'] ) {
          $patha = explode($_SERVER['HTTP_HOST'], XOOPS_URL);
          $path = $patha[1].'/';
          setcookie ('MySelectTheme', $_SESSION['xoopsUserTheme'], time() + 86400 * 14, $path);
        }
      } elseif ( isset($_COOKIE['MySelectTheme']) && !is_array($_COOKIE['MySelectTheme']) ) {
        if ( in_array($_COOKIE['MySelectTheme'], $this->mRoot->mContext->getXoopsConfig('theme_set_allowed')) ) {
          $this->mRoot->mContext->setThemeName($_COOKIE['MySelectTheme']);
          $_SESSION['xoopsUserTheme'] = $_COOKIE['MySelectTheme'];
        }
      }
    }
  }
}
?>

#pathの取得に問題が出る場合があるので、その場合は直して^^;
Re^2: Re^4: XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず) 
投稿者: souhalt | 投稿日時: 2008/10/27 18:43 | 親コメント: #19213
souhalt
chatnoir さん (or Marijuana さん?)、レスありがとうございます。
代替コードで期待した動作になりました。

引用:
これだけならXCLDBに入れたプリロードでどうでしょう?
ゲストもクッキーに保存しちゃうので不要ならそこの処理は削除で


XCLDB とは XOOPS Cube Legacy Developer's Bible:
Amazon.co.jp: XOOPS Cube Legacy デベロッパーズ・バイブル chatnoir(内水はるか), Marijuana(宇津木おさむ) 本

のことですね。
以前しっかり 購入させていただきました が、なかなか読む時間が取れなくて。
確かに XCLDB p.378 に記述があります。

レスには書いてありませんでしたが、XCLDB の記述に合わせて、
XOOPS_ROOT_PATH/preload の下に SaveTheme.class.php というファイル名で保存するのが良いですね?

動作を見ると、SaveTheme.class.php はテーマチェンジャーと異なり、テーマを切り替える度に必ず保存される仕様のようです。
切り替えたテーマを保存するか否かをユーザが選択できませんが、それでも十分使えそうです。

しかし、実際には SaveTheme.class.php を使うとしても、XCL に関する疑問は残ります。もう一度整理すると、

(0) テーマチェンジャーは、(そのままでは) XCL で動作しない (動作するという情報は間違い) 。

また、

(1) 何故か mainfile.php の中身が2度実行されている。
  → この動作は XCL として問題ないか? (バグか仕様か?)
(2) $_POST の入力パラメータが消える段階は、XCube_Delegate() を呼び出す所。
  → $_POST が取得できないのは XCL として問題ないか? (バグか仕様か?)
(3) 入力部だけでなく、出力 (記録) 部も動作していない。
  → XCL は X2 と異なり theme.php 66 行の updateUserByField() を実行しても DB の theme が更新されないが、
  この動作は XCL として問題ないか? (バグか仕様か?)

全部仕様だ、ということであれば、放置しようと思います。
バグと見なすべきではないか、という御意見が多ければ、Bug Tracker に上げようと思います。
Re: Re^2: Re^4: XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず) 
投稿者: onokazu | 投稿日時: 2008/10/27 21:12 | 親コメント: #19214
onokazu

(1) 何故か mainfile.php の中身が2度実行されている。
  → この動作は XCL として問題ないか? (バグか仕様か?)
(2) $_POST の入力パラメータが消える段階は、XCube_Delegate() を呼び出す所。
  → $_POST が取得できないのは XCL として問題ないか? (バグか仕様か?)


mainfile.phpが例え2度読み込まれていたとしても、error_logを挿入された箇所が
2度実行されることはありえないので、普通に考えてリクエストが2度発生している
んだと思います。おそらくPOSTの後にリダイレクトでGETリクエストになって
いるんでしょう。そう考えれば後の方のログでPOSTパラメータが消えているのも
不思議じゃないと思います。

それで少しコアのコードを見てみましたが、modules/legacy/preload/ThemeSelect.class.phpで
下記のような部分を発見


function doChangeTheme(&$principal, &$controller, &$context)
{
    if (!empty($_POST['xoops_theme_select'])) {
        $xoops_theme_select = explode('!-!', $_POST['xoops_theme_select']);
        if ($this->_isSelectableTheme($xoops_theme_select[0])) {
            $this->mRoot->mContext->setThemeName($xoops_theme_select[0]);
            $_SESSION['xoopsUserTheme'] = $xoops_theme_select[0];
            $controller->executeForward($GLOBALS['xoopsRequestUri']);
        }
    } elseif (!empty($_SESSION['xoopsUserTheme']) && $this->_isSelectableTheme($_SESSION['xoopsUserTheme'])) {
        $this->mRoot->mContext->setThemeName($_SESSION['xoopsUserTheme']);
    }
}


doChangeTheme()はいつも実行されるので、$_POST['xoops_theme_select']があると
その値がセッションに保存されてそのセッションの間だけそのテーマになるみたいですね。
そしてリダイレクトしているので、theme.phpは実行されないため再ログイン後には元の
テーマに戻るんだと思います。

(3) 入力部だけでなく、出力 (記録) 部も動作していない。
  → XCL は X2 と異なり theme.php 66 行の updateUserByField() を実行しても DB の theme が更新されないが、
  この動作は XCL として問題ないか? (バグか仕様か?)


XCLでも実行されると思いますが、XCLでは上記のようにリダイレクトされているので最初の
POSTリクエスト時にtheme.phpまで行ってないので、そのように見えるだけだと思います。

試しにmodules/legacy/preload/ThemeSelect.class.phpを一時的に削除して再度テストされて
みてはいかがでしょうか。そうすれば期待通りに動作するかもしれません。
Re^2: Re^2: Re^4: XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず) 
投稿者: souhalt | 投稿日時: 2008/10/28 17:26 | 親コメント: #19215
souhalt
Re^2: Re^2: Re^4: XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず)

onokazu さん、創始者メンバー直々のレス、恐れ入ります。

引用:
試しにmodules/legacy/preload/ThemeSelect.class.phpを一時的に削除して再度テストされて
みてはいかがでしょうか。そうすれば期待通りに動作するかもしれません。


試してみました。結果は、

チェックポイント通過フロー:
1. mainfile.php #1
2. XCube_Controller.class.php #1
3. XCube_Controller.class.php #2
4. theme.php #1 ($_POST に入力パラメータがセットされている)

(1) データベースの theme フィールド値は、切り替え操作で選択したテーマに変化する
(2) 切り替え操作後のテーマは、切り替え操作で選択したテーマではなく、z_changeable_theme (デフォルト・サイトテーマ) になる
(3) ログオフ後 (ゲスト) のテーマは、z_changeable_theme (デフォルト・サイトテーマ) になる
(4) 再ログイン後のテーマは、z_changeable_theme (デフォルト・サイトテーマ) になる

上記 (1) は、期待した動作に必要なことです。
(2),(4) は ThemeSelect.class.php を単純に削除したための副作用でしょうか。

それでは、リダイレクトの直前に theme を保存させたらどうかと思い、
試しに ThemeSelect.class.php 内で executeForward() の直前に、
Marijuana さんのコード (cookie 処理を除く) を、
$_POST['holdtheme'] の条件を付けて挿入してみました。

XOOPS_ROOT_PATH/modules/legacy/preload/ThemeSelect.class.php: line 55
	$_SESSION['xoopsUserTheme'] = $xoops_theme_select[0];
	if (!empty($_POST['holdtheme'])) {
		// start of Marijuana's code imported from SaveTheme.class.php
		// cf. XOOPS Cube Legacy Developer's Bible p.378: http://www.amazon.co.jp/dp/4797340487
		// cf. http://xoopscube.jp/modules/forum/index.php/node/6121
		if ($this->mRoot->mContext->mUser->isInRole('Site.RegisteredUser')) {
			$xUser =& $this->mRoot->mContext->mXoopsUser;
			if ( isset($_SESSION['xoopsUserTheme']) && is_object($xUser) && $xUser->get('theme') != $_SESSION['xoopsUserTheme'] ) {
				$handler =& xoops_gethandler('user');
				$edituser =& $handler->get($xUser->get('uid'));
				$edituser->set('theme', $_SESSION['xoopsUserTheme']);
				$handler->insert($edituser, true);
			}
		}
		// end of Marijuana's code
	}
	$controller->executeForward($GLOBALS['xoopsRequestUri']);


結果は、
(1) データベースの theme フィールド値は、切り替え操作で選択したテーマに変化する (「このテーマを常に使う」オン時のみ)
(2) 切り替え操作後のテーマは、切り替え操作で選択したテーマになる
(3) ログオフ後 (ゲスト) のテーマは、z_changeable_theme (デフォルト・サイトテーマ) になる
(4) 再ログイン後のテーマは、切り替え操作で選択したテーマになる

「このテーマを常に使う」チェックボックスの機能も動作するようです。
あとは、デフォルト・サイトテーマの設定を変更すれば、ほぼ期待した動作になりそうです。
途中でリダイレクトされて $_POST が theme.php に渡らないということがポイントだったようですね。

ただ、これでは XCL のハックになり、更新の度にパッチを当てなければならないので、
Marijuana さんはプリロードのコードで実装したと、そういう経緯があったのかもしれません。

試しに プリロードのコードにも $_POST['holdtheme'] の条件を付けてみましたが、
こちらは $_POST が渡らないらしく、「このテーマを常に使う」チェックボックスの機能は動作しませんでした。

整理すると、
(1) 切り替えたテーマの保存を、切り替える度に行う場合
  テーマチェンジャーを使わず、
  XOOPS_ROOT_PATH/preload/SaveTheme.class.php (by Marijuana) を設置する方法がある
(2) 切り替えたテーマの保存を、ユーザが選択できるようにする場合
  テーマチェンジャーを使い、
  XOOPS_ROOT_PATH/modules/legacy/preload/ThemeSelect.class.php に上記パッチを当てる方法がある

なお、(2) の方法が適切かどうかは確信がありません。また、冗長なロジックがあるかもしれません。

明確なバグと見ることができないのであれば、XCL 側で対応してもらうのは難しいかもしれないので、
この件で要望を出すのはとりあえず保留にしようかと思います。
本当は標準で実装されていれば良いのですが。

---
P.S. スレ違いで失礼しますが、このモジュール (Xigg) に投稿する際に、
半角の ">" は文字参照に変換されて Web ページに表示されます (期待した動作) が、
半角の "<" 以降は削除されて表示されません。
他のモジュールでは文字参照に変換されて Web ページに表示されたと思います。
Xigg とはそういうものですか?

---
訂正: "Marijuana" ← "chatnoir"
Re: Re^2: Re^2: Re^4: XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず) 
投稿者: Marijuana | 投稿日時: 2008/10/28 18:34 | 親コメント: #19219
Marijuana
chatnoirじゃなくてMarijuanaです(笑)

引用:
ただ、これでは XCL のハックになり、更新の度にパッチを当てなければならないので、
chatnoir さんはプリロードのコードで実装したと、そういう経緯があったのかもしれません。

doChangeThemeはデリゲートで実行してるのでプリロードで差し替え可能なはずですよ。
$controller->mSetupUserからdoChangeThemeを削除して、doChangeTheme相当のハックした関数を登録してやればコアには手を入れずに済みます。
先のプリロードは手抜きというか、ここを変えなくてもテーマの保存が出来るので、doChangeThemeを差し替えてません。
「このテーマを常に使う」チェックボックスとか考慮してませんでしたから。。。

あと少しなので頑張ってプリロードを書いてみてください。


引用:
明確なバグと見ることができないのであれば、XCL 側で対応してもらうのは難しいかもしれないので、
この件で要望を出すのはとりあえず保留にしようかと思います。

リダイレクトしてるだけなのでバグではなく仕様になるかと思います。

引用:
本当は標準で実装されていれば良いのですが。

プリロードとデリゲートで好きなように差し替えてねって事でデリゲートになってると思います。
Re^2: Re^2: Re^2: Re^4: XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず) 
投稿者: souhalt | 投稿日時: 2008/10/29 18:55 | 親コメント: #19220
souhalt
Re^2: Re^2: Re^2: Re^4: XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず)

引用:
chatnoirじゃなくてMarijuanaです(笑)


大変失礼しました (でも "しゃの♪" だったので) 。
訂正可能な分 (comment19219) は訂正しました。

引用:
doChangeThemeはデリゲートで実行してるのでプリロードで差し替え可能なはずですよ。
$controller->mSetupUserからdoChangeThemeを削除して、doChangeTheme相当のハックした関数を登録してやればコアには手を入れずに済みます。


試行錯誤の結果、SaveTheme.class.php の中身を下のようにしたところ、それらしい動作をします。
ただ、これだと単に追加であって、「削除して」「差し替え」ではないだろうと思います。
もっとも、executeForward() があるためか、ThemeSelect.class.php の doChangeTheme() は、実行されないようです。
executeForward() をコメントアウトすると、ThemeSelect.class.php の doChangeTheme() が、実行されます。
お手数かけて済みませんが、御教授をお願い致します。

XOOPS_ROOT_PATH/preload/SaveTheme.class.php
<?php
// cf. XOOPS_ROOT_PATH/modules/legacy/preload/ThemeSelect.class.php
// cf. XOOPS Cube Legacy Developer's Bible p.378: http://www.amazon.co.jp/dp/4797340487
// cf. http://xoopscube.jp/modules/forum/index.php/node/6121

if (!defined('XOOPS_ROOT_PATH')) exit;

class SaveTheme extends XCube_ActionFilter
{
	function preFilter()
	{
//		$this->mRoot->mDelegateManager->delete('Legacy_ThemeSelect.IsSelectableTheme', 'Legacy_ThemeSelect::doChangeTheme');	// NG
//		$this->mController->mSetupUser->delete('Legacy_ThemeSelect::doChangeTheme');	// NG
		$this->mController->mSetupUser->add(array(&$this, 'doChangeTheme'));
	}

	function doChangeTheme(&$principal, &$controller, &$context)
	{
		if (!empty($_POST['xoops_theme_select'])) {
			$xoops_theme_select = explode('!-!', $_POST['xoops_theme_select']);
			if ($this->_isSelectableTheme($xoops_theme_select[0])) {
				$this->mRoot->mContext->setThemeName($xoops_theme_select[0]);
				$_SESSION['xoopsUserTheme'] = $xoops_theme_select[0];
				// start of patch
				if (!empty($_POST['holdtheme'])) {
					// start of Marijuana's code imported from SaveTheme.class.php
					// cf. XOOPS Cube Legacy Developer's Bible p.378: http://www.amazon.co.jp/dp/4797340487
					// cf. http://xoopscube.jp/modules/forum/index.php/node/6121
					if ($this->mRoot->mContext->mUser->isInRole('Site.RegisteredUser')) {
						$xUser =& $this->mRoot->mContext->mXoopsUser;
						if ( isset($_SESSION['xoopsUserTheme']) && is_object($xUser) && $xUser->get('theme') != $_SESSION['xoopsUserTheme'] ) {
							$handler =& xoops_gethandler('user');
							$edituser =& $handler->get($xUser->get('uid'));
							$edituser->set('theme', $_SESSION['xoopsUserTheme']);
							$handler->insert($edituser, true);
						}
					}
					// end of Marijuana's code
				}
				// end of patch
				$controller->executeForward($GLOBALS['xoopsRequestUri']);
			}
		} elseif (!empty($_SESSION['xoopsUserTheme']) && $this->_isSelectableTheme($_SESSION['xoopsUserTheme'])) {
			$this->mRoot->mContext->setThemeName($_SESSION['xoopsUserTheme']);
		}
	}

	function _isSelectableTheme($theme_name)
	{
		return in_array($theme_name, $this->mRoot->mContext->getXoopsConfig('theme_set_allowed'));
	}
}
?>
Re: Re^2: Re^2: Re^2: Re^4: XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず) 
投稿者: Marijuana | 投稿日時: 2008/10/30 0:19 | 親コメント: #19223
Marijuana
引用:
大変失礼しました (でも "しゃの♪" だったので) 。
訂正可能な分 (comment19219) は訂正しました。

ネタでかましてるだけなので気にしないでください^^;

引用:
試行錯誤の結果、SaveTheme.class.php の中身を下のようにしたところ、それらしい動作をします。
ただ、これだと単に追加であって、「削除して」「差し替え」ではないだろうと思います。

書いてから気づいたのですが、オブジェクトで登録してると削除するのは物凄く面倒なことしないと出来ないですね。
今回の場合は削除するぐらいなら処理が走らないようにした方が簡単かな。

引用:
もっとも、executeForward() があるためか、ThemeSelect.class.php の doChangeTheme() は、実行されないようです。
executeForward() をコメントアウトすると、ThemeSelect.class.php の doChangeTheme() が、実行されます。

ここが微妙なところなんですよね。
デリゲートでは実行順序をコントロールすることが可能ですが、このコードではコントロールしてないので、ThemeSelect::doChangeThemeが必ず後から実行される保証はありません。
サイトプリロードとモジュールプリロードの違いで配列の登録順序は先になるので、先に実行されるとは思いますが・・・souhaltさんのコードは実際先に実行されますよね。

実行順序をコントロールして以下のようにしてみました
<?php
class SaveTheme extends XCube_ActionFilter
{
  private $_change = false;
  
  public function preBlockFilter()
  {
    $this->mController->mSetupUser->add(array(&$this, 'doChangeTheme'), XCUBE_DELEGATE_PRIORITY_NORMAL - 1);
  }
  
  public function postFilter()
  {
    if ($this->mRoot->mContext->mUser->isInRole('Site.RegisteredUser') && $this->_change && !empty($_POST['holdtheme']) ) {
      $xUser = $this->mRoot->mContext->mXoopsUser;
      if ( isset($_SESSION['xoopsUserTheme']) && is_object($xUser) && $xUser->get('theme') != $_SESSION['xoopsUserTheme'] ) {
        $handler = xoops_gethandler('user');
        $edituser = $handler->get($xUser->get('uid'));
        $edituser->set('theme', $_SESSION['xoopsUserTheme']);
        $handler->insert($edituser, true);
        $this->mController->executeForward($GLOBALS['xoopsRequestUri']);
      }
    } elseif ( $this->_change ) {
      $this->mController->executeForward($GLOBALS['xoopsRequestUri']);
    }
  }
  
  public function doChangeTheme(&$principal, &$controller, &$context)
  {
    if (!empty($_POST['xoops_theme_select'])) {
      $xoops_theme_select = explode('!-!', $_POST['xoops_theme_select']);
      if ($this->_isSelectableTheme($xoops_theme_select[0])) {
        $this->mRoot->mContext->setThemeName($xoops_theme_select[0]);
        $_SESSION['xoopsUserTheme'] = $xoops_theme_select[0];
        $this->_change = true;
      }
      unset($_POST['xoops_theme_select']);
    }
  }
  
  private function _isSelectableTheme($theme_name)
  {
    return in_array($theme_name, $this->mRoot->mContext->getXoopsConfig('theme_set_allowed'));
  }
}
?>

確実に先に実行させるためXCUBE_DELEGATE_PRIORITY_NORMAL - 1にするとメソッドdoChangeThemeではユーザオブジェクトが作成されていないので、postFilterでユーザデータに登録させてます。
$_POST['xoops_theme_select']をunsetすることでThemeSelect::doChangeThemeのロジックをスキップさせています。<割と強引
メソッドdoChangeTheme内でもDBに接続しているのでユーザオブジェクトを使わずにSQLを書いてしまえばdoChangeTheme内で完結させることも出来ます。(上のコードよりこっちの方がスマートかな)

10って答えを出すのに引き算、足し算、割り算、掛け算どれを使っても10を導くことが出来るのと同じでプログラムも1つじゃないので面白いですよね。
このコードだと不要な処理も走るので、souhaltさんのコードで十分かと思います。


引用:
P.S. スレ違いで失礼しますが、このモジュール (Xigg) に投稿する際に、
半角の ">" は文字参照に変換されて Web ページに表示されます (期待した動作) が、
半角の "<" 以降は削除されて表示されません。
他のモジュールでは文字参照に変換されて Web ページに表示されたと思います。
Xigg とはそういうものですか?

htmlタグがいくつかそのまま書けるみたい(テーブルタグで絵描いたりして遊んでみた)なのでこのモジュールの仕様だと思います。
Re^2: Re^2: Re^2: Re^2: Re^4: XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず) 
投稿者: souhalt | 投稿日時: 2008/10/30 12:00 | 親コメント: #19224
souhalt
Re^2: Re^2: Re^2: Re^2: Re^4: XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず)

引用:
書いてから気づいたのですが、オブジェクトで登録してると削除するのは物凄く面倒なことしないと出来ないですね。
今回の場合は削除するぐらいなら処理が走らないようにした方が簡単かな。


そうでしたか。削除しようとしたのですが、うまくいきませんでした。

引用:
確実に先に実行させるためXCUBE_DELEGATE_PRIORITY_NORMAL - 1にするとメソッドdoChangeThemeではユーザオブジェクトが作成されていないので、postFilterでユーザデータに登録させてます。
$_POST['xoops_theme_select']をunsetすることでThemeSelect::doChangeThemeのロジックをスキップさせています。<割と強引


実行順序を PRIORITY などで明示化したコードということですね。

引用:
サイトプリロードとモジュールプリロードの違いで配列の登録順序は先になるので、先に実行されるとは思いますが・・・souhaltさんのコードは実際先に実行されますよね。

引用:
このコードだと不要な処理も走るので、souhaltさんのコードで十分かと思います。


そうですね。明示されない実行順序ですが、支障なく動作しているように見えます。
でも、せっかくコードを書いていただいたので、そちらの方を使用させていただこうかと思います。
(多少プリロードとデリゲートの勉強にはなりました)

整理すると、
- XCL (XOOPS Cube Legacy) 2.1
- テーマチェンジャー (Theme Changer) 2.6
- XOOPS_ROOT_PATH/preload/SaveTheme.class.php (2008/10/30 by Marijuana)

上記の組み合わせで、
「ユーザーが自分のテーマを持てる」こと (ログイン後の初期テーマ設定) ができるようです
(テーマチェンジャーの「このテーマを常に使う」機能を含めて) 。
なお、「モジュールごとにテーマを設定」に関しては、想定も確認もしておりません。

アドバイスを戴いた皆様、どうもありがとうございました。

---
引用:
htmlタグがいくつかそのまま書けるみたい(テーブルタグで絵描いたりして遊んでみた)なのでこのモジュールの仕様だと思います。


それでは、単体の半角 "<" は文字参照で書くしかないようです。
了解しました。
Re: Re^2: Re^2: Re^2: Re^2: Re^4: XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず) 
投稿者: Marijuana | 投稿日時: 2008/10/30 22:48 | 親コメント: #19228
Marijuana
引用:
整理すると、
- XCL (XOOPS Cube Legacy) 2.1
- テーマチェンジャー (Theme Changer) 2.6
- XOOPS_ROOT_PATH/preload/SaveTheme.class.php (2008/10/30 by Marijuana)

上記の組み合わせで、
「ユーザーが自分のテーマを持てる」こと (ログイン後の初期テーマ設定) ができるようです
(テーマチェンジャーの「このテーマを常に使う」機能を含めて) 。

ユーザ情報にテーマを保持させるだけならテーマチェンジャー は必要ないですよ
テーマ選択のブロックにこのテーマを常に使うってチェックボックスでも追加すれば、プリロードだけで可能です。
Re^2: Re^2: Re^2: Re^2: Re^2: Re^4: XCL2.1.6RC: テーマチェンジャー動作せず ($_POST 取得不可、theme フィールド変化せず) 
投稿者: souhalt | 投稿日時: 2008/10/31 8:23 | 親コメント: #19232
souhalt
引用:
ユーザ情報にテーマを保持させるだけならテーマチェンジャー は必要ないですよ
テーマ選択のブロックにこのテーマを常に使うってチェックボックスでも追加すれば、プリロードだけで可能です。


その点は分かってます。
互換モジュールの「テーマ選択」ブロックを使うなら、id と name を "holdtheme" にした御指摘のチェックボックスの他、
あとは onchange を削って「送信」(submit) ボタンを追加すればできます。
テーマチェンジャーの「テーマ選択」ブロックを使う場合も、実際はフォームの部分だけ使われるようなイメージだと思います。
互換モジュールを改変して使うか、テーマチェンジャーをインストールして改変せずに (あるいは改変して不要部分を無効化して) 使うか、
いずれにしても好みの問題の範囲かと。

    投票(0)

    新しいものから | 古いものから | RSS feed
     
    To Top