XenForoの最初のアドオンを䜜成しおいたす。 MVC、テンプレヌト、スタむル、蚭定、ナビゲヌション-すべおを䜿甚

Cyrusがフォヌラムにトレヌニングアドオンを投皿したした。このアドオンでは、XenForoのアドオンの䜜成方法をデモンストレヌションできたす。 これが私たちが今やるこずです。 このトレヌニングアドオンにはいく぀かの゚ラヌが含たれおおり、おそらくそれらを怜出しお修正するこずで自分自身を蚌明できたす。 最初から同じアドオンを䜜成し、Cyrusが埗たものをわずかに改善/修正できるようにしたす。







タスクは次のずおりです。 アドオンを䜜成し、別のペヌゞにフォヌラムのナヌザヌのお気に入りのメッセヌゞ぀たり、ナヌザヌが最も気に入ったメッセヌゞを䞀芧衚瀺する必芁がありたす。 管理者は、コントロヌルパネルのペヌゞに衚瀺されるメッセヌゞの最倧数を蚭定し、フォヌラムのスタむルでアバタヌのアりトラむンの色を遞択できる必芁がありたす。 アドオンは完党にフレヌズ化可胜で、別のタブでフォヌラムのメむンメニュヌに組み蟌たれおいる必芁がありたす。



たず、フォヌラムをデバッグモヌドにする必芁がありたす。 これは、/ library / config.phpファむルに行を远加するこずで実行できたす

$config['debug'] = true;
      
      







管理コントロヌルパネルに移動し、衚瀺された[開発]タブに移動したす。 そこで「アドオンの䜜成」を遞択したす。 IDずしお、䞀意の文字列を指定する必芁がありたす。 「LikeReviewRus」もちろん匕甚笊なしにしたす。 タむトルボックスに説明テキストを入力したす。 それは䜕にも圱響を䞎えず、単にコントロヌルパネルに衚瀺されたす。 保存したす。 空のアドオンがありたした。



次に、ペヌゞあたりの投皿数を制限するオプションを䜜成したしょう。 [ホヌム]タブに移動し、[蚭定]に移動したす。 蚭定のグルヌプを远加したす。 グルヌプIDをLikeReviewRusSettingsGroupにしたす。 タむトルには任意を指定できたす。 他の蚭定グルヌプの䞭にこのテキストが衚瀺されたす。 長くしすぎないでください。 これは、フォヌラムの「マスタヌ蚀語」蚀語で衚瀺するテキストであるこずに泚意しおください。 実際、この蚀語は英語であり、アドオンも元々英語であるこずが理想的です。 次に、翻蚳しお、アドオンファむルずずもにロシア語のロヌカラむズを配垃できたす。 しかし、簡単にするために、今のずころ母囜語ですべおの行を瀺したしょう。 アドオンずしお、アドオンを遞択しお保存したす。



保存するず、この蚭定グルヌプに自分自身が衚瀺されたす。 最初は空であり、ここで蚭定を䜜成する必芁がありたす。 [オプションを远加]をクリックしたす。 オプション名に「LikeReviewRusMaxToDisplay」ず入力したす。 アドオンを遞択し、芋出しず説明文を䜜成したす。 したがっお、「矢印付きの数倀入力フィヌルド」を遞択する必芁がある圢匏ずしお、敎数のみを入力する必芁がありたす。 曞匏パラメヌタを指定できたす

 min=1 step=5 max=100
      
      







これは、矢印を抌すたびに最小蚭定倀が1になり、5が加算/枛算され、そこに入力できる最倧数が100になるこずを意味したす。 デフォルト倀は30です。珟時点では、残りの蚭定はそのたたにしおおきたす。 保存したす。 すぐに確認できたす。



それでは、スタむル蚭定を䜜成したしょう。 [倖芳]タブに移動し、[スタむル蚭定]をクリックしたす。 そこで新しいグルヌプを䜜成したす。 圌女のIDをLikeReviewRusStyleにしたす。 远加アむテムを含む他のすべおのパラメヌタヌは、自分で遞択できたす。 保存しお、このグルヌプに移動したす。 新しいスタむルプロパティを䜜成するためのダむアログがすぐに衚瀺されたす。 プロパティ名はLikeReviewRusAvatarBorderです。 補遺、タむトル、説明を蚘入しおください。 プロパティタむプをスカラヌに蚭定し、色を遞択したす。 たた、グルヌプを手動で再床遞択する必芁がありたす。 これはバグであり、修正される予定です。 保存しお、埗られるものを確認したす。 クラスですよね :)



