BitrixFrameworkすべおを自分の手に

こんにちは



Bitrixのトピックに関する私からの別の自殺蚘事は、今回はhabrabsocietyがより寛倧になるこずを願っおいたす 実際には、コヌド、スキヌム、ホリバヌなしですべおがここにあり、すべおが公平です。



この蚘事では、BitrixFrameworkの代替案を怜蚎したす。これは、開発者の䜜業を楜にし、Bitrix CMSの開発に䜕らかの圢で正しい方向に圱響を䞎えるように蚭蚈されおいたす。



嫌いな人ぞの察応通垞の批刀ず、カルマぞのトピックに関するコメントを曞く堎合、個人的に送信したす;-)。 皮のVolfycha、内郚のすべおが興味深い...







たず、すべおの「i」にドットを付けたしょう



以䞋に曞かれおいるこずはすべお私の個人的な意芋であり、スリッパに萜ち着いお投げるこずができたすが、私は正しいず確信しおいたす



  1. 「Bitrixには100䞇行のたわごずがありたす」 -はい、間違いありたせん。 党䜓の問題は、Bitrixが䞋䜍互換性をサポヌトしおいるこずですバヌゞョン12.0から16.5に曎新するず、すべおが正垞に機胜するはずです。 なぜ圌らがこれをするのか、私にはわかりたせん私には誰も知らないようです。 暙準コンポヌネントの゜ヌス情報ブロック芁玠を衚瀺するための2K行のコヌド-物事の順序に぀いお話すず、連䞭ぱンドナヌザヌが䜿いやすくするこずを決定し、想定できるすべおのものを提䟛したしたこれは事実ではありたせん。必芁なずきに。 さお、远い぀くために、最近のセミナヌで、Bitrix開発者はPSRに察する態床を発衚したした「たあ、このPSRずは䜕か、私はそれを読んで、䜕人かの男が集たっおゎミを曞きたした」正確な匕甚ではありたせん。 したがっお、コヌドは垞に臭いがしたす。
  2. 「Bitrixにはひどい構造がありたす」 -そうではありたせん。 Bitrixはファむルベヌスであり、MVCの理解は䞀般に受け入れられおいるものずは異なり、倚くの堎合、「MVCではない」=「ホラヌホラヌずは䜕かの構造」です。 したがっお、これは非垞に物議をかもし、物議を醞す問題です。 そしお、あなたはBitrix構造で生きるこずができたす。
  3. 「BitrixFrameworkは決しお発展しない」 -これが私の意芋であり、ここに理由がありたす。リリヌスごずに、Bitrixは「Shop」モゞュヌルのみをファむナラむズし、いく぀かの倉曎を行いたすが、それらはすべおストアを察象ずしおいたす。 圌らは率盎に蚀っお残りを気にしたせん。 BFの開発は、䞋䜍互換性を攟棄し、Shopモゞュヌル以䞊のものを扱うようになったずきに始たりたす。


ゞャガヌノヌトに䌚おう



確かに倚くの人がこのキャラクタヌに粟通しおいたすDotaからではなく、Marvelから。圌は「やめられない」。 少し哀れな名前は、実際、このプロゞェクトの本質を反映しおいたす。それは、Bitrixの開発方法、導入されたむノベヌション、ラむブラリの存続ず繁栄にたったく関係ありたせん。



Bitrixはナヌザヌを察象ずしおいたす。 Juggernautは開発者向けです。



なぜこれが必芁なのですか



必芁だから 実際にはすべおが非垞に論理的です





バヌゞョン14からは、バヌゞョン14の叀いカヌネルのサポヌトを終了し、新しい「しかし、顧客ぞの配慮」に重点を眮く必芁がありたした。 でたらめ。 これは、Yii2がYii1をサポヌトしお組み合わせた堎合も同じです。



Bitrixは進歩を遂げおいないため、コミュニティは泣き蚀、Ideaサヌビスぞの曞き蟌み、暙準コンポヌネントを䜿甚したねじれの代わりにそれを行いたす。



Scられたビトリックス、今、ゞャガヌノヌトのレビュヌを始めるこずができたす。 次に、ラむブラリの構成郚分の抂芁ずその䜿甚方法の簡単な説明を開始したす。



コンポヌネント



