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
20 июня 2015, 19:42
modx.pro
17
14 775
+2

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

Василий Наумкин
21 июня 2015, 06:26
+1
Интересно, мне одному не понятно, что это и зачем?
    Василий Столейков
    21 июня 2015, 08:18
    0
    Да, не совсем всё это освещено в статье…
    Как я понимаю, тут ситуация, когда разные сайты-лэндинги разбросаны по сети и сделаны на MODX, а заявки с их форм собираются в одну битрикс-админку для их обработки менеджерами…
      Alexander V
      21 июня 2015, 10:52
      0
      Совершенно верно. Есть SaveForm и даже работает, после обработки напильником, но это не то.
      Здесь мы сразу собираем заявки в CRM. К тому же Битрикс24 для компании до 12 сотрудников бесплатный.
    Василий Столейков
    21 июня 2015, 08:26
    0
    Мне больше интересно как с разных других php-сайтов собирать заявки (например в как ресурсы в виде тикетов) в одну админку MODX. То есть сайты разбросаны по другим серверам, но посылать данные формы они должны в базу MODX.
    Какие тут должны быть этапы?
      Alexander V
      21 июня 2015, 17:25
      0
      Добавил пример вызова FormIT
        Антон
        Антон
        22 декабря 2016, 18:29
        0
        А есть пример с 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
        0
        Вот только вчера хотел спросить как переделать под Modx…
        А можете адаптировать под formConstruct, точнее наверно как вывод под него сделать?
          Владимир Ульяновский
          22 июня 2015, 23:36
          0
          И совершенный для меня вариант это еще и заказы с минишопа гнать в битрикс24…
          Поможете?
            Alexander V
            23 июня 2015, 00:28
            0
            По-хорошему надо плагин оформить. Тут я к сожалению не помощник.
              Владимир Ульяновский
              23 июня 2015, 00:34
              0
              Плагин это да, круто было бы.
              Вопрос:
              Я вставил код rest.php в снипет и сделал вывод &hooks=`[[import.b24]],redirect` редирект срабатывает что говорит что hooks выполняется… но лид в битриксе не заполняется…
              Что я не правильно сделал?
                Alexander V
                23 июня 2015, 00:38
                0
                Я так не пробовал. Из оригинала я удалил вывод ответа сервера. Добавьте ответ и уберите редирект, он появится перед формой после отправки.
            Ilya Ev
            24 июня 2015, 12:03
            1
            +1
            Вот писал на скорую руку для себя, лучше подредактировать ибо криво)

            на событие 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
            23 июня 2015, 00:31
            0
            formConstruct использует FormIt насколько я знаю. Точно так же и оформить, как в примере. Главное соблюдайте имена полей и вызов хука из файла.
            DOM
            DOM
            08 апреля 2016, 10:05
            0
            Кто-то с передачей OPPORTINUTY (Возможная сумма сделки) работал? Почему-то цена не передается, как только не пробовал. Есть мысль что это из-за типа double. Если пихнуть ее в поле с типом string, то все гуд. Но в Отчестве она мне не надо )) Подскажите, плз, кто решил такой вопрос.
              DOM
              DOM
              08 апреля 2016, 11:06
              0
              Все разобрался, ошибка в мануале самого битрикса
              OPPORTINUTY — не правильно!!!
              Ставьте значение — OPPORTUNITY
                DOM
                DOM
                03 августа 2016, 14:59
                0
                А если нужно указать 2 поля с email как быть в таком случае?
                'EMAIL_HOME' => $leadData['EMAIL_HOME1'],
                EMAIL_HOME1 и EMAIL_HOME2
                  pr-light
                  24 октября 2017, 16:22
                  0
                  Ребят, а можно каким-то макаром передавать файлик прикрепленный к форме?
                    Umida
                    11 февраля 2019, 06:19
                    0
                    Здравствуйте ) Никто не пробовал прицепить к Лиду товары этим методом? PRODUCT_ID не работает ( Может есть какой-то иной способ…
                      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                      23