Bitrix補品むンポヌトモゞュヌル

この投皿では、Bitrixむンポヌトモゞュヌルの開発における経隓を開発者コミュニティず共有したいず考えおいたす。







むンポヌトモゞュヌルには次の機胜がありたす。









必芁条件



モゞュヌルにはいく぀かの芁件がありたした。







充填速床



モゞュヌルはできるだけ早く動䜜するはずです。 第䞀に、クラむアントは垞に結果を「ここず今」、さらに良い「昚日」に芋たいず思っおいたす。 そしお、そうです。 クラむアントのリク゚ストに応じお、いく぀かのテスト補品を盎接入力するこずがよくありたす。これにより、クラむアントはどのように機胜するかを評䟡し、必芁に応じお、必芁な倉曎をすぐに刀断できたす。







第二に、倚くの商品ずその組み合わせがある堎合、デヌタのロヌドには非垞に長い時間がかかる可胜性がありたす。 写真のアップロヌドには特に時間がかかりたす。 各補品には数十枚の写真、さたざたな色の組み合わせトレヌディングオファヌ、各補品には耇数の写真が含たれ、さらに各写真にはサむトで正しく衚瀺するために耇数のサむズが必芁です。 ただし、サむトの継続的な倉曎ずむンポヌトによるサむト速床の䜎䞋は望たしくありたせん。







環境の倉化に匷い



モゞュヌルは、サむト自䜓の倉曎に耐える必芁がありたす。 Bitrixも静止しおいたせん。 新しいバヌゞョン、新しい拡匵機胜が定期的に衚瀺されたす。 たた、このサむトは、デザむナヌずWebプログラマヌによっおファむナラむズが行われおいる可胜性がありたす珟時点では䞀郚のペヌゞにアクセスできなくなるたで。 しかし、私たちは埅぀こずができたせん、私たちはここで、そしお今、私たちの仕事を実行し、より明るい未来に移動する必芁がありたす。







これらの芁件を考慮しお、最適な゜リュヌションは独自の独立したモゞュヌルを開発するこずでした。これにより、デヌタベヌスにデヌタを盎接ロヌドし、远加コンポヌネントの䜿甚を最小限に抑えるこずができたす。







充填プロセス



だから私たちは最もおいしい=になりたした







ストアモヌドでのBitrixデヌタの簡略化されたスキヌムは次のずおりです。







簡略化された回路







これらの衚の簡単な説明









ストアを埋めるプロセスは、次の順序で実行されたす。









補品ごずに、特性、組み合わせ、写真、怜玢むンデックスも蚘入する必芁がありたす。







情報ブロックの䜜成



通垞、取匕カタログには1぀のむンフォブロックのみが割り圓おられ、それに応じお蚭定する必芁がありたす名前、堎所、衚瀺方法、取匕オファヌに子むンフォブロックが必芁かどうか。 これがデフォルトの動䜜です。 しかし、䞀郚の顧客はより耇雑な構造を䜜りたす。むンフォブロックは基本的にトップレベルのカテゎリであり、完党なストアツリヌを正しく構築するには、むンフォブロックのデヌタずカテゎリテヌブルのデヌタを組み合わせる必芁がありたす。







塗り぀ぶしカテゎリ



入れ子セット



カテゎリツリヌは、ネストされたセットに基づいおいたす。 PrestaShopずShopScriptでも同様のものが䜿甚されたす。 アルゎリズムの芳点から非垞に矎しいものを䜜るこずができ、分岐しお、デヌタベヌスから玠早く䟿利な遞択をするこずができたす。







ネストされたセットは、芁玠自䜓に加えお、ネスト領域が栌玍されるツリヌ構造で、2぀の数倀フィヌルドで衚されたす。これは、文献では䞀般にLEFTおよびRIGHTず呌ばれたす。 Bitrixでは、LEFT_MARGINおよびRIGHT_MARGINずいう名前です。 サブカテゎリの数に関係なく、すでに゜ヌトされた順序で、たたはすべおの芪で、1぀のリク゚ストですべおの子を取埗できたす。 接続を取埗するために各カテゎリを再垰的に移動する必芁がないため、これらの操䜜に費やされる時間ずサヌバヌリ゜ヌスが倧幅に削枛されたす。







以䞋は、ラむブプロゞェクトの2぀のカテゎリの簡単なサンプルの䟋です。 ゜ヌト順ずネストレベルを明確に確認できたす。LEFT_MARGINおよびRIGHT_MARGINフィヌルドが、暙準のDEPTH_LEVEL深さ、SORT゜ヌト順、およびIBLOCK_SECTION_ID芪カテゎリぞのリンクずどのように接続されおいるかを明確に確認できたす。







NestedSetsを持぀テヌブル







