Вопросы к товарам
Дополнительные опции
Модуль предоставляет возможность добавлять вопросы и ответы к товарам, например, как на Озон. С возможностью управления вопросам/ответам через центр администрирования.
Вопросы могут добавлять только авторизованные клиенты, ответы - только те клиенты, которые приобрели товар.
Перейдите в раздел Вопросы к товарам, вопросы можно добавить для каждого магазина, если для всех магазинов вопросы добавлены, кнопка Добавить будет отсутствовать.

Интеграция в клиентской части
После установки модуля необходимо проинтегрировать в XSL-шаблоны товара и ТДС интернет-магазина функционал модуля для клиентской части
- Добавление в XSL-шаблон карточки товара
В требуемом месте добавьте вызов темплейта:
<xsl:if test="hostcms_questions/node()"> <div class="row"> <div class="col-xs-12"> <xsl:if test="/shop/siteuser_id > 0"> <div class="hostcms-questions-wrapper"> <h2>Задайте вопрос о товаре</h2> <span>Вам ответит продавец, представитель бренда или пользователь, купивший этот товар. Пришлем уведомление, когда поступит ответ</span> <form name="hostcms_question_form" action="{/shop/shop_item/url}" method="POST"> <div class="margin-top-10"> <input type="text" name="hostcms_question_text" class="form-control" placeholder="Напишите свой вопрос"/> </div> <xsl:if test="hostcms_questions/client_name != ''"> <div class="hostcms_question-client-info"> <div>Вы оставляете отзыв как: <span class="hostcms-question-client-name"><xsl:value-of select="hostcms_questions/client_name" /></span></div> <label> <div> <span>Оставить вопрос анонимно</span> <input type="checkbox" name="hostcms_question_anonimous" value="1" onclick="$.hqChangeAnonimous(this)"/> </div> </label> <div> <button class="btn btn-primary hostcms-question-send" type="submit" name="hostcms_question_send" value="hostcms_question_send">Отправить вопрос</button> </div> </div> </xsl:if> </form> </div> </xsl:if> <div class="row margin-top-20"> <xsl:apply-templates select="hostcms_questions/hostcms_question_item"/> </div> </div> </div> </xsl:if>И сами темплейты вопросов/ответов:
<xsl:template match="hostcms_question_item"> <div id="hostcms_question_item_{@id}" class="hostcms-question-item col-xs-12"> <div><xsl:value-of disable-output-escaping="yes" select="question"/></div> <xsl:if test="../buyed = 1"> <div class="hostcms-question-badge hostcms-question-badge-buyed" onclick="$('#AddHostcmsQuestionAnswer{@id}').toggle('slow')">Ответить</div> <div class="row"> <div class="col-xs-12"> <div id="AddHostcmsQuestionAnswer{@id}" class="" style="display:none;"> <xsl:call-template name="AddHostcmsQuestionAnswerForm"> <xsl:with-param name="hostcms_question_item_id" select="@id"/> </xsl:call-template> </div> </div> </div> </xsl:if> <div class="margin-top-10"> <span class="hostcms-question-badge hostcms-question-item-like-badge" onclick="$.hqLikeQuestion({@id}, this);"> <xsl:if test="likes/@is_liked = 1"> <xsl:attribute name="class">hostcms-question-badge hostcms-question-item-like-badge is-liked</xsl:attribute> </xsl:if> <i class="fa fa-thumbs-up fa-fw"></i> <span class="hostcms-question-item-likes"><xsl:value-of select="likes"/></span> </span> <span><xsl:value-of select="date"/></span> <span class="hostcms-question-item-client-name"><xsl:value-of select="client_name"/></span> </div> > <xsl:if test="count(hostcms_question_item_answer)"> <xsl:apply-templates select="hostcms_question_item_answer"/> </xsl:if> </div> </xsl:template> <xsl:template name="AddHostcmsQuestionAnswerForm"> <xsl:param name="hostcms_question_item_id" select="0"/> <form id="hostcms_question_answer_form_{$hostcms_question_item_id}" name="hostcms_question_answer_form" action="{/shop/shop_item/url}" method="POST"> <xsl:if test="/shop/shop_item/hostcms_questions/client_name != ''"> <div class="hostcms-questions-answer-wrapper"> <div> <span class="hostcms-question-answer-client-name"><xsl:value-of select="/shop/shop_item/hostcms_questions/client_name" /></span> </div> <div class="margin-top-10"> <input type="text" name="hostcms_question_answer_text" class="form-control" placeholder="Ваш ответ на вопрос"/> </div> <input type="hidden" name="hostcms_question_item_id" value="{$hostcms_question_item_id}"/> <div class="margin-top-10"> <button class="btn btn-primary hostcms-question-send" type="submit" name="hostcms_question_answer_send" value="hostcms_question_answer_send">Отправить</button> <label style="font-weight: initial; margin-top: 5px"> <div> <span style="margin-right: 5px;">Оставить ответ анонимно</span> <input style="margin: 0;" type="checkbox" name="hostcms_question_answer_anonimous" value="1" onclick="$.hqChangeAnswerAnonimous({$hostcms_question_item_id}, this)"/> </div> </label> </div> </div> </xsl:if> </form> </xsl:template> <xsl:template match="hostcms_question_item_answer"> <div id="hostcms_question_item_answer_{@id}" class="hostcms-question-item-answer col-xs-12"> <xsl:if test="best = 1"> <div class="hostcms-question-badge hostcms-question-badge-best"><i class="fa fa-trophy"></i>Лучший ответ</div> </xsl:if> <div><xsl:value-of disable-output-escaping="yes" select="answer"/></div> <div class="hostcms-question-item-answer-info"> <span>Вам помог этот ответ?</span> <span class="hostcms-question-badge hostcms-question-item-answer-like-badge" onclick="$.hqLikeQuestionAnswer({@id}, 1, this);"> <xsl:if test="likes/@is_liked = 1"> <xsl:attribute name="class">hostcms-question-badge hostcms-question-item-answer-like-badge is-liked</xsl:attribute> </xsl:if> <span>Да</span> <span class="hostcms-question-item-answer-likes"><xsl:value-of select="likes"/></span> </span> <span class="hostcms-question-badge hostcms-question-item-answer-dislike-badge" onclick="$.hqLikeQuestionAnswer({@id}, 0, this);"> <xsl:if test="dislikes/@is_disliked = 1"> <xsl:attribute name="class">hostcms-question-badge hostcms-question-item-answer-dislike-badge is-disliked</xsl:attribute> </xsl:if> <span>Нет</span> <span class="hostcms-question-item-answer-dislikes"><xsl:value-of select="dislikes"/></span> </span> <span><xsl:value-of select="date"/></span> <span class="hostcms-question-item-answer-client-name"> <xsl:choose> <xsl:when test="official = 1"> Представитель магазина <i class="fa fa-check-circle hostcms-question-official" title="Официальный представитель магазина"></i> </xsl:when> <xsl:otherwise><xsl:value-of select="client_name"/></xsl:otherwise> </xsl:choose> </span> </div> </div> </xsl:template> - Добавление обработки в ТДС интернет-магазина
В типовой динамической страницы магазина найдите условие нахождения в карточке товара
if ($Shop_Controller_Show->item)и в него добавьте код:/** Hostcms_Questions */ if (Core::moduleIsActive('hostcms_question') && Core::moduleIsActive('siteuser')) { if (Core_Array::getPost('hostcms_question_send')) { $oShop = $Shop_Controller_Show->getEntity(); $Shop_Controller_Show->cache(FALSE); $oXmlQuestionTag = Core::factory('Core_Xml_Entity') ->name('document'); $oSiteuser = Core_Entity::factory('Siteuser')->getCurrent(); if ($oSiteuser) { $question = Core_Str::stripTags(Core_Array::getPost('hostcms_question_text', '', 'str')); $oHostcms_Question_Item = Core_Entity::factory('Hostcms_Question_Item'); $allowable_tags = '<b><strong><i><em><br><p><u><strike><ul><ol><li>'; $oHostcms_Question_Item->shop_id = $oShop->id; $oHostcms_Question_Item->shop_item_id = $Shop_Controller_Show->item; $oHostcms_Question_Item->siteuser_id = $oSiteuser->id; $oHostcms_Question_Item->question = nl2br($question, $allowable_tags); $oHostcms_Question_Item->anonimous = Core_Array::getPost('hostcms_question_anonimous', 0, 'int'); $oHostcms_Question_Shop = Core_Entity::factory('Hostcms_Question_Shop')->getByShop_id($oShop->id, FALSE); if (!is_null($oHostcms_Question_Shop) && $oHostcms_Question_Shop->premoderate) { $oHostcms_Question_Item->active = 0; } $oShop_Item = Core_Entity::factory('Shop_Item', $Shop_Controller_Show->item); $oXmlQuestionTag ->addEntity($oHostcms_Question_Item) ->addEntity($oShop_Item); if (strlen($question)) { // Antispam if (Core::moduleIsActive('antispam')) { $Antispam_Controller = new Antispam_Controller(); $bAntispamAnswer = $Antispam_Controller ->addText($oHostcms_Question_Item->question, 'question') ->execute(); } else { $bAntispamAnswer = TRUE; } if ($bAntispamAnswer) { $oHostcms_Question_Item->save(); $oHostcms_Question_Item ->dateFormat($oShop->format_date) ->dateTimeFormat($oShop->format_datetime); if (!is_null($oHostcms_Question_Shop) && $oHostcms_Question_Shop->send_notification) { Hostcms_Question_Controller::createNotification($oHostcms_Question_Item); $oXmlQuestionTag->addEntity($oShop); // Отправка письма администратору $oXsl = Core_Entity::factory('Xsl')->getByName('ПисьмоОДобавленииВопроса'); $subject = Core::_('Hostcms_Question_Shop.mail_subject', $oShop_Item->name); Hostcms_Question_Controller::sendAdminEmail($oSiteuser, $oXsl, $oXmlQuestionTag, $subject); } } else { $oXmlQuestionTag->addEntity(Core::factory('Core_Xml_Entity') ->name('error_antispam')->value(1) ); } } else { $oXmlQuestionTag->addEntity(Core::factory('Core_Xml_Entity') ->name('error_question')->value(1) ); } } else { $oXmlQuestionTag->addEntity(Core::factory('Core_Xml_Entity') ->name('error_siteuser')->value(1) ); } // Результат добавления вопроса $xsl_result = Xsl_Processor::instance() ->xml($oXmlQuestionTag->getXml()) ->xsl(Core_Entity::factory('Xsl')->getByName('УведомлениеДобавлениеВопросаКТовару')) ->process(); $Shop_Controller_Show->addEntity( Core::factory('Core_Xml_Entity') ->name('message')->value($xsl_result) ); } if (Core_Array::getPost('hostcms_question_answer_send')) { $oShop = $Shop_Controller_Show->getEntity(); $Shop_Controller_Show->cache(FALSE); $oXmlQuestionAnswerTag = Core::factory('Core_Xml_Entity') ->name('document'); $hostcms_question_item_id = Core_Array::getPost('hostcms_question_item_id', '', 'int'); $oSiteuser = Core_Entity::factory('Siteuser')->getCurrent(); if ($oSiteuser && $hostcms_question_item_id) { $answer = Core_Str::stripTags(Core_Array::getPost('hostcms_question_answer_text', '', 'str')); $oHostcms_Question_Item_Answer = Core_Entity::factory('Hostcms_Question_Item_Answer'); $allowable_tags = '<b><strong><i><em><br><p><u><strike><ul><ol><li>'; $oHostcms_Question_Item_Answer->hostcms_question_item_id = $hostcms_question_item_id; $oHostcms_Question_Item_Answer->siteuser_id = $oSiteuser->id; $oHostcms_Question_Item_Answer->answer = nl2br($answer, $allowable_tags); $oHostcms_Question_Item_Answer->anonimous = Core_Array::getPost('hostcms_question_answer_anonimous', 0, 'int'); $oHostcms_Question_Shop = Core_Entity::factory('Hostcms_Question_Shop')->getByShop_id($oShop->id, FALSE); if (!is_null($oHostcms_Question_Shop) && $oHostcms_Question_Shop->premoderate) { $oHostcms_Question_Item_Answer->active = 0; } $oShop_Item = Core_Entity::factory('Shop_Item', $Shop_Controller_Show->item); $oXmlQuestionAnswerTag ->addEntity($oHostcms_Question_Item_Answer) ->addEntity($oHostcms_Question_Item_Answer->Hostcms_Question_Item) ->addEntity($oShop_Item); if (strlen($answer)) { // Antispam if (Core::moduleIsActive('antispam')) { $Antispam_Controller = new Antispam_Controller(); $bAntispamAnswer = $Antispam_Controller ->addText($oHostcms_Question_Item_Answer->answer, 'answer') ->execute(); } else { $bAntispamAnswer = TRUE; } if ($bAntispamAnswer) { $oHostcms_Question_Item_Answer->save(); $oHostcms_Question_Item_Answer ->dateFormat($oShop->format_date) ->dateTimeFormat($oShop->format_datetime); if (!is_null($oHostcms_Question_Shop) && $oHostcms_Question_Shop->send_notification) { $oXmlQuestionAnswerTag->addEntity($oShop); // Отправка письма администратору $oXsl = Core_Entity::factory('Xsl')->getByName('ПисьмоОДобавленииОтветаНаВопрос'); $subject = Core::_('Hostcms_Question_Shop.answer_mail_subject', $hostcms_question_item_id); Hostcms_Question_Controller::sendAdminEmail($oSiteuser, $oXsl, $oXmlQuestionAnswerTag, $subject); // Отправка письма клиенту $oXslSiteuser = Core_Entity::factory('Xsl')->getByName('ПисьмоКлиентуОДобавленииОтветаНаВопрос'); $subjectSiteuser = Core::_('Hostcms_Question_Shop.answer_siteuser_mail_subject'); Hostcms_Question_Controller::sendSiteuserEmail($oSiteuser, $oXslSiteuser, $oXmlQuestionAnswerTag, $subjectSiteuser); } } else { $oXmlQuestionAnswerTag->addEntity(Core::factory('Core_Xml_Entity') ->name('error_antispam')->value(1) ); } } else { $oXmlQuestionAnswerTag->addEntity(Core::factory('Core_Xml_Entity') ->name('error_answer')->value(1) ); } } else { $oXmlQuestionAnswerTag->addEntity(Core::factory('Core_Xml_Entity') ->name('error_siteuser')->value(1) ); } // Результат добавления ответа $xsl_result = Xsl_Processor::instance() ->xml($oXmlQuestionAnswerTag->getXml()) ->xsl(Core_Entity::factory('Xsl')->getByName('УведомлениеДобавлениеОтветаНаВопросКТовару')) ->process(); $Shop_Controller_Show->addEntity( Core::factory('Core_Xml_Entity') ->name('message')->value($xsl_result) ); } } /** Hostcms_Questions */

Консультации и гарантированный доступ к обновлениям осуществляется в течение 6 месяцев со дня оплаты.
Информация о разработчике:
- Разработчик: Hostmake LLC
- Вопросы по модулю: support@hostcms.ru
- Поддержка: support@hostcms.ru
| Версия | Дата | Описание | Версия от | Версия до |
| 1.1 | 16.02.2026 | Общие исправления. |
7.1.6 | ∞ |
| 1.0 | 21.05.2025 | Релиз |
7.1.2 | ∞ |