bitrix

создание ZIP архива на лету и отдача на скачивание bitrix

08.04.2015 Bitrix, php скрипты , , ,

<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
// require($_SERVER["DOCUMENT_ROOT"]."/download/createzip.php");
$arrFile = array(
					"/upload/item.jpg", 
					"/upload/item2.jpg", 
					"/upload/slide.jpg",
					"/upload/products/doc/CWSO.pdf",
					"/upload/products/doc/CWSS-C-W.pdf",
					"/upload/products/doc/CWSS-O.pdf",
					"/upload/products/doc/CWST.pdf",
					"/upload/products/doc/DBS1224B4W_manual.pdf",
					"/upload/products/doc/EMA_DBS_Certificate.pdf",
					"/upload/products/doc/EnScape_Certificate.pdf",
					"/upload/products/doc/ExitPoint_Certificate.pdf",
					"/upload/products/doc/ExitPoint_manual.pdf",
					);

createZipAndDownload($arrFile);

function createZipAndDownload($arFiles)
{
	$zip = new ZipArchive();
	$filename = "system_sensor_archive_".date("d.m.Y").".zip";
	var_dump($filename);
	if ($zip->open($filename, ZipArchive::CREATE)!==TRUE) {
	    exit("Невозможно открыть <$filename>\n");
	}

	foreach ($arFiles as $file) 
	{		
	 	$arr = explode("/", $file);	 	
	 	var_dump($arr);
		$zip->addFile($_SERVER["DOCUMENT_ROOT"].$file, end($arr));
	}
	
	$zip->close();

	file_force_download($filename);
}

function file_force_download($file) {
  if (file_exists($file)) {
    // сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт
    // если этого не сделать файл будет читаться в память полностью!
    if (ob_get_level()) {
      ob_end_clean();
    }
    // заставляем браузер показать окно сохранения файла
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    // читаем файл и отправляем его пользователю
    readfile($file);

    unlink($file);
    exit;
  }
}

Оригинал тут http://pastebin.com/h8zubtLz

bitrix получить id типа цен

04.09.2014 Bitrix ,

Есть прекрасные методы

$arResultPrices = CIBlockPriceTools::GetCatalogPrices($arParams["IBLOCK_ID"], $arParams["PRICE_CODE"]);
array (
  'CLUB' => 
  array (
    'ID' => '2',
    'TITLE' => 'Цена клубная',
    'SELECT' => 'CATALOG_GROUP_2',
    'CAN_VIEW' => true,
    'CAN_BUY' => true,
  ),
)
$arResultPricesAllow = CIBlockPriceTools::GetAllowCatalogPrices($arResultPrices);
array (
  0 => 2,
)

Дерево до самого начала, получение родителей секции.

05.08.2014 Bitrix

Получение родителей секции.


	if(CModule::IncludeModule("iblock"))
	{
	

		$rsParentSection = CIBlockSection::GetByID('7');
		if ($arParentSection = $rsParentSection->GetNext())
		{
			// var_dump($arParentSection);
			  /* itdbg($arParentSection['ID']); */
			  itdbg($arParentSection['IBLOCK_ID']);
			  itdbg($arParentSection['LEFT_MARGIN']);
			  itdbg($arParentSection['RIGHT_MARGIN']);
			  itdbg($arParentSection['DEPTH_LEVEL']);
		   $arFilter = array(
		   'IBLOCK_ID' => $arParentSection['IBLOCK_ID'],
		   '<=LEFT_BORDER' => $arParentSection['LEFT_MARGIN'], 
		   '>=RIGHT_BORDER' => $arParentSection['RIGHT_MARGIN'],
		   // '<DEPTH_LEVEL' => $arParentSection['DEPTH_LEVEL']
		   ); // выберет потомков без учета активности
		   $rsSect = CIBlockSection::GetList(array('DEPTH_LEVEL'=>'asc'),$arFilter);
		   while ($arSect = $rsSect->GetNext())
		   {
			   // получаем подразделы
			   itdbg($arSect[NAME], false,3);
			   itdbg($arSect[ID], false,3);
			   itdbg($arSect[DEPTH_LEVEL], false,3);
			 

		   }
		}
	}

Добавление свойства тип карты в компонент iblock.element.add.form

04.08.2014 Bitrix ,

вставляется в шаблон

