Добавление необходимых полей в кеш для использования в 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,
            ));
         }
      
      }
      
   }
   

}

Нарезка картинок для свойства FILE

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

id свойства 31, свойство множественное

AddEventHandler("iblock", "OnBeforeIBlockElementAdd",	Array("MyClass",	"OnBeforeIBlockElementAddHandler"));
		class MyClass
		{
			// создаем обработчик события "OnAfterIBlockElementAdd"
			function OnBeforeIBlockElementAddHandler(&$arFields)
			{
				
				if($arFields["IBLOCK_ID"] == 14){
					// dbg($arFields,true);
					foreach($arFields[PROPERTY_VALUES][31] as &$file):
					   CAllFile::ResizeImage(
						 $file, 
						 array("width" => "200", "height" => "200"), 
						 BX_RESIZE_IMAGE_PROPORTIONAL);
					endforeach;
				}

			}
		}

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

16.03.2013 php, php скрипты , ,

header.php

$GLOBALS['TITLE'] = ''; //тут будет храниться заголовок страницы
//тут мы пишем наш код всех нужных нам компонентов
function settitle ($title) {
	// global $GLOBALS['TITLE'];
	$GLOBALS['TITLE'] = $title;
}
function showtitle () {
	echo "{TITLE}"; //выводим временный костыль для автозамены буферизированного контента
}
ob_start();
echo "<html><head><title>";
showtitle (); //выводим заголовок страницы
echo "</title></head><body>";

index.php

<?include('header.php')?>
<?php
settitle("Пример  gfbfdg fdgdfgfdgотложенных функций"); //обратите снивание заголовок наш уже вывелся выше
//но он был временно буферизирован и не попал на страничку
?>
<?include('footer.php')?>

footer.php

$content=ob_get_clean();//получаем весь буфер и очищаем его
//а теперь самое интересное замена титла на последний установленній
$content=preg_replace("!{TITLE}!", $GLOBALS['TITLE'], $content);
//выводим буферизированный контент
echo $content;

ЧПУ своими руками

16.03.2013 php, php скрипты No comments

<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteRule ^catalog/([^/.]+)/([^/.]+)/?$ catalog/index.php?SECTION_CODE=$1&ELEMENT_ID=$2 [L]
	RewriteRule ^catalog/([^/.]+)/?$ catalog/index.php?SECTION_CODE=$1 [L]
</IfModule>

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

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

http://dev.1c-bitrix.ru/community/webdev/user/60622/blog/7049/

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

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

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

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

в компоненте детального вывода статьи в файле 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 (если конечно к вашему сайту подключена данная библиотека) может посмотреть в полном размере…

Валидация в inpute

26.02.2013 javascript

Ввод только русских символов, только латинских, только числа.
в этом параметре

data-check='["RUSSTR"]'

нужно указать «RUSSTR» или «ENSTR» или «NUMERIC»

<input type='text' id='S_NAME' name='DATA[S_NAME]' class='symbolic' value='<?=$postArData['S_NAME']?>' data-check='["RUSSTR"]' />
jQuery('.symbolic').keyup(function(){
		var This		= jQuery(this);
		var ThisData	= This.data('check');
		var Val			= This.val();
		for(b in ThisData){
			var a = ThisData[b];
			switch (a) {
				case 'RUSSTR':
					var ValCheck	= '';
					var shablon		= /[А-Яа-я -]{1,50}/;
					var resultCheck	= Val.match(shablon);
					if (resultCheck == Val && resultCheck!=null){
						ValCheck = Val;
					}else{
						var kolich = Val.length;
						ValCheck = Val.slice(0,kolich-1);
					var ValCheck = Val.replace(/[A-Za-z0-9]/g,"");
					}
					This.val(ValCheck);
				break
				case 'ENSTR':
					var ValCheck	= '';
					var shablon		= /[a-zA-z -]{1,50}/;
					var resultCheck	= Val.match(shablon);
					if (resultCheck == Val && resultCheck!=null){
						ValCheck = Val;
					}else{
						var kolich = Val.length;
						ValCheck = Val.slice(0,kolich-1);
						var ValCheck = Val.replace(/[А-Яа-я0-9]/g,"");
					}
					This.val(ValCheck);
				break
				case 'NUMERIC':
					var ValCheck	= '';
					var shablon		= /[0-9]{1,50}/;
					var resultCheck	= Val.match(shablon);
					if (resultCheck == Val && resultCheck!=null){
						ValCheck = Val;
					}else{
						var kolich = Val.length;
						ValCheck = Val.slice(0,kolich-1);
						var ValCheck = Val.replace(/[\D]/g,"");
					}
					This.val(ValCheck);
				break

				default:

			}
		}
	});

jQuery data

26.02.2013 javascript No comments

Array

<input type='text' id='S_NAME' name='DATA[S_NAME]' class='symbolic' value='<?=$postArData['S_NAME']?>' data-check='["test", "twoo", "thrie"]' />
var stuff = $("#S_NAME").data("check");
alert(stuff[2]);

Object

<input type='text' id='S_NAME' name='DATA[S_NAME]' class='symbolic' value='<?=$postArData['S_NAME']?>' data-check='{"name":"John"}' />
var stuff = $("#S_NAME").data("check");
console.log(stuff);