bitrix

добавление переменных в component_epilog.php из result_modifier.php

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

в result_modifier.php

$this->__component->arResultCacheKeys[] = 'OLOLO';
$arResult['OLOLO'] = 'OLOLO';

в component_epilog.php

var_dump($arResult);

Пример использования nElementID

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

        $arSort = array( // сортировка из параметров компонента
			$arParams["SORT_BY1"]=>$arParams["SORT_ORDER1"],
			$arParams["SORT_BY2"]=>$arParams["SORT_ORDER2"],
		);
		$arSelect = array( // выбирать будем несколько необходимых полей
			"ID",
		);
		$arNavParams = array(
			"nPageSize"		=> 1, // выбираем по 1 элементу с каждой стороны от текущего
			"nElementID"	=> $GLOBALS['arFiltr']['ID'], // тот элемент, соседей которого ищем
		);




		$arItems = Array();
		$rsItems = CIBlockElement::GetList($arSort, array('IBLOCK_ID'=>$arParams["IBLOCK_ID"]), false, $arNavParams, $arSelect);
		$rsItems->SetUrlTemplates($arParams["DETAIL_URL"]);
		while($obItem = $rsItems->GetNextElement()) {
			$arItem = $obItem->GetFields();
			$arItems[] = $arItem;
		}




		if(count($arItems)==3){ // если выборка вернула 3 элемента, значит есть оба соседа
			$arResult["PREV_NEXT_NAV"]["PREV_ITEM"] = $arItems[0];
			$arResult["PREV_NEXT_NAV"]["NEXT_ITEM"] = $arItems[2];
		}elseif(count($arItems)==2){ // если 2 - то соседний элемент только 1
			if($arItems[0]["ID"]!=$arResult["ID"]){			// определяем, слева он или справа
				$arResult["PREV_NEXT_NAV"]["PREV_ITEM"] = $arItems[0];
			}else{
				$arResult["PREV_NEXT_NAV"]["NEXT_ITEM"] = $arItems[1];
			}
		}

Для cron bitrix

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

Если нужен в bitrix крон, то в начало скрипта укажите этот код.

$_SERVER["DOCUMENT_ROOT"] = '/home/www';

define('NO_AGENT_STATISTIC', 'Y');
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS",true); 
define('CHK_EVENT', false);
 
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
 
@set_time_limit(0);
@ignore_user_abort(true);


CModule::IncludeModule('iblock');
$_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__FILE__)."/..");
$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"];

define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS",true); 
define('CHK_EVENT', true);

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

@set_time_limit(0);
@ignore_user_abort(true);

Предыдущий и следующий элемент в детальном просмотре элемента

08.04.2013 Bitrix, php скрипты

<?
//в result_modifier.php элемента 

$arOrder = array("timestamp_x" => "desc"); // упорядочиваем как и в разделе.
$arSelect = Array("ID", "NAME","DETAIL_PAGE_URL");
$arFilter = Array("IBLOCK_ID"=>$arParams["IBLOCK_ID"], "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y");
$res = CIBlockElement::GetList($arOrder, $arFilter, false, array("nPageSize" => "1","nElementID" => $arResult["ID"]), $arSelect);
//"nPageSize" - количество элементов на странице при постраничной навигации 
//"nElementID" - ID элемента который будет выбран вместе со своими соседями. Количество соседей определяется параметром nPageSize.
while($ob = $res->GetNext())
{
  $arFields[] = $ob;
}

$arResult["RIGHT_ARROW"]["LINK"] = str_replace("#ELEMENT_ID#",$arFields["2"]["ID"],$arFields["2"]["DETAIL_PAGE_URL"]);
$arResult["RIGHT_ARROW"]["NAME"] = $arFields["2"]["NAME"];

$arResult["LEFT_ARROW"]["LINK"] = str_replace("#ELEMENT_ID#",$arFields["0"]["ID"],$arFields["0"]["DETAIL_PAGE_URL"]);
$arResult["LEFT_ARROW"]["NAME"] = $arFields["0"]["NAME"];
?>

Отложенные функции

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

В шаблоне компонента

<?$this->SetViewTarget("some_block");?>
	<div class="some_text_block">
		<?foreach ($arSome as $some) echo $some."<br/>"?>
	</div>
<?$this->EndViewTarget();?>

В шаблоне страниц

<?=$APPLICATION->ShowViewContent('some_block');?>

Много сайтовость Bitrix, создание гипер ссылок

27.03.2013 Bitrix, php скрипты No comments ,

<html>
<head><title>Создание ссылок на папки bitrix и upload</title></head>
<body>
<?
error_reporting(E_ALL & ~E_NOTICE);
@ini_set("display_errors",1);

