Избранное

Определение города по ip-адресу для вывода в шаблонах 1С-Битрикс

5 июля 2013, 9:55

Иногда на сайтах требуется вывести какой-нибудь блок, сформированный уникально в зависимости от города посетителя. К примеру, если я нахожусь в Екатеринбурге, то в шапке сайта мне выводится телефон офиса в Екатеринбурге, если в Москве, то соответственно другой телефон.

Еще один пример который в последнее время часто используется на интернет-магазинах. В карточке товара выводится блок о доставке товара в город который определяется по ip адресу посетителя.

Итак, чтобы реализовать этот функционал в 1С-Битрикс на вашем сайте заходим по адресу /bitrix/php_interface и открываем файл init.php

Добавляем в него такие функции:

<?
function get_city_by_ip($ip){
  $data = file_get_contents_timeout("http://ipgeobase.ru:7020/geo?ip=".$ip);
  if($data){
    $xml = simplexml_load_string($data);
    return $xml->ip->city;
  }else{
    return "Москва";
  }
}

function file_get_contents_timeout($filename, $timeout=3)
{
  if(strpos($filename,"://")===false) return file_get_contents($filename);
  if(!function_exists("curl_init")) return false;
  $session=curl_init($filename);
  curl_setopt($session,CURLOPT_MUTE,true);
  curl_setopt($session,CURLOPT_RETURNTRANSFER,true);
  curl_setopt($session,CURLOPT_CONNECTTIMEOUT,$timeout);
  curl_setopt($session,CURLOPT_TIMEOUT,$timeout);
  curl_setopt($session,CURLOPT_USERAGENT,"Mozilla/5.0 (compatible)");
  $result=curl_exec($session);
  curl_close($session);
  return $result;
}
?>

Но правильнее будет добавить эти функции не в сам файл init.php, а подключить к нему другой файл, например functions.php и уже в него вставить эти функции.

Подключить файл functions.php можно используя в файле init.php такой код:

