ページへ戻る

− Links

 印刷 

inc​/X2edituser :: なーおんWEB

xpwiki:inc/X2edituser

AU携帯からX2サイトでプロフィール編集できない件のハック[1] anchor.png[2]

携帯対応レンダーで、どうしてもプロフィール[3]編集ができない件、Xoops[4] 2.0.16a-JPでは 「edituser.php」がテンプレートレスのため、xoops2のコアハックが必要です。 今回、修正できましたので公開します。

追記: 案1、案2がありますが、 案2がお勧めです。

Page Top

状況 anchor.png[5]

「edituser.php」のフォーム出力は、表組みの中に組み込まれています。 しかし、この中に3つの<input hidden..>要素があり、<tr><td></td></tr>で囲まれていません。

PC表示の時のHTMLソース

Everything is expanded.Everything is shortened.
 
 
 
 
 
 
 
 
 
 
 
 
<form name='userinfo' id='userinfo' action='edituser.php' method='post' onsubmit='return xoopsFormValidate_userinfo();'>
<table width='100%' class='outer' cellspacing='1'><tr><th colspan='2'>プロフィール[3]の編集</th></tr>
 :(略)
<td class='even'><input type='radio' name='user_mailok' value='1' />はい
<input type='radio' name='user_mailok' value='0' checked='checked' />いいえ
</td></tr>
<input type='hidden' name='uid' id='uid' value='1' />
<input type='hidden' name='op' id='op' value='saveuser' />
<input type='hidden' name='XOOPS_TOKEN_edituser_0' id='XOOPS_TOKEN_edituser_0' value='73c49509e09fcefb3aee244ebbae50ee' />
<tr valign='top' align='left'><td class='head'></td>
<td class='even'><input type='submit' class='formButton' name='submit'  id='submit' value='変更を保存' />
</td></tr></table></form>

これが、PCのブラウザや、docomo、softbank携帯からは問題ないようなのですが、AUではどうしても送信しても元ページに戻ってしまいます。

Page Top

案1「edituser.php」のハック anchor.png[6]

Page Top
edituser.phpのハック anchor.png[7]

edituser.phpの205行目あたり

205
206
207
208
    $uid_hidden = new XoopsFormHidden('uid', $xoopsUser->getVar('uid'));
    $op_hidden = new XoopsFormHidden('op', 'saveuser');
    $token_hidden = new XoopsFormToken(XoopsSingleTokenHandler::quickCreate('edituser'));
    $submit_button = new XoopsFormButton('', 'submit', _US_SAVECHANGES, 'submit');

 これを、↓ 以下のように変更

205
206
207
208
209
    $uid_hidden = "<tr><td></td><td><input type='hidden' name='uid' id='uid' value='" . $xoopsUser->getVar('uid'). "' />";
    $op_hidden = "<input type='hidden' name='op' id='op' value='saveuser' />";
    $token = new XoopsFormToken(XoopsSingleTokenHandler::quickCreate('edituser'));
    $token_hidden = "<input type='hidden' name='".$token->_name."' id='".$token->_name."' value='".$token->_value."' /></td></tr>";
    $submit_button = new XoopsFormButton('', 'submit', _US_SAVECHANGES, 'submit');
Page Top
変更後にアクセス時のHTMLソース anchor.png[8]

上記変更後に、PCからアクセスした時のHTMLソースは、以下のようになりました。 これで、AU携帯でも変更が可能になります。

Everything is expanded.Everything is shortened.
 
 
 
 
 
 
 
 
 
 
 
 
<form name='userinfo' id='userinfo' action='edituser.php' method='post' onsubmit='return xoopsFormValidate_userinfo();'>
<table width='100%' class='outer' cellspacing='1'><tr><th colspan='2'>プロフィール[3]の編集</th></tr>
 :(略)
<td class='even'><input type='radio' name='user_mailok' value='1' />はい
<input type='radio' name='user_mailok' value='0' checked='checked' />いいえ
</td></tr>
<tr><td></td><td><input type='hidden' name='uid' id='uid' value='1' />
<input type='hidden' name='op' id='op' value='saveuser' />
<input type='hidden' name='XOOPS_TOKEN_edituser_0' id='XOOPS_TOKEN_edituser_0' value='10d24c91a2f218e02dc53e02a27622f3' /></td></tr>
<tr valign='top' align='left'><td class='head'></td><td class='even'>
<input type='submit' class='formButton' name='submit'  id='submit' value='変更を保存' />
</td></tr></table></form>
Page Top

案2「themform.php」のハック anchor.png[9]

上記「edituser.php」は元に戻して、「class/xoopsform/themform.php」をハックします。 この方法は、nao-ponさんに教えていただきました[10]。 HTML構造的にも、こちらの方が正しいやりかただと思います。

Page Top
themeform.php の 82行目あたりから anchor.png[11]
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
    function render()
    {
        $required =& $this->getRequired();
        $ret = "<form name='".$this->getName()."' id='".$this->getName()."' action='".$this->getAction()."' method='".$this->getMethod()."' onsubmit='return xoopsFormValidate_".$this->getName()."();'".$this->getExtra().">\n<table width='100%' class='outer' cellspacing='1'><tr><th colspan='2'>".$this->getTitle()."</th></tr>";
        //$count = 0;
        $hidden = '';
        foreach ( $this->getElements() as $ele ) {
            if (!is_object($ele)) {
                $ret .= $ele;
            } elseif (!$ele->isHidden()) {
                //if ($count % 2 == 0) {
                    $class = 'even';
                //} else {
                //    $class = 'odd';
                //}
                $ret .= "<tr valign='top' align='left'><td class='head'>".$ele->getCaption();
                if ($ele->getDescription() != '') {
                    $ret .= '<br /><br /><span style="font-weight: normal;">'.$ele->getDescription().'</span>';
                }
                $ret .= "</td><td class='$class'>".$ele->render()."</td></tr>";
                //$count++;
            } else {
                $hidden .= $ele->render();
            }
        }
        $ret .= "</table>" . $hidden . "</form>\n";
        $ret .= $this->renderValidationJS( true );
        return $ret;
    }
Page Top
変更後にアクセス時のHTMLソース anchor.png[12]
Everything is expanded.Everything is shortened.
 
 
 
 
 
 
 
 
 
 
 
 
<form name='userinfo' id='userinfo' action='edituser.php' method='post' onsubmit='return xoopsFormValidate_userinfo();'>
<table width='100%' class='outer' cellspacing='1'><tr><th colspan='2'>プロフィール[3]の編集</th></tr>
 :(略)
<td class='even'><input type='radio' name='user_mailok' value='1' />はい
<input type='radio' name='user_mailok' value='0' checked='checked' />いいえ
</td></tr>
<tr valign='top' align='left'><td class='head'></td>
<td class='even'><input type='submit' class='formButton' name='submit'  id='submit' value='変更を保存' /></td></tr></table>
<input type='hidden' name='uid' id='uid' value='1' />
<input type='hidden' name='op' id='op' value='saveuser' />
<input type='hidden' name='XOOPS_TOKEN_edituser_0' id='XOOPS_TOKEN_edituser_0' value='d7a44c5ccee5b9e7c95775c94437bd2b' />
</form>

以上


Last-modified: 2019-08-17 (土) 07:11:56 (JST) (1707d) by なーお