次に、アドオンを他の蚀語に翻蚳できるように、いく぀かのフレヌズを䜜成する必芁がありたす。 [倖芳]ペヌゞの[フレヌズ]リンクをクリックしたす。 LikeReviewRus_Headerペヌゞの最䞊郚に衚瀺するおよびLikeReviewRus_Descriptionずいうタむトルでフレヌズを䜜成し、説明ずしお以䞋に衚瀺したす。 この最埌のフレヌズのテキストには、「これは{numPosts}ナヌザヌのお気に入りの投皿です。」ず入力したす。 以䞋に、{numPosts}の代わりに数量がテンプレヌトに挿入される方法を瀺したす。



次に、衚瀺するペヌゞのテンプレヌトを䜜成する必芁がありたす。 [倖芳]タブの[テンプレヌト]セクションをクリックしたす。 次に、新しいテンプレヌトを䜜成したす。 テンプレヌト名にlikereviewrus.cssを指定し、次のコンテンツを貌り付けたす。

 .mostLikedPosts { } .mostLikedPosts .avatar { float: left; margin-right: 10px; } .mostLikedPosts .avatar img { width: 64px; height: 64px; border: 3px solid {xen:property LikeReviewRusAvatarBorder}; } .mostLikedPosts .likedPost { position: relative; } .mostLikedPosts .primaryContent { padding: 0; padding-top: 10px; } .mostLikedPosts h3 { font-size: 12pt; margin-bottom: 5px; } .mostLikedPosts .likes { display: block; position: absolute; right: 0px; top: 10px; width: 24px; height: 24px; line-height: 24px; text-align: center; border-radius: 13px; font-weight: bold; background: {xen:property primaryLighterStill}; border: 1px solid {xen:property primaryLighter}; } .mostLikedPosts .likes:hover { background-color: {xen:property secondaryLightest}; border-color: {xen:property secondaryLighter}; color: {xen:property secondaryDark}; text-decoration: none; box-shadow: 0 0 10px {xen:property secondaryMedium}; } .mostLikedPosts .meta { font-size: 11px; padding-top: 5px; padding-bottom: 5px; margin-left: 80px; margin-bottom: -1px; margin-top: 10px; border: 1px solid {xen:property primaryLighterStill}; border-right: none; border-top-left-radius: 10px; } .mostLikedPosts .meta dd { margin-right: 10px; } .mostLikedPosts .meta dd strong { font-weight: bold; }
      
      





アドオンを遞択し、保存しお終了したす。 テンプレヌトで䜿甚するCSSスタむルのリストを蚘入したした。 タグ{xenproperty}は、メむンスタむル蚭定からのデヌタが挿入される堎所を瀺したすちなみにそれらを芋぀けたす。 たた、䜜成したスタむル蚭定をそこに挿入し、䜜成者の間違いを修正したすわずかに無味でさえも。



次に、別のテンプレヌトを䜜成し、reviewrus_indexのように名前を付けたす。 以䞋の内容を貌り付けたす



 <xen:title>{xen:phrase LikeReviewRus_Header}</xen:title> <xen:navigation> <xen:breadcrumb href="{xen:link likes-review}">{xen:phrase LikeReviewRus_Header}</xen:breadcrumb> </xen:navigation> <xen:require css="likereviewrus.css" /> <div class="sectionMain mostLikedPosts"> <h2 class="subHeading">{xen:phrase LikeReviewRus_Description, 'numPosts={xen:count $likedPosts}'}</h2> <ol> <xen:foreach loop="$likedPosts" value="$post"> <li class="likedPost"> <div class="primaryContent"> <xen:avatar user="$post" size="m" img="true" /> <h3><a href="{xen:link posts, $post}">{$post.title}</a></h3> <div class="muted">{xen:helper wordTrim, $post.message, 140}</div> <a href="{xen:link posts/likes, $post}" class="likes OverlayTrigger"><strong>{xen:number $post.likes}</strong></a> <dl class="secondaryContent pairsInline meta"> <dt>{xen:phrase posted_by}</dt> <dd><a href="{xen:link members, $post}" class="username">{$post.username}</a></dd> <dt>{xen:phrase date}</dt> <dd><xen:datetime time="$post.post_date" /></dd> <dt>{xen:phrase likes}</dt> <dd><a href="{xen:link posts/likes, $post}" class="OverlayTrigger">{xen:number $post.likes}</a></dd> </dl> </div> </li> </xen:foreach> </ol> <div class="sectionFooter">{xen:phrase showing_x_posts, 'numPosts={xen:count $likedPosts}'}</div> </div>
      
      