if ($_POST['path'])
   $path = rtrim($_POST['path'],"/\\");
else
   $path = '../site2/www';

if ($_POST['create'])
{
   if (preg_match("#^/#",$path))
      $full_path = $path;
   else
      $full_path = realpath($_SERVER['DOCUMENT_ROOT'].'/'.$path);

   if (file_exists($_SERVER['DOCUMENT_ROOT']."/bitrix"))
      $strError = "В текущей папке уже существует папка bitrix";
   elseif (is_dir($full_path))
   {
      if (is_dir($full_path."/bitrix"))
      {
         if (symlink($path."/bitrix",$_SERVER['DOCUMENT_ROOT']."/bitrix"))
         {
            if(symlink($path."/upload",$_SERVER['DOCUMENT_ROOT']."/upload"))
               echo "<font color=green>Символические ссылки удачно созданы</font>";
            else
               $strError = 'Не удалось создать ссылку на папку upload, обратитесь к администратору сервера';
         }
         else
            $strError = 'Не удалось создать ссылку на папку bitrix, обратитесь к администратору сервера';
            
      }
      else
         $strError = 'Указанный путь не содержит папку bitrix';
   }
   else
      $strError = 'Неверно указан путь или ошибка прав доступа';
   
   if ($strError)
      echo '<font color=red>'.$strError.'</font><br>Исходный путь: '.$full_path;
}
?>
<form method=post>
Путь к папке, содержащей папки bitrix и upload: <input name=path value="<?=htmlspecialchars($path)?>"><br>
<input type=submit value='Создать' name=create>
</form>

Добавление необходимых полей в кеш для использования в component_epilog.php

26.03.2013 Bitrix, php скрипты No comments , ,

Например, если нужно вручную добавить элемент в цепочку навигации, а в component_epilog.php попадают не все необходимые поля (например, передалось только имя, а ссылки нет).

Тогда в файле result_modifier.php пишем:

$cp = $this->__component;
if (is_object($cp))
$cp->SetResultCacheKeys(array("SECTION_PAGE_URL"));

после чего в файле component_epilog.php становится доступным  $arResult[«SECTION_PAGE_URL»] (т.к. мы принудительно записали его в кеш).

Замена изображений внутри Detail_Text на show_image()

26.03.2013 Bitrix, php скрипты No comments , ,

Оригинал статьи http://dev.1c-bitrix.ru/community/blogs/Docs_and_other/7222.php

Доброго времени суток, уважаемое сообщество!!!

Поступила тут одна «хотелка» от клиента. спешу поделиться

Итак: есть сайт, на котором публикуется (точнее пока что планируется к публикации) огромное количество статей. В этих статьях по тексту контент-менеджеры могут накидывать какие-то изображения, поясняющие текст. НО! заниматься подгонкой изображений к читабельному виду для такого количества статей им то ли лень, то ли денег жалко … и захотел клиент, чтобы все-таки изображения ужимались. причем, ужимались сервером, а не браузером клиента.

И вот родилась идея:

в компоненте детального вывода статьи в файле result_modifier создаею обработчик:

<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die(); 
$pattern="/<img[^>]+src=(\"|')(.+?)(\"|')[^>]*>/si"; 
preg_match_all($pattern,$arResult["DETAIL_TEXT"],$matches); 
$startfloat="right"; 
$arResult["DETAIL_TEXT"]=str_replace(SITE_SERVER_NAME,"",$arResult["DETAIL_TEXT"]); 
$arResult["DETAIL_TEXT"]=str_replace(str_replace("http://","http://www.",SITE_SERVER_NAME),"",$arResult["DETAIL_TEXT"]); 
foreach ($matches[0] as $k=>$image) { 
    $imgSrc='<а  class="fancy" href="'.$matches[2][$k].'" >'; 
    $imgSrc.=CFile::ShowImage($matches[2][$k], 300, 300, "style='float:".$startfloat.";margin:5px;'", "", false); 
    $imgSrc.="</а>"; 
    $arResult["DETAIL_TEXT"]=str_replace($image,$imgSrc,$arResult["DETAIL_TEXT"]); 
    if($startfloat=="right") $startfloat="left"; else $startfloat="right"; 
} 
?> 

в итоге, все изображения ужимаются в 300 на 300, а если кто хочет — в fancybox (если конечно к вашему сайту подключена данная библиотека) может посмотреть в полном размере…

P.S. Спасибо другу моему, Андрею — великому гуру веб-мира, за постоянную помощь с регулярными выражениями (да и не только), с которыми я все никак не подружусь

ДОБАВЛЕНИЕ ОТ 22.03: оставляем у изображений title и alt

