Клиентская интеграция

Комментарии информационных систем

Для подключения антиспам-системы в комментариях информационных систем необходимо:

  1. В XSL-шаблоне для уведомления о добавлении комментария вносим новую обработку ошибки.
    После:
    <!-- Ошибка. Неверный код подтверждения -->
    <xsl:when test="/document/error_captcha = 1">
        <div id="error">Ошибка! Вы неверно ввели число подтверждения отправки комментария!</div>
    </xsl:when>

    Добавляем:
    <!-- Ошибка. Не прошел антиспам -->
    <xsl:when test="/document/error_antispam = 1">
        <div id="error">Ошибка! Комментарий не может быть добавлен!</div>
    </xsl:when>
  2. Переходим в типовую динамическую страницу информационных систем и настраиваем её на обработку антиспам-системы.
    Для этого блок:
    $oComment->save();

    $oComment
        ->dateFormat($oInformationsystem->format_date)
        ->dateTimeFormat($oInformationsystem->format_datetime);

    $oInformationsystem_Item->add($oComment)->clearCache();

    $oXmlCommentTag->addEntity($oInformationsystem);

    // Отправка письма администратору
    $sText = Xsl_Processor::instance()
        ->xml($oXmlCommentTag->getXml())
        ->xsl(Core_Entity::factory('Xsl')->getByName(Core_Array::get(Core_Page::instance()->libParams, 'addCommentAdminMailXsl')))
        ->process();

    $aFrom = array_map('trim', explode(',', EMAIL_TO));

    $oCore_Mail_Driver = Core_Mail::instance()
        ->to(EMAIL_TO)
        ->from($aFrom[0])
        ->header('Reply-To', Core_Valid::email($oComment->email)
            ? $oComment->email
            : $aFrom[0])
        ->subject(Core::_('Informationsystem.comment_mail_subject'))
        ->message(trim($sText))
        ->contentType(Core_Array::get(Core_Page::instance()->libParams, 'commentMailNoticeType', 0) == 0
            ? 'text/plain'
            : 'text/html'
        )
        ->send();

    меняем на:
    // Antispam
    if (Core::moduleIsActive('antispam'))
    {
        $Antispam_Controller = new Antispam_Controller();
        $bAntispamAnswer = $Antispam_Controller
            ->addText($oComment->author)
            ->addText($oComment->email)
            ->addText($oComment->phone)
            ->addText($oComment->subject)
            ->addText($oComment->text)
            ->execute();
    }
    else
    {
        $bAntispamAnswer = TRUE;
    }

    if ($bAntispamAnswer)
    {
        $oComment->save();

        $oComment
            ->dateFormat($oInformationsystem->format_date)
            ->dateTimeFormat($oInformationsystem->format_datetime);

        $oInformationsystem_Item->add($oComment)->clearCache();

        $oXmlCommentTag->addEntity($oInformationsystem);

        // Отправка письма администратору
        $sText = Xsl_Processor::instance()
            ->xml($oXmlCommentTag->getXml())
            ->xsl(Core_Entity::factory('Xsl')->getByName(Core_Array::get(Core_Page::instance()->libParams, 'addCommentAdminMailXsl')))
            ->process();

        $aFrom = array_map('trim', explode(',', EMAIL_TO));

        $oCore_Mail_Driver = Core_Mail::instance()
            ->to(EMAIL_TO)
            ->from($aFrom[0])
            ->header('Reply-To', Core_Valid::email($oComment->email)
                ? $oComment->email
                : $aFrom[0])
            ->subject(Core::_('Informationsystem.comment_mail_subject'))
            ->message(trim($sText))
            ->contentType(Core_Array::get(Core_Page::instance()->libParams, 'commentMailNoticeType', 0) == 0
                ? 'text/plain'
                : 'text/html'
            )
            ->send();
    }
    else
    {
        $oXmlCommentTag->addEntity(Core::factory('Core_Xml_Entity')
            ->name('error_antispam')->value(1)
        );

        $oComment->text = Core_Str::br2nl($oComment->text);
        $Informationsystem_Controller_Show->addEntity($oComment);
    }

