К содержанию

FormIT. Собираем заявки(лиды) в Битрикс 24



1. В вашей форме необходимо указать хук на приложеный файл. В моём примере он в корне.
&hooks=`rest.php`
2. Имена полей(name) должны соответствовать требованиям Битрикс API. При этом, поле TITLE обязательное!
3. Если всё хорошо, то будет созда лид. CRM=> Ещё=> Лиды

Файл rest.php не забудьте указать ваш адрес в Битрикс24, email и пароль
<?php
// CRM server connection data
define('CRM_HOST', 'domain.bitrix24.ru'); // your CRM domain name
define('CRM_PORT', '443'); // CRM server port
define('CRM_PATH', '/crm/configs/import/lead.php'); // CRM server REST service path

// CRM server authorization data
define('CRM_LOGIN', 'e@mail.ltd'); // login of a CRM user able to manage leads
define('CRM_PASSWORD', 'yourpassword'); // password of a CRM user
// OR you can send special authorization hash which is sent by server after first successful connection with login and password
//define('CRM_AUTH', 'e54ec19f0c5f092ea11145b80f465e1a'); // authorization hash

/********************************************************************************************/

// POST processing
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
	$leadData = $_POST;

	// get lead data from the form
	$postData = array(
		'TITLE' => $leadData['TITLE'],
		'NAME' => $leadData['NAME'],
		'EMAIL_HOME' => $leadData['EMAIL_HOME'],
		'COMMENTS' => $leadData['COMMENTS'],
	);

	// append authorization data
	if (defined('CRM_AUTH'))
	{
		$postData['AUTH'] = CRM_AUTH;
	}
	else
	{
		$postData['LOGIN'] = CRM_LOGIN;
		$postData['PASSWORD'] = CRM_PASSWORD;
	}

	// open socket to CRM
	$fp = fsockopen("ssl://".CRM_HOST, CRM_PORT, $errno, $errstr, 30);
	if ($fp)
	{
		// prepare POST data
		$strPostData = '';
		foreach ($postData as $key => $value)
			$strPostData .= ($strPostData == '' ? '' : '&').$key.'='.urlencode($value);

		// prepare POST headers
		$str = "POST ".CRM_PATH." HTTP/1.0\r\n";
		$str .= "Host: ".CRM_HOST."\r\n";
		$str .= "Content-Type: application/x-www-form-urlencoded\r\n";
		$str .= "Content-Length: ".strlen($strPostData)."\r\n";
		$str .= "Connection: close\r\n\r\n";

		$str .= $strPostData;

		// send POST to CRM
		fwrite($fp, $str);

		// get CRM headers
		$result = '';
		while (!feof($fp))
		{
			$result .= fgets($fp, 128);
		}
		fclose($fp);

		// cut response headers
		$response = explode("\r\n\r\n", $result);

		$output = '<pre>'.print_r($response[1], 1).'</pre>';
	}
	else
	{
		echo 'Connection Failed! '.$errstr.' ('.$errno.')';
	}
}
else
{
	$output = '';
}

// HTML form
?>
Это небольшая адаптация под Modх. Оригинал решения смотрите здесь.
Пример вызова
[[!FormIt?
    &hooks=`rest.php`
    &validate=`NAME:required:minLength=^2^,EMAIL_HOME:required:email,COMMENTS:required:minLength=^10^`
    &FormFields=`TITLE,NAME,EMAIL_HOME,COMMENTS`
    &successMessage=`<div class="uk-alert uk-alert-large">Ваша заявка принята!</div>`
    &submitVar=`submit`
    ]]
    [[!+fi.successMessage]]
<form class="uk-form uk-form-horizontal" id="contactForm" method="post" action="[[~[[*id]]]]">
<input type="hidden" name="TITLE" id="" value="Заявка">
    <fieldset>
        <legend>Отправить сообщение</legend>
        <div class="uk-form-row">
		<input type="text" name="NAME" placeholder="Имя" class=" uk-width-1-1 uk-form-large[[!+fi.error.NAME:notempty=` uk-form-danger`]]" value="[[!+fi.NAME]]" required>
		[[!+fi.error.NAME:notempty=`<p class="uk-text-danger uk-text-bold">Поле должно содержать не менее 2 символов</p>`]]
		</div>

        <div class="uk-form-row">
		<input type="email" name="EMAIL_HOME" placeholder="Email" class=" uk-width-1-1 uk-form-large[[!+fi.error.EMAIL_HOME:notempty=` uk-form-danger`]]" value="[[!+fi.EMAIL_HOME]]" required>
		</div>
		[[!+fi.error.EMAIL_HOME:notempty=`<p class="uk-text-danger uk-text-bold">Укажите ваш Email</p>`]]
		<div class="uk-form-row">
		<textarea  name="COMMENTS" cols="30" rows="6" placeholder="Сообщение" class=" uk-width-1-1 uk-form-large[[!+fi.error.COMMENTS:notempty=` uk-form-danger`]]" required>[[!+fi.COMMENTS]]</textarea>
		[[!+fi.error.COMMENTS:notempty=`<p class="uk-text-danger uk-text-bold">Поле должно содержать не менее 10 символов</p>`]]
		</div>

		<div class="uk-form-row"><input class="uk-button uk-button-large uk-button-primary" name="submit" type="submit" value="Отправить сообщение »"></div>
    </fieldset>
