component.php 13.1 KB
<?
use \Cpeople\Classes\Block;


//if (!empty($_GET)) $arParams['IS_AJAX'] = true;

$arParams['SHOW_LIKE_BUTTON'] = true;
$arParams['IS_AJAX_FILTER'] = true;

$arParams['CODE'] = !empty($_REQUEST['CODE']) ? $_REQUEST['CODE'] : false;
$arParams['TEMPLATE'] = $arParams['CODE']
    ? 'detail'
    : ($arParams['IS_AJAX'] || isset($_REQUEST['get-more'])
        ? (isset($_REQUEST['similar-project']) ? 'ajax-similar-project' : 'ajax')
        : false);
if(!$arParams['TEMPLATE'] && isAjax()) {
    $arParams['TEMPLATE'] = 'ajax-filter';
}

if($arParams['TEMPLATE'] == 'ajax-filter' || $arParams['TEMPLATE'] == 'ajax' || $arParams['TEMPLATE'] == 'ajax-similar-project') {
    $APPLICATION->RestartBuffer();
}

$arParams['PROJECT_ID'] = $_REQUEST['similar-project'];

$arParams['PAGE_SIZE'] = 4;
$arParams['PAGE_NUM'] = empty($_REQUEST['page']) ? 1 : (int)$_REQUEST['page'];


if($arParams['TEMPLATE'] !== 'detail') {
    if ($arParams['IS_AJAX']) {
        header('Content-Type: application/json');
    }
}

$arParams['URI'] = $APPLICATION->GetCurUri();


if(isset($_REQUEST['is-fave'])) {
    $arParams['IS_FAVE'] = true;
}

if($arParams['IS_FAVE']) {
    $arParams['FAVE_IDS'] = getFaveItems();

    // убираем левые айдишники, если они есть
    $rs = CIBlockElement::GetList(
        array(),
        array('IBLOCK_ID' => IBLOCK_PROJECTS, 'ACTIVE' => 'Y', 'ID' => $arParams['FAVE_IDS']),
        false,
        false,
        array('ID')
    );
    $existFaveIds = array();
    while($ar = $rs->Fetch()) {
        $existFaveIds[] = $ar['ID'];
    }

    if($arParams['FAVE_IDS'] != $existFaveIds) {
        $arParams['FAVE_IDS'] = $existFaveIds;
        setcookie('fav_ids', '[' . implode(',', $existFaveIds) . ']', time() + 30*24*60*60, '/');
    }

    if(!$arParams['FAVE_IDS']) {
        LocalRedirect('/projects/');
    }
}

