Популярное
8 заметок с тегом

Битрикс

26 апреля  

Как вывести информацию только определенной группе пользователей в Битрикс

Задача: Необходимо реализовать функционал «Оптовые покупатели». Цены выводить только оптовикам. Если человек не зарегистрирован, то предложить ему пройти регистрацию и стать оптовым покупателем. Обязательно постмодерация.

Реализация:

Если вам тоже необходимы любые доработки по Битриксу, то вы можете обратиться к нам за помощью. Пишите на почту info@artapir.ru

Весь процесс решения этой задачи, я конечно описывать не будут. Решил поделиться примером реализации в битриксе, как вывести информациютолько для определенных групп пользователей. На сайте, была создана группа пользователей — «Оптовые покупатели» ID=«8». После регистрации, пользователь стандартно попадает в группу «Зарегистрированные пользователи»

На сайте, если человек не зарегистрирован выводиться сообщение:

После регистрации, выводим сообщение

Вот тут как раз и нужна проверка на группу пользователей.Для этого мы использовали CSite::InGroup

<?if(CSite::InGroup(array(8))):?>
		
		<?else:?>	
Ожидайте вашего подтверждения в качестве оптового покупателя
		<?endif;?>

Где «8» — это ID группы которая нам необходимо

Битрикс
2018  

Вывести теги в фильтр Битрикс bintrix.news

Задача:

Если вам тоже необходимы любые доработки по Битриксу, то вы можете обратиться к нам за помощью. Пишите на почту info@artapir.ru

Вывести фильтр по тегам для компонента bitrix.news. из дополнительного свойства с типом «Строка». Проблема заключается в том, что по умолчанию в компоненте catalog.filter который по умолчанию подключается в компонент новостей, выводиться строка поиска по тегам.

Необходимо было сделать что бы она выводилась выпадающим списком. Списком можно вывести свойство, которое имеет свойство «Список». Но менять свойства,не было возможности.

Решение:
Для начало, нам необходимо составить массив всех наших значений. Для этого, в шаблоне компонента /bitrix/catalog.filter/.default/template.php вставляем код перед формой:

<?
//start generation arr for options
foreach($arResult["arrProp"] as $value)
{
   $arSelect[] = "PROPERTY_".$value["CODE"];
}
$res = CIBlockElement::GetList(Array(), Array("IBLOCK_ID"=>IntVal($arParams["IBLOCK_ID"])), false, Array("nPageSize"=>false), $arSelect);
while($ob = $res->GetNext())
{
   foreach($arResult["arrProp"] as $value)
   {
      $arSelOpt[$value["CODE"]][] = $ob["PROPERTY_".$value["CODE"]."_VALUE"];
   }
}
foreach($arResult["arrProp"] as $value)
{
   $arSelOpt[$value["CODE"]] = array_unique($arSelOpt[$value["CODE"]]);
}
//end generation arr for options
?>

А теперь правим форму:

<form name="<?echo $arResult["FILTER_NAME"]."_form"?>" action="<?echo $arResult["FORM_ACTION"]?>" method="get">
   <fieldset>
      <?foreach($arResult["ITEMS"] as $arItem):
         if(array_key_exists("HIDDEN", $arItem)):
            echo $arItem["INPUT"];
         endif;
      endforeach;?>
      <?foreach($arResult["ITEMS"] as $arItem):?>
         <?if(!array_key_exists("HIDDEN", $arItem)):?>
            <?
            foreach($arResult["arrProp"] as $val)
            {
               if($val["NAME"] == $arItem["NAME"])
               {
                  echo '<div class="name_filtr">'."{$arItem["NAME"]} ".'</div>';
                  echo '<select style="width:150px;" onChange="'.$arResult["FILTER_NAME"]."_form".'" name="arrFilter_pf['.$val["CODE"].']">';
                
                  foreach($arSelOpt[$val["CODE"]] as $value)
                  {
                     echo '<option type="submit" name="set_filter" value="'."{$value}".'">'."{$value}".'</option>';
                  }
                  echo '</select>';
               }
            }
            ?>
         <?endif?>
      <?endforeach;?>
      <input  class="submit" type="submit" name="set_filter" value="Показать" />
   </fieldset>