текст файла result_modifier немного видоизменился:

<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
$patternSRC="/[^>]+src=(\"|')(.+?)(\"|')[^>]*>/si";
$pattern2="/(alt|src|title)=(\"|')(.+?)(\"|')/si";
$pattern="/<img([^>]*)\/?>/si";
preg_match_all($pattern,$arResult["DETAIL_TEXT"],$matches);
$modifiedImages=array();
foreach($matches[1] as $k=>$image){
    preg_match_all($pattern2,$image,$Attrmatches);
    $attributes=array();
    foreach($Attrmatches[1] as $kT=>$Tmp){
     $attributes[$Tmp]=$Attrmatches[3][$kT];
    }
    $modifiedImages[$matches[0][$k]]=$attributes;
}
$startfloat="right";
$arResult["DETAIL_TEXT"]=str_replace(SITE_SERVER_NAME,"",$arResult["DETAIL_TEXT"]);
$arResult["DETAIL_TEXT"]=str_replace(str_replace("http://","http://www.",SITE_SERVER_NAME),"",$arResult["DETAIL_TEXT"]);
foreach ($modifiedImages as $image=>$attributes) {
    $imgSrc='<a  class="fancy" href="'.$attributes["src"].'" title="'.$attributes["title"].'" >';
    $imgSrc.=CFile::ShowImage($attributes["src"], 300, 300, "alt='".$attributes["alt"]."' title='".$attributes["title"]."'  style='float:".$startfloat.";margin: 5px;'", "", false);
    $imgSrc.="</a>";
    $arResult["DETAIL_TEXT"]=str_replace($image,$imgSrc,$arResult["DETAIL_TEXT"]);
    if($startfloat=="right") $startfloat="left"; else $startfloat="right";
}
?>

первым шагом выбираем все изображения из текста. А затем уже получаем все атрибуты для конкретного изображения и данные по изображению помещаем в массив.
А потом уже для каждого изображения делаем подмену в детальном тексте

подключение LANG файла bitrix

21.03.2013 Bitrix, php скрипты No comments ,

Есть файл

/home/bitrix/www/bitrix/php_interface/include/sale_delivery/delivery_ems_ibatt.php

для него нужно подключить LANG файл

IncludeTemplateLangFile('/bitrix/templates/.default/sale_delivery/delivery_ems_ibatt.php');

а вот путь, где должен лежать сам LANG файл

/home/bitrix/www/bitrix/templates/.default/lang/ru/sale_delivery/delivery_ems_ibatt.php

P.S. Все переменные в ланг файлах должны быть уникальными, т.е если в компоненте news.list есть

<?=GetMessage('TRYAM')?>

и после вызывается другой компонент в котором есть такая же переменная, то последний компонент перезапишет $MESS[‘TRYAM’];

при регистрации пользователя, есть птичка (подписаться на новости)

20.03.2013 Bitrix, php скрипты No comments , , , ,

при регистрации пользователя, есть птичка (подписаться на новости)

// Подписка на рассылку при регистрации

AddEventHandler("main", "OnAfterUserAdd", "OnAfterUserAddHandler");

function OnAfterUserAddHandler(&$arFields)
{

   $errors = Array();

   if($arFields["ID"]>0 && $arFields["UF_SUBSCRIBE"])
   {

      if(CModule::IncludeModule("subscribe")) {
      
         $USER_ID = $arFields["ID"];
         $EMAIL = $arFields["EMAIL"];
      
         $arFilter = array(
            "ACTIVE" => "Y",
            "LID" => "s1",
            "VISIBLE"=>"Y",
         );
      
         $rsRubrics = CRubric::GetList(array(), $arFilter);
         $arRubrics = array();
         while($arRubric = $rsRubrics->GetNext()) $arRubrics[] = $arRubric["ID"];
      
         $obSubscription = new CSubscription;
      
         $rsSubscription = $obSubscription->GetList(array(), array("USER_ID" => $USER_ID));
         $arSubscription = $rsSubscription->Fetch();
   
         if(is_array($arSubscription))
         {
            $rs = $obSubscription->Update(
               $arSubscription["ID"],
               array(
                  "FORMAT" => "html",
                  "RUB_ID" => $arRubrics,
               ),
               false
            );
         }
         else
         {
            $ID = $obSubscription->Add(array(
               "USER_ID" => $USER_ID,
               "ACTIVE" => "Y",
               "EMAIL" => $EMAIL,
               "FORMAT" => "html",
               "CONFIRMED" => "Y",
               "SEND_CONFIRM" => "N",
               "RUB_ID" => $arRubrics,
            ));
         }
      
      }
      
   }
   

}