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

программирование РСС

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

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.

Подсчет и вывод количества элементов инфоблока в 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 в работающих проектах, но думаю скоро я исправлю это. И напишу, что получилось.

Просмотр массива 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 +  Ранее