</form>

В итоге, мы получаем красивый список свойств, по которому можно отфильтровать элементы новостей

Поблагодарить автора

Битрикс   наши услуги
2018  

Выводить похожие статье Битрикс

Если вам тоже необходимы любые доработки по Битриксу, то вы можете обратиться к нам за помощью. Пишите на почту info@artapir.ru

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

Решение:
Для вывода статей воспользуемся обычным news.list, а похожие статьи будем передавать фильтром в данный компонент.

текст кода, с комментариями по ходу:

// 1. Получаем данные по выбранному элементу: его название и поисковыве теги

$CurentElement=intval($_GET["ID"]); // берем ID текущей статьи из адресной строки

// 2. Получаем данные по выбранному элементу:

$res = CIBlockElement::GetByID($CurentElement);
if($ar_res = $res->GetNext())
    $arCurentElement=$ar_res;

// 3. Из названия и поисковых тегов формируем строку, по словам которой будем искать все похожие записи:

$tmpName=str_replace(
    array(".", ",","?","!","-"),
    "",
    trim($arCurentElement["NAME"]." ".$arCurentElement["TAGS"])
);

/*знаю, что кусок кода выше можно было сделать проще через регулярные выражения. Но, к сожалению, я с ними не дружу:( */

if(strlen($tmpName)>0){
    $arLooksLike = array(
     "INCLUDE_SUBSECTIONS" => "Y",
     "!ID"=>intval($CurentElement)  /*исключаем данный элемент из выборки*/
    );
    $NameItems=explode(" ",$tmpName);  

    /* кто умеет пользоваться регулярными выражениями - можете предварительно не очищать от знаков пунктуации, 
      а сразу тут выбирать уже массив готовых результатов */

    $itemsArray=array();
    foreach($NameItems as $item){
     if(strlen($item)>1){
      $itemsArray[]=array("NAME" => "%".$item."%");  // ищем элементы, у которых выбранное свойство есть в названии
      $itemsArray[]=array("TAGS" => "%".$item."%");  // ищем элементы, у которых выбранное свойство есть в поисковых тегах
     }
    }
    $tmpArray=array("LOGIC" => "OR");  // подключаем логику "ИЛИ"

   следующие 2 операции, думаю, можно ужать, но не стал заморачиваться: и так работает.   

     $tmpArray=array_merge($tmpArray,$itemsArray); 

    $addFArray=array(
     array($tmpArray),
    );
    $GLOBALS["arLooksLike"]=array_merge($arLooksLike,$addFArray);  

}

В результате в глобальном массиве

$GLOBALS["arLooksLike"]

лежит подключаемый фильтр. Этот массив и подключаем к компоненту «news.list»:

"FILTER_NAME" => "arLooksLike",

Всем спасибо за внимание! жду критики...

Поблагодарить автора

Битрикс
2018  

Как вывести Теги в списке новостей битрикса?

Необходимо вывести теги ссылкой на поиск по тегам с условиями для этого тега.
По умолчанию, битрикс выводит теги одной строкой в одном свойстве.

Нам необходимо разобрать это свойство и вывести так как нам надо.

Необходимые данные находятся
$arItem[«TAGS»]

В шаблон /bitrix/news.list/

Вставляем в нужное место код:

Копируй и вставляй!

<img src="/images/tegs.png" alt="">
	
	<?
$arrTags = explode(',', $arItem["TAGS"]);
$count = count($arrTags);
$i = 0;

foreach($arrTags as $value):
   $i++;
   $value = trim($value);
   echo '<a href="/search/?tags='.str_replace(' ', '+', $value).'">'.$value.'</a> ';      
   if($i != $count) echo ', ';
endforeach;
?>

И получаем

При клики на тег, мы переходим на поиск по тегам!
Отлично!

Для детальной странице,необходимо заменить arItem

