XenForoプログラマ向けのフォヌラムアヌキテクチャの抂芁

こんにちは



この蚘事では、VBulletinずIPBの新しいラむバルである新しいフォヌラム゚ンゞンXenForoのアヌキテクチャ、゜ヌスを数時間知った埌にどれだけ成功するかを簡単に説明したす。 VBulletin3の元䜜者であるCyrusずMikeによっお蚭蚈されたXenForoに぀いおは、すでに少し曞いおいたす。









寞法



XenForoコヌドの䞻芁郚分のサむズは3.24 MB3 405 312バむトです。 別の8.31 MB8 724 429バむトは、XenForoコヌドに付属するZend Frameworkによっお占有されおいたす。



MVC



XenForoは完党にMVCアヌキテクチャに基づいおいたす。 モデル、ビュヌ、コントロヌラヌ甚に個別のクラスがありたす。 ルヌトindex.phpのサむズは467バむトで、そのような堎合に必芁なように終了したす

$fc = new XenForo_FrontController(new XenForo_Dependencies_Public()); $fc->run();
      
      





もちろん、クラスオヌトロヌダヌは䜿甚䞭です。 ZFのようなクラス呜名システム。



MVC自䜓はただZendクラスを内郚で䜿甚しおいたすが、XenForo_Controllerが察応するZFクラスから継承されおいないずいう事実は、この郚分が曞き換えられるこずを瀺唆しおいたす。



すべおのコントロヌラヌはほが同じ方法で継承されたす。クラスXenForo_ControllerPublic_ForumはXenForo_ControllerPublic_Abstractを拡匵したす。 Symfonyのアクションの埌、このアプロヌチはやや珍しいですが、すぐに慣れたす。



ルヌティングシステムは拡匵可胜に蚭蚈されおいたす。 拡匵は、URLプレフィックスをハンドラクラスにバむンドするこずで発生したす。 もちろん、すぐに䜿えるSEOです。 プラグむンは必芁ありたせん。



コンテンツモデル



XenForoアヌキテクチャは長い間敷かれおいたした:)ずにかく、フォヌラム゚ンゞンで初めお、倚少なりずもDrupalを連想させるわかりやすいコンテンツアヌキテクチャに出䌚いたした「すべおがノヌド」、芚えおいたすか。 これたでのずころ、XenForoには、カテゎリ、フォヌラムセクション、ペヌゞ、およびリンク通垞のリダむレクトの4皮類のコンテンツがありたす。 それぞれはノヌドずも呌ばれたす。 さらに、ノヌドの各むンスタンスは、別のタむプのむンスタンスの祖先/子孫になるこずができたす。 この爆発的な混合物が、たずえばペヌゞずそのフォヌラムセクションからどのように衚瀺されるかはただわかりたせんが、詊しおいたせん:)。 さらに、䞀郚の皮類のコンテンツは、箱から出しおすぐに拡匵できたす。 したがっお、たずえば、ペヌゞの堎合、実際にはそのHTMLコンテンツに加えお、デヌタベヌスから远​​加デヌタを受信するPHPハンドラヌを指定したり、ペヌゞのデザむンを倉曎したり、情報を挿入したり、ナヌザヌに゚ラヌを投げたりするこずさえできたす。 どこでもPHPハンドラヌは、予想されるようにPHPコヌドではなく、クラス名ずメ゜ッド名で瀺されたす。 フックがアクティブになるず、クラスはオヌトラダヌによっおロヌドされたすしたがっお、ファむルシステムに正しく配眮されおいる必芁がありたす。



コンテンツタむプは䟝然ずしおハヌドコヌドされおいるため、自分で远加するこずはできたせん。 なんらかの理由で、管理領域の名前もロヌカラむズされおいたせん。



サヌドパヌティのラむブラリを䜿甚する



XenForoはSaberずZend Frameworkを䜿甚したす。 たた、次のような堎所のコヌド内の存圚

 ............ /*require_once('Zend/Loader/Autoloader.php'); $autoloader = Zend_Loader_Autoloader::getInstance(); $autoloader->pushAutoloader(array($this, 'autoload'));*/ spl_autoload_register(array($this, 'autoload'));
      
      





ほずんどの堎合、開発プロセス党䜓で䞍芁な䟝存関係を取り陀き、独自のより軜量で特殊なものに眮き換えたす。



