Отложенные функции [bitrix api]

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

На примере, допустим нам нужно в левую колонку (header.php) выводить список товаров, но по определенному условию, если на странице находится товар с ценой больше 1000 р. или еще по какому-либо критерию. Важно то, что мы не знаем значение по которому можно определить это и оно было-бы нам доступно в header.php, только если это $_GET параметр, но я думаю все цены товара «поднимать» в $_GET это бред.

Вот для передачи значения в header и служат отложенные функции. Заголовок странице устанавливается тоже так, передача значения идет с самой страницы.

С помощью метода $APPLICATION->SetPageProperty(‘KEY’, ‘VALUE’) на самой странице добавляем в ее свойства наше значение, в примере с ценой это будет примерно так:

$APPLICATION->SetPageProperty('MAX_PRICE', $i_ProductPrice);

Далее пишем функцию и ложем ее в init.php например,

Continue reading

Статичная ли страница? [bitrix api]

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

Continue reading

Тот еще COUNT

Иногда бывает под вечер зависнешь на какой-нибудь проверке и не можешь понять почему логика не складывается. Оказывается просто потому что,  не логично работают некоторые участки системы.

В частности столкнулся вот только что с функцией count в php для подсчета значений в массиве. В голове всегда было воспоминание что с ней что-то не так, вот пришлось их обновлять.

//$i = 1.05; // true
//$i = 1;  // true
//$i = '1'; // true
$i = array();// false
var_dump(count($i) > 0);

Логичнее наверное сделать что если переменная не массив, то возвращать NULL или false, так нет же надо возвращать 1.

Если var не является массивом или объектом, реализующим интерфейс Countable, будет возвращена 1. За одним исключением: если varNULL, то будет возвращён 0.

no IE6

Безусловно в жизни web разработчика ie6 это проблема. Для меня все версии ie, мягко говоря, не вызывают доверия. Снипед для ie6, но я жду не дождусь когда и от ie7 я с большим удовольствием его поставлю. От ie8 и выше, жить становится лучше.

Пишем в /bitrix/php_interface/init.php что-то типа:

	$user_agent = $_SERVER['HTTP_USER_AGENT'];
	if (stripos($user_agent, 'MSIE 6.0') !== false && stripos($user_agent, 'MSIE 8.0') === false && stripos($user_agent, 'MSIE 7.0') === false)
		header ("Location: /ie6/ie6.html");

Создаем папку типа /ie6/ и редиректим всех «счастливых» обладателей туда. Ну чтобы их совсем не обижать добавим специальную заглушку типа этой

AJAX навигация по меткам

Итак задача, нужно сохранять состояние страницы после ajax запроса. Для этого приспособили метки у ссылок, URL будет вот такого вида http://site.ru/#/key:val/key1:val1/keyN:valN/

В js далеко не гуру, но все работает и нативно.