<?if($arResult["PROPERTY_LIST_FULL"][$propertyID]["USER_TYPE"] == "map_yandex"):?><?
         CModule::IncludeModule('iblock');
         include_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/iblock/admin_tools.php');
         $property_fields = $arResult["PROPERTY_LIST_FULL"][$propertyID];
         $arUserType = CIBlockProperty::GetUserType($property_fields["USER_TYPE"]);
         
         echo call_user_func_array($arUserType["GetPropertyFieldHtml"],
          array(
           $property_fields,
           array("VALUE"=>$value),
           array(
            "VALUE"=>'PROPERTY['.$property_fields["ID"].']['.$i.']',
            "DESCRIPTION"=>'PROPERTY['.$property_fields["ID"].']['.$i.'][DESCRIPTION]',
            "FORM_NAME"=>'iblock_add',
            "MODE"=>"FORM_FILL",
            "COPY"=>false,
           ),
          )
         );
          
          
        endif?>

Получение id раздела по коду и id элемента по коду

02.08.2014 Bitrix ,

$iSectionID = CIBlockFindTools::GetSectionID(false,$_REQUEST['SECTION_CODE'],array("IBLOCK_ID" => I_CONTESTS));
$iElementID = CIBlockFindTools::GetElementID(false,$_REQUEST['CODE'],false,false,array("IBLOCK_ID" => I_CONTESTS));

bitrix фильтр по датам

01.08.2014 Bitrix ,

bitrix фильтр по свойствам с датой

	$arFiltr['<=PROPERTY_WITH_TIME']	= date("Y-m-d H:i:s", time());
	$arFiltr['>=PROPERTY_TO_TIME']		= date("Y-m-d H:i:s", time());

Подписка пользователя на рассылку при регистрации BITRIX

23.06.2014 Bitrix , ,

Нужно создать свойство checkbox UF_SUBSCR, вывести в форме регистрации и вставить этот код в init.php

AddEventHandler("main", "OnAfterUserUpdate", Array("EventHandlerClass", "OnAfterUserUpdateHandler"));
class EventHandlerClass
{
	function OnAfterUserUpdateHandler(&$arFields)
    {
		
		global $USER;
		 // условие атоподписки, если пользователь подтверждает регистрацию или если admin редактирует пользователя
		if(
			($arFields['RESULT'] && $_GET['confirm_user_id'] > 0 && $_GET['confirm_code'] && $_GET['confirm_user_id'] == $arFields['ID']) || 
			$USER->IsAdmin()
		){	
				// поиск польщователя
				$filter = Array(
					"ID" => $arFields['ID'],
				);
				
				// выбираем EMAIL и свойство UF_SUBSCR
				$rsUsers = CUser::GetList(
					($by="id"), 
					($order="desc"), 
					$filter,
					array(
						'FIELDS' => array('ID', 'EMAIL'),
						'SELECT' => array('UF_SUBSCR')
					)
				);
				if($usParam = $rsUsers->Fetch()){

					CModule::IncludeModule("subscribe");
					$subscr = new CSubscription;
					
					// если свойство заполнено то полписываем
					if($usParam['UF_SUBSCR']){
					
						// поиск подписчика по mail
						$subscription = CSubscription::GetByEmail($usParam['EMAIL']);
						
						if($arSub = $subscription->Fetch()){			
							// если майл есть в подписчиках, то активируем подписку
							$res = $subscr->Update($arSub['ID'], array(
								"ACTIVE"		=> "Y",
								"USER_ID"		=> $usParam['ID'],
								"RUB_ID"		=> array(G_SUBSCRIPTION),// id подписки
								)
							);
						
						}else{
							// если нет подписки, то добавляем его
							$arFieldFiltr = Array(
								"RUB_ID"		=> array(G_SUBSCRIPTION),// id подписки
								"USER_ID"		=> $usParam['ID'],
								"FORMAT"		=> "text",
								"EMAIL"			=> $usParam['EMAIL'],
								"ACTIVE"		=> "Y",
								"SEND_CONFIRM"	=> 'N'
							);
							$ID = $subscr->Add($arFieldFiltr);							
							// поиск подписчика по mail, что бы получить код потверждения
							$subscription = CSubscription::GetByEmail($usParam['EMAIL']);				
							if($arSub = $subscription->Fetch()){		
								$arResult['DATA_SUB_USSER']	= $arSub;
							}
							
							// подтверждаем подписку
							$res = $subscr->Update($ID, 
								array(
									"CONFIRMED"		=> "Y",
									"CONFIRM_CODE"	=> $arResult['DATA_SUB_USSER']["CONFIRM_CODE"]
								)
							);
							unset($arResult);
						}
					}else{
						// если при обновлении пользователя свойство пустое, то деактивируем подписчика 
						$subscription = CSubscription::GetByEmail($usParam['EMAIL']);
						if($arSub = $subscription->Fetch()){			
							// активируем подписку
							$res = $subscr->Update($arSub['ID'], array(
								"ACTIVE"		=> "N",
								)
							);						
						}					
					}
				}
			}
	}
}

