注文の多いXOOPS屋 TOP現在のブログ旧スタッフblog アーカイブ
このページは 2007〜2008 年に公開していた「株式会社RYUS スタッフblog」のアーカイブです。内容は当時のものです。

ちょっと邪道なuserモジュール改造

2007/10/12 18:39   Ryuji   カテゴリ: XOOPS Cube

XOOPS Cubeのユーザ管理画面でユーザ登録するときに、メールアドレスの必須チェックを外したかったので、少々邪道な方法でやってみました。

まず、ユーザ登録画面のアクションを継承して、UserEditCustomアクションを作成します。

/modules/user/admin/actions/UserEditCustomAction.class.php

<?php

if (!defined('XOOPS_ROOT_PATH')) exit();
require_once XOOPS_MODULE_PATH .'/user/admin/actions/UserEditAction.class.php';

class User_UserEditCustomAction extends User_UserEditAction
{

}
?>


この状態で、
XOOPS_URL/modules/user/admin/index.php?action=UserEditCustom
にアクセスすると、XOOPS Cubeのユーザ追加画面と同じ画面が表示されます。

メールアドレスのチェックなど、入力項目のチェックは、ActionFormで行われているので、こちらも継承したActionFormを作成します。
今回は、別ファイルにするのも面倒だったので、先ほどのUserEditCustomAction.class.phpに書き足しました。

PREclass User_UserAdminEditCustomForm extends User_UserAdminEditForm
{
}/PRE

この作成したActionFormを使うように、UserEditCustomアクションを修正します。

class User_UserEditCustomAction extends User_UserEditAction
{
function _setupActionForm()
{
$this->mActionForm =& new User_UserAdminEditCustomForm();
$this->mActionForm->prepare();
}
}/PRE

これで改造の下準備ができました。

では、メールアドレスの必須チェックを外します。
ActionFormのprepareでvalidatorを登録しているので、prepareでメールアドレスの必須チェックをしている箇所だけ修正します。

class User_UserAdminEditCustomForm extends User_UserAdminEditForm
{
function prepare()
{
parent::prepare();

// emailの必須チェック外した
unset($this->mFieldProperties['email']);
$this->mFieldProperties['email'] =& new XCube_FieldProperty($this);
$this->mFieldProperties['email']->setDependsByArray(array( 'maxlength', 'email'));
$this->mFieldProperties['email']->addMessage('maxlength', _MD_USER_ERROR_MAXLENGTH, _MD_USER_LANG_EMAIL, '60');
$this->mFieldProperties['email']->addVar('maxlength', 60);
$this->mFieldProperties['email']->addMessage('email', _MD_USER_ERROR_EMAIL, _MD_USER_LANG_EMAIL);
}
}

親クラスで設定されてる$this->mFieldProperties[\'email\']をunsetして、設定しなおすという強引なやり方です(^^;

というわけで、最終的な UserEditCustomAction.class.php は、下記のコードになりました。

<?php
if (!defined('XOOPS_ROOT_PATH')) exit();
require_once XOOPS_MODULE_PATH .'/user/admin/actions/UserEditAction.class.php';

class User_UserEditCustomAction extends User_UserEditAction
{
function _setupActionForm()
{
$this->mActionForm =& new User_UserAdminEditCustomForm();
$this->mActionForm->prepare();
}

}

class User_UserAdminEditCustomForm extends User_UserAdminEditForm
{
function prepare()
{
parent::prepare();

// emailの必須チェック外した
unset($this->mFieldProperties['email']);
$this->mFieldProperties['email'] =& new XCube_FieldProperty($this);
$this->mFieldProperties['email']->setDependsByArray(array( 'maxlength', 'email'));
$this->mFieldProperties['email']->addMessage('maxlength', _MD_USER_ERROR_MAXLENGTH, _MD_USER_LANG_EMAIL, '60');
$this->mFieldProperties['email']->addVar('maxlength', 60);
$this->mFieldProperties['email']->addMessage('email', _MD_USER_ERROR_EMAIL, _MD_USER_LANG_EMAIL);
}
}
?>/PRE

あとは、mod_rewriteで
XOOPS_URL/modules/user/admin/index.php?action=UserEdit へのアクセスを
XOOPS_URL/modules/user/admin/index.php?action=UserEditCustom へリダイレクトさせればOKです。

今回は、実験的にpreloadファイルつくってみました(^^;
/modules/user/admin/preload/RedirectAdminUserEdit2AdminUserEditCustom.class.php

<?php
class User_RedirectAdminUserEdit2AdminUserEditCustom extends XCube_ActionFilter
{
function postFilter()
{
if(is_object($this->mRoot->mContext->mXoopsModule)){
if($this->mRoot->mContext->mXoopsModule->get('dirname') == 'user'){
$action = xoops_getrequest('action');
if($action=='UserEdit'){
$url= 'index.php?action=UserEditCustom';
$uid = intval(xoops_getrequest('uid'));
if($uid){
$url .='&uid='.$uid;
}
$this->mController->executeForward($url);
}
}
}
}
}
?>/PRE

かなり邪道なやり方だとは思いますが、XOOPS Cubeだと、配布ファイルを編集せず、かつ自前のコードは最小限にして、こういうこともできるというところが、気に入っています。