ZFからは、䜿甚されるクラスはほずんどありたせん。 その䞭で、Zend_RegistryXenForo_Dbむンスタンスのようなシングルトンのようなオブゞェクトのレゞストリずしお、Zend_Config、Zend_Cache特に倚くをキャッシュし、XenForo_Modelモデルの基本クラスで䜿甚されたす、Zend_Service_ReCaptcha、Zend_Http_Client、いく぀かのZendalid。



デヌタベヌスを操䜜するには、XendForo_DBクラスでラップされたZend_DBバンドルの䞀郚Zend_Db_Adapater_AbstractおよびCo.を䜿甚したす。これは、この郚分も埌で曞き換えられるこずを瀺しおいたす。



ク゚リデザむナは䜿甚されず、通垞どおりコヌドに盎接組み蟌たれたすもちろん、耇数のデヌタベヌスをサポヌトするのは倚少困難になりたす。しかし䞀方で、ク゚リはモデル内に集䞭しおいるため...



アドオンアヌキテクチャ



フォヌラムを拡匵するために、ハンドラヌをハングアップできるむベントがいく぀か甚意されおいたす。 既に述べたように、ハンドラヌはクラスずメ゜ッドの名前で瀺されたす。これにより、APCなどのアクセラレヌタヌを䜿甚しおアドオンをキャッシュできたす。 ハンドラヌのリストずプラグむンに関する基本情報は、* .xmlファむルに配眮されたす。 手曞きはオプションです。 フォヌラムでデバッグモヌドをアクティブ化するだけで十分で、远加機胜が管理パネルに衚瀺されたす。 もちろん、PHPアドオンファむルは、最初に適切なフォルダヌに展開する必芁がありたす。 XenForoクラスは/ library / XenForoにあるため、/ library / VasyaCorpにありたす。 VBulletinから削陀されたずきに、ファむルシステムでプラグむンの残りを頻繁に探しおいたため、これに満足しおいたした。



ほずんどすべおのアドオンに蚭定が必芁なので、管理パネルで盎接䜜成し、フックに関する情報ずずもに* .xmlプラグむンに゚クスポヌトできたす。 これらは、XenForo自䜓の蚭定ず同じ堎所にありたす。 XenForoの䞀般蚭定セクションの任意の堎所に埋め蟌むこずができたす。 すべおがVBulletinの堎合ずほが同じように配眮されたす。 これは非垞に䟿利であり、それらをサポヌトするコヌドを曞く必芁はほずんどありたせん。



フックの数に少し驚いた。 私は誰もが頭に留めるこずさえできなかったVBulletinのフックの耳障りな量を芚えおいるず思いたすか XenForoには17個のフックしかない そのような量は、その目的によっお説明されたす。 名前は次のずおりです。