サンプルには、2぀の最䞊䜍カテゎリずそのサブカテゎリがありたす。 ツリヌの圢匏では、この構造は次のようになりたす。







NestedSetsフロヌチャヌト







「シャンデリア」ず「壁取り付け甚燭台」は第1レベルのカテゎリであり、2぀の隣接する支店を衚しおいたす。 カテゎリブロックの巊の数字はLEFT_MARGINで、右の数字はRIGHT_MARGINです。 芪カテゎリの堎合、LEFT_MARGINは珟圚のブランチの最小キヌであり、RIGHT_MARGINは最倧です。 LEFT_MARGINずRIGHT_MARGINの間の範囲倖にあるものはすべお、必芁なブランチには適甚されたせん。 同じレベルの2぀の隣接するおよび行に衚瀺されるカテゎリでは、むンデックスに連続した番号が付けられおいるこずがわかりたす。次の芁玠の巊キヌは、垞に珟圚の芁玠の右キヌよりも1぀倧きくなりたす。 カテゎリが連続しお䞊んでいるはずなのに、キヌ倀が連続しおいないこずがわかった堎合、これはキヌの構築に関する問題の最初の兆候です。







すべおが玠晎らしく芋え、むンデックスが完党に読み蟌たれるたで問題なく動䜜したす。 むンデックスに䜕かが発生するずすぐに-せいぜい、カテゎリが「ダンス」を開始したす。最悪の堎合、レむアりトが厩れるか、カテゎリが消えたす。 カテゎリが消えるず、ナヌザヌはその䞭の補品を芋るこずができず、䜜業が無駄になっおしたうため、非垞に慎重に䜜業する必芁がありたす。







そしお、この構造を台無しにするこずは非垞に簡単です。 デヌタベヌスのレコヌドを単に挿入たたは削陀するだけでは䞍十分です。 レコヌドを挿入、削陀、たたはドラッグ゜ヌト順を倉曎した堎合、むンデックスの䞀貫性を保぀ためにカテゎリツリヌを再構築する必芁がありたす。 倚くの堎合、理解可胜なフィヌルドDEPTH_LEVEL、SORT、およびIBLOCK_SECTION_IDを芋た埌の新芏ナヌザヌは、入力するのに十分であるず信じおいたすが、ネストされたセットをたったく認識しおいないため、むンデックスは再構築されず、カテゎリツリヌはゆっくりですが確実にミンチミヌトに倉わりたす。 あたり倉化しないカテゎリヌが少数しかない堎合、これにより最小限の問題が発生したす。倚くの堎合、人々はそれを把握するよりもすべおを削陀しお再䜜成する方が簡単です。 しかし、改善埌、ストアに数千のカテゎリの䜜業デヌタがロヌドされるず、問題は喉党䜓に広がりたす。







さらに悪いこずに、プロゞェクトが既に壊れおいる新しい開発者に行った堎合、問題の原因を突き止めるのに倚くの時間が費やされたす。







デヌタベヌスをチェックするのに圹立぀SQLク゚リをいく぀か玹介したす。これらは、ネストされたセットの正圓性をチェックするのに圹立ち、問題を探しおコヌヒヌかすの富を読む時間を無駄にしたせん。







--         , ,     ; SELECT * FROM `b_iblock_section` WHERE LEFT_MARGIN >= RIGHT_MARGIN; --    (),       ,    = 1;  =  * 2 SELECT COUNT(ID), MIN(LEFT_MARGIN), MAX(RIGHT_MARGIN) FROM `b_iblock_section`; --         , ,     ; SELECT * FROM (SELECT ID, MOD((RIGHT_MARGIN - LEFT_MARGIN), 2) AS ostatok FROM `b_iblock_section`) t WHERE ostatok = 0; --         , ,     ; SELECT * FROM (SELECT ID, MOD(LEFT_MARGIN - DEPTH_LEVEL + 2, 2) AS ostatok FROM `b_iblock_section`) t WHERE ostatok = 1; --   ,    , .     ,       SELECT ID, CONCAT(REPEAT('--', DEPTH_LEVEL - 1), `NAME`) as `NAME`, LEFT_MARGIN, RIGHT_MARGIN, DEPTH_LEVEL, IBLOCK_SECTION_ID as PARENT FROM `b_iblock_section` ORDER BY IF(ISNULL(IBLOCK_SECTION_ID), ID, IBLOCK_SECTION_ID), LEFT_MARGIN; --     SELECT ID, CONCAT(REPEAT('--', DEPTH_LEVEL - 1), `NAME`) as `NAME`, LEFT_MARGIN, RIGHT_MARGIN, DEPTH_LEVEL, IBLOCK_SECTION_ID as PARENT FROM `b_iblock_section` WHERE LEFT_MARGIN IN (SELECT LEFT_MARGIN FROM `b_iblock_section` GROUP BY LEFT_MARGIN HAVING count(*)>1) ORDER BY LEFT_MARGIN; --    ,              ,        SELECT CHILD.ID, CHILD.DEPTH_LEVEL, CHILD.`NAME`, CHILD.LEFT_MARGIN, CHILD.RIGHT_MARGIN, PARENT.LEFT_MARGIN as PARENT_LEFT_MARGIN, PARENT.RIGHT_MARGIN as PARENT_RIGHT_MARGIN FROM `b_iblock_section` AS CHILD JOIN `b_iblock_section` AS PARENT ON PARENT.ID = CHILD.IBLOCK_SECTION_ID WHERE (CHILD.LEFT_MARGIN <= PARENT.LEFT_MARGIN) OR (CHILD.RIGHT_MARGIN >= PARENT.RIGHT_MARGIN) OR ((CHILD.DEPTH_LEVEL - 1) <> PARENT.DEPTH_LEVEL) OR (CHILD.LEFT_MARGIN >= CHILD.RIGHT_MARGIN);
      
      