Готово. После данных манипуляций всё, что приходит в полях комментария будет проверятся через антиспам-систему и список стоп-слов.

Комментарии интернет-магазина

Для подключения антиспам-системы в комментариях интернет-магазина необходимо:

  1. В XSL-шаблоне для уведомления о добавлении комментария вносим новую обработку ошибки.
    После:
    <!-- Ошибка. Неверный код подтверждения -->
    <xsl:when test="/document/error_captcha = 1">
        <div id="error">Ошибка! Вы неверно ввели число подтверждения отправки комментария!</div>
    </xsl:when>

    Добавляем:
    <!-- Ошибка. Не прошел антиспам -->
    <xsl:when test="/document/error_antispam = 1">
        <div id="error">Ошибка! Комментарий не может быть добавлен!</div>
    </xsl:when>
  2. Переходим в типовую динамическую страницу интернет-магазина и настраиваем её на обработку антиспам-системы.
    Для этого блок:
    $oComment->save();

    $oComment
        ->dateFormat($oShop->format_date)
        ->dateTimeFormat($oShop->format_datetime);

    $oShop_Item->add($oComment)->clearCache();

    $oXmlCommentTag->addEntity($oShop);

    // Отправка письма администратору
    $sText = Xsl_Processor::instance()
        ->xml($oXmlCommentTag->getXml())
        ->xsl(
            Core_Entity::factory('Xsl')
                ->getByName(Core_Array::get(Core_Page::instance()->libParams, 'addCommentAdminMailXsl'))
        )
        ->process();

    $aFrom = array_map('trim', explode(',', EMAIL_TO));

    Core_Mail::instance()
        ->to(EMAIL_TO)
        ->from($aFrom[0])
        ->header('Reply-To', Core_Valid::email($oComment->email)
            ? $oComment->email
            : $aFrom[0]
        )
        ->subject(Core::_('Shop.comment_mail_subject'))
        ->message(trim($sText))
        ->contentType(Core_Array::get(Core_Page::instance()->libParams, 'commentMailNoticeType', 0) == 0
            ? 'text/plain'
            : 'text/html'
        )
        ->send();

    меняем на:
    // Antispam
    if (Core::moduleIsActive('antispam'))
    {
        $Antispam_Controller = new Antispam_Controller();
        $bAntispamAnswer = $Antispam_Controller
            ->addText($oComment->author)
            ->addText($oComment->email)
            ->addText($oComment->phone)
            ->addText($oComment->subject)
            ->addText($oComment->text)
            ->execute();
    }
    else
    {
        $bAntispamAnswer = TRUE;
    }

    if ($bAntispamAnswer)
    {
        $oComment->save();

        $oComment
            ->dateFormat($oShop->format_date)
            ->dateTimeFormat($oShop->format_datetime);

        $oShop_Item->add($oComment)->clearCache();

        $oXmlCommentTag->addEntity($oShop);

        // Отправка письма администратору
        $sText = Xsl_Processor::instance()
            ->xml($oXmlCommentTag->getXml())
            ->xsl(
                Core_Entity::factory('Xsl')
                    ->getByName(Core_Array::get(Core_Page::instance()->libParams, 'addCommentAdminMailXsl'))
            )
            ->process();

        $aFrom = array_map('trim', explode(',', EMAIL_TO));

        Core_Mail::instance()
            ->to(EMAIL_TO)
            ->from($aFrom[0])
            ->header('Reply-To', Core_Valid::email($oComment->email)
                ? $oComment->email
                : $aFrom[0]
            )
            ->subject(Core::_('Shop.comment_mail_subject'))
            ->message(trim($sText))
            ->contentType(Core_Array::get(Core_Page::instance()->libParams, 'commentMailNoticeType', 0) == 0
                ? 'text/plain'
                : 'text/html'
            )
            ->send();
    }
    else
    {
        $oXmlCommentTag->addEntity(Core::factory('Core_Xml_Entity')
            ->name('error_antispam')->value(1)
        );

        $oComment->text = Core_Str::br2nl($oComment->text);
        $Shop_Controller_Show->addEntity($oComment);
    }

Корзина