var Navigation = function()
{
this.isHash = function(){return (window.location.href.indexOf('#') !== -1 && window.location.hash.length > 1);};

/**
* Возвращает все параметры из url в виде объекта
*/
this.getQueryParams = function(){
if(this.isHash())
{
var _ar = window.location.hash.replace('#', '').split('/');
var _ob = {};

for(var i=0; i < _ar.length; i++){
if(_ar[i] !== "")
_ob[i] = _ar[i];
}

var returnObject = {};
for(var j in _ob){

if (_ob.hasOwnProperty(j)) {
var _ar_params = _ob[j].split(':');
returnObject[_ar_params[0]] = _ar_params[1];
}
}

return returnObject;
}

return false;
};

/**
* Устанавливает строку параметров, если есть сотрет что было
*/
this.setHash = function(objectParsms){

var ar = [], j = 0;
for(var i in objectParsms){
j++; ar[j] = i + ':' + objectParsms[i];
}

var hashString = ar.join('/');

if(hashString.length > 0)
window.location.hash = '#' + hashString + '/';
};

this._isEmptyObject = function(Obj)
{
var i = 0;
for(var o in Obj){
i++;
}

return i;
};

this._isKeyObject = function(obj, key){

for(var o in obj)
{
if(o === key)
return true;
}

return false;
};

/**
* Добавляет параметр в url, если параметр уже есть то заменит значение на новое
*/
this.addHashParam = function(objectParams){

if(this.isHash())
{
var params = this.getQueryParams();

for(var o in objectParams){
if(this._isKeyObject(params, o)){
params[o] = objectParams[o];
}
}

var arRes = [], k = 0;
for(var or in params){
k++;arRes[k] = or + ':' + params[or];
}

var str_hash = arRes.join('/');

var ar = [], j = 0;
for(var i in objectParams){
if(!this._isKeyObject(params, i)){
j++; ar[j] = i + ':' + objectParams[i];
}
}

if(ar.length > 0){
str_hash += ar.join('/') + '/';
}
else{
str_hash += '/';
}

window.location.hash = str_hash;
}
else
{
this.setHash(objectParams);
}
};

/**
* Удаляет параметр из url можно указывать несколько, принимает массив ключей
*/
this.delHashParams = function(arParams){
if(this.isHash())
{
var params = this.getQueryParams();

for(var a = 0; a <= arParams.length; a++){
delete params[arParams[a]];
}

if(this._isEmptyObject(params) > 0)
this.setHash(params);
else
window.location.hash = '';
};
};
};

Делать такую навигацию весьма трудоемко, но позволяет немного шире использовать ajax.

Предзагрузка изображений js [snippets]

2 рабочие функции для пред загрузки картинок, нативная и jQuery.

	

function preload(images) {
   if (typeof document.body == "undefined") return;
 	    try {

 	        var div = document.createElement("div");
 	        var s = div.style;
 	            s.position = "absolute";
 	        s.top = s.left = 0;
 	        s.visibility = "hidden";
 	        document.body.appendChild(div);
         div.innerHTML = "";
 	        var lastImg = div.lastChild;
 	        lastImg.onload = function() { document.body.removeChild(document.body.lastChild); };
 	     }
 	     catch(e) {
 	        // Error. Do nothing.
     }
 	}
 	});

	jQuery.preloadImages = function () {
	    var images = (typeof arguments[0] == 'object') ? arguments[0] : arguments;
	    for (var i = 0; i < images.length; i++) {
	        jQuery("").attr("src", images[i]);
	    }
	}

Найдено на просторах.
http://clip2net.com/clip/m11386/1304961837-clip-11kb.png

Конвертер валют для Bitrix [php, js]

Конвертер валют Битрикс

Конвертер валют Битрикс

Я редко что-то выкладываю готовое, но вот просто захотелось. Я не жадный, просто нет времени. Итак задача была сделать конвертер на js, для этого нам нужно иметь данные для подсчета, принципиально не захотел делать пересчет на аяксе так как это был бы не совсем js конвертер. Вариантов получения данных несколько, вот как сделал я.

В битриксе есть модуль «Валюты» он нам нужен для back-end нашего конвертера. Для автоматического обновления есть скрипт который обновляет курс, его можно запускать кроном или агентом, я выбрал крон. Там же в модуле валюты есть список курсов, с названиями и значениями курса по умолчанию, по большому счету нам нужны только названия валют оттуда. Его пришлось собирать ручками, по этому в архиве положу csv файл, загрузите его сами. Теперь когда back-end готов можно перейти к компоненту.

Компонент обрабатывает данные из модуля, он должен быть постоянно кэшированным так как при вычислении коэффициента для каждой валюты, создается большой кол-во запросов, благо они мелкие и легкие. Кэш компонента очищается при отработки скрипта на кроне, в коде это можно найти. Логика компонента возвращает 2 json объекта с которыми мы в дальнейшем работаем в шаблоне. В общем смотрим что получилось, улучшать там есть что, буду раз замечаниям.

Скачать архив

В папке cron скрипт для пересчета валюты, в flag флаги, их нужно положить в upload или поправить пути. Не забудьте подключить jQuery.