充填品



「箱から出しおすぐに」商品を完党に衚瀺できない



これが「機胜」です。 むンポヌトしお管理パネルに衚瀺する内容や方法に関係なく、フロント゚ンドのプロパティはただ衚瀺されないため、手で線集モヌドで衚瀺するこずはできたせん。







詳现ビュヌ蚭定







このCMSに初めお出䌚ったずき、この動䜜はやや混乱を招き、同じデフォルトの動䜜を持぀他のCMSを芚えおいたせん。 情報ブロックを蚭定するデザむナヌは匷力ですが、デフォルトでは誰も圌に぀いお知らないので、ドキュメントを読むのに倚くの時間を費やすか、あなたのために時間を費やすBitrixスペシャリストに倚くのお金を費やすか、CMSを探す必芁がありたす時間がかかりたす。







ファセットむンデックス



ファセットむンデックスには、商品の各特性のむンデックスの䜜成が含たれたす。これにより、非垞に迅速な怜玢を行うこずができたす。 タむプb_iblock_{IBLOCK_ID}_index



およびb_iblock_{IBLOCK_ID}_index_val



2぀のテヌブルが、各補品が怜玢可胜な特性を蚘述する各むンフォブロックのデヌタベヌスに远加されたす。 䞊の図では、これら2぀のテヌブルのむンデックスは34でした。なぜなら、 取埗したデヌタベヌスの取匕提案を説明するために、34番目の情報ブロックが䜿甚されたした。 このようなブロックは倚数存圚する可胜性があるため、各情報ブロックに察しおファセットむンデックス付きのテヌブルのペアが䜜成されたす。 ブランチの各カテゎリに゚ントリが远加されたす。 ぀たり 必芁なすべおのカテゎリの指定されたフィヌルドで補品を怜玢するには、この補品を怜玢する各カテゎリの゚ントリを耇補したす。 原則ずしお、これは䞋䜍レベルのカテゎリです-補品では、すべおのカテゎリがこのブランチすべおの芪でより高いため、たずえば䞊䜍レベルのカテゎリではサブカテゎリから補品を怜玢できたす。







ファセットむンデックスの倖芳は、私たちにずっお䞍快な驚きでした。 冬の曎新の1぀の埌、フロント゚ンドの商品は姿を消したした。 間違いなし。 すべおが管理パネルに衚瀺されたす。 しかし、フロント゚ンドには新補品はありたせんでした。 圢成された沈黙を通しお、プログラマヌが灰色に倉わるのを聞くこずができたした。 ファセットむンデックスが満たされおいない補品は、珟圚も氞久にも衚瀺されないこずが刀明したした。 これらの非垞にファセット化されたむンデックスを誰も望んでいなくおも、意図的に含めた人はいたせんし、さらに、フロント゚ンドで䜕も遞択しおいたせん。 ぀たり ナヌザヌによるフィルタリングのフィヌルドが入力されおいなくおも、䜕らかの理由でフィルタヌが機胜したす。 動䜜は奇劙です。 そのような導入の結果-人々は死にかけおいたした。 人々は損倱を被った。 充填方法に関係なく。







それずは別に、特性の識別子の蚈算に蚀及する䟡倀がありたす。 魔法を信じたすか これは魔法です。 たず、ドキュメントによれば、このフィヌルドは、特性の䞀般リスト特性によるフィルタに察しお論理的の識別子に察応するべきではなく、特性の䞀般リストに2を掛けた識別子でなければなりたせん。 「この魔法の意味は䜕か」ずいう質問に察する明確な答えは芋぀かりたせんでした。 42を掛けるず、はるかにうたくいくようで、少なくずもある皋床は意味がありたす。 第二に、管理パネルを介しおサむトを埋めるこずは、この䞀芋些现な魔法に準拠しおいない可胜性があるこずが繰り返し指摘されたした。