Для подключения антиспам-системы в корзине необходимо внести изменения в XSL-шаблон обработки формы адреса доставки.

После тега <form> добавляем вывод ошибки:

<xsl:if test="error != ''">
	<div class="alert alert-danger alert-cart" role="alert">
		<xsl:value-of disable-output-escaping="yes" select="error" />
	</div>
</xsl:if>

Далее переходим в код типовой динамической страницы корзины и перед строкой switch (Core_Array::getPost('recount') ? 0 : Core_Array::getPost('step')) добавляем блок:

// Проверка антиспамом формы с данными
if (Core_Array::getPost('step') == 2)
{
	// Antispam
	if (Core::moduleIsActive('antispam'))
	{
		$Antispam_Controller = new Antispam_Controller();

		foreach ($_POST as $tmpValue)
		{
			if (is_string($tmpValue))
			{
				$Antispam_Controller->addText($tmpValue);
			}
		}

		$bAntispamAnswer = $Antispam_Controller->execute();

		// Проверка не пройдена
		if (!$bAntispamAnswer)
		{
			$_POST['step'] = 1;
		}
	}
}

Далее после строки $Shop_Address_Controller_Show = new Shop_Address_Controller_Show($oShop); добавляем:

if (isset($bAntispamAnswer) && !$bAntispamAnswer)
{
	$Shop_Address_Controller_Show->addEntity(
		Core::factory('Core_Xml_Entity')
			->name('error')
			->value('Ошибка, вам запрещено заполнение формы')
	);
}

Формы

Для подключения антиспам-системы в модуле форм необходимо внести изменения в XSL-шаблон обработки формы.
После:

<xsl:when test="errorId = 2">
   Прошло слишком мало времени с момента последней отправки Вами формы!
</xsl:when>


Добавляем:

<xsl:when test="errorId = 3">
   Ошибка! Форма не может быть обработана!
</xsl:when>

Правка типовой динамической страницы форм не требуется, так как вся обработка антиспам-системы вынесена в стандартный контроллер показа форм Form_Controller_Show.

Клиенты

Для подключения антиспам-системы при регистрации пользователей сайта необходимо внести изменения в код типовой динамической страницы регистрации. Блок:

$oSiteuser->save();

if ($bNewUser)
{
    // Внесение пользователя в группу по умолчанию
    $oSiteuser_Group = $oSiteuser->Site->Siteuser_Groups->getDefault();

    if (!is_null($oSiteuser_Group))
    {
        $oSiteuser_Group->add($oSiteuser);
    }
}

// Почтовые рассылки
if (Core::moduleIsActive('maillist'))
{
    $aMaillists = $oSiteuser->getAllowedMaillists();

    foreach ($aMaillists as $oMaillists)
    {
        $oMaillist_Siteuser = $oSiteuser->Maillist_Siteusers->getByMaillist($oMaillists->id);

        // Пользователь подписан
        if (Core_Array::getPost("maillist_{$oMaillists->id}"))
        {
            // Пользователь не был подписан
            is_null($oMaillist_Siteuser) && $oMaillist_Siteuser = Core_Entity::factory('Maillist_Siteuser')->siteuser_id($oSiteuser->id)->maillist_id($oMaillists->id);

            $oMaillist_Siteuser->type = Core_Array::getPost("type_{$oMaillists->id}") == 0 ? 0 : 1;
            $oMaillist_Siteuser->save();

        }
        elseif (!is_null($oMaillist_Siteuser))
        {
            // Отписываем пользователя от рассылки
            $oMaillist_Siteuser->delete();
        }
    }
}

// Дополнительные свойства
$oSiteuser_Property_List = Core_Entity::factory('Siteuser_Property_List', $oSiteuser->site_id);

