6 заметок с тегом

bitrix

Хранения и вывод «телефона», «почты» и т. д. в шаблонах битрикса

Зачастую при разработке веб-проектов встаёт проблема хранения и редактирования редко-изменяемых полей типа «телефон», «Почта», «адрес компании» и т. д.

Для решения этой проблемы я пытался изобрести свой «велосипед» используя включаемые области, затем долгое время использовал инфоблок в которым хранил значения поля и его символьный код, по которому обращался и доставал значения полей в шаблонах.

Все это продолжалось до тех пор, пока я не увидел у себя под носом нужное мне решение в маркетплейсе «Настройки ++».
Оно как раз помогает создавать сколь угодно таких «полустатичных полей» и даёт возможность выводить их в самих шаблонах.

Скачивайте, пока не сделали платным :—)
https://marketplace.1c-bitrix.ru/solutions/askaron.settings/

2018   bitrix   битрикс

Bitrix24. Обновляем штатные FM поля лида.

Не секрет что документации по api bitrix24 очень мало, и та что есть достаточно скудна.
Для тех кто не хочет тратить как я время на изучение ядра, написал небольшую заметку по классическому на вскидку кейсу.

У нас есть лид со штатными полями телефон и почта, периодически значения этих полей может меняться, нам необходимо программно иметь возможность их сменить.
Первое что приходит на ум это использовать стандартный Update для лида. К сожалению так CRM не будет менять поля PHONE и EMAIL, для того чтобы иметь возможность их сменить нужно использовать другой класс CCrmFieldMulti.
Ниже прикладываю листинг метода, который я написал для смены телефона или почты у лида. Его можно свободно использовать для смены значений телефона в CRM Bitrix24.

/**
    * Обновляем FM поля
    * @param TYPE_ID Тип FM поля
    * @param LEAD_ID ID лида
    * @param VALUE значение для поля
    */    
    function updateFieldMulti($TYPE_ID, $LEAD_ID, $VALUE){
		\Bitrix\Main\Loader::includeModule('crm');

		$dbResult = \CCrmFieldMulti::GetList(
		    array(),
		    array(
		        'ENTITY_ID' => 'LEAD',
		        'CHECK_PERMISSIONS' => 'N',
		        'TYPE_ID' => $TYPE_ID,
		        'ELEMENT_ID' => $LEAD_ID
		    )
		);
		 
		if($arLead = $dbResult->GetNext()){
		    $arLeadID = $arLead;
		}
		 
		$ds = new \CCrmFieldMulti;
		$ds->Update(
			$arLeadID['ID'], 
			array(
				'VALUE' 	=>	$VALUE, 
				'TYPE_ID'	=>	$arLeadID['TYPE_ID'], 
				'VALUE_TYPE'	=>	$arLeadID['VALUE_TYPE'], 
				'COMPLEX_ID'	=>	$arLeadID['COMPLEX_ID']
			)
		);
    }
2018   bitrix   bitrix24   CRM   Лид

Как показать следующую и предыдущую новость в битриксе?

Этот довольно часто встречающийся кейс пока никак не реализован в самом битриксе, поэтому пишу этот пост больше для себя, чтобы решение этой проблемы где-то было под рукой.
Обычно такая потребность возникает на странице какого-то конкретного поста, для того чтобы после него вывести следующий и предыдущий за ним пост. Поэтому код ниже написан для комплексного компонента «news», вставлять его надо в файле detail.php. Как всегда не претендую на оптимальность, но мою потребность он легко закрывает)

<?
	$rs=CIBlockElement::GetList(array("active_from" => "desc"), array("ACTIVE"=>"Y", "IBLOCK_ID"=>$arParams["IBLOCK_ID"]), false, array("nElementID"=>$ElementID, "nPageSize"=>1), array("ID", "NAME", "DETAIL_PAGE_URL"));
	while($ar=$rs->GetNext()) $page[] = $ar;
?>
<div>
	<?if (count($page) == 2 && $ElementID == $page[0][ID]):?>
		<div class="_next">
			<a href="<?=$page[1]["DETAIL_PAGE_URL"]?>">
				<?=$page[1]["NAME"]?>
			</a>
		</div>
	<?elseif (count($page) == 3):?>
		<div class="_prev">
			<a href="<?=$page[0]["DETAIL_PAGE_URL"]?>">
				<?=$page[0]["NAME"]?>
			</a>
		</div>
		<div class="ps-_next">
			<a href="<?=$page[2]["DETAIL_PAGE_URL"]?>">
				<?=$page[2]["NAME"]?>
			</a>
		</div>
	<?elseif (count($page) == 2 && $ElementID == $page[1][ID]):?>
		<div class="_prev">
			<a href="<?=$page[0]["DETAIL_PAGE_URL"]?>">
				<?=$page[0]["NAME"]?>
			</a>
		</div>
	<?endif;?>
</div>
2017   bitrix   битрикс

catalog.section.list для вывода дерева разделов и элементов

Зачастую у меня при разработке возникает двухуровневая структура данных, и часто удобно использовать в инфоблоках секции и элементы как способ хранения информации.
К сожалению битрикс не дает штатного компонента для вывода такого дерева:

  • секция 1
    — элемент1.1
    — элемент1.2
    — элемент1.3
  • секция 2
    — элемент2.1
    — элемент2.2
    — элемент2.3
    ...

