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>    Комментарии: 23
                Интересно, мне одному не понятно, что это и зачем?            
                    
                Да, не совсем всё это освещено в статье…
Как я понимаю, тут ситуация, когда разные сайты-лэндинги разбросаны по сети и сделаны на MODX, а заявки с их форм собираются в одну битрикс-админку для их обработки менеджерами…
                    Как я понимаю, тут ситуация, когда разные сайты-лэндинги разбросаны по сети и сделаны на MODX, а заявки с их форм собираются в одну битрикс-админку для их обработки менеджерами…
                Совершенно верно. Есть SaveForm и даже работает, после обработки напильником, но это не то.
Здесь мы сразу собираем заявки в CRM. К тому же Битрикс24 для компании до 12 сотрудников бесплатный.
                    Здесь мы сразу собираем заявки в CRM. К тому же Битрикс24 для компании до 12 сотрудников бесплатный.
                Мне больше интересно как с разных других php-сайтов собирать заявки (например в как ресурсы в виде тикетов) в одну админку MODX. То есть сайты разбросаны по другим серверам, но посылать данные формы они должны в базу MODX. 
Какие тут должны быть этапы?
                    Какие тут должны быть этапы?
                Добавил пример вызова FormIT            
                    
                А есть пример с AjaxForm?
FormIT глючит по страшному, несколько лидов скидывает при перезагрузке, да и вообще страницу перезагружать не вижу смысла.
Вот такой вызов не работает.
Вот такой вызов битрикс отлично ловил и не по одному разу.
                    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`
    ]]            
                Вот только вчера хотел спросить как переделать под Modx…
А можете адаптировать под formConstruct, точнее наверно как вывод под него сделать?
                    А можете адаптировать под formConstruct, точнее наверно как вывод под него сделать?
                И совершенный для меня вариант это еще и заказы с минишопа гнать в битрикс24…
Поможете?
                    Поможете?
                По-хорошему надо плагин оформить. Тут я к сожалению не помощник.            
                    
                Плагин это да, круто было бы.
Вопрос:
Я вставил код rest.php в снипет и сделал вывод &hooks=`[[import.b24]],redirect` редирект срабатывает что говорит что hooks выполняется… но лид в битриксе не заполняется…
Что я не правильно сделал?
                    Вопрос:
Я вставил код rest.php в снипет и сделал вывод &hooks=`[[import.b24]],redirect` редирект срабатывает что говорит что hooks выполняется… но лид в битриксе не заполняется…
Что я не правильно сделал?
                Я так не пробовал. Из оригинала я удалил вывод ответа сервера. Добавьте ответ и уберите редирект, он появится перед формой после отправки.            
                    
                Чтоб я еще знал как… Слаб я в этом.            
                    
                Допишите последней строкой
                    <?=$output;?>            
                В вывод или в снипет?            
                    
                Я не делал снипет. Прочитайте заметку внималельней. Это последняя строка rest.php, она покажет ответ сервера            
                    
                Вот писал на скорую руку для себя, лучше подредактировать ибо криво)
на событие msOnCreateOrder
                    на событие 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));
	}
}            
                formConstruct использует FormIt насколько я знаю. Точно так же и оформить, как в примере. Главное соблюдайте имена полей и вызов хука из файла.            
                    
                Кто-то с передачей OPPORTINUTY (Возможная сумма сделки) работал? Почему-то цена не передается, как только не пробовал. Есть мысль что это из-за типа double. Если пихнуть ее в поле с типом string, то все гуд. Но в Отчестве она мне не надо )) Подскажите, плз, кто решил такой вопрос.            
                    
                Все разобрался, ошибка в мануале самого битрикса 
OPPORTINUTY — не правильно!!!
Ставьте значение — OPPORTUNITY
                    OPPORTINUTY — не правильно!!!
Ставьте значение — OPPORTUNITY
                А если нужно указать 2 поля с email как быть в таком случае?
'EMAIL_HOME' => $leadData['EMAIL_HOME1'],
EMAIL_HOME1 и EMAIL_HOME2
                    'EMAIL_HOME' => $leadData['EMAIL_HOME1'],
EMAIL_HOME1 и EMAIL_HOME2
                Ребят, а можно каким-то макаром передавать файлик прикрепленный к форме?
            
                    
                Здравствуйте ) Никто не пробовал прицепить к Лиду товары этим методом? PRODUCT_ID не работает ( Может есть какой-то иной способ…            
                    
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.