魔法の実装に぀いおはここで説明したすが 、䜕に䜕を掛けるのかを説明すべきドキュメントぞのリンクもありたすが、残念ながら、執筆時点では4の数字の魔法がありたす。







利甚可胜なドキュメントはありたせん







ファセットむンデックスの詳现ず察凊方法に぀いおは、Bitfilter開発者フォヌラムのトピック「 スマヌトフィルタヌは非垞にファセットされおきれいです」 を参照しおください 。







その他のニュアンス



過剰なキャッシングは悪いです



Bitrixは、デフォルトで有効になっおいる独自のキャッシュを持っおいたす。 このキャッシュが匷制的にフラッシュされるたで、サむトぞの倉曎は衚瀺されない堎合がありたす。 これにより、すべおが明確になり、CMS API自䜓を䜿甚しおリセットできたす。 ただし、堎合によっおは远加のキャッシュツヌルが含たれるこずがあり、ホスティングプロバむダヌはそれらをオンにするこずもできたす。最終的には、たずえば、クロムキャッシュが状況を悪化させる可胜性がありたす。







システム芁件はストアずずもに拡倧したす



モゞュヌルを可胜な限り最適化したしたが、これは垞にサヌバヌ容量を増やす必芁性からお客様を救うわけではありたせん。 商品の量ず特性の倧幅な増加に䌎い、Bitrixは通垞の動䜜のためにサヌバヌ容量、特にRAMの増加も必芁ずしたす。 CMSが起動され、倚数のデモ補品で動䜜する最も安䟡なホスティングを䜿甚した構成では、10,000個の補品を入力するず、すべおが正垞に動䜜したす。 これはそれぞれビゞネス向けの匷力な倚機胜CMSであり、名刺サむトよりも真剣にホスティングする必芁があるこずを理解しおおく必芁がありたす。







䜕に来たの



Bitrixは、CMSず連携するフレヌムワヌクず、顧客ずやり取りするフレヌムワヌクの䞡方で、倚くの興味深い経隓を提䟛しおくれたした。 間違いなく、これは優れた機胜を備えた優れたCMSです。 しかし、初心者には重すぎたす。 はい、初心者のために䜕がありたすか。プログラマヌでさえ、このCMSを初めお䜿甚する堎合、すぐにフルサむトを立ち䞊げるのに倚くの時間ず神経を費やすこずができたす。 ニュアンスが倚すぎたす。 自分のビゞネスを始めたばかりで、スタッフに経隓豊富なBitrixプログラマヌがいない堎合、より理解しやすいCMSを遞択するか、少なくずも賌入前にサヌビスVirtual Labでデモバヌゞョンを詊しおみる䟡倀がありたす。

すでにBitrixを賌入しおいる堎合、最初に行う必芁があるのは、コンテンツでそれを埋め、完党なバックアップを䜜成するこずです。 埌で、デザむナヌにメむクを泚文し、商品の衚瀺やその他の線集を構成できたす。 このアプロヌチの利点は、ストアを完了した人が、説明、必芁なすべおの属性、組み合わせ、写真を䜿甚しお、ラむブ補品の線集結果をすぐに芖芚的に評䟡できるこずです。 最初はサむトがデザむナヌによっおばらばらに匕き裂かれ、それが初めお私たちに匕き裂かれ、クラむアントがストアを立ち䞊げる前の最埌の瞬間にレむアりトの問題に遭遇したずいうケヌスが䜕床もありたした。







たた、モゞュヌルを介したBitrixぞのむンポヌト速床の小さなベンチマヌクを䜜成したした。 テストセットには、23298枚の写真を含む1495個の補品ず組み合わせが含たれおいたした。







ロヌカルデヌタベヌス接続MySQLぞの盎接接続



詊隓タむプ 読み蟌み時間
空のデヌタベヌスにむンポヌトする 21.48秒
䟡栌ず残高を曎新する 15.91秒


HTTPブリッゞ経由でサむトにむンポヌトする



䜜業マシンからのテストのむンポヌトは、テストストアbitrixlabs.ruで行われたした。 むンポヌト甚の写真はサプラむダのサヌバヌにあり、httpプロトコル経由で入手できたした。 このテストでは、写真のダりンロヌドずネットワヌク速床が充填速床にどのように圱響するかを確認できたす。







詊隓タむプ 読み蟌み時間
空のデヌタベヌスぞのむンポヌト写真なし 6分8.11秒
空のデヌタベヌスぞのむンポヌト23298枚の写真から 38分11.49秒
䟡栌ず残高を曎新する 4分11.87秒


このモゞュヌルは珟圚、次のプログラムおよびサヌビスで䜿甚されおいたす。










All Articles