Bitrixが新年をほぼ台無しにした方法

私たちは小さなWebスタジオに元気に暮らし、名刺サイト、オンラインストア、小さなポータルを作成しました。 1C-Bitrixプラットフォーム上のプロジェクトがありました。 もちろん、私たちは公式のBitrixインテグレーターではありませんでしたが、力と経験が許す限り実行可能なプロジェクトを行いました。 私たちが使用する必要のないコンポーネントだけであるように思えますが、国内の脳のこの奇跡は、新年になんとか驚きをもたらしました。



新しい注文が届きました-オンラインストア。 ちなみに、オンラインストアもあり、Codeigniterフレームワークに基づいて、私たちが作成したCMSで作業していました。 うまく動作し、かなり高速でした。 しかし、時間がかかり、Laravel4が出てきました(非常にシンプルで素晴らしかったです)、Yii2(最終的に安定)、Phalcon(Cは非常に高速です)で、故人のCIを使用する強さはもうありません(誰かが家に連れて行ってくれます)。 アシスタントと視線を交換した後、私たちはすぐに古いシステムで新しい注文を作成したくないことに気付きました。 Yii2のオンラインストアの成功した決定を書き直す考えがありましたが、オープンカート、CSカート、およびPrestaShopに目を向けましたが、顧客はこの問題に終止符を打ちました-1C Bitrix(ビジネスエディション)。 ブライトは、石鹸とロープをスーツケースにきちんと折りたたんで出発したいと考えています。 一方、すべてがそれほど悪いわけではない、と私は考えました。 既製の高品質ソリューションのセットを用意します(キーワードは既製であり、顧客に警告されました)。レイアウトを紹介するだけです。 そして数日後、仕事は沸騰し始めました。



「ほら! 起動してインストールされました!」と叫びました。 「なんてこった、たくさんのファイル?!」とgitは考えました。



基礎として、私はBitrixでインストールできるオンライン衣料品店を取りました。



私たちはオフィスで友人と一緒に座って、小さな部品を引っ張り、突然Bitrixから一等賞を獲得しました。 このシステムには、正しく接続されたcssファイルとjsファイルを結合および圧縮する機能があります。 「どこで失敗したのか」-jqueryが接続を停止したときに私に最初に発生した石鹸。 必死にCtrl + Zを押して、作成したコードをキャンセルしますが、何も役に立ちません。 考えられないオプションは戦いに入りますが、成功ももたらさないでしょう。 私の頭には混乱があります。 私はお茶に行きます。 私が留守中に、ビトリックスは彼が許して稼ぐと言って戻ってくることを懇願しました。 私がサイトを再び始めたとき、静的アセンブリは完璧な状態でした。 魔法、私は思った、と私はそれを忘れたかった、私の友人は、私から数メートル離れて座って、同じバグに走っていたので。 グーグルは、同様の問題に直面していると判断しましたが、解決策はありません。



私の場合のように、しばらくして、サイトの静電気は自動的に修復されました。 ちなみに、このバグは開発プロセスで一度表面化しました。 このバグの本質は、明らかに、未定の理由で、マージ時にjsファイルの順序が混乱するか、必要なjsファイルの一部がマージに入らないことです。



頭の部分は次のように見えます:

<head>
		<meta charset="utf-8"/>
        <?
        $APPLICATION->ShowMeta("robots", false, true);
        $APPLICATION->ShowMeta("keywords", false, true);
        $APPLICATION->ShowMeta("description", false, true);
        ?>
		<link rel="shortcut icon" type="image/x-icon" href="<?= SITE_DIR ?>/favicon.ico"/>
		<link rel="stylesheet"
			  type="text/css"
			  href="<?= CUtil::GetAdditionalFileURL('http://fonts.googleapis.com/css?family=PT+Sans:400,700,400italic,700italic&subset=latin,cyrillic'
			  ) ?>"/>
		<link rel="stylesheet"
			  type="text/css"
			  href="<?= CUtil::GetAdditionalFileURL('http://fonts.googleapis.com/css?family=Noto+Sans&subset=latin,cyrillic'
			  ) ?>"/>
		<link rel="stylesheet"
			  type="text/css"
			  href="<?= CUtil::GetAdditionalFileURL('http://fonts.googleapis.com/css?family=Roboto+Slab:400,300,700&subset=latin,cyrillic'
			  ) ?>"/>
		<?
		$APPLICATION->ShowCSS(true, true);
		?>
		<link rel="stylesheet"
			  type="text/css"
			  href="<?= CUtil::GetAdditionalFileURL(SITE_TEMPLATE_PATH . "/css/jquery.formstyler.css") ?>"/>
		<link rel="stylesheet"
			  type="text/css"
			  href="<?= CUtil::GetAdditionalFileURL(SITE_TEMPLATE_PATH . "/css/jquery.nouislider.css") ?>"/>
		<link rel="stylesheet"
			  type="text/css"
			  href="<?= CUtil::GetAdditionalFileURL(SITE_TEMPLATE_PATH . "/css/jquery.ad-gallery.css") ?>"/>
        <link rel="stylesheet"
              type="text/css"
              href="<?= CUtil::GetAdditionalFileURL(SITE_TEMPLATE_PATH . "/css/keyboard.css") ?>"/>

        <?$APPLICATION->AddHeadScript(SITE_TEMPLATE_PATH."/js/jquery-1.11.1.min.js");?>
        <?$APPLICATION->AddHeadScript(SITE_TEMPLATE_PATH."/functions.js");?>

		<?
		$APPLICATION->ShowHeadStrings();
		$APPLICATION->ShowHeadScripts();
		?>

        <!--[if lt IE 9]>
        <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
        <![endif]-->

		<title><? $APPLICATION->ShowTitle() ?></title>
	</head>

      
      