Битрикс   Лайфхак
2018  

Установить optipng jpegoptim на Битрикс VDS

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

К сожалению это часто такая проблема:
1) многие клиенты не знаю что такое «Оптимизация изображения» и вставляют картинки такие как есть.
2) Разработчик, забывают настроить хотя бы штатные Битриксовые обработки фото при выгрузке из 1С

Вот и один из таких клиентов,пришел к нам на поддержку:

Данного клиента, по необходимости,пришлось переносить на VDS и устанавливать Bitrix OS — что за необходимость мы напишем позже!

Решив воспользоваться модулем Оптимизация картинок — автоматически и без сторонних сервисов мы столкнулись с еще одной проблемой. Не установлены jpegoptim и optipng по умолчанию на сервере

Зайдя в консоль, мы прописываем вот такую строчку

yum install optipng jpegoptim

И происходит МАГИЯ :)

После завершения, мы видим два новых файла в директории /usr/bin «optipng» и «jpegoptim » соответственно.

После всех манипуляций, устанавливаем модуль и смотрим наши картинки. От увиденного, глаза наливаются кровью :)

Приступаем к оптимизации изображения:

Во время обработки изображения, решили посмотреть на нагрузку сервера и охренели, нагрузка доходила до 100%!

Ну что, о результатах мы расскажем не много позже, оставив долю интриги.

p.s. Кстати, в качестве хостинга и VDS для сайтов на битриксе, мы всегда используем и рекомендуем

Хостинг TimeWeb

Поблагодарить автора

Битрикс   Тестируем
2018  

Выгрузка веса товара из 1С для торговых предложений

Задача: Выгрузить вес товаров из 1С для торговых предложений. По умолчанию, вес в 1С есть только у Номенклатуры.

Решение: На стороне 1С  для предложений добавляем новое свойство — Вес,гр. На сайте делаем новое свойство Вес,гр- VES_GR
И пишем и пишем обработчик который вставляем в init.php

Наверняка, кому то пригодиться эта информация:

Сам обработчик:

AddEventHandler("catalog", "OnCompleteCatalogImport1C", "upDateWiegth");
{
	function upDateWiegth() 
	{ 
		if (CModule::IncludeModule("catalog") && CModule::IncludeModule("iblock")) 
		{
			$arSelect = Array("ID", "IBLOCK_ID", "PROPERTY_VES_GR"); 	//получаем вес товара из свойства 
			
			//запрос всех товаро
			$db_res = CCatalogProduct::GetList(
				array("ID"=>"ASC"),
				array(),
				false, 
				false, 	//array('nTopCount' => 1000),
				array('ID','ELEMENT_IBLOCK_ID')
			); 
			while ($ar_res = $db_res->Fetch()) 
			{
				//запрос доп. информации по каждому товару, определяем вес
				$arFilter = Array(
					"ID"=>$ar_res["ID"],
					"IBLOCK_ID"=>$ar_res["ELEMENT_IBLOCK_ID"],
				); 
				
				$res = CIBlockElement::GetList(Array(), $arFilter, false, array('nTopCount' => 1), $arSelect); 
				if ($ob = $res->GetNextElement()) 
				{ 
					$arFields = $ob->GetFields(); 
					
					//если вес присутствует
					if ($arFields['PROPERTY_VES_GR_VALUE']) 
					{ 
						$wightResult = $arFields['PROPERTY_VES_GR_VALUE']*1000; 
						
						$ar_load = array(
							"WEIGHT" => $wightResult,
						);
						
						//изменяем вес - значение берется из свойства с кодом VES_GR
						if (CCatalogProduct::Update($ar_res["ID"], $ar_load) == true) 
						{ 
							echo "Вес товара ".$ar_res["ID"]." обновлен"; 
						} 
						else 
						{ 
							echo "Произошла ошибка при обновление веса товара"; 
						}
					}
				}

			}
		}
	}
}

После чего, мы делаем выгрузку и получаем вот какие значения:

Битрикс
Ранее Ctrl + ↓