<?if (file_exists($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/include/functions.php"))
		require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/include/functions.php");
?>

В данном случае я положил файл functions.php в папку /bitrix/php_interface/include/

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

Далее нам осталось вывести результат работы данных функций в любом месте на сайте где это требуется.
Я покажу на примере блока со скриншота.

<div class="order-info">
   <?$city = get_city_by_ip($_SERVER["REMOTE_ADDR"]);?>
   <?if($city=="Москва"){?>
   <p><strong>Бесплатная доставка по Москве!</strong></p>
   <?}else{?>
   <p><strong>Быстрая доставка в город <?=$city?>!</strong></p>
   <?}?>
</div>

Итак, если пользователь в Москве, то ему будет выведено сообщение «Бесплатная доставка по Москве!». Если определился любой другой город, то пользователь увидит сообщение «Быстрая доставка в город {НАЗВАНИЕ ГОРОДА}».

Надеюсь данная информация будет полезна.

Форма отправки данных с любыми полями на 1С-Битрикс «Старт»

24 марта 2013, 21:05

Сегодня расскажу как сделать форму обратной связи с любыми типами полей, используя стандартный функционал и почтовые события 1С-Битрикс. Особенно это актуально для редакции 1С-Битрикс «Старт», так как в ней нет модуля «веб-формы».

Сначала создаем обычную html форму в любом месте на сайте, где она нам нужна. Она может быть во всплывающем окошке или просто на странице сайта, не важно... Ее код может выглядеть примерно как в приведенном примере.

<form id="request-order-form" action="">
    <div>
         <h2>Форма заказа</h2>

        <div class="controls">
            <label>Имя</label>
            <div class="input"> <span class="required">*</span>

                <input type="text" id="form-user-name" />
            </div>
        </div>
        <div class="controls">
            <label>Телефон</label>
            <div class="input"> <span class="required">*</span>

                <input type="text" id="form-user-phone" />
            </div>
        </div>
        <div class="controls">
            <label>E-Mail</label>
            <div class="input"> <span class="required">*</span>

                <input type="text" id="form-user-email" />
            </div>
        </div>
        <div class="controls">
            <label>Комментарий</label>
            <textarea id="textarea" rows="3"></textarea>
        </div>
    </div>
    <div class="actions">
        <button type="submit" class="btn">Отправить</button>
    </div>
</form>

Важно задать стили или идентификаторы форме и элементам, так как необходимо будет обращаться к ним при помощи jQuery.

Далее идем в подключенный файл javascript или можно подключить отдельный файл javascript к шаблону сайта. Вставляем туда код javascript моего примера.

$(document).ready(function(){ 
	orderForm.validform();
});



var orderForm = {
	validform: function(){
        var errors = false;
		
		var regPhone = /^[\(\)\[\]\s\\\/\-0-9\+]{5,250}$/i;
		var regMail = /^([a-z0-9_\-]+\.)*[a-z0-9_\-]+@([a-z0-9][a-z0-9\-]*[a-z0-9]\.)+[a-z]{2,4}$/i;
		
        var highlight = function(type, field){
            switch (type) {
                case 'ok':
                    field.parent("div.input").removeClass("error");
                    break;
                case 'err':
                    field.parent("div.input").addClass("error");
					errors = true;
                    break;
            }
            if(errors){
                field.attr({error: 'yes'});
            }
        }
        // по нажатию submit
        $("#request-order-form button:submit").click(function(){
            $('[error]').removeAttr('error');
			
			var name = $('#request-order-form input#form-user-name');
            if (name.val().length > 1) {
               highlight('ok', name);
            } else {
                highlight('err', name);
            }
			
			var email = $('#request-order-form input#form-user-email');
			if (regMail.test(email.val())) {
               highlight('ok', email);
            } else {
                highlight('err', email);
            }
			
			var phone = $('#request-order-form input#form-user-phone');
			if (regPhone.test(phone.val())) {
               highlight('ok', phone);
            } else {
                highlight('err', phone);
            }	
			
            if (errors) {
                errors = false;
            } else {
				var text = $('#request-order-form textarea#textarea').val();
				
				function onAjaxSuccess(data) {
					alert("Спасибо, Ваш заказ успешно отправлен.");
				}
				$.post('/ajax.php', { 
					name:name.val(),
					email:email.val(),
					phone:phone.val(),
					text:text
				}, onAjaxSuccess);
            }
			return false;
        });
    },
}

Там идут различные проверки валидности заполения формы и формируются переменные из введенных данных для отправки ajax запроса на сервер. Можно создать сколько угодно разных полей в форме, прописать обработчики для них в javascript файле и назначить переменные для отправки ajax запроса.

Далее необходимо создать файл ajax.php в корне сайта, либо в любой другой дирректории. В моем примере, в коде javascript используется корневая дирректория. В этот файл необходимо прописать такой код:

<?
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS", true);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
	$arSend = array(
		"NAME" => htmlspecialchars($_POST['name']),
		"EMAIL" => htmlspecialchars($_POST['email']),
		"PHONE" => htmlspecialchars($_POST['phone']),
		"TEXT" => htmlspecialchars($_POST['text']),
	);
	CEvent::Send('ORDER',SITE_ID,$arSend);
}
?>

Осталось создать тип события и шаблон отправки письма для него. В моем примере тип события имеет имя ORDER. Заходим в административную часть сайта на 1С-Битрикс, переходим по адресу: Настройки > настройки продукта > почтовые события > типы почтовых событий. Добавляем новый тип с названием которое прописали в файле ajax.php.

Теперь необходимо создать шаблон отправки для этого почтового события. Переходим по адресу Настройки > настройки продукта > почтовые события > почтовые шаблоны. Создаем новый шаблон для нашего почтового события. Переменные в тексте письма можно выводить используя названия заданные в файле ajax.php, в моем примере это будет выглядеть так:

Имя: #NAME#
Контактный телефон: #PHONE#
Контактный e-mail: #EMAIL#
Текст сообщения: #TEXT#

Вот и все, надеюсь кому-нибудь поможет.

Подсчет и вывод количества элементов инфоблока в 1С-Битрикс

30 ноября 2012, 15:42

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

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

<?CModule::IncludeModule('iblock'); 
$arFilter = array( 
    'IBLOCK_ID' => 123, // ID инфоблока 
    // любые другие параметры, например 'ACTIVE' => 'Y' 
); 
$res = CIBlockElement::GetList(false, $arFilter, array('IBLOCK_ID')); 
if ($el = $res->Fetch()) 
    echo 'Записей: '.$el['CNT'];?>

Генерация изображений любого размера в шаблонах вывода 1С-Битрикс

30 ноября 2012, 14:31

Генерация изображения произвольного разрешения из детальной картинки в шаблоне детального просмотра:

Добавляем следующий код в файл result_modifier.php (если этого файла нет, то создаем и кладем в папку шаблона):

<? if(is_array($arResult["DETAIL_PICTURE"]))
{
	$arFilter = '';
	$arFilter = array(array('name' => 'sharpen', 'precision' => 20), 
        array('name' => 'watermark','position' =>'br',
        'size'=>'real','type'=>'image','alpha_level'=>'70',
        'file'=>$_SERVER['DOCUMENT_ROOT'].'/include/watermark_white.png'));

	$arFileTmp = CFile::ResizeImageGet(
		$arResult['DETAIL_PICTURE'],
		array('width' => 762, 'height' => 465),
		BX_RESIZE_IMAGE_EXACT,
		true, $arFilter
	);

	$arResult['DETAIL_PICTURE_762'] = array(
		'SRC' => $arFileTmp['src'],
		'WIDTH' => $arFileTmp['width'],
		'HEIGHT' => $arFileTmp['height'],
	);
}?>

В данном случае применен фильтр резкости, и наложение водяного знака на изображение.

В $arResult формируется массив $arResult['DETAIL_PICTURE_762'].
Для вывода адреса изображения, вставляем в шаблон:
$arResult['DETAIL_PICTURE_762']['SRC']

Генерация изображений произвольного разрешения для множественного свойства типа «файл»

<? if (is_array($arResult['DISPLAY_PROPERTIES']['IMAGES']))
{

	foreach ($arResult['DISPLAY_PROPERTIES']['IMAGES']['FILE_VALUE'] as $key => $arFile)
	{
		$arFilter = '';
		$arFilter = array(array('name' => 'sharpen', 'precision' => 20), 
                array('name' => 'watermark','position' =>'br',       
                'size'=>'real','type'=>'image','alpha_level'=>'70',
                'file'=>$_SERVER['DOCUMENT_ROOT'].'/include/watermark_white.png'));
		$arFileTmp = CFile::ResizeImageGet(
			$arFile,
			array('width' => 762, 'height' => 465),
			BX_RESIZE_IMAGE_EXACT,
			true, $arFilter
		);

		$arFile['PREVIEW_WIDTH'] = $arFileTmp['width'];
		$arFile['PREVIEW_HEIGHT'] = $arFileTmp['height'];

		$arFile['SRC_PREVIEW'] = $arFileTmp['src'];
		$arResult['MORE_PHOTO'][$key] = $arFile;
	}
}
?>

Для вывода в шаблоне детального просмотра, вставляем код:

Seblod — самый мощный CCK для Joomla

4 февраля 2012, 16:05

Seblod — самый мощный CCK для Joomla
Итак, что такое CCK?
CCK (content construction kit) — система создания контента или управления контентом. Это расширения для Joomla, которые позволяют очень гибко создавать и управлять материалами на сайте.

Ну вообще, это касается не только системы управления joomla, думаю это общее понятие. В некоторых CMS construction kit есть по умолчанию, например в бесплатной Drupal 7 или в коммерческой системе 1C-Битрикс (даже в самой младшей редакции). Joomla до своего собственного CCK к сожалению пока не доросла, поэтому приходится использовать сторонние расширения.

Расскажу немного о самых известных CCK для CMS joomla.

K2 — пожалуй самая популярная система. Для неё существует очень много модулей и плагинов, её поддерживает большое сообщество. Она наиболее простая для понимая, но не такая гибкая как хотелось бы. Работа с полями CCK на мой взгляд очень неудобна. Нет интерфейса для визуального редактирования шаблонов вывода контента. Компонент существует отдельно от стандартного джумловского com_content и никак с ним не интегрируется, что делает невозможным использование в связке с K2 множества модулей разработанных для компонента com_content. Да и устанавливая K2, вы по сути отказываетесь от большей части стандартного функционала joomla. Этим K2 меня всегда отталкивал. А ещё с фильтрацией материалов у него всё плохо, в стандартном варианте её просто нет, есть конечно платные модули.... но это уже получается допиливание допилинного. Нет возможности отключить стандартные поля introtext и fulltext, что тоже идёт ему в минусы. Он поддерживает joomla 1.5, 1.7 и уже 2.5.
http://getk2.org/

MightyResources — довольно много раньше использовал этот CCK в своих проектах. Он значительно более гибкий по сравнению с К2, работа с полями значительно удобнее, очень много параметров для настроек визуального вывода контента. Если нужны дополнительные шаблоны оформления материалов, придется покупать платную лицензию, причем красота этих шаблонов мягко говоря сомнительна. Намаялся в своё время с этим компонентом, много багов, много лишнего в стандартном выводе, много приходится настраивать и чистить. Также не имеет никакой интеграции со стандартным компонентом com_content. C модулями для него ещё хуже чем с К2, ведь CCK K2 более распространён и некоторые хорошие модули могут выводить информацию и из него. К примеру модуль Gavik News Show отлично дружит как с com_content так и с K2. В MightyResources в бесплатной версии есть фильтры, только вот работают они как-то по-дурацки. Этот CCK существует только для версии joomla 1.5 и создатели похоже совсем не торопятся адаптировать его под joomla 2.5.
http://www.mightyextensions.com/joomla-components/resources-cck-custom-content-types

Ещё пару слов о CCK с которыми я почти не работал, но кое какое мнение о них у меня есть.

YooZOO — Создателям этого компонента за дизайн можно ставить 10 баллов из 10, всё сделано очень красиво, и вроде бы очень удобно. Также популярный компонент CCK joomla, благодаря своей красоте и понятности интерфейса. Хороший визуальный интерфейс для управления выводом полей, везде ajax, drug and drop. Насколько я знаю, с фильтрацией в нем дела обстоят тоже не очень хорошо. Также нет интеграции с com_content. В бесплатной версии только 2 готовых приложения «blog» и «pages», все самое интересное доступно за деньги. Почти не работал с этим компонентом, но видел что с ним делают, так что он достаточно гибкий и мощный. Поддержка joomla 2.5 уже есть.
http://www.yootheme.com/zoo

FLEXIcontent — ещё один CCK для joomla. Есть поддержка только версии joomla 1.5. Распространён довольно мало, поэтому думаю, что для joomla 2.5 он появится не скоро. Интерфейс административной панели выполнен довольно симпатично. Есть фильтры, и тут они работают вполне приемлемо. Главное отличие от предыдущих CCK — это пожалуй то, что FLEXIcontent использует com_content для хранения материалов, т. е. есть интеграция со стандартным функционалом joomla. Есть подозрение, что компонент стоящий, но поддержки 2.5 нет, поэтому отказался от его использования и изучения.
http://flexicontent.org/

Ну а теперь о том, ради чего собственно и затеял этот пост.

Seblod — самый мощный CCK для Joomla

Seblod — пожалуй самый мощный и самый гибкий компонент CCK для joomla. На сегодняшний день последняя редакция имеет версию 2.1 и работает пока только с joomla 1.7. Думаю очень скоро этот компонент допилят и до версии 2.5, переживать об этом не стоит, тем более, что сама джумла 2.5 вышла всего пару недель назад.
Что же такого интересного в этом загадочном Seblod? Когда в первый раз столкнулся с этим компонентом, он показался мне ужасно сложным, пожалуй это чувство никуда не пропало и сейчас) Он очень сложный, но вместе с тем и ужасно интересный. Самый большой его плюс — это полная интеграция с системой joomla, с категориями, материалами, пользователями, ролями пользователей, шаблонами. Гибкая настройка списков, таблиц, материалов. Можно вообще отказаться от использования сторонних модулей вывода и использовать только листинги Seblod, на мой взгляд это очень удобно. Легко переносить приложения созданные в seblod между разными проектами. Отлично реализованы фильтры. Но к сожалению пока очень мало документации по нему, и распространён он значительно меньше чем K2 или ZOO.
http://seblod.com/
Мне ещё не довелось использовать seblod в работающих проектах, но думаю скоро я исправлю это. И напишу, что получилось.

