phpBB / XenForoを使用したサイトでの承認

約1年前、フォーラム(phpBB)に登録したユーザーがサイト(modX)にログインできるようにする必要がありました。 当時、フォーラムはすでに機能しており、ユーザーは積極的にコミュニケーションをとっていました。 MODxBBソリューションはその時点では存在せず、必要でした 空想する。



結果はこのようなものです

<?php global $modx, $phpbb_root_path, $phpEx, $user, $db, $config, $cache, $template, $auth; $phpbb_root_path = $modx->config['base_path'] . 'forum/'; define('IN_PHPBB', true); $phpEx = "php"; include($phpbb_root_path . 'includes/functions_install.' . $phpEx); include($phpbb_root_path . 'includes/functions_display.' . $phpEx); include($phpbb_root_path . 'common.' . $phpEx); include($phpbb_root_path . 'includes/captcha/captcha_factory.' . $phpEx); $user->session_begin(); $auth->acl($user->data); $user->setup('ucp'); $login = array(); if(isset($_POST['logoutForum']) && $user->data['user_id'] != ANONYMOUS) $user->session_kill(); //  if(isset($_POST['login']) && $user->data['user_id'] == ANONYMOUS){ $username = request_var('username', '', true); $password = request_var('password', '', true); $autologin = (!empty($_POST['autologin'])) ? true : false; $viewonline = (!empty($_POST['viewonline'])) ? false : true; $login = $auth->login($username, $password, $autologin, $viewonline); } header('Content-type: text/html; charset=UTF-8'); header('Cache-Control: private, no-cache="set-cookie"'); header('Expires: 0'); header('Pragma: no-cache'); if((!empty($login) && $login['status'] == LOGIN_SUCCESS) || $user->data['user_id'] != ANONYMOUS){ if(!empty($login)) $auth->acl($user->data); $modx->setPlaceholder('UserName',get_username_string('full', $user->data['user_id'], $user->data['username'], $user->data['user_colour'])); echo $modx->getChunk('ExitBlock'); /* Hello [+UserName+] <form method="post" action="/[~[*id*]~]"><input type="submit" name="logoutForum" value="" /></form> */ } else{ if(isset($login['error_msg']) && $login['error_msg']){ //  $err = $user->lang[$login['error_msg']]; if ($login['error_msg'] == 'LOGIN_ERROR_USERNAME' || $login['error_msg'] == 'LOGIN_ERROR_PASSWORD'){ $err = (!$config['board_contact']) ? sprintf($user->lang[$login['error_msg']], '', '') : sprintf($user->lang[$login['error_msg']], '<a hrf="mailt:' . htmlspecialchars($config['board_contact']) . '">', '</a>'); } if($login['error_msg']=='LOGIN_ERROR_ATTEMPTS'){ //? $captcha = & phpbb_captcha_factory::get_instance($config['captcha_plugin']); $captcha->init(CONFIRM_LOGIN); $template->assign_vars(array('CAPTCHA_TEMPLATE' => $captcha->get_template())); $err = $user->lang[$login['error_msg']]; $err.='<br /><img sr="/forum/ucp.php?mode=confirm&confirm_id='.$template->_rootref['CONFIRM_IMAGE_LINK'].'" alt=" " /><br />   : <input type="text" name="confirm_code" id="confirm_code" size="8" maxlength="8" title=" " /><input type="hidden" name="confirm_id" id="confirm_id" value="'.$template->_rootref['CONFIRM_ID'].'" title=" " /><br />'; } $modx->setPlaceholder('ErrorMsg',$err); } echo $modx->getChunk('forumLoginForm'); /* <form method="post" action=""> [+ErrorMsg+]<BR> : <input type="text" name="username" id="username" size="10" title="login" /><br /> : <input type="password" name="password" id="password" size="10" title="password" /><br /> <input type="submit" name="login" value="" /> </form> */ } ?>
      
      







コードは確かに完璧ではありませんが、完璧に機能しました。

