2011年4月25日月曜日

XOOPS Cubeでメールアドレス・ログインを実現する実践編

メールログイン自体はGIJOE氏のpreloadで実現します。


以下、User_EmailLogin.class.php をpreloadフォルダへ入れます。
<?php

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

class User_EmailLogin extends XCube_ActionFilter
{
    function preFilter()
    {
        $root =& XCube_Root::getSingleton();
        $root->mDelegateManager->add("Site.CheckLogin", array( &$this , 'checkLogin') ) ;
    }

    function checkLogin(&$xoopsUser)
    {
        if (is_object($xoopsUser)) {
            return;
        }

        $root =& XCube_Root::getSingleton();
        $root->mLanguageManager->loadModuleMessageCatalog('user');

        $userHandler =& xoops_getmodulehandler('users', 'user');
       
        $criteria =& new CriteriaCompo();
        $criteria->add(new Criteria('email', xoops_getrequest('uname')));
        $criteria->add(new Criteria('pass', md5(xoops_getrequest('pass'))));
       
       
        $userArr =& $userHandler->getObjects($criteria);
       
        if (count($userArr) != 1) {
            return;
        }
       
        if ($userArr[0]->get('level') == 0) {
            // TODO We should use message "_MD_USER_LANG_NOACTTPADM"
            return;
        }
       
        $handler =& xoops_gethandler('user');
        $user =& $handler->get($userArr[0]->get('uid'));
       
        $xoopsUser = $user;
   
        //
        // Regist to session
        //
        $root->mSession->regenerate();
        $_SESSION = array();
        $_SESSION['xoopsUserId'] = $xoopsUser->get('uid');
        $_SESSION['xoopsUserGroups'] = $xoopsUser->getGroups();
    }
}
?>

落とし穴はここから。

このままだとユーザー名の上限である25文字以上のメールアドレス使っているユーザーはメールアドレスを入力できません。

そこで、userモジュールのブロックテンプレートuser_block_login.htmlのmaxlengthを25文字でなくメールアドレスの最大文字長である255文字に変えます。
<form action="<{$xoops_url}>/user.php" method="post" style="margin-top: 0px;">
    <{$smarty.const._MB_USER_USERNAME}><br />
    <{xoops_input type=text name=uname size=12 value=$block.unamevalue maxlength=255 id="`$smarty.const.XOOPS_INPUT_DEFID_PREFIX`block_uname"}><br />
    <{$smarty.const._MB_USER_PASSWORD}><br />
    <{xoops_input type=password name=pass size=12 maxlength=32 id="`$smarty.const.XOOPS_INPUT_DEFID_PREFIX`block_pass"}><br />
<!--<label><{xoops_input type=checkbox name=rememberme value=On class=formButton}><{$smarty.const._MB_USER_REMEMBERME}></label><br />-->
    <input type="hidden" name="xoops_redirect" value="<{$xoops_requesturi}>" />
    <{xoops_input type=hidden name=op value=login id="`$smarty.const.XOOPS_INPUT_DEFID_PREFIX`block_op"}>
    <{xoops_input type=submit name=submit value=$smarty.const._MB_USER_LOGIN id="`$smarty.const.XOOPS_INPUT_DEFID_PREFIX`block_submit"}><br />
</form>
<{if $block.use_ssl == '1'}>
  <a href="javascript:openWithSelfMain('<{$block.sslloginlink}>', 'ssllogin', 300, 200);"><{$smarty.const._MB_USER_SECURE}></a>
<{/if}>
<a href="<{$xoops_url}>/lostpass.php"><{$smarty.const._MB_USER_LOSTPASS}></a>
<br /><br />
<{if $block.allow_register == '1'}>
  <a href="<{$xoops_url}>/register.php"><{$smarty.const._MB_USER_USERREG}></a>
<{/if}>
 これで一件落着と思いきやもう一つ見逃してはなりません。WizMobileで携帯対応しているならこれも手を入れる必要があります。

xoops_trust_pathのmodules/wizmobile/templates/main_login.html

これを開いてこっちも255文字へ上限を変更。これでやっとXOOPS Cube のメールアドレスログインが実現します。おっと、WziMobileのバージョンは最新版をダウンロードするのをお忘れなく。Ver0.51以降は簡単ログインでチケット処理が追加されてます。
<div id="<{$wizmobile_dirname}>Login">
  <form action="<{$xoops_url}>/modules/<{$wizmobile_dirname}>/index.php" method="post">
    <input type="hidden" name="act" value="Login" />
    <{wiz_gticket area=$wizmobile_dirname}>
    <input type="submit" value="<{"WIZMOBILE_LANG_SIMPLE_LOGIN"|wiz_constant}>" />
  </form>
  <span style="margin-top: 1em; color: #ff0000;"><{"WIZMOBILE_MSG_SIMPLE_LOGIN_CAUTION"|wiz_constant}></span>
</div>
<br />

<form action="<{$xoops_url}>/user.php" method="post" style="margin-top: 0px;">
  <{$smarty.const._MB_USER_USERNAME}><br />
  <input name="uname" id="<{$smarty.const.XOOPS_INPUT_DEFID_PREFIX}>_uname" type="text" size="12" maxlength="255" <{wizin_inputmode mode="alpha"}> /><br />
  <{$smarty.const._MB_USER_PASSWORD}><br />
  <input name="pass" id="<{$smarty.const.XOOPS_INPUT_DEFID_PREFIX}>_pass" type="password"  size="12" maxlength="32" <{wizin_inputmode mode="alpha"}> /><br/>
  <{xoops_input type=hidden name=op value=login id="`$smarty.const.XOOPS_INPUT_DEFID_PREFIX`_op"}>
  <{xoops_input type=submit name=submit value=$smarty.const._MB_USER_LOGIN id="`$smarty.const.XOOPS_INPUT_DEFID_PREFIX`_submit"}>
</form>
<a href="<{$xoops_url}>/lostpass.php"><{$smarty.const._MB_USER_LOSTPASS}></a>
<br /><br />

<{if $wizmobile_userModuleConfig.allow_register == '1'}>
  <a href="<{$xoops_url}>/register.php"><{$smarty.const._MB_USER_USERREG}></a>
<{/if}>

以上、XOOPS Cube でメールアドレス・ログインを実現する実践編でした。

0 件のコメント:

コメントを投稿