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#

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

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'];?>

28 июля 2015, 22:36

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

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

***
— Мне обидно, что мы часто забываем о настоящем. Я же помню, как не раз, когда мне было сложно, ты, не бросаясь словами, сжимал мне руку. Давал понять, что ты рядом. Помню, как мы долго молчали, не из-за того, что не о чем было говорить... Так хорошо понимали состояния друг друга, что не могли передать их словами. Вот это и есть настоящее, которое легко утратить в толпе. Люди, я думаю, вообще не нуждаются в словах. Достаточно руки в руке и взглядов.

***
Мы способны стремительно распрощаться с любой из вредных привычек — бросить курить, отказаться от спиртного, перестать объедаться сладким перед сном. Но есть такие вещи, не поддающиеся силе воли. Забыть или разлюбить, к примеру. Все, что рождается в сердце, навсегда в нем остается.

***
Отныне я ничего больше не раскрашиваю — принял все, как есть, как было и как должно было быть. С нами случилось время, с нами случилась жизнь, это то, чему еще никто не смог противостоять. Нет, я не смирился с этой разлукой. Просто должен идти дальше, пока не знаю куда, но должен идти. Ведь дорога возникает под шагами идущего.

***
Мы ждем любовь про себя, в тихой заводи своего одиночества, не осознавая, что обманываемся. Что долгожданный стук в дверь не прозвучит, а на пороге не появится спаситель с храбрым сердцем. Это все в книжках, это все в голливудском кино. Там все красиво — жизнь быстрее, чем наша, люди более подтянутые и крепкие, чем мы, декорации новее и дороже, чем те, что окружают нас.

А в настоящей жизни? Красиво иначе, больно иначе. И это совсем не плохо, может, даже хорошо. Мы плачем иначе — солеными и настоящими слезами. Зато у нас есть право на выбор сюжета: мы играем жизнь так, как хотим, и нам не кричат в рупор, требуя повторить в десятый раз дубль. Мы же сами режиссеры своих судеб. Может, истинное счастье в этой свободе?

***
— Я так устал искать все заново...

***
Для чего возвращаться в прошлое, если все равно не заберешь тех, кто там остался?

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

***
С годами утрачивается легкость шагов. Не принимая в расчет, что нельзя стать победителем, не научившись проигрывать, — сотню раз измеряем, обдумываем, анализируем, что попросту вредит делу. А полезно напрочь забыть про „можно“ с „нельзя“, и безо всякой задней мысли радоваться чему-то простому, наслаждаясь вкусом жизни.

***
Не очень скучаю по большому городу. Зато не покидает ощущение того, что меня там кто-то ждет. Так всегда, когда находишься на расстоянии. Возвращаешься и понимаешь: все по-прежнему.

***
— Многоточие — это ведь приближающийся конец?
— Совсем нет, сынок.
— Но в нем большая доля сомнений...
— Неопределенности. А даже в самой туманной неопределенности есть надежда.

***
И я вспоминаю нас в бризе утраченного майского утра. Я проснулся от пристального взгляда. Приподнявшись на локте, она смотрела на меня с бесконечным ощущением жизни. В комнате пахло хвоей, остатками теплого рассвета. „У нас будет ребенок“.

***
Я на кухне с открытыми окнами, за ними — продрогший город. Грустит, кашляет. Большой город, в котором твои мечты сбываются у кого-то другого. Пусть. Давно не мечтаю. Я просто делаю шаги. То назад, то вперед.

***
В отношения с людьми мы любим раздавать роли. Требовать актеров строго следовать нашей трактовке. И сами при этом играем самозабвенно. Потом кто-то рано или поздно захочет хотя бы часок побыть собой, а не персонажем. И в этот миг все развалится.

6 сентября 2011, 13:44

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>

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

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