LOGIN ID Password Auto Login Register Now! Lost Password?
XUGJ Forum

XCL2.1ユーザ情報編集フォームの乗っ取り

投稿ツリー


このトピックの投稿一覧へ

GIJOE

なし XCL2.1ユーザ情報編集フォームの乗っ取り

msg# 1
depth:
0
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2009/11/11 12:33
GIJOE  Admiral 居住地: 2003年4月くらい  投稿数: 3708
XCL2.1ではユーザ情報のフィールド定義を簡単に変更することはできません。

だから、userモジュールのテンプレートを編集することで、ICQやAIMみたいなあまり利用価値のないフィールドを別の用途に流用する、なんて使われ方が意外と多いと思います。

ただ、テンプレート(HTML)編集だけでは、入力制約や権限といった機能を変更することはできません。かといって、userモジュールのforms/やactions/下のファイルを直接Hackするのは望ましくありません。

そこで、こんなpreloadを作ってみました。


2ファイル構成です。

(1) EditUserOverride.class.php (プリロード)
(2) _EditUserOverride.class.php (上記プリロードから呼び出されるサブクラス定義)

このうち、(2)は preload/ 直下ではなく、preload/disabled/ の下に置きます。

(1) html/preload/EditUserOverride.class.php
<?php

// ユーザ情報編集オーバーライド

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

class EditUserOverride extends XCube_ActionFilter
{
	function preFilter()
	{
		// ユーザ関連のアクション作成部をフック
		$this->mRoot->mDelegateManager->add( 'User_ActionFrame.CreateAction' , array( &$this , 'hook' ) , XCUBE_DELEGATE_PRIORITY_FINAL ) ;
	}

	function hook( &$actionFrame )
	{
		if( strcasecmp( get_class( $actionFrame->mAction ) , 'User_EditUserAction' ) === 0 ) {
			// ユーザ編集Actionの時だけ、オーバーライドしたActionに差し替え
			require_once dirname(__FILE__).'/disabled/_EditUserOverride.class.php' ;
			$actionFrame->mAction =& new UserOverride_EditUserAction( $actionFrame->mAdminFlag ) ;
		}
	}
}



(2) html/preload/disabled/_EditUserOverride.class.php
<?php

// ユーザ情報編集オーバーライド(ActionおよびForm記述)

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

// 差し替え用Action
class UserOverride_EditUserAction extends User_EditUserAction
{
	function _setupActionForm()
	{
		// フォームの差し替え
		$this->mActionForm =& new UserOverride_EditUserForm( $this->mConfig ) ;
		$this->mActionForm->prepare() ;
	}
}


// 差し替え用Form
class UserOverride_EditUserForm extends User_EditUserForm
{
	// フォーム定義をオーバーライド
	function prepare()
	{
		parent::prepare() ;
	
		// フォーム用フィールドの登録
		// 入力制約等の追加/変更/削除
	}

	// DB等からロードする際の処理をオーバーライド
	function load( &$obj )
	{
		parent::load( $obj ) ;

		// $obj->set( 'field' , $this->get( 'field' ) ) ;
	}

	// 更新時の処理をオーバーライド
	function update( &$obj )
	{
		// 入力データに置き換える前のオブジェクトを保存しておく
		$original_obj = unserialize( serialize( $obj ) ) ;
		// $original_obj = clone $obj ; とやると、php4でパースエラーになる

		parent::update( $obj ) ;

		if( ! $GLOBALS['xoopsUser']->isAdmin( 'user' ) ) {
			// Userモジュールの管理者権限が必要なフィールドについて書き戻す
			$obj->set( 'name' , $original_obj->get('name') ) ;
		}

		// $obj->set( 'field' , $this->get( 'field' ) ) ;
	}
}

この(2)の書き方次第で、たいていのロジックは記述可能です。

このサンプルでは、nameについては、管理者だけしか書き換えられないようにしています。

こんなことをしなくても、テンプレートカスタマイズで、フォームから該当の<input>を消せば良いではないか、と思った方は要注意です。

直接、name=hoge とPOSTしてくる可能性があるのですから。


正直、こんなサンプルだと、何の役に立つのか良く判らないと思いますが、時間があったら、有用な(2)のサンプルを書き足していきます。


ちなみに、XoopsUserオブジェクトの定義を簡単に置き換えられないので、「フィールドの追加」は意外と面倒です。

そんなわけで、「フィールドの流用」で目的が達成出来るならそれが一番楽です。
投票数:1 平均点:10.00

  条件検索へ


Back to Page Top
MainMenu
Manuals
Search
XOOPS Official & Dev.
XOOPS Communities