Использование SEO данных инфоблока через API

06.06.2014 Bitrix ,

Получить поля SEO для элемента можно так:

CModule::IncludeModule("iblock");
 
$rsSection = CIBlockSection::GetList(
    array(),
    array(
        "IBLOCK_ID" => $arParams['IBLOCK_ID'],
        "ACTIVE"=>"Y",
        "=CODE"=>$arParams["SECTION_CODE"]),
    false);
 
if($arSection = $rsSection->GetNext()){
 
$ipropValues = new \Bitrix\Iblock\InheritedProperty\ElementValues(
        $arSection["IBLOCK_ID"],
        $arSection["ID"]
    );
    $arSection["IPROPERTY_VALUES"] = $ipropValues->getValues();
    echo '<pre>'; print_r($arSection["IPROPERTY_VALUES"]); echo '</pre>';
}

Поля SEO для раздела можно получить похожим способом:

CModule::IncludeModule("iblock");
 
$rsSection = CIBlockSection::GetList(
    array(),
    array(
        "IBLOCK_ID"=>$arParams['IBLOCK_ID'],
        "ACTIVE"=>"Y",
        "=CODE"=>$arParams["SECTION_CODE"]),
        false
        );
 
if($arSection = $rsSection->GetNext()){
 
$ipropValues = new \Bitrix\Iblock\InheritedProperty\SectionValues(
    $arSection["IBLOCK_ID"],
    $arSection["ID"]
    );
     
    $arSection["IPROPERTY_VALUES"] = $ipropValues->getValues();
    echo "<pre>"; print_r($arSection); echo '</pre>';
}

Оригинал статьи тут http://yournet.kz/blog/bitrix/ispolzovanie-seo-dannyx-v-infobloke-cherez-api

подписать авторизованного пользователя bitrix

29.05.2014 Bitrix

CModule::IncludeModule("subscribe");
$arFields = Array(
	"RUB_ID"		=> array($arParams['ID_SUB']), // id рассылки должен быть массив!
	"USER_ID"		=> $USER->GetID(),
	"FORMAT"		=> "text",
	"EMAIL"			=> $USER->GetEmail(),
	"ACTIVE"		=> "Y",
	"SEND_CONFIRM"	=> 'N'
);
$ID = $subscr->Add($arFields);


$subscription = CSubscription::GetByEmail($USER->GetEmail());				
if($arSub = $subscription->Fetch()){		
	$arResult['DATA_SUB_USSER']	= $arSub;
}

// подтверждаем подписку
$res = $subscr->Update($ID, 
	array(
		"CONFIRMED"		=> "Y",
		"CONFIRM_CODE"	=> $arResult['DATA_SUB_USSER']["CONFIRM_CODE"]
	)
);

Bitrix постраничка для массива 2

17.12.2013 Bitrix ,

/* 
 component params
*/
"NEWS_COUNT" => "2",
"PAGER_TITLE" => "", 
"PAGER_SHOW_ALWAYS" => "N", 
"PAGER_TEMPLATE" => "", 
"PAGER_DESC_NUMBERING" => "N", 
"PAGER_DESC_NUMBERING_CACHE_TIME" => "36000", 
"PAGER_SHOW_ALL" => "Y",


/* 
 component
*/
$rs = new CDBResult;
$rs->InitFromArray($arResult["ITEMS"]);
$rs->NavStart($arParams["NEWS_COUNT"]);

$arResult["NAV_STRING"] = $rs->GetPageNavStringEx($navComponentObject, $arParams["PAGER_TITLE"], $arParams["PAGER_TEMPLATE"], $arParams["PAGER_SHOW_ALWAYS"]);
$arResult["NAV_CACHED_DATA"] = $navComponentObject->GetTemplateCachedData();
$arResult["NAV_RESULT"] = $rs;

$arResult["ITEMS"] = array();
while($arSection = $rs->Fetch()){
 $arResult["ITEMS"][] = $arSection;
}


/*
 template
*/
<?if($arParams["DISPLAY_BOTTOM_PAGER"]):>
 <?=$arResult["NAV_STRING"]?>
<?endif;?>