Stylizer — ускорение верстки страниц в несколько раз

13 октября 2011, 13:20

Какой редактор css вы используете при верстке сайтов?
Существует множество редакторов для написания css кода, начиная от обычного windows-блокнота до такого монстра как Adobe Dreamweaver.
Но использовать dreamweaver только для того чтоб писать css код — не очень удачное решение. Он сильно нагружает систему и расходует довольно много оперативной памяти.

Stylizer — ускорение верстки страниц в несколько раз

В своей работе, я использую редактор HTMLPad.
Пишу в нём html код, javascript, php и иногда редактирую css.
Но это все обычные текстовые редакторы, в этой статье речь пойдет о другом...

Вы когда-нибудь использовали плагин firebug для mozilla firefox? ...сейчас он существует и для браузера google chrome. Думаю любой, кто занимается версткой сайтов знает этот плагин, и знает как удобно им редактировать css код, видя при этом изменения на странице сайта прямо в реальном времени. Но есть одно «Но»... Вы не можете сохранять изменения в css файлы на хостинге... Т. е. написав правила css для какого-нибудь заголовка или блока в firebug, вам нужно будет скопировать их и вставить в файлы стилей вашего сайта на хостинге.

Когда я только начинал заниматься версткой, мне казалось, что это очень неудобно... а просто писать правила в html редакторе, подгоняя отступы по несколько раз, выбирая цвет и т. д... совсем уж долго и быстро надоедает.