try {
    if ($this->StartResultCache(COMPONENTS_CACHE_TTL))
    {
        /** @var $item \SH\Entities\Project */
        $arFilter = array('IBLOCK_ID' => IBLOCK_PROJECTS, 'ACTIVE' => 'Y');

        try {
            if ($arParams['TEMPLATE'] == 'detail' || $arParams['TEMPLATE'] == 'ajax-similar-project') {
                // детальная

                $getter = Block\Getter::instance()
                    ->setFilter($arFilter)
                    ->setClassName('\SH\Entities\Project')
                    ->setNavStartParams(array('nTopCount' => 1));

                if($arParams['TEMPLATE'] == 'detail') {
                    $arResult['ITEM'] = $getter->getByCode($arParams['CODE']);
                } else {
                    $arResult['ITEM'] = $getter->getById($arParams['PROJECT_ID']);
                }
                if (!$arResult['ITEM']) throw new Exception('detail not found');

                $arResult['NAME'] = $arResult['ITEM']->NAME;

                /**
                 * В блоке похожих проектов в первую очередь выводятся проекты аналогичного типа и из того же диапазона по площади, что и текущий проект, по дате публикации (более поздние выводятся раньше).
                 * Во вторую очередь выводятся проекты аналогичного типа, но из другого диапазона по площади, что и текущий проект, по дате публикации (более поздние выводятся раньше).
                 * В третью очередь выводятся проекты из того же диапазона по площади, что и текущий проект, но другого типа, по дате публикации (более поздние выводятся раньше).
                 * В последнюю очередь выводятся последние добавленные проекты по дате публикации (более поздние выводятся раньше).
                 */

                $items = Block\Getter::instance()
                    ->setFilter($arFilter)
                    ->addFilter('!ID', $arResult['ITEM']->ID)
                    ->addFilter('PROPERTY_HIDE_IN_LIST', false)
                    ->setOrder(array('ACTIVE_FROM' => 'DESC', 'ID' => 'DESC'))
                    ->setClassName('\SH\Entities\Project')
                    ->get();

                $curSquare = $arResult['ITEM']->getSquare();
                if ($curSquare) {
                    if ($curSquare < 200) {
                        $minSquare = 0;
                        $maxSquare = 200;
                    } elseif ($curSquare <= 300) {
                        $minSquare = 200;
                        $maxSquare = 300;
                    } elseif ($curSquare <= 500) {
                        $minSquare = 300;
                        $maxSquare = 500;
                    } else {
                        $minSquare = 500;
                        $maxSquare = 99999;
                    }
                }
                $curSection = $arResult['ITEM']->getPropValue('PROJECT_SECTION');

                foreach ($items as $i => $item) {
                    if ($item->ID == $arResult['ITEM']->ID) {
                        unset($items[$i]);
                    } else {
                        $square = $item->getSquare();
                        $item->isCurSquare = $curSquare && $square && $minSquare < $square && $square < $maxSquare;
                        $item->isCurSection = $item->getPropValue('PROJECT_SECTION') == $curSection;
                    }
                }

                $sortedItems = array();
                foreach ($items as $i => $item) {
                    if ($item->isCurSquare && $item->isCurSection) {
                        $sortedItems[] = $item;
                        unset($items[$i]);
                    }
                }

                foreach ($items as $i => $item) {
                    if ($item->isCurSection) {
                        $sortedItems[] = $item;
                        unset($items[$i]);
                    }
                }

                foreach ($items as $i => $item) {
                    if ($item->isCurSquare) {
                        $sortedItems[] = $item;
                        unset($items[$i]);
                    }
                }

                foreach ($items as $i => $item) {
                    $sortedItems[] = $item;
                }
                unset($items);
                $arResult['ITEMS'] = $sortedItems;

                $arResult['COUNT'] = count($arResult['ITEMS']);
                $arResult['REMAIN'] = $arResult['COUNT'] - $arParams['PAGE_SIZE'] * $arParams['PAGE_NUM'];
                $arResult['ITEMS'] = array_slice($arResult['ITEMS'], $arParams['PAGE_SIZE'] * $arParams['PAGE_NUM'] - $arParams['PAGE_SIZE'], $arParams['PAGE_SIZE']);

                $ipropValues = new \Bitrix\Iblock\InheritedProperty\ElementValues(IBLOCK_PROJECTS, $arResult['ITEM']->ID);
                $arResult['IPROPERTY_VALUES'] = $ipropValues->getValues();

				//$arResult['TITLE'] = $arResult['IPROPERTY_VALUES']['ELEMENT_META_TITLE'];
				$arResult['TITLE'] = (($arResult['ITEM']->getPropValue('PROJECT_SECTION') == 'Дом') ? $arResult['ITEM']->getPropValue('PROJECT_SECTION').' из клееного бруса ' : '').$arResult['ITEM']->NAME.': '.(($arResult['ITEM']->getPropValue('FLOOR_COUNT') > 0) ? $arResult['ITEM']->getPropValue('FLOOR_COUNT').'-этажный, ' : '').(($arResult['ITEM']->getPropValue('SQUARE') > 0) ? 'площадь '.$arResult['ITEM']->getPropValue('SQUARE').' кв. м, ' : '').(($arResult['ITEM']->getPropValue('BEDROOM_COUNT') > 0) ? 'количество спален - '.$arResult['ITEM']->getPropValue('BEDROOM_COUNT').', ' : '').'фото проекта, поэтажный план, описание';
                $arResult['KEYWORDS'] = $arResult['IPROPERTY_VALUES']['ELEMENT_META_KEYWORDS'];
                $arResult['DESCRIPTION'] = $arResult['IPROPERTY_VALUES']['ELEMENT_META_DESCRIPTION'];

            } else {

                // список проектов
                if (!$arParams['IS_FAVE'] || $arParams['FAVE_IDS']) {

                    $getter = Block\Getter::instance()
                        ->setFilter($arFilter)
                        ->addFilter('PROPERTY_HIDE_IN_LIST', false)
                        ->setOrder(array('SORT' => 'ASC', 'ACTIVE_FROM' => 'DESC', 'ID' => 'DESC'))
                        ->setClassName('\SH\Entities\Project')
                        ->setNavStartParams(array('nPageSize' => $arParams['PAGE_SIZE'], 'iNumPage' => $arParams['PAGE_NUM']));

                    if(!$arParams['IS_FAVE']) {
                        $arExtraFilter = \SH\ProjectFilter::getInstance()->getBitrixFilter();
                        $getter->addFilter($arExtraFilter);
                    }

                    if ($arParams['FAVE_IDS']) {
                        $getter->addFilter('ID', $arParams['FAVE_IDS']);
                    }

                    $arResult['ITEMS'] = $getter->get();

                    $arResult['COUNT'] = $getter->getFoundRows();
                    $arResult['REMAIN'] = $arResult['COUNT'] - $arParams['PAGE_SIZE'] * $arParams['PAGE_NUM'];

                }
            }
        } catch(Exception $e) {
            // страница списка проектов

            $arResult['ITEM'] = Block\Getter::instance()
                ->setFilter(array('IBLOCK_ID' => IBLOCK_PROJECTS_PAGES, 'ACTIVE' => 'Y'))
                ->setClassName('\SH\Entities\Project')
                ->setNavStartParams(array('nTopCount' => 1))
                ->getByCode($arParams['CODE']);
            if (!$arResult['ITEM']) throw new Exception($e);

            $arResult['FILTER'] = $arResult['ITEM']->getPropRawValue('FILTER');
            $arResult['DETAIL_TEXT'] = $arResult['ITEM']->DETAIL_TEXT;
            $arResult['NAME'] = $arResult['ITEM']->NAME;

            $arExtraFilter = \SH\ProjectFilter::getInstance($arResult['FILTER'])->getBitrixFilter();

            $getter = Block\Getter::instance()
                ->setFilter($arFilter)
                ->addFilter($arExtraFilter)
                ->addFilter('PROPERTY_HIDE_IN_LIST', false)
                ->setOrder(array('SORT' => 'ASC', 'ACTIVE_FROM' => 'DESC', 'ID' => 'DESC'))
                ->setClassName('\SH\Entities\Project')
                ->setNavStartParams(array('nPageSize' => $arParams['PAGE_SIZE'], 'iNumPage' => $arParams['PAGE_NUM']));

            if ($arParams['FAVE_IDS']) {
                $getter->addFilter('ID', $arParams['FAVE_IDS']);
            }

            $arResult['ITEMS'] = $getter->get();

            $arResult['COUNT'] = $getter->getFoundRows();
            $arResult['REMAIN'] = $arResult['COUNT'] - $arParams['PAGE_SIZE'] * $arParams['PAGE_NUM'];
            $arParams['TEMPLATE'] = '';


            $ipropValues = new \Bitrix\Iblock\InheritedProperty\ElementValues(IBLOCK_PROJECTS_PAGES, $arResult['ITEM']->ID);
            $arResult['IPROPERTY_VALUES'] = $ipropValues->getValues();

            $arResult['TITLE'] = $arResult['IPROPERTY_VALUES']['ELEMENT_META_TITLE'];
            $arResult['KEYWORDS'] = $arResult['IPROPERTY_VALUES']['ELEMENT_META_KEYWORDS'];
            $arResult['DESCRIPTION'] = $arResult['IPROPERTY_VALUES']['ELEMENT_META_DESCRIPTION'];

            $arResult['NOT_USE_H1'] = true;

        }

        $arResult['TEMPLATE'] = $arParams['TEMPLATE'];

        $this->SetResultCacheKeys(array('NAME', 'TITLE', 'KEYWORDS', 'DESCRIPTION', 'PAGE_HEAD_EXTRA_CONTENT', 'TEMPLATE'));
        $this->IncludeComponentTemplate($arResult['TEMPLATE']);
    }
} catch(Exception $e) {
//    $APPLICATION->RestartBuffer();echo '<pre>' . htmlspecialchars(print_r($e->getMessage(), true)) . '</pre>';die();
    define('ERROR_404', true);
    $this->AbortResultCache();
    return;
}