コンポヌネントは、Bitrix Webサむトの構築元ずなるブリックです。 コンポヌネントは条件付きで2぀のカテゎリに分類されたすりィゞェットずルヌタヌBitrix衚蚘では「通垞」ず「耇雑」。



りィゞェット



りィゞェットは、愚かなこずに1぀の基本的なタスクを実行するフォヌム、リスト、情報を衚瀺するコンポヌネントです。 りィゞェットは入力を受け取り、䜕らかの方法でそれを倉換したす。 圌は他に䜕もするべきではありたせん。 りィゞェットはルヌティングを制埡したせんが、䜿甚できたす。



コンポヌネント実行のデフォルトの順序





順番に





ほずんどの堎合、単にinitResultメ゜ッドをオヌバヌラむドし、コンポヌネントテンプレヌトをスロヌしたす。



以䞋は、infoblock芁玠のリストを衚瀺するコンポヌネントクラスclass.phpの䟋です。 入力で、パラメヌタヌの配列$ paramsを受け取りたす。これは、デヌタのフィルタヌ凊理ず䞊べ替えに䜿甚されたす。



コヌド
<?php namespace Widget\Iblock\Element\List_; use Jugger\Db\Orm\Ib\IblockElement; use Jugger\Component\WidgetComponent; class Component extends WidgetComponent { /* *    'init', *    $arParams     , *   : $this->params = $arParams['params'] */ public $params = []; /* *  ,    *   ,    */ protected function init() { parent::init(); $this->isCachingTemplate = true; } /* *     */ protected function initResult() { $this->arResult['elements'] = IblockElement::getList($this->params); } }
      
      







ルヌタヌ



ルヌタヌのタスクは、りィゞェットを䞀緒に収集するこずです。 ルヌタヌ-ナヌザヌ芁求REQUEST_URIに基づいお、察応するアクションを呌び出すコントロヌラヌです。 アクションは、情報を含むペヌゞりィゞェットを含むか、䜕らかのロゞックを含むこずができたす。



コンポヌネント実行のデフォルトの順序





順番に





以䞋は、ディレクトリを実装するコンポヌネントの䟋です。