Хотя для меня он был бы крайне полезен. В таких случаях для себя я использую следующий подход.
На страницу вытаскиваю стандартный компонент catalog.section.list с default-ом шаблоном.

  1. Вычищаю все лишнее с файлов template.php и result_modifier.php.
  2. В result_modifier делаю с помощью CIBlockElement::GetList запрос на получение всех элементов в данном инфоблоке и структурирую их в массив с ключом равным секции элемента.
  3. Прохожусь циклом по $arResult[«SECTIONS»] и добавляю в каждый элемент массива массив который я получил в шаге 2.
  4. В итоге у меня получается массив с секциями внутри каждого из элементов массива будет подмассив со всеми элементами массива.

Содержание файла result_modifier будет примерно вот таким:

$arSelect = Array("ID", "NAME", "IBLOCK_SECTION_ID");
$arFilter = Array("IBLOCK_ID"=>$arParams["IBLOCK_ID"], "ACTIVE"=>"Y");
$res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
while($ob = $res->GetNextElement())
{
	$arFields = $ob->GetFields();
	$arSec[$arFields["IBLOCK_SECTION_ID"]][] = $arFields;
}
foreach ($arResult['SECTIONS'] as $key => $arSection){
	$arResult['SECTIONS'][$key]["ELEMENTS"] = $arSec[$arSection["ID"]];
}

p.s. совершенно неточно что данный подход идеальный и вы можете придумать свой)

2017   bitrix   битрикс

Мультиязычный сайт на битриксе

За все время разработки мультиязычных сайтов я видел кучу подходов для организации хранения контента для разных языков.
Попробую изложить самый оптимальный способ которым я пользуюсь.

Разберем классическую ситуацию с сайтом на двух языках: английском и русском.
В системе будет два типа контента:

  1. Что лежит в инфоблоках — динамический контент.
  2. Статический. Он будет лежать в языковых файлах.

Ключевым моментом в разработке будет создание двух сайтов, каждый из которых будет работать для одного языка вот тут:
http://ВАШ_САЙТ/bitrix/admin/site_admin.php?lang=ru
Важно в поле язык ввести нужно значение языка:

Теперь для статического контента все просто, нужно грамотно использовать папку «lang» и уметь пользоваться функцией «GetMessage()».
Для динамики использую следующий лайхак, в инфоблоке создаю для контента две секции, каждой из которых проставляю символьный код соответсвующий языкам на сайте. Получается что-то типо вот такого:

На самом же сайте просто вывожу контент из нужный папке в инфоблоке с помощью константы LANGUAGE_ID.

2017   bitrix

Кадрирование изображений в вебе. (Пример на Битриксе)

При разработке типовых страниц на сайтах часто возникает проблема в кадрировании изображений. Основная проблема в том, что контент-менеджеры не парятся о размерах, весе и расширении изображения при этом хотят увидеть на странице красиво сверстанный результат. Поэтому на back-endе я всегда пишу обработку для изображений загружаемых с админки.

При этом я обычно наблюдаю два сценария:
№1. Допустим у нас есть лента новостей, и у каждого поста есть превью размером 200x400. Контент-менеджер грузит в админку горизонтальную фотку и ожидает что в ленте, где все фоточки вертикальные они встанут красиво. В таких случаях я обычно кроплю фотки, загоняя их в заданный размер, в 99,9% это происходит «тупо» по центру, при этом код выглядит как-то так:

$imageFile = CFile::GetFileArray($arItem["PREVIEW_PICTURE"]["ID"]);
$arFileTmp = CFile::ResizeImageGet($imageFile,  array("width" => 388, "height" => 215),  BX_RESIZE_IMAGE_EXACT,  false,Array("name" => "sharpen", "precision" => 15));
$photo_img = $arFileTmp["src"];

№2. Во-втором случае речь обычно идет о ленте с партнерами, либо о карусели с «нашими клиентами», либо о слайдере с отзывами и т. п. В общем о случаях, когда важно показать все изображение, без обрезки. В таком случае у нас имеется некая область с заданным размером, и мы скриптом «вгоняем» нашу картинку туда. Предварительно необходимо понять изображения вертикальное или горизонтальное, дабы получить оптимальные размеры для последующей обработки функцией ResizeImageGet().

if ($imageFile["WIDTH"] > $imageFile["HEIGHT"]) 
{
	
	$width = 360;
	$height = $imageFile["HEIGHT"] * $width / $imageFile["WIDTH"];
	if ($height > 270) 
	{
		$width = 360*271/$height;
		$height = 270;
	}
}
else
{
	$height = 270;
	$width = $imageFile["WIDTH"] * $height / $imageFile["HEIGHT"];
}
$arFileTmp = CFile::ResizeImageGet($imageFile,  array("width" => $width, "height" => $height),  BX_RESIZE_IMAGE_EXACT,  false,Array("name" => "sharpen", "precision" => 15));
$photo_img = $arFileTmp["src"];

Код далеко не оптимальный, набросан «на скорую руку». В примере область для загрузки изображений размером 360x270.

2017   bitrix