Email в качестве логина

Часто возникает потребность поставить Email в качестве логина при регистрации пользователя 1С-Битрикс.

По умолчанию, email является обязательным при регистрации (можно отключить с 14-ой версии, по-моему),
поэтому если регистрируем через форму регистрации, то подключаем обработчик:

AddEventHandler("main", "OnBeforeUserRegister", Array("Handlers", "OnBeforeUserRegisterHandler"));

Теперь внимание! Если регистрируем автоматически при размещении заказа через
sale.order.ajax:

AddEventHandler("main", "OnBeforeUserAdd", Array("Handlers", "OnBeforeUserAddHandler"));

Если его не поставить, то логин будет формироваться по собственной логике sale.order.ajax!

Ваш класс:

class Handlers {
  function OnBeforeUserRegisterHandler(&$arFields) {
  	$arField['EMAIL'] = $arFields['LOGIN'];
  }
 
  function OnBeforeUserAddHandler(&$arFields) {
  	$arFields['LOGIN'] = $arField['EMAIL'];
  }
}

Индексация цен в 1С-Битрикс

Что если необходимо поднять цену для всех товаров каталога, скажем, на 15%?
Нашел вот такой способ.

Решение работает только в редакции 1С-Битрикс «Бизнес» и выше.
Подробнее

Ссылка на звонок с iPhone

Хотите, чтобы нажав на ссылку телефона, можно было позвонить?
Не все мобильные операционки автоматически распознают телефоны.

Делаем вот такую ссылку:

<a href="tel:8-555-555-55-55">8-555-555-55-55</a>

Тадааам!

А можно еще СМС отправить:

<a href="sms:8-555-555-55-55">8-555-555-55-55</a>

Насколько известно, это работает и под Android.

1С-Битрикс: Выпадающий список при привязке к элементам в виде списка

Исходные данные:
1. 1С-Битрикс “Стандарт”;
2. Компонент bitrix.catalog.filter.

При фильтрации по свойствам типа “Список” выпадающий список появляется автоматически. А вот при фильтрации по свойствам “Привязка к элементам в виде списка” — не получается. Не нашел подходящего решения и написал сам.

Компонент модифицировать не надо, все делается в result_modifier.php компонента bitrix.catalog.filter, скопированного в ваш шаблон.
Подробнее

Битрикс: Событие окончания импорта из 1С

В документации этого нет, но по секрету скажу: на случай, если кому понадобилось «подвесить» обработчик события завершения выгрузки из 1С, надо использовать вот такой код в /bitrix/php_interface/init.php

AddEventHandler("catalog", "OnSuccessCatalogImport1C", "DSOnSuccessCatalogImport1C");
function DSOnSuccessCatalogImport1C(){
	// Ваш код
}

Взято вот с этой ветки форума разработчиков. Спасибо Денису Диденко.

Определение мобильного браузера через JS

Давеча понадобилось на лету через JS определить, через мобильный ли браузер сидит пользователь?
Нашел замечательный сниппет:

;window.mobileDetection = {
    Android:function () {
        return navigator.userAgent.match(/Android/i);
    },
    BlackBerry:function () {
        return navigator.userAgent.match(/BlackBerry/i);
    },
    iOS:function () {
        return navigator.userAgent.match(/iPhone|iPad|iPod/i);
    },
    Opera:function () {
        return navigator.userAgent.match(/Opera Mini/i);
    },
    Windows:function () {
        return navigator.userAgent.match(/IEMobile/i);
    },
    any:function () {
        return (this.Android() || this.BlackBerry() || this.iOS() || this.Opera() || this.Windows());
    }
};

Пользоваться так:

window.isMobile = mobileDetection.any() // Вернет true, если сидим с мобильника
window.isMobile = mobileDetection.iOS() // Вернет true, если сидим с iPhone или iPad

Можно расширить объект а на другие клиенты, надо только знать userAgent.

Определение города посетителя

Как это сделать? Да очень просто!

Пример на Joomla 2.5.

Качаем API и базу Sypex Geo City отсюда.

Создаем папку templates/ваш_шаблон/geo/ и кладем туда API и базу.

Вставляем вот этот код в шаблон:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
$path = JPATH_THEMES.'/'.$this->template."/geo/";
 
include($path.'sxgeo.php');
 
function get_user_ip(){
    if ( getenv('REMOTE_ADDR') ) $user_ip = getenv('REMOTE_ADDR');
    elseif ( getenv('HTTP_FORWARDED_FOR') ) $user_ip = getenv('HTTP_FORWARDED_FOR');
    elseif ( getenv('HTTP_X_FORWARDED_FOR') ) $user_ip = getenv('HTTP_X_FORWARDED_FOR');
    elseif ( getenv('HTTP_X_COMING_FROM') ) $user_ip = getenv('HTTP_X_COMING_FROM');
    elseif ( getenv('HTTP_VIA') ) $user_ip = getenv('HTTP_VIA');
    elseif ( getenv('HTTP_XROXY_CONNECTION') ) $user_ip = getenv('HTTP_XROXY_CONNECTION');
    elseif ( getenv('HTTP_CLIENT_IP') ) $user_ip = getenv('HTTP_CLIENT_IP');
    $user_ip = trim($user_ip);
    if ( empty($user_ip) ) return false;
    if ( !preg_match("/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/", $user_ip) ) return false;
    return $user_ip;
}
$ip = get_user_ip();
$SxGeo = new SxGeo($path."sxgeocity.dat");
$city = $SxGeo->get($ip);

Вуаля, в переменной $city лежит ваш город, можете с ним играться как хотите :-)

Цитаты в HTML. Стилизация через SCSS

Есть замечательная статья на html5doctor о семантике цитат.
В SCSS строковые цитаты я стилизую так:

style.scss

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
q {
	font-style: italic;
 
	&:lang(ru) {quotes: '«' '»' '“' '”';}
	&:lang(en) {quotes: '„' '“' '‚' '‘';}
 
	&:lang(ru) {
		&:before {content: '«'; content: open-quote;}
		&:after {content: ' »'; content: close-quote;}
		& q:before {content: '“'; content: open-quote;}
		& q:after {content: '”'; content: close-quote;}
	}
 
	&:lang(en) {
		&:before {content: '“'; content: open-quote;}
		&:after {content: '”'; content: close-quote;}
		& q:before {content: '‘'; content: open-quote;}
		& q:after {content: '’'; content: close-quote;}
	}
}

modernizr: что это и где использовать?

Слышали о полезной библиотеке modernizr?
Если не слышали, позвольте вкратце рассказать, где ее можно применить.

Что это такое?

modernizr — библиотека, которая определят поддержку браузерами современных технологий.
Поставляется в составе HTML5 Boilerplate, можно качать и ставить отдельно.
Подключается в верху страницы и добавляет документу классы, соответствующие технологиям.
Так же создает объект window.Modernizr, в котором хранит много полезной информации. Подробнее

Кнопка «Назад» на iPhone

Просто в качестве заметки.
Если нажать кнопку «назад» на iPhone (iOS 5), то он возвратит предыдущую страницу в последнее сохраненное состояние сценария.
То есть к примеру оставит нажатые кнопки, если они нажимались при помощи javascript.
Чтобы этого не происходило, форсируем перезагрузку страницы при переходе «назад»:

1
2
3
4
5
6
7
8
if ((/iphone|ipod|ipad.*os 5/gi).test(navigator.appVersion)) {
	window.onpageshow = function(evt) {
		if (evt.persisted) {
			// Ваш код, который необходимо выполнить при перезагрузке
			location.reload();
		}
	};
}