$aProperties = $oSiteuser_Property_List->Properties->findAll();
foreach ($aProperties as $oProperty)
{
    // Поле не скрытое
    if ($oProperty->type != 10)
    {
        $aProperty_Values = $oProperty->getValues($oSiteuser->id);
        count($aProperty_Values) == 0 && $aProperty_Values[0] = $oProperty->createNewValue($oSiteuser->id);

        // Дополнительные свойства
        switch ($oProperty->type)
        {
            case 0: // Int
            case 3: // List
            case 5: // Information system
                $aProperty_Values[0]->value(intval(Core_Array::getPost("property_{$oProperty->id}")));
                $aProperty_Values[0]->save();
            break;
            case 1: // String
            case 4: // Textarea
            case 6: // Wysiwyg
                $aProperty_Values[0]->value(Core_Str::stripTags(strval(Core_Array::getPost("property_{$oProperty->id}"))));
                $aProperty_Values[0]->save();
            break;
            case 8: // Date
                $date = strval(Core_Array::getPost("property_{$oProperty->id}"));
                $date = Core_Date::date2sql($date);
                $aProperty_Values[0]->value($date);
                $aProperty_Values[0]->save();
            break;
            case 9: // Datetime
                $datetime = strval(Core_Array::getPost("property_{$oProperty->id}"));
                $datetime = Core_Date::datetime2sql($datetime);
                $aProperty_Values[0]->value($datetime);
                $aProperty_Values[0]->save();
            break;
            case 2: // File
                $aFileData = Core_Array::getFiles("property_{$oProperty->id}");
                if (!is_null($aFileData))
                {
                    $aProperty_Values[0]->setDir(
                        $oSiteuser_Property_List->getDirPath($oSiteuser)
                    );

                    if (Core_File::isValidExtension($aFileData['name'], array('JPG', 'JPEG', 'GIF', 'PNG')))
                    {
                        // Удаление файла большого изображения
                        if ($aProperty_Values[0]->file)
                        {
                            $aProperty_Values[0]
                                ->deleteLargeFile()
                                ->deleteSmallFile();
                        }

                        $aProperty_Values[0]->save();
                        $aProperty_Values[0]->file = 'property_' . $aProperty_Values[0]->id . '.' . Core_File::getExtension($aFileData['name']);
                        $aProperty_Values[0]->file_name = Core_Str::stripTags($aFileData['name']);

                        try
                        {
                            $oSiteuser_Property_List->createPropertyDir($oSiteuser);

                            // Resize image
                            Core_Image::instance()->resizeImage($aFileData['tmp_name'], $oSiteuser->Site->max_size_load_image, $oSiteuser->Site->max_size_load_image, $aProperty_Values[0]->getLargeFilePath());

                            $aProperty_Values[0]->save();
                        }
                        catch (Exception $e) {
                            Core_Message::show($e->getMessage(), 'error');
                        };
                    }
                }
            break;
            case 7: // Checkbox
                $aProperty_Values[0]->value(is_null(Core_Array::getPost("property_{$oProperty->id}")) ? 0 : 1);
                $aProperty_Values[0]->save();
            break;
        }
    }
}

// Регистрация нового пользователя
if ($bNewUser)
{
    if ($bQuickRegistration)
    {
        // Авторизуем зарегистрированного пользователя
        $oSiteuser->setCurrent();

        // Перенаправляем на страницу, с которой он пришел
        !is_null(Core_Array::getPost('location')) && $Siteuser_Controller_Show->go(
            strval(Core_Array::getPost('location'))
        );
    }

    // Отправка письма
    $oSite_Alias = $oSiteuser->Site->getCurrentAlias();
    $Siteuser_Controller_Show
        ->setEntity($oSiteuser)
        ->applyAffiliate(Core_Array::get($_COOKIE, 'affiliate_name'))
        ->subject(
            Core::_('Siteuser.confirm_subject', !is_null($oSite_Alias) ? $oSite_Alias->alias_name_without_mask : '')
        )
        ->sendConfirmationMail(Core_Entity::factory('Xsl')->getByName($xsl_letter));

    ?>
    <h1>Спасибо за регистрацию</h1>
    <p>Для продолжения работы необходимо подтвердить регистрацию Ваших данных.
    В Ваш адрес отправлено письмо, содержащее ссылку для подтверждения регистрации.</p>
    <p>Если Ваш браузер поддерживает автоматическое перенаправление через 3 секунды Вы перейдете на страницу <a href="../">авторизации пользователя</a>.</p>
    <script type="text/javascript">setTimeout(function(){ location = '../' }, 3000);</script>
    <?php

    return;
}
else
{
    ?><h1>Ваши анкетные данные успешно изменены</h1>
    <p>Если Ваш браузер поддерживает автоматическое перенаправление через 3 секунды Вы перейдете в <a href="../">кабинет пользователя</a>.</p>
    <script type="text/javascript">setTimeout(function(){ location = '../' }, 3000);</script>
    <?php

    return;
}

