Вопросы к товарам

Вопросы к товарам
9 900 ₽ Демо
Менее 50 установок.

Дополнительные опции

Помощь в интеграции модуля на сайте, адаптация XSL и CSS под дизайн сайта.
Минимальная редакция для работы модуля «Бизнес»
Приобрести и затем установить модуль вы можете через раздел «Магазин приложений» в центре администрирования HostCMS.

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

Вопросы могут добавлять только авторизованные клиенты, ответы - только те клиенты, которые приобрели товар.

Перейдите в раздел Вопросы к товарам, вопросы можно добавить для каждого магазина, если для всех магазинов вопросы добавлены, кнопка Добавить будет отсутствовать.

Интеграция в клиентской части

После установки модуля необходимо проинтегрировать в XSL-шаблоны товара и ТДС интернет-магазина функционал модуля для клиентской части

  1. Добавление в 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>
  2. Добавление обработки в ТДС интернет-магазина

    В типовой динамической страницы магазина найдите условие нахождения в карточке товара 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
Похожие