12 заметок с тегом

РСС

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>

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

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

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С-Битрикс: Выводим цену товара в компонент поиска по заголовкам

14 февраля 2013, 16:17

На одном из сайтов возникла необходимость выводить цену товара при вводе посетителем запроса в строку поиска. Постараюсь объяснить как ее решить.

Итак, нам нужно отредактировать шаблон вывода компонента search.title.
Копируем его и открываем на редактирование файл ajax.php

Примерно в 20-21 строчке кода ищем ячейку таблицы td class='title-search-item'
И сразу после ссылки вставляем следующий код:

Теперь осталось только оформить вывод цены стилями css и готово.

1C-Битрикс — назначаем класс тегу body в зависимости от раздела сайта

13 февраля 2013, 16:47

Вставляем вот такую функцию в шаблон сайта:

Я вставил в самый верх кода.

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

Эта функция будет добавлять класс к тегу body с названием равным имени папки раздела сайта.
К примеру в разделе сайта http://site-name.ru/services/ тег body будет иметь класс services.

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;
	}
}
?>

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

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

Просмотр массива arResult в 1С-Битрикс

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

Почему-то когда я начал изучать битрикс, для меня было загадкой — где взять все имена переменных которые используются в шаблонах компонентов. Я не мог понять... прочитал и изучил уже несколько официальных курсов, а нигде нет такой казалось бы важной вещи как просмотр массивов с переменными. Может я был недостаточно внимателен... Так как тогда я ещё мало понимал в массивах и вообще в программировании, для меня это было сложно :)

Возможно кому-то пригодится. Этот код надо вставлять в шаблон компонента.

<?echo «<pre>»; print_r($arResult); echo «</pre>»;?>

Суффикс класса страницы в 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 класса.

Сайт хоккейного клуба Маяк

28 сентября 2011, 22:03

Недавняя работа — сайт хоккейного клуба «Динамо-Маяк».
Использовал CMS Joomla 1.5
Была куча работы по верстке и наполнению сайта, очень много информации накопилось за время существования клуба)

По части программирования, пожалуй самое интересное на этом сайте вывод игроков на странице http://hkmayak.ru/club/comand
Пришлось придумывать как вывести в нужном виде и сохранить вложенность разделов и категорий. Использовал тут модуль новостей Gavick News Pro. Вообще очень часто его использую на joomla сайтах, почти в каждой работе. Очень гибкий модуль для вывода контента.

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

Сайт хоккейного клуба Маяк


Первый вариант шапки сайта.

Сайт хоккейного клуба Маяк


Ну и ссылка на сам сайт))) http://hkmayak.ru/
Ctrl +  Ранее