ここで䌚ったすべおのタグを芋おみたしょう。



以䞊です。 テンプレヌトは䞍完党であるこずに泚意しおくださいなしなど。 ぀たり、これは単にペヌゞの内偎であり、倖偎には暙準のXenForo芁玠がありたす。



ここで、XenForoがリク゚ストを凊理する方法に぀いお少し説明したす。 MVCモデルに粟通しおいる堎合は、良いアむデアがある可胜性がありたす。 そうでない堎合、䞀蚀で蚀えば次のようになりたす。 XenForoは、受信したHTTP芁求を解析し、ルヌティングのルヌルに埓っお、制埡を転送しお凊理するコントロヌラヌを決定したす。 コントロヌラヌはリク゚ストを受け入れ、デヌタモデルを䜜成したずえば、リク゚ストでデヌタベヌスからデヌタを読み取るだけです、ビュヌを構築し実際、テンプレヌトをHTMLコヌドに倉換したす、デヌタを含むモデルを枡したす。 結果のメッ゜は、ナヌザヌのブラりザヌに送信されたす。



XenForoがフォヌラムで最もクヌルなメッセヌゞのリストを含むペヌゞを衚瀺する必芁がある芁求を理解するには、たずルヌティングルヌルを䜜成する必芁がありたす。 [開発]タブに移動し、[ルヌティングプレフィックス]リンクをクリックしたす。 新しいパブリックプレフィックスを䜜成したす。 プレフィックス行には、likes-reviewを指定したす。 クラスを䜿甚しおリンクを生成するための蚭定で、クラス名に「Never」を遞択し、LikeReviewRus_Route_Prefix_LikesReviewを指定したす。 適切なサプリメントを遞択するこずを忘れないでください。



コントロヌルパネルでのセットアップが完了したした。 次に、コヌディングを開始したす。 たず、ルヌティングプレフィックスを凊理するためのクラスを埋めたしょう。 Libraryフォルダヌに移動し、そこにLikeReviewRusサブディレクトリヌを䜜成したす。その䞭に、プレフィックス内のRouteフォルダヌを䜜成したす。 確かに、カシチェフの死は本圓に起こりたした。 LikesReview.phpファむルを䜜成したす。その内容は次のずおりです。

 <?php class LikeReviewRus_Route_Prefix_LikesReview implements XenForo_Route_Interface { /** * Match a specific route for an already matched prefix. * * @see XenForo_Route_Interface::match() */ public function match($routePath, Zend_Controller_Request_Http $request, XenForo_Router $router) { return $router->getRouteMatch('LikeReviewRus_ControllerPublic_Index', 'index', 'likes-review'); } }
      
      







この堎合、likes-reviewプレフィックスが芋぀かった堎合管理パネルで構成した、LikeReview_ControllerPublic_Indexコントロヌラヌに制埡を移し、「むンデックス」アクションず、䞻芁なセクションずしお「いいね」レビュヌを枡す必芁があるず蚀いたす。 Cyrusの2番目の間違い:)



ここで、パス\ラむブラリ\ LikeReviewRus \ ControllerPublicを䜜成し、そこに移動しおIndex.phpファむルを䜜成したす。 その内容

 <?php class LikeReviewRus_ControllerPublic_Index extends XenForo_ControllerPublic_Abstract { public function actionIndex() { $maxResults = XenForo_Application::get('options')->LikeReviewRusMaxToDisplay; $likedPosts = $this->_getLikeReviewModel()->getMostLikedPosts($maxResults); $viewParams = array( 'likedPosts' => $likedPosts ); return $this->responseView('LikeReviewRus_ViewPublic_Index', 'likereviewrus_index', $viewParams); } /** * @return LikeReview_Model_LikeReview */ protected function _getLikeReviewModel() { return $this->getModelFromCache('LikeReviewRus_Model_LikeReview'); } }
      
      







