AU携帯からX2サイトでプロフィール編集できない件のハック
AU携帯からX2サイトでプロフィール編集できない件のハック
携帯対応レンダーで、どうしてもプロフィール編集ができない件、Xoops 2.0.16a-JPでは 「edituser.php」がテンプレートレスのため、xoops2のコアハックが必要です。 今回、修正できましたので公開します。
追記: 案1、案2がありますが、 案2がお勧めです。
状況
「edituser.php」のフォーム出力は、表組みの中に組み込まれています。 しかし、この中に3つの<input hidden..>要素があり、<tr><td></td></tr>で囲まれていません。
PC表示の時のHTMLソース
| <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'>プロフィールの編集</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ではどうしても送信しても元ページに戻ってしまいます。
案1「edituser.php」のハック
edituser.phpのハック
edituser.phpの205行目あたり
205
206
207
208
209
210
211
| $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
210
211
212
213
| $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');
|
変更後にアクセス時のHTMLソース
上記変更後に、PCからアクセスした時のHTMLソースは、以下のようになりました。 これで、AU携帯でも変更が可能になります。
| <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'>プロフィールの編集</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>
|
案2「themform.php」のハック
上記「edituser.php」は元に戻して、「class/xoopsform/themform.php」をハックします。 この方法は、nao-ponさんに教えていただきました。 HTML構造的にも、こちらの方が正しいやりかただと思います。
themeform.php の 82行目あたりから
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
| 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; }
|
変更後にアクセス時のHTMLソース
| <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'>プロフィールの編集</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>
|
以上
実体ファイル:inc/X2edituser
新しくコメントをつける