Я начал искать программу, которая позволяла бы редактировать css код в визуальном режиме и при этом умела бы сохранять все изменения в файлы на хостинге.
И вот после долгих поисков я её нашел. Пожалуй это уникальная программа, ничего подобного больше я не встречал. Называется она Stylizer.
Сайт разработчиков: http://www.skybound.ca/

Stylizer — ускорение верстки страниц в несколько раз

Программа платная и стоит 80 долларов, но она поразительно ускоряет продуктивность. С её помощью, верстать страницы можно в несколько раз быстрее.
Использую её уже больше года, обалденный инструмент для верстальщика.

На официальном сайте есть ознакомительная версия, которая работает 14 дней.

С одной лицензией можно использовать программу на 2-х разных компьютерах, причем один компьютер должен быть стационарный, а второй — ноутбук. Лицензия привязывается к компьютерному железу.
Каждые 90 дней можно устанавливать программу на новый компьютер, при этом на старом она работать естественно перестает)

Суффикс класса страницы в 1C-Битрикс

7 октября 2011, 16:14

Сегодня, верстая один из очередных сайтов на Битрикс столкнулся с одной небольшой задачкой... Все страницы сайта однотипные, используется один шаблон для всех. Потребовалось сделать одну страницу частично уникальной в плане дизайна и простыми манипуляциями с кодом внутри материала эту задачу нельзя было решить, нужно было немного изменить шаблон сайта на этой конкретной странице.