コヌド
 <?php namespace Widget\Iblock\Element\Catalog; use Jugger\Db\Orm\Ib\IblockElement; use Jugger\Db\Orm\Ib\IblockSection; use Jugger\Component\RouteComponent; class Component extends RouteComponent { /* * ID ,   */ public $iblockId; /* *  ,            *  ,        'aliases' */ protected function getAliases() { return [ "sectionList" => "index.php", "elementList" => "#SECTION_CODE#/", "elementView" => "#SECTION_CODE#/#ELEMENT_CODE#/" ]; } /* *    ,   */ protected function onBefore($action) { if (!$this->iblockId) { throw new \Exception("  'iblockId' ". get_called_class()); } return parent::onBefore($action); } /* *       */ protected function getSection($sectionCode) { return IblockSection::getRow([ "filter" => [ "IBLOCK_ID" => $this->iblockId, "CODE" => $sectionCode ], ]); } /** *    */ public function actionSectionList() { $sectionList = IblockSection::getListByField( "=IBLOCK_ID", $this->iblockId, [ "order" => ["SORT" => "ASC"] ] ); $this->arResult['sectionList'] = $sectionList; $this->render('list'); } /** *     *  $sectionCode    URL */ public function actionElementList($sectionCode) { $section = $this->getSection($sectionCode); if (!$section) { $this->error404(); } // $this->arResult['section'] = $section; $this->arResult['elementList'] = $section->getElements(); $this->render('section'); } /** *    *      ,       'aliases' */ public function actionElementView($sectionCode, $elementCode) { $section = $this->getSection($sectionCode); if (!$section) { $this->error404(); } // $element = IblockElement::getRow([ "filter" => [ "IBLOCK_ID" => $this->iblockId, "IBLOCK_SECTION_ID" => $section->ID, "CODE" => $elementCode, ], ]); if (!$element) { $this->error404(); } $this->arResult['element'] = $element; $this->arResult['section'] = $section; $this->render('view'); } }
      
      









クラスの自動ロヌド



これは非垞に必芁なこずであるこずはすでに明らかであるため、この問題に぀いおはあたり話さないでしょう。



Juggernautによっお実装されたずおり



「lib」フォルダヌでは、次の構造を確認する必芁がありたす。クラスファむルの名前は、拡匵子ず䞊䜍名前空間を含たず、名前空間名ず同じです。 たずえば、クラス「Iblock \ Property \ Table」は、ファむル「... / modules / Iblock / lib / Property / Table.php」に察応したす。



「includeModule」を呌び出す必芁がなくなりたした 必芁に応じお、すべおのクラスが必芁なディレクトリから自動的にロヌドされたす。

モゞュヌルのディレクトリが名前空間の名前ず異なる堎合、たたはその他の状況では、名前空間ずディレクトリの察応を手動で蚭定できたす。



 //  "Jugger\D7\Iblock"    "./lib/D7/Iblock.php" –      \Jugger\Psr\Psr4\Autoloader::addNamespace('Jugger', __DIR__.'/lib'); //  "Jugger\D7\Iblock"    "./classes/Iblock.php" \Jugger\Psr\Psr4\Autoloader::addNamespace('Jugger\D7', __DIR__.'/classes');
      
      







Bitrixにもオヌトロヌドがありたすが、パスの圢成方法が少し異なりたす。



クラス「Olof \ Catalog \ Tools \ File」は「/Olof.Catalog/lib/Tools/File.php」ず翻蚳されたす。



クラス「Olof \ Catalog」が必芁な堎合は、すみたせん、手動でその存圚を瀺したす以䞋を参照。 モゞュヌルディレクトリには、区切り文字「。」が必芁です。それ以倖の堎合は、フォレスト内を歩きたす。 ディレクトリ "olof.catalog.iblock"の内容-間違っおいたす。



Bitrixの玳士は実際に通垞のこずをしたした。圌らはモゞュヌル名でベンダヌを指定するのを面倒をみたしたが、これはディレクトリに名前を付けるための䜙分な条件だず思いたす。



自動ロヌドは、接尟蟞を削陀しお「element.php」ファむルに倉換するこずにより、「ElementTable」タむプのクラスに暗黙的に応答したす。 実際、このため、Tableずいうクラスを䜜成するこずはできたせん。



たた、珟圚接続されおいないモゞュヌルincludeModuleからクラスをロヌドするこずはできたせん。



Bitrixオプションの䟋を考えおみたしょう。モゞュヌル「olof.iblock」ず察応するinclude.phpファむルがありたす。



 namespace Olof\Iblock; use Bitrix\Main\Loader; //   Loader::includeModule("Olof.Iblock"); //      Api Loader::registerAutoLoadClasses("Olof.Iblock", [ "\Olof\Classes\Api" => ". /modules/Olof.Iblock/classes/api.php", ]); //    : // Olof\Iblock\Element -> ./modules/Olof.Iblock/lib/Element.php // Olof\Classes\Api -> ./modules/Olof.Iblock/classes/api.php // Olof\Classes\Help -> ./modules/Olof.Classes/lib/Help.php
      
      







私の意芋では、暗黙の事柄や条件が倚すぎたす。 そしお、明日、Bitrixがどんな愚かさを思い付くのか誰も知らない。 そしお、PSR-4のように、ネヌムスペヌスプレフィックスのディレクトリを瀺す必芁があり、その埌はクヌルになりたす。 それたでの間、ゞャガヌノヌトがいたす;-)



アクティブレコヌド



゚ンティティ、特に情報ブロックを操䜜するために、ActiveRecordテンプレヌトが実装されおいたす。 珟時点では、ARはBitrix DataMappersに基づいおおり実際にはアドオン、将来的には完党に独立したORM / DAOに移行する予定です。



以䞋は、ARを介しおむンフォブロックを操䜜する䟋です。実際に珟圚利甚可胜なすべおの方法がカバヌされおいたす。



コヌド
 use Jugger\Db\Orm\Ib\Iblock; use Jugger\Db\Orm\Ib\IblockSection; use Jugger\Db\Orm\Ib\IblockElement; /* *   */ $iblock = Iblock::getByPrimary(1); $iblock = Iblock::getRowByField("=ID", 1); $iblock = Iblock::getRow([ "filter" => [ "=ID" => 1, ], ]); $iblock = new Iblock($iblock); /** *    ,      */ $iblock->NAME; $iblock->IBLOCK_TYPE_ID; /** *     */ $iblock->getElements(); $iblock->getSections(); /* *    */ $sectionList = $iblock->getSections(); $sectionList = $iblock->getSections([ "order" => [ "NAME" => "ASC", ], ]); $sectionList = IblockSection::getListByField("=IBLOCK_ID", $iblock->ID); $sectionList = IblockSection::getList([ "filter" => [ "=IBLOCK_ID" => $iblock->ID, ], ]); /* *    */ $section = new IblockSection($sectionList->fetch()); $section->getChilds(); //   1-   $section->getChilds(2); //    2-   ( ,    ) $section->getChilds(0); //    $section->getIblock(); //   /* *    */ $elementList = $section->getElements(); while($element = $elementList->fetch()) { /* *    AR      */ $element = new IblockElement($element); $element->getProperties(); //   /* *    */ $elementProperty = $element->getProperty(1); /* *   (  ) */ $value = $elementProperty->VALUE; $value = $elementProperty->getValue(); /* *       , *           */ $elementProperty->getValueRaw(); //    $elementProperty->getValueEnum(); // IblockPropertyEnum -    (L) $elementProperty->getValueFile(); // CFile::GetFileArray $elementProperty->getValueHtml(); // (string) HTML  $elementProperty->getValueElement(); // IblockElement -   (E) $elementProperty->getValueSection(); // IblockSection -   (G) $elementProperty->getValueNumber(); // (float)  (int)     /* *    */ $property = $elementProperty->getMeta(); $property->NAME; $property->HINT; }
      
      









メ゜ッド getPrimary 、 getRow 、 getRowByField 、 getList 、 getListByField-すべおのActiveRecordで同䞀です。



ARの機胜は珟圚かなり貧匱ですたずえば、テヌブルにクロスサヌチはありたせんが、それらは暙準関数のラッパヌであるため、getListおよびgetRowメ゜ッドでBitrixバンを䜿甚できたす。 通垞のDAOを䜜成/借甚した埌、この瞬間は完了したす。



遺産



Bitrixの匷みは、倚くの人が同意するず思いたすが、そのナヌザヌむンタヌフェむス、぀たりHermitageです。 非垞に䟿利で柔軟です。



以䞋は、゚ルミタヌゞュの䜿甚䟋です。



コヌド
 use Jugger\Db\Orm\Ib\IblockSection; use Jugger\Db\Orm\Ib\IblockElement; use Jugger\Ui\Hermitage; use Jugger\Ui\Hermitage\Icon; use Jugger\Context\UrlManager\Iblock; /* @var $this CBitrixComponentTemplate */ /* @var $component CBitrixComponent */ /* *   ""  ""     */ $element = IblockSection::getByPrimary(1); Hermitage::addButtonEditIblockElement($this, $element); Hermitage::addButtonDeleteIblockElement($this, $element); $section = IblockSection::getByPrimary(1); Hermitage::addButtonEditIblockSection($this, $section); Hermitage::addButtonDeleteIblockSection($this, $section); /* *      */ Hermitage::addButton( $component, Iblock::getElementCreateUrl(1), " ", [ "ICON" => Icon::TOOLBAR_CREATE, ] ); /* *      */ Hermitage::addPanelButton("#", "", [ "ICON" => Icon::PANEL_TRANSLATE, ]);
      
      









非垞に賞賛され、曞かれおいるこずはほずんどありたせん実際、これはナヌザヌずの察話に十分です。 管理むンタヌフェむスに関しお倚くの実装が必芁ですが、これはもはやHermitageではなく、これはすべお蚈画に含たれおいたす。



安党性



私がBitrixで知っおいる限りそしお、この問題でそれを隠したせん、私は実際にそれを回避したせんでした、それはサむトセキュリティコヌド内で䞀般的に悲しいですSI保護のみ。 将来、このセクションには、さたざたな攻撃や悪意のあるアクションXSS、ランダムデヌタ生成、さたざたな暗号化機胜、フォヌム怜蚌、パスワヌドの操䜜などから保護するためのツヌルが含たれたす。 珟時点では、CSRF保護ツヌルのみが実装されおいたす。



 use Jugger\Security\Csrf; /* * ""  */ if (Csrf::validateTokenByPost()) { // ok } else { // error } echo Csrf::printInput(); /* * ""  */ $nameField = "csrf"; $token = Bitrix\Main\Context::getCurrent()->getRequest()->getPost($nameField); if (Csrf::validateToken($token)) { // ok } else { // error } $token = Csrf::createToken(); echo "<input type='hidden' name='{$nameField}' value='{$token}'>";
      
      







各チェックの埌成功たたは倱敗-トヌクンはセッションから削陀されるため、トヌクンは1回しかチェックできたせん。



Urlmanager



Bitrixぞのルヌティング、私は高床で、それゆえこの゚リアはゞャガヌノヌトでも圱響を受けおいるずは蚀いたせん。 このクラスを䜿甚するず、URLルヌトルヌタヌコンポヌネントで䜿甚を動的に䜜成しお䜿甚できたす。



URLの解析ず生成の䟋を考えおみたしょう。



コヌド
 use Jugger\Context\UrlManager; /* *   URL   */ UrlManager::setBaseUrl("/catalog"); UrlManager::addAlias("sectionList", "index.php"); UrlManager::addAlias("elementList", "#SECTION_CODE#/"); UrlManager::addAlias("elementView", "#SECTION_CODE#/#ELEMENT_CODE#/"); /* *   'alias'    * ,   '/catalog/section1/element1/'    'elementView' */ $alias = UrlManager::parseRequest(); /* *     (   UrlManager   ,     ) */ $folder404 = "/catalog"; $arUrlTemplates = [ "sectionList" => "index.php", "elementList" => "#SECTION_CODE#/", "elementView" => "#SECTION_CODE#/#ELEMENT_CODE#/", ]; $arVariables = []; // UrlManager::$params CComponentEngine::parseComponentPath($folder404, $arUrlTemplates, $arVariables); /* *      */ UrlManager::addParams([ "param1" => "value1", "param2" => "value2", ]); /* *   URL. *        . *     "ELEMENT_CODE" -    */ UrlManager::addParam("SECTION_CODE", "section1"); $url = UrlManager::build("elementView", [ "ELEMENT_CODE" => "element1", ]); // $url: /catalog/section1/element1/
      
      









将来的には、 urlRewrite.phpに接続するこずも蚈画されおいたす 。



むベント



このクラスは、D7の機胜の単なるラッパヌであり、より䟿利に䜿甚できたす。



 use Jugger\Helper\Event; /* *   */ Event::on(" ", function(){ //  }); Event::on(" ", "\ClassName::MethodName", "moduleName"); /* *   */ Event::off(" "); Event::off(" ", 3); //  4-   ( )  /* *   */ Event::trigger(" "); /* *      () */ Event::trigger(" ", $this);
      
      







次は



近い将来の蚈画





おわりに



倚くのこずが蚈画されおいたすが、倚くのこずが行われおいたせん。 ラむブラリは必芁に応じお開発されるため、珟圚の泚文倚くの堎合同じタむプず空き時間に倧きく䟝存したす。



冒頭で述べたように、プロゞェクトはすべおにもかかわらず開発されたす。開発の速床のみが、䜜成者ず関係者の数に䟝存したす。 したがっお、遞択はあなた次第です。



あなたが必芁ずするこのために、垌望する慈善家は助けるこずができたすそうでなければ、方法はありたせん



このプロゞェクトはGitHubにあるため、誰でも線集、远加、コメント、質問ができたす。



ご枅聎ありがずうございたした 建蚭的な批刀は倧歓迎です:-)



PSは、「FIG Bitrixのはい」のような、曞き蟌みをしないずいう巚倧な芁求をコメントしおいたす。 私は人々がこのシステムで䜕をしなければならないかを知っおいたす、そしお、このプロゞェクトはちょうどそれを改善するこずを目指しおいたす。 したがっお、「任意のフレヌムワヌクでプロゞェクトを䜜成する方がより簡単で簡単だ」ず思う堎合、これを知っおおり、あなたにずっお非垞に満足しおいるので、あなた自身の意芋を残しおください。 よろしくお願いしたす



リポゞトリ github.com/irpsv/juggernaut.bitrix_release

マヌケットプレむス近日公開



All Articles