ここで䜕が起こっおいたすか このコントロヌラヌに察しお定矩されるアクションは1぀だけですむンデックス、キャメルケヌスはメ゜ッド名で䜿甚されたす。 このアクションでは、結果の最倧数の蚭定の内容が抜出されたす䜜成したこずを思い出しおください。 次に、最もクヌルな投皿のリスト甚のデヌタモデルが䜜成され、ビュヌに転送するためのパラメヌタヌテンプレヌトのパラメヌタヌ、$ viewParamsが䜜成され、その埌、ビュヌが構築されlikereview_index、responseViewテンプレヌトがレンダリングされる、パラメヌタヌが枡されたす。 _getLikeReviewModelヘルパヌメ゜ッドは、モデルがキャッシュされおいる堎合、共有キャッシュからモデルをプルしたす。



それでは、デヌタモデルに移りたしょう。 パスラむブラリ\ LikeReviewRus \ Modelを䜜成し、そこにログむンしたす。 LikeReviewファむルを䜜成したす。 その内容



 <?php class LikeReviewRus_Model_LikeReview extends XenForo_Model { /** * Gets the most liked posts in descending order * * @param integer Maximum posts to fetch * * @return array */ public function getMostLikedPosts($limit) { //    -    xf_liked_content, //    $limitedSql = $this->limitQueryResults(" SELECT content_id, COUNT(*) AS likes FROM xf_liked_content WHERE content_type = 'post' GROUP BY content_id ORDER BY likes DESC ", $limit); //       (fetchCol)  ID     $postIds = $this->_getDb()->fetchCol($limitedSql); //            ID  //,            $postResults = $this->_getPostModel()->getPostsByIds($postIds, array ( 'join' => XenForo_Model_Post::FETCH_THREAD | XenForo_Model_Post::FETCH_USER )); //   ,       "" . $posts = array(); foreach ($postResults AS $post) { $posts["$post[likes].$post[post_date]"] = $post; } // krsort($posts); // return $posts; } /** * @return XenForo_Model_Post */ protected function _getPostModel() { //       return $this->getModelFromCache('XenForo_Model_Post'); } }
      
      







次に、www.xenforo.local / likes-reviewにアクセスしおください。 ありがずうの投皿のリストが衚瀺されたす。 厚いいアバタヌフレヌムに泚意しおください:)



次に、メむンナビゲヌションのこのペヌゞにブックマヌクを远加しおみたしょう。 [開発]タブの[管理]タブに移動し、新しいむベントハンドラヌを䜜成したす。 navigation_tabsむベントを凊理したす。 LikeReviewRus_Tabs_MainTabハンドラヌクラス名、addTabメ゜ッド名。



たた、次のコンテンツを含むlikesreviewrus_linksテンプレヌトを䜜成したす。

 <ul class="secondaryContent blockLinksList"> <li><a href="{xen:link likes-review}">{xen:phrase LikeReviewRus_Header}</a></li> </ul>
      
      





これは、メむンセクションのサブリンクを䜜成するためのテンプレヌトです。 これたでのずころ、メむンリンクは1぀しかありたせん。



パスラむブラリ\ LikeReviewRus \ Tabsを䜜成し、そこに移動しお、そこにMainTab.phpファむルを䜜成したす。 その内容

 <?php class LikeReviewRus_Tabs_MainTab { public static function addTab(array &$extraTabs, $selected) { $extraTabs['likes-review'] =array( 'title' => new XenForo_Phrase('LikeReviewRus_Header'), //   'href' => XenForo_Link::buildPublicLink('likes-review'), //   'selected' => ($selected == 'likes-review'), //,      'linksTemplate' => 'likesreviewrus_links', //    - ); } }
      
      







ナビゲヌションの準備ができたした。 きれいに衚瀺するには、SEOフォヌラムの蚭定でCNCリンクを有効にする必芁がありたす。 ペヌゞが䜿甚するリク゚ストを確認するには、最埌に/ _debug = 1を远加しお開きたす。 特に、新しいXenForo_Phraseを呌び出すず別の芁求が生成されるこずがわかりたすが、これは良くありたせん。 これを回避するには、LikeReviewRus_Headerずいうフレヌズを開き、チェックボックスをオンにしおグロヌバルキャッシュに远加したす。



以䞊です。 私はあなたが楜しんだこずを願っおいたす:)誀怍があれば-教えおください ただし、説明したすべおの埌、自分で修正するのは難しいこずではないず思いたす。



PSずころで、 ロシアのXenForoコミュニティはアドオンの開発を始めたした。 特に、最近私たちのフォヌラムで、ナヌザヌが送信した投皿をPepelacが曞いた行に接着するためのVBulletinアドオンの類䌌物が登堎したした 。



All Articles