В джумле есть такое понятие как суффикс класса страницы, т. е. для страниц джумла можно прописывать суффикс для класса основного контейнера body или div в зависимости от конкретного шаблона.
Ну к примеру в шаблоне используется такой контейнер —
<div class=«content»>всякий разный код, бла бла бла...</div>

Суффикс класса страницы в 1C-Битрикс

Прописав суффикс для этой страницы в настройках пункта меню, мы получим что-то типо
<div class=«content_page»>всё тот же код, бла бла бла... </div>

Теперь мы можем изменять внешний вид данной страницы, добавляя в файлы css различные правила для контейнеров внутри тега div.content_page

В битриксе такого функционала по умолчанию нет, поэтому мне пришлось придумывать как добиться чего-то подобного.
Первый вариант для решения моей задачи — это скопировать основной шаблон сайта и применить копию к странице которую требуется изменить. Именно так я бы и сделал буквально несколько месяцев назад, когда только начинал изучать битрикс. Это нифига не рациональный вариант :)

Можно проще!

Переходим к редактированию шаблона сайта, ищём тэг body или любой другой контейнер. Я использовал тег <body>

Мне нужно, чтоб у страницы с адресом /services/restaurant.php был свой суффикс... ну или в данном случае просто класс для тега body

Прописываем такую конструкцию:
<body<?if($APPLICATION->GetCurPage(false)==«/services/restaurant.php»):?> class=«restaurant»<?else:?><?endif?>>

Теперь у данной страницы к тегу body будет применяться класс restaurant, а на всех остальных страницах сайта тег будет без css класса.