Меняется на:

// Antispam
if (Core::moduleIsActive('antispam'))
{
    $Antispam_Controller = new Antispam_Controller();
    $bAntispamAnswer = $Antispam_Controller
        ->addText($oSiteuser->login)
        ->addText($oSiteuser->email)
        ->addText($oSiteuser->name)
        ->addText($oSiteuser->patronymic)
        ->addText($oSiteuser->surname)
        ->addText($oSiteuser->company)
        ->addText($oSiteuser->website)
        ->addText($oSiteuser->country)
        ->addText($oSiteuser->city)
        ->addText($oSiteuser->address)
        ->execute();
}
else
{
    $bAntispamAnswer = TRUE;
}

if ($bAntispamAnswer)
{
    $oSiteuser->save();

    if ($bNewUser)
    {
        // Внесение пользователя в группу по умолчанию
        $oSiteuser_Group = $oSiteuser->Site->Siteuser_Groups->getDefault();

        if (!is_null($oSiteuser_Group))
        {
            $oSiteuser_Group->add($oSiteuser);
        }
    }

    // Почтовые рассылки
    if (Core::moduleIsActive('maillist'))
    {
        $aMaillists = $oSiteuser->getAllowedMaillists();

        foreach ($aMaillists as $oMaillists)
        {
            $oMaillist_Siteuser = $oSiteuser->Maillist_Siteusers->getByMaillist($oMaillists->id);

            // Пользователь подписан
            if (Core_Array::getPost("maillist_{$oMaillists->id}"))
            {
                // Пользователь не был подписан
                is_null($oMaillist_Siteuser) && $oMaillist_Siteuser = Core_Entity::factory('Maillist_Siteuser')->siteuser_id($oSiteuser->id)->maillist_id($oMaillists->id);

                $oMaillist_Siteuser->type = Core_Array::getPost("type_{$oMaillists->id}") == 0 ? 0 : 1;
                $oMaillist_Siteuser->save();

            }
            elseif (!is_null($oMaillist_Siteuser))
            {
                // Отписываем пользователя от рассылки
                $oMaillist_Siteuser->delete();
            }
        }
    }

    // Дополнительные свойства
    $oSiteuser_Property_List = Core_Entity::factory('Siteuser_Property_List', $oSiteuser->site_id);

    $aProperties = $oSiteuser_Property_List->Properties->findAll();
    foreach ($aProperties as $oProperty)
    {
        // Поле не скрытое
        if ($oProperty->type != 10)
        {
            $aProperty_Values = $oProperty->getValues($oSiteuser->id);
            count($aProperty_Values) == 0 && $aProperty_Values[0] = $oProperty->createNewValue($oSiteuser->id);

            // Дополнительные свойства
            switch ($oProperty->type)
            {
                case 0: // Int
                case 3: // List
                case 5: // Information system
                    $aProperty_Values[0]->value(intval(Core_Array::getPost("property_{$oProperty->id}")));
                    $aProperty_Values[0]->save();
                break;
                case 1: // String
                case 4: // Textarea
                case 6: // Wysiwyg
                    $aProperty_Values[0]->value(Core_Str::stripTags(strval(Core_Array::getPost("property_{$oProperty->id}"))));
                    $aProperty_Values[0]->save();
                break;
                case 8: // Date
                    $date = strval(Core_Array::getPost("property_{$oProperty->id}"));
                    $date = Core_Date::date2sql($date);
                    $aProperty_Values[0]->value($date);
                    $aProperty_Values[0]->save();
                break;
                case 9: // Datetime
                    $datetime = strval(Core_Array::getPost("property_{$oProperty->id}"));
                    $datetime = Core_Date::datetime2sql($datetime);
                    $aProperty_Values[0]->value($datetime);
                    $aProperty_Values[0]->save();
                break;
                case 2: // File
                    $aFileData = Core_Array::getFiles("property_{$oProperty->id}");
                    if (!is_null($aFileData))
                    {
                        $aProperty_Values[0]->setDir(
                            $oSiteuser_Property_List->getDirPath($oSiteuser)
                        );

                        if (Core_File::isValidExtension($aFileData['name'], array('JPG', 'JPEG', 'GIF', 'PNG')))
                        {
                            // Удаление файла большого изображения
                            if ($aProperty_Values[0]->file)
                            {
                                $aProperty_Values[0]
                                    ->deleteLargeFile()
                                    ->deleteSmallFile();
                            }

                            $aProperty_Values[0]->save();
                            $aProperty_Values[0]->file = 'property_' . $aProperty_Values[0]->id . '.' . Core_File::getExtension($aFileData['name']);
                            $aProperty_Values[0]->file_name = Core_Str::stripTags($aFileData['name']);

                            try
                            {
                                $oSiteuser_Property_List->createPropertyDir($oSiteuser);

                                // Resize image
                                Core_Image::instance()->resizeImage($aFileData['tmp_name'], $oSiteuser->Site->max_size_load_image, $oSiteuser->Site->max_size_load_image, $aProperty_Values[0]->getLargeFilePath());

                                $aProperty_Values[0]->save();
                            }
                            catch (Exception $e) {
                                Core_Message::show($e->getMessage(), 'error');
                            };
                        }
                    }
                break;
                case 7: // Checkbox
                    $aProperty_Values[0]->value(is_null(Core_Array::getPost("property_{$oProperty->id}")) ? 0 : 1);
                    $aProperty_Values[0]->save();
                break;
            }
        }
    }

    // Регистрация нового пользователя
    if ($bNewUser)
    {
        if ($bQuickRegistration)
        {
            // Авторизуем зарегистрированного пользователя
            $oSiteuser->setCurrent();

            // Перенаправляем на страницу, с которой он пришел
            !is_null(Core_Array::getPost('location')) && $Siteuser_Controller_Show->go(
                strval(Core_Array::getPost('location'))
            );
        }

        // Отправка письма
        $oSite_Alias = $oSiteuser->Site->getCurrentAlias();
        $Siteuser_Controller_Show
            ->setEntity($oSiteuser)
            ->applyAffiliate(Core_Array::get($_COOKIE, 'affiliate_name'))
            ->subject(
                Core::_('Siteuser.confirm_subject', !is_null($oSite_Alias) ? $oSite_Alias->alias_name_without_mask : '')
            )
            ->sendConfirmationMail(Core_Entity::factory('Xsl')->getByName($xsl_letter));

        ?>
        <h1>Спасибо за регистрацию</h1>
        <p>Для продолжения работы необходимо подтвердить регистрацию Ваших данных.
        В Ваш адрес отправлено письмо, содержащее ссылку для подтверждения регистрации.</p>
        <p>Если Ваш браузер поддерживает автоматическое перенаправление через 3 секунды Вы перейдете на страницу <a href="../">авторизации пользователя</a>.</p>
        <script type="text/javascript">setTimeout(function(){ location = '../' }, 3000);</script>
        <?php

        return;
    }
    else
    {
        ?><h1>Ваши анкетные данные успешно изменены</h1>
        <p>Если Ваш браузер поддерживает автоматическое перенаправление через 3 секунды Вы перейдете в <a href="../">кабинет пользователя</a>.</p>
        <script type="text/javascript">setTimeout(function(){ location = '../' }, 3000);</script>
        <?php

        return;
    }
}
else
{
    $Siteuser_Controller_Show->addEntity(
        Core::factory('Core_Xml_Entity')
            ->name('error')->value('Пользователь не может быть зарегистрирован!')
    );
}

Не нашли ответ на свой вопрос в документации? Направьте обращение в службу поддержки или онлайн чат.

Комментарии

  • Без темы

    реализация при добавлении элемента, например в гостевой книге, и "товара" на доске объявлений?

    08.08.2017 17:15:01
    Puma