</form>
Alexander V
Alexander V
20 июня 2015, 19:42
modx.pro
16 683
Реклама

Комментарии: 23

Василий Наумкин
Василий Наумкин Администратор
21 июня 2015, 06:26
Интересно, мне одному не понятно, что это и зачем?
    Василий Столейков
    Василий Столейков Проверенный
    21 июня 2015, 08:18
    Да, не совсем всё это освещено в статье…
    Как я понимаю, тут ситуация, когда разные сайты-лэндинги разбросаны по сети и сделаны на MODX, а заявки с их форм собираются в одну битрикс-админку для их обработки менеджерами…
      Alexander V
      Alexander V Проверенный
      21 июня 2015, 10:52
      Совершенно верно. Есть SaveForm и даже работает, после обработки напильником, но это не то.
      Здесь мы сразу собираем заявки в CRM. К тому же Битрикс24 для компании до 12 сотрудников бесплатный.
    Василий Столейков
    Василий Столейков Проверенный
    21 июня 2015, 08:26
    Мне больше интересно как с разных других php-сайтов собирать заявки (например в как ресурсы в виде тикетов) в одну админку MODX. То есть сайты разбросаны по другим серверам, но посылать данные формы они должны в базу MODX.
    Какие тут должны быть этапы?
      Alexander V
      Alexander V Проверенный
      21 июня 2015, 17:25
      Добавил пример вызова FormIT
        Антон
        Антон Старожил
        22 декабря 2016, 18:29
        А есть пример с AjaxForm?
        FormIT глючит по страшному, несколько лидов скидывает при перезагрузке, да и вообще страницу перезагружать не вижу смысла.
        Вот такой вызов не работает.
        [[!AjaxForm?
        	&snippet=`FormIt`
        	&form=`tpl.AjaxForm.example`
        	&hooks=`rest.php`
        	&FormFields=`TITLE,NAME,EMAIL_HOME,COMMENTS,OPPORTUNITY`
            	&validate=`NAME:required:minLength=^2^,EMAIL_HOME:required:email`
        	&validationErrorMessage=`В форме содержатся ошибки!`
        	&successMessage=`Сообщение успешно отправлено`
        	&submitVar=`submit`
        ]]
        Зеленое окошко с сообщением об успешной отправке вылазит, а до битрикса не доходит.

        Вот такой вызов битрикс отлично ловил и не по одному разу.
        [[!FormIt?
            &hooks=`rest.php`
            &validate=`NAME:required:minLength=^2^,EMAIL_HOME:required:email`
            &FormFields=`TITLE,NAME,EMAIL_HOME,COMMENTS,OPPORTUNITY`
            &successMessage=`<div class="uk-alert uk-alert-large">Ваша заявка принята!</div>`
            &submitVar=`submit`
            ]]
        Владимир Ульяновский
        22 июня 2015, 23:13
        Вот только вчера хотел спросить как переделать под Modx…
        А можете адаптировать под formConstruct, точнее наверно как вывод под него сделать?
          Владимир Ульяновский
          22 июня 2015, 23:36
          И совершенный для меня вариант это еще и заказы с минишопа гнать в битрикс24…
          Поможете?
            Alexander V
            Alexander V Проверенный
            23 июня 2015, 00:28
            По-хорошему надо плагин оформить. Тут я к сожалению не помощник.
              Владимир Ульяновский
              23 июня 2015, 00:34
              Плагин это да, круто было бы.
              Вопрос:
              Я вставил код rest.php в снипет и сделал вывод &hooks=`[[import.b24]],redirect` редирект срабатывает что говорит что hooks выполняется… но лид в битриксе не заполняется…
              Что я не правильно сделал?
                Alexander V
                Alexander V Проверенный
                23 июня 2015, 00:38
                Я так не пробовал. Из оригинала я удалил вывод ответа сервера. Добавьте ответ и уберите редирект, он появится перед формой после отправки.
                  Владимир Ульяновский
                  23 июня 2015, 00:51
                  Чтоб я еще знал как… Слаб я в этом.
                    Alexander V
                    Alexander V Проверенный
                    23 июня 2015, 00:58
                    Допишите последней строкой
                    <?=$output;?>
                      Владимир Ульяновский
                      23 июня 2015, 00:59
                      В вывод или в снипет?
                        Alexander V
                        Alexander V Проверенный
                        23 июня 2015, 01:06
                        Я не делал снипет. Прочитайте заметку внималельней. Это последняя строка rest.php, она покажет ответ сервера
                          Alexander V
                          Alexander V Проверенный
                          23 июня 2015, 01:10
                Ilya Ev
                Ilya Ev Старожил
                24 июня 2015, 12:03
                Вот писал на скорую руку для себя, лучше подредактировать ибо криво)

                на событие msOnCreateOrder

                <?php
                switch($modx->event->name) {
                case 'msOnCreateOrder':
                // CRM server conection data
                define('CRM_HOST', ''); // your CRM domain name
                define('CRM_PORT', '443'); // CRM server port
                define('CRM_PATH', '/crm/configs/import/lead.php'); // CRM server REST service path
                
                // CRM server authorization data
                define('CRM_LOGIN', ''); // login of a CRM user able to manage leads
                define('CRM_PASSWORD', ''); // password of a CRM user
                // OR you can send special authorization hash which is sent by server after first successful connection with login and password
                //define('CRM_AUTH', ''); // authorization hash
                
                /********************************************************************************************/
                
                // POST processing
                //$leadData = $_POST['DATA'];
                $leadData=$order->get();
                $leadCost=$order->getcost(true,true);
                $leadNum='имя сайта-'.$order->getnumer();
                $ledContact=explode(" ", $leadData['receiver']);
                	// get lead data from the form
                	$postData = array(
                		'TITLE' => $leadNum,
                		'COMPANY_TITLE' => 'Сайт',
                		'NAME' => $ledContact[0],
                		'LAST_NAME' => $ledContact[1],
                		'COMMENTS' => $leadData['comment'],
                		'OPPORTUNITY' => $leadCost,
                		'CURRENCY_ID' => 'RUR',
                		'ADDRESS' => 'дом 18 к5',
                		'PHONE_WORK' => $leadData['phone'],
                		'WEB_WORK' => 'сайт',
                		'SOURCE_ID' => 'WEB',
                		'EMAIL_WORK' => $leadData['email'] 
                	);
                
                	// append authorization data
                	if (defined('CRM_AUTH'))
                	{
                		$postData['AUTH'] = CRM_AUTH;
                	}
                	else
                	{
                		$postData['LOGIN'] = CRM_LOGIN;
                		$postData['PASSWORD'] = CRM_PASSWORD;
                	}
                
                	// open socket to CRM
                	$fp = fsockopen("ssl://".CRM_HOST, CRM_PORT, $errno, $errstr, 30);
                	if ($fp)
                	{
                		// prepare POST data
                		$strPostData = '';
                		foreach ($postData as $key => $value)
                			$strPostData .= ($strPostData == '' ? '' : '&').$key.'='.urlencode($value);
                
                		// prepare POST headers
                		$str = "POST ".CRM_PATH." HTTP/1.0\r\n";
                		$str .= "Host: ".CRM_HOST."\r\n";
                		$str .= "Content-Type: application/x-www-form-urlencoded\r\n";
                		$str .= "Content-Length: ".strlen($strPostData)."\r\n";
                		$str .= "Connection: close\r\n\r\n";
                
                		$str .= $strPostData;
                
                		// send POST to CRM
                		fwrite($fp, $str);
                /*
                		// get CRM headers
                		$result = '';
                		while (!feof($fp))
                		{
                			$result .= fgets($fp, 128);
                		}
                		fclose($fp);
                
                		// cut response headers
                		$response = explode("\r\n\r\n", $result);
                
                		$output = '<pre>'.print_r($response[1], 1).'</pre>';
                */
                	}
                	else
                	{
                		//echo 'Connection Failed! '.$errstr.' ('.$errno.')';
                $modx->log(modX::LOG_LEVEL_INFO, print_r('Ошибка передачи в битрикс', 1));
                	}
                
                
                }
                Alexander V
                Alexander V Проверенный
                23 июня 2015, 00:31
                formConstruct использует FormIt насколько я знаю. Точно так же и оформить, как в примере. Главное соблюдайте имена полей и вызов хука из файла.
                DOM
                DOM Старожил
                08 апреля 2016, 10:05
                Кто-то с передачей OPPORTINUTY (Возможная сумма сделки) работал? Почему-то цена не передается, как только не пробовал. Есть мысль что это из-за типа double. Если пихнуть ее в поле с типом string, то все гуд. Но в Отчестве она мне не надо )) Подскажите, плз, кто решил такой вопрос.
                  DOM
                  DOM Старожил
                  08 апреля 2016, 11:06
                  Все разобрался, ошибка в мануале самого битрикса
                  OPPORTINUTY — не правильно!!!
                  Ставьте значение — OPPORTUNITY
                    DOM
                    DOM Старожил
                    03 августа 2016, 14:59
                    А если нужно указать 2 поля с email как быть в таком случае?
                    'EMAIL_HOME' => $leadData['EMAIL_HOME1'],
                    EMAIL_HOME1 и EMAIL_HOME2
                      pr-light
                      pr-light Старожил
                      24 октября 2017, 16:22
                      Ребят, а можно каким-то макаром передавать файлик прикрепленный к форме?
                        Umida
                        Umida Старожил
                        11 февраля 2019, 06:19
                        Здравствуйте ) Никто не пробовал прицепить к Лиду товары этим методом? PRODUCT_ID не работает ( Может есть какой-то иной способ…
                          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                          23