フォーラムエンジンを変更するアイデアがなかった場合、このトピックはこれで終了していました。 インターネットをさまよい、XenForoをインストールすることにしました。 決定要因は次のような項目でした。

  1. すぐに使えるソーシャルパン
  2. phpBB 3.0フォーラムからユーザー、トピック、メッセージをインポートする機能
  3. コンフォートコード
  4. アクティブなコミュニティ




ダウンロード、インストール、インポート...さらに、古いフォーラムのリンクを使用してサイトにアクセスしたユーザーを新しいページにリダイレクトできるように、ID-Schnickを保存してインポートが行われました。

ここで、サイト自体で認証フォームを復元する必要がありました。 判明したように、XenForoコードは非常に明確であるため、これはそれほど難しくありません。

 <?php $noauth=isset($noauth)? $noauth : ''; //    ? $fileDir=$modx->config['base_path'].'forum/'; $startTime = microtime(true); require ($fileDir . '/library/XenForo/Autoloader.php'); XenForo_Autoloader::getInstance()->setupAutoloader($fileDir . '/library'); XenForo_Application::modxParserActive(); // XenForo,       XenForo_Application::initialize($fileDir . '/library', $fileDir); XenForo_Application::set('page_start_time', $startTime); XenForo_Session::startPublicSession(); $xfUser = XenForo_Visitor::getInstance(); $data=array(); if($xfUser->get('user_id')=='0'){ $data['back']=isset($_SERVER['REQUEST_URI'])?$_SERVER['REQUEST_URI']:'/'; $data['linkauth']='forum/login/login'; $data['noauth']=$modx->getChunk($noauth); //   echo $modx->parseChunk('forumLoginForm', $data,'[+','+]'); /*[+noauth+]<BR> <form action="/[+linkauth+]" mthod="post" lass="xenForm " id="login" style="display: block"> <>/e-mail: <inut type="text" name="login" id="LoginControl" class="textCtrl" tabindex="101">&nbsp;&nbsp;&nbsp;&nbsp;:<inut type="password" name="password" class="textCtrl" id="ctrl_password" tabindex="102">&nbsp;&nbsp;&nbsp;&nbsp;<inut type="submit" class="button primary" value="" tabindex="104"></> <inut type="hidden" name="remember" value="1" id="ctrl_remember"> <inut type="hidden" name="cookie_check" value="1"> <inut type="hidden" name="redirect" value="[+back+]"> <inut type="hidden" name="_xfToken" value=""> </frm>*/ }else{ $data['UserName']=$xfUser->get('username'); echo $modx->parseChunk('ExitBlock', $data,'[+','+]'); } ?>
      
      







そして今、最も興味深い部分が始まります:modxParserActiveがどんな神秘的な関数であるかを説明します。



ライブラリ/ XenForo /フォルダーからApplication.phpファイルを開き、XenForo_Applicationクラスに新しい変数の定義を追加します

 protected static $_modxParser = false;
      
      





次に、新しい関数を定義します



 public static function modxParserActive() { self::$_modxParser = true; } public static function GetModxParser() { return self::$_modxParser; }
      
      





そして最後の仕上げ。 beginApplication関数で、コードをラップします

 @ini_set('output_buffering', false); // see http://bugs.php.net/bug.php?id=36514 if (!@ini_get('output_handler')) while (@ob_end_clean()); error_reporting(E_ALL | E_STRICT & ~8192); set_error_handler(array('XenForo_Application', 'handlePhpError')); set_exception_handler(array('XenForo_Application', 'handleException'));
      
      







次の条件で



 if(!self::GetModxParser()){ …... }
      
      







はい、エンジンコードをクロールすることは最良のアイデアではないことを知っていますが、それがまさにポイントでした。 この投稿。 これまでのところ、これがmodxとXenForoの互換性の競合を回避することができた唯一の方法です。 実際、modxはob_end_cleanのみを使用してチャンク、スニペットを解析します。 そして、この関数は以前に呼び出されたため、modxは空のバッファーを受け取り、その後の結果をすべて受け取ります。



All Articles