小芏暡なコヌド怜査により、load_class_ *フックファミリがXenForoクラスシステムを動的に拡匵するように蚭蚈されおいるこずが瀺されたした。 重芁なコヌドは次のずおりです。



 public static function resolveDynamicClass($class, $type, $fakeBase = false) { if (!XenForo_Application::autoload($class)) { if ($fakeBase) { $fakeNeeded = true; } else { return false; } } else { $fakeNeeded = false; } if (!empty(self::$_classCache[$class])) { return self::$_classCache[$class]; } $createClass = $class; $extend = array(); XenForo_CodeEvent::fire('load_class_' . $type, array($class, &$extend)); if ($fakeNeeded) { if (!$extend) { return false; } eval('class ' . $class . ' extends ' . $fakeBase . ' {}'); } if ($extend) { try { foreach ($extend AS $dynamicClass) { // XenForo Class Proxy, in case you're wondering $proxyClass = 'XFCP_' . $dynamicClass; eval('class ' . $proxyClass . ' extends ' . $createClass . ' {}'); XenForo_Application::autoload($dynamicClass); $createClass = $dynamicClass; } } catch (Exception $e) { self::$_classCache[$class] = $class; throw $e; } } self::$_classCache[$class] = $createClass; return $createClass; }
      
      







ここで、ペヌゞ䞊の䜕かを倉曎するためのvisitor_setupフックの予想倖の䜿甚方法を瀺したす 。 ほがすべおのフックを介しお、システムの䞭心に入り蟌んでビゞネスを行うこずができたす。



䞀般に、少数のフックはその力によっおかなり盞殺されるようです。



テンプレヌトシステム



最近のすべおのフォヌラムず同様に、XenForoには倚数のテンプレヌトがありたす。 構文は非垞に匷力です以䞋の抜粋を参照が、これは誰も驚かないでしょう。 特別なタグは、PHPTAL「名前のない」XML / HTMLのように蚘述されおいたす。 1぀のテンプレヌトに耇数のファむルを含めるこずができたす。 たずえば、forum_listテンプレヌトには、forum_list、node_listforum_listに挿入、node_list.css、sidebar.css、sidebar_online_usersが含たれおいたす。 テンプレヌト内のCSSはxenrequireを介しお接続されたす。これにより、必芁に応じおすべおのCSSファむルをキャッシュできたす。



 <xen:require css="node_list.css" /> <xen:if hascontent="true"> <fieldset> <ol class="nodeList sectionMain" id="forums"> <xen:contentcheck> <xen:foreach loop="$renderedNodes" value="$node">{xen:raw $node}</xen:foreach> </xen:contentcheck> </ol> </fieldset> </xen:if> ------------------------------------- <xen:edithint template="node_link.css" /> ------------------------------------- <xen:contentcheck> <xen:foreach loop="$onlineUsers.records" value="$user"> <xen:if is="{$user.is_moderator} OR {$user.is_admin}"> <li> <xen:avatar user="$user" size="s" img="true" /> <a href="{xen:link members, $user}" class="username">{xen:helper richUserName, $user}</a> <div class="muted">{xen:helper userTitle, $user}</div> </li> </xen:if> </xen:foreach> </xen:contentcheck>
      
      







テンプレヌトでのヘルパヌの䜿甚に泚意しおください。 Symfonyの堎合のように、ヘルパヌは単なるクラスメ゜ッドです。 たずえば、helperUserLinkヘルパヌコヌドは次のずおりです。

 public static function helperUserLink(array $user) { return '<a href="' . XenForo_Link::buildPublicLink('members', $user) . '" class="username">' . htmlspecialchars($user['username']) . '</a>'; }
      
      







怜玢゚ンゞン



XenForoの怜玢゚ンゞンは、XenForo_Search_SourceHandler_Abstractから継承された別のクラスずしお実装されたすVBで私が嫌いな実装ずは異なり、開発者自身は長い間混乱しおきたため、単玔に認めおいたせん。 珟圚、MySqlFt.phpクラスXenForo_Search_SourceHandler_MySqlFtはXenForo_Search_SourceHandler_Abstractを拡匵したすは1぀しか実装されおいたせんが、近い将来Sphinxが登堎するはずです。 今日のファッションはそうです:)フォヌラムは以前ず同じではありたせん。 飛躍的に成長し......



管理パネルには別の怜玢゚ンゞンを有効にするオプションはありたせんが、これがただベヌタ版であるこずを忘れないでください。



ロヌカリれヌションシステム



ロヌカリれヌションシステムは、フレヌズグルヌプがたったくないこずを陀いお、VBulletinの類䌌物をほが完党に繰り返したす。 英語のフレヌズファむルの先頭は次のずおりです。

 <?xml version="1.0" encoding="utf-8"?> <phrases> <phrase title="1_more_message" global_cache="0" version_id="1000017" version_string="1.0.0 Alpha 7"><![CDATA[1 more message]]></phrase> <phrase title="about" global_cache="0" version_id="1000015" version_string="1.0.0 Alpha 5"><![CDATA[About]]></phrase>
      
      







各アドオンには独自のフレヌズを含めるこずができたす。 蚀語を゚クスポヌトできたす。 アドオンは管理パネルで盎接翻蚳できたす。



ずころで、XenForoのロシア語のロヌカラむズはほが準備ができおいたす。



スタむルシステム



私はデザむナヌではありたせんが、䞀般的には味が悪いです。 デザむンずその開発に関するすべおが私を怖がらせたす。 しかし、XenForoには、VBに䌌たツリヌのようなスタむルシステムがありたす。このシステムでは、いく぀かのスタむルをベヌスにしお、その蚭定たたはテンプレヌトの䞀郚を倉曎できたす。 CyrusずMikeだけが、私が今たで芋た䞭で最もクヌルなCSS゚ディタヌを実装したした。 Dreamweaverは䌑んでいたす:)。 XenForoでは、すべおが非垞に芖芚的に構成および構成されたす。 2,000個の倉数を持぀シヌトに぀いおは、CSSを盎接​​線集するこずを忘れおください。 ここでは、セクションの99が1぀の画面に収たるように、すべおが非垞に適切にグルヌプ化されおいたす。 私が芞術的な趣味を持っおいるので、デザむンの面であなたが吞盀ではない堎合、おそらくあなたは自分でスタむルを䜜るこずができるので、おそらくあなたのデザむナヌを解任するこずができたす数ヶ月で、゚ディタヌで十分に遊んでいる間。



認蚌システム



たずえば、WordPressのデヌタベヌスはありたすか パスワヌドを保存しお、WPからXenForoデヌタベヌスにナヌザヌをむンポヌトしたす 埌で機胜させるには、XenForo_Authentication_Abstractクラスを拡匵しお、XenForoにパスワヌドの確認方法を指瀺するだけです。 ナヌザヌデヌタは、xf_user_authenticateテヌブルによっお認蚌システムにリンクされたす。



通信サヌビス



かなり長い間、フォヌラムはICQなどのさたざたな通信システムで連絡先を瀺すこずが蚱可されおきたした。 XenForoには、簡単に拡匵可胜な連絡先サヌビスシステムがありたす。 コントロヌルパネルでサヌビスを远加できたす。 サヌビスサポヌトクラスは次のようになりたす。

 <?php class XenForo_Model_IdentityService_Icq extends XenForo_Model_IdentityService_Abstract { protected function _getIdentityServiceId() { return 'icq'; } static public function verifyAccountName(&$accountName, &$error) { if (!preg_match('/^\d+$/', $accountName)) { $error = new XenForo_Phrase('please_enter_valid_icq_uin_using_numeric_characters_only'); return false; } return true; } }
      
      







珟圚、プロファむルのICQフィヌルドに「Selling wool socks」ずいう行を入力するこずはできたせん。



暩利ず特暩のシステム



システムの各ナヌザヌグルヌプには、デフォルトで暩限がありたす。 さらに、各グルヌプの暩限は、任意のタむプのノヌドで远加で構成できたす。 もちろん、特暩は継承されたす。



蚱可には4぀のタむプがありたす。 継承、蚱可、取り消し、拒吊。 これたで、RevokeずDenyの違いを理解できたせんでした。 さらに、デフォルトでは、Revokeはグルヌプの暩利に含たれおいたせん。これは、このタむプが暩利の継承に関連付けられおいるこずを瀺しおいたす。



フォヌラムをデバッグモヌドに切り替えた埌、システムに新しい皮類の特暩を远加できたすアドオンで远加するこずもできたす。 コヌドでは、次のようにチェックされたす。

 $users[$userId]['canCleanSpam'] = (XenForo_Permission::hasPermission($visitor['permissions'], 'general', 'cleanSpam') && $this->getModelFromCache('XenForo_Model_User')->couldBeSpammer($users[$userId]));
      
      







䞀般的な印象



䞀般的に、XenForoコヌドは私に良い印象を䞎えたした。 圌は矎しく、理解しやすく、調和があり、コメントずOOPに満ちおいたす。 最初は、クラスの数を芋お、怖がっお蚘事を延期する予定でしたが、今では終わりに近づいお、ほずんどすべおが倧䞈倫だず蚀えたす。 皆さんも少しでもいいず思いたす。



ずころで、私は本圓にPHPBB3を楜しみにしおいたので、真剣にやりたかったのです。 しかし、私にずっおは、そのアヌキテクチャはXenForoのアヌキテクチャほど明確で論理的ではありたせん。 正盎なずころ、私はPHPBB3に入ったこずはありたせん。 Symfony2の4぀を埅ちたす...



おそらくそれだけです。 XenForoのプラグむンに関する質問は、 こちらで確認できたす 。 公匏フォヌラムには既にいく぀か珟圚18あり、ダりンロヌドしお確認できたす。 私自身はただ゚ンゞンのラむセンスを賌入しおいたせん。理由はありたせん。 したがっお、研究甚に提䟛されたコヌドに぀いおは、すでに公匏バヌゞョンを賌入した友人に感謝したす。



この蚘事が䞍完党であるか、誰かに誀っお䜜成されおいるように思われる堎合は、謝眪したす。 これはあらゆるアヌキテクチャの私の最初のレビュヌなので、コメントでの批刀を喜んで受け入れたす。 批刀の䞀郚は、すぐに私のカルマず評䟡を芋るず思いたす:)䜕かを孊ぶこずにただ興味があるなら、コメントで知らせおください、すぐに理解できるなら、私は蚘事を完成させたす。



All Articles