, .



, . . (#SITE_DIR#/catalog/#SECTION_CODE#/). , #SITE_DIR#/catalog/ . /catalog/index.php . « » – , 30 . . . ajax , . :



if($_REQUEST['ajax']=='Y')

      
      





, , $_REQUEST[‘ajax’] NOTICE, - . isset .



if(isset($_REQUEST['ajax']) && $_REQUEST['ajax']=='Y')

      
      





, . , , , , , - . — . , - , . , , ( ) , . js \bitrix\components\bitrix\catalog.element\templates\.default\script.js, 2839 , result_modifier.php , js .



, « - ». . jquery, , 1 BX.js, . 200 .



, - . , - , . , , 1000 mA « » : ? , , . . , . , , .



, , - , ajax , . , , . “” .



. - . CSaleBasket::Add, , , . , .



, , . «». . Update . .



$code = Add2BasketByProductID($productID, $QUANTITY, $arRewriteFields, $product_properties);

if (!$code) {
    $response['status'] = 400;
    $response['message'] = '     ';
} else {
    $response['basket'] = getActualSmallBasket();

    /*fix     sku  */
    if (is_array($productProperties)) {
        $arFields["PROPS"] = $productProperties;
        CSaleBasket::Update($code, $arFields);
     }
}

      
      





. , , . , , . , (bitrix:search.page), , arResult . , . arResult[‘PARAM2’], id , , ITEM_ID S, . arResult, , - . , . , .



. , -, ajax . Ajax . « ». , , -. . PAGEN_1, PAGEN_2. , . . , , ajax . . , .



. . , , . - , , , . . «» . : – . . . . , : , . , . OnAfterIBlockElementAdd . :



/*       */
AddEventHandler("catalog", "OnPriceUpdate", Array("DiEvent", "OnPriceUpdateHandler"));
AddEventHandler("catalog", "OnPriceAdd", Array("DiEvent", "OnPriceAddHandler"));

/*       */
AddEventHandler("catalog", "OnProductAdd", Array("DiEvent", "OnProductAddHandler"));
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", Array("DiEvent", "OnProductUpdateHandler"));

/**
     *        
     *
     * @param $id
     * @param $arFields
     */
    function OnPriceUpdateHandler($id, $arFields) {
        self::updateFilterPrice($arFields['PRODUCT_ID']);
    }

    /**
     *        
     *
     * @param $id
     * @param $arFields
     */
    function OnPriceAddHandler($id, $arFields) {
        self::updateFilterPrice($arFields['PRODUCT_ID']);
    }

    /**
     *        
     *
     * @param $id
     * @param $arFields
     */
    function OnProductAddHandler($id, $arFields) {
        self::updateFilterPrice($id);
    }

    /**
     *        
     * OnProductUpdate    ((
     * @param $arFields
     */
    function OnProductUpdateHandler(&$arFields) {
        if ($arFields['IBLOCK_ID'] == 2) {
            self::updateFilterPrice($arFields['ID']);
        }
    }

/**
     *          
     * MIN_OFFER_PRICE, MAX_OFFER_PRICE     .
     *      BASE!      .
     *
     * @param $PRODUCT_ID id 
     */
    public static function updateFilterPrice($PRODUCT_ID) {
        $EL = new CIBlockElement();

        //    
        $arr = CIBlockPriceTools::GetOffersArray(
            array('IBLOCK_ID' => 2),
            array($PRODUCT_ID),
            array(),
            array(),
            array(),
            0,
            CIBlockPriceTools::GetCatalogPrices(2, array('BASE'))
        );

        if (is_array($arr) && count($arr) > 0) {
            $minPrice = null;
            $maxPrice = 0;

            //      ,     

            foreach ($arr as $offer) {
                $offerMinPrice = $offer['MIN_PRICE']['VALUE'];

                if (is_null($minPrice)) {
                    $minPrice = $offerMinPrice;
                } else {
                    if ($offerMinPrice < $minPrice) {
                        $minPrice = $offerMinPrice;
                    }
                }

                if ($offerMinPrice > $maxPrice) {
                    $maxPrice = $offerMinPrice;
                }
            }

            //   MIN_OFFER_PRICE, MAX_OFFER_PRICE
            $EL->SetPropertyValuesEx($PRODUCT_ID, 2,
                                     array('MIN_OFFER_PRICE'=>$minPrice,
                                           'MAX_OFFER_PRICE'=>$maxPrice,)
            );
        } else {
            //   
            $priceType = CIBlockPriceTools::GetCatalogPrices(2, array('BASE'));
            $cgroup = $priceType['BASE']['SELECT'];

            //       !
            $result = $EL->GetList(array(), array('IBLOCK_ID'=>2, 'ID'=>$PRODUCT_ID), false, false, array('*', $cgroup));
            $arrElm = $result->GetNextElement();

            if (is_object($arrElm)) {
                $fields = $arrElm->GetFields();

                //   
                $price = CIBlockPriceTools::GetItemPrices(2, $priceType, $fields);

                //   MIN_OFFER_PRICE, MAX_OFFER_PRICE
                $EL->SetPropertyValuesEx($PRODUCT_ID, 2,
                                         array('MIN_OFFER_PRICE'=>$price['BASE']['VALUE'],
                                               'MAX_OFFER_PRICE'=>$price['BASE']['VALUE'],)
                );
            }
        }
    }

      
      





(sale.order.full). , , EDOST , , . . . .



. , . , , , – , N . , 1C , . . , . , . , . , , . , , . : , , , . , , .



, , , , , , . - 30 , 31, . «» .



All Articles