if($arResult['TEMPLATE'] == 'ajax-filter' || $arResult['TEMPLATE'] == 'ajax' || $arResult['TEMPLATE'] == 'ajax-similar-project') {
    die();
}

if(!$arResult['TEMPLATE']) {
    $APPLICATION->SetPageProperty('HIDE_CENTRING_WRAP', 'Y');
    // non fly header
    $APPLICATION->SetPageProperty('CONTAINER_CLASS_TOP', '');
    $APPLICATION->SetPageProperty('HEADER_CLASS_MAIN', ' _main');
} elseif($arResult['TEMPLATE'] == 'detail') {
    $APPLICATION->SetPageProperty('BODY_CLASS', 'main-page');
    $APPLICATION->SetPageProperty('HIDE_PAGE_HEAD', 'Y');
    $APPLICATION->SetPageProperty('HIDE_CENTRING_WRAP', 'Y');
    $APPLICATION->SetPageProperty('HIDE_PAGE_CONTENT', 'Y');
}

if($arResult['NAME']) $APPLICATION->AddChainItem($arResult['NAME']);
if($arResult['NAME']) $APPLICATION->SetTitle($arResult['NAME']);
if($arResult['TITLE']) $APPLICATION->SetPageProperty('title', $arResult['TITLE']);
if($arResult['KEYWORDS']) $APPLICATION->SetPageProperty("keywords", $arResult['KEYWORDS']);
if($arResult['DESCRIPTION']) $APPLICATION->SetPageProperty("description", $arResult['DESCRIPTION']);