Задача: в одном оптовом интернет-магазине присутствуют клиенты фирмы под наименованием "дилеры". У каждого дилера есть персональный менеджер. Соотвественно у менеджера есть много "дилеров". Необходимо создать функциональность "Задать вопрос менеджеру" для каждого "дилера". Также "дилер" может видеть только свои вопросы и ответы на них.

Используемые технологии: - модуль "Шаблоны данных", модуль "FAQ", xslt-шаблонизатор, протокол usel и немного php.

1. Организация типов данных

С помощью модуля "Шаблона данных" создаем справочник "Менеджеры" со следющими полями - ФИО, e-mail, номер телефона. Для всех полей ставим галочку "Обязательное" - это необходимо для предотвращения неправильного ввода информации о менеджере. Система UMI.CMS не даст занести значение в справочник с пустыми полями.

Далее переходим к редактированию типа данных "Зарегистрированный пользователь" и создаем в нем дополнительное поле типа "Выбор из списка", которое свяжем с созданным справочником "Менеджеры".

Также редактируем тип данных "Категория в FAQ", куда вводим такое же дополнительное поле как в типе данных "Зарегистрированный пользователь". Создаем дополнительное поле типа "Выбор из списка", которое свяжем с созданным справочником "Менеджеры".

2. Регистрация дилера

Для того, чтобы в интернет-магазине не появился дилер, который не привязан к менеджеру немного переделаем стандартную регистрацию. Для этого в custom.php переносим под другим наименованием, например registrate_diler, стандартную функцию registrate. Из скопированной функции удаляем отправку активационного кода пользователю.

 

  1. $mail_arr['activate_link'] = "http://" . $domain .
    $this
    ->pre_lang . "/users/activate/" . $activate_code . "/";

 

Не забываем добавить созданный метод в  permissions.custom.php. А также в форме регистрации дилера меняем action на созданный нами метод /users/registrate_diler/.

Администратор сайта получит уведомление о регистрации нового дилеар и проставит ему соответсвующего менеджера.

3. Организация модуля FAQ

Для каждого менеджера создаем категорию в FAQ, в свойствах которой проставляем нужного менеджера.

4. Создание формы отправки вопроса менджеру для дилера

Для решения данной задачи мы должны пройти по следующему алгоритму. Получить менеджера, свзязанного с дилером, а потом найти категорию FAQ, свзязанную с нужным менеджером.

Получение id нужного менеджера и построение формы отправки вопроса

 

  1. <xsl:template name="manager_answer">
  2. <xsl:variable name="user_reg"
    select
    ="document('udata://users/auth')/udata/user_id" />
  3. <xsl:variable name="user_tree"
    select
    ="document(concat('uobject://',$user_reg))/udata" />
  4. <xsl:variable name="manager_id"
    select
    ="$user_tree//property[@id='9129']/value/item/@id" />
  5. <xsl:variable name="manager_faq"
    select
    ="document(concat('usel://getFaq/1053/',$manager_id))/udata/page/@id" />
  6.  
  7. <xsl:apply-templates
    select
    ="document(concat('udata://faq/addQuestionForm//',$manager_faq))/udata">
  8. <xsl:with-param name="cat">
    	<xsl:value-of select="$manager_faq" /></xsl:with-param>
  9. <xsl:with-param name="manager_mail">
  10. <xsl:value-of
    	select="document(concat('uobject://',$manager_id,'.managers_mail'))//value" />
  11. </xsl:with-param>
  12. </xsl:apply-templates>
  13.  
  14. </xsl:template>
  15. <xsl:template match="udata[@module = 'faq'][@method = 'addQuestionForm']">
  16. <xsl:param name="cat" />
  17. <xsl:param name="manager_mail" />
  18. <h2>Задать вопрос</h2>
  19. <form method="post" id="questionForm"
    action="/faq/post_question/{$cat}/" onSubmit="return checkForm(this);">
  20. <xsl:if test="$_err"><xsl:call-template name='errors' /></xsl:if>
  21. <div>
  22. <label for="title">Тема<span>*</span>:</label>
  23. <input style="width: 100%;" class="formField" type="text" name="title" id="title" />
  24. </div>
  25. <div>
  26. <label for="question">Вопрос<span>*</span>:</label>
  27. <textarea style="width: 100%;" rows="5" class="formField"
    name
    ="question" id="question" ></textarea>
  28. </div>
  29. <xsl:apply-templates select="document('udata://system/captcha')/udata" />
  30. <input type="submit" class="formButton" value="Отправить" />
  31. </form>
  32. </xsl:template>
  33.  

Комментарии к коду

2. Получаем id авторизованного пользователя
3. Получаем дерево xml свойств авторизованного пользователя
4. Получаем id менеджера пользователя. В созданной системе идентификатор поля "менеджер" для типа зарегистрированный пользователь был 9129. Будет другой, но можно обратиться и по имени свойства.
5. Получаем id категории faq нужного менеджера через выборку usel. Код будет приведен ниже. В созданной системе корневой проект FAQ, содержащий категории FAQ менеджеров, имел идентификатор 1052. Будет меняться.

Получение id нужной категории FAQ

Для решения данной задачи возпользуемся протоколом выборки usel.

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <selection mode="and">
  3. <target result="pages">
  4. <type module="faq" method="category" />
  5. <category>{1}</category>
  6. </target>
  7. <property name="menedzher_vetki">
  8. <object>{2}</object>
  9. </property>
  10. </selection>

 

Комментарий к коду:

7. Вторым параметром передаем id менеджера, который хранится в созданном нами свойстве "Менеджер ветки" в шаблоне данных и который имеет имя "menedzher_vetki"

5. Получаем список вопросов дилера менеджеру

Проблема заключатся в том, что в системе у каждого вопроса есть автор, в котором хранится идентификатор "автора", но не пользователя, который послал вопрос. Это сделано для тех режимов, когда вопросы могут задавать еще и гости. Внутри UMI.CMS существует макрос %users viewAuthor%, но мы будем писать противоположный, так как нам надо по id пользователя получить его author_id.
Cоздаем custom.php со следующей функцией:

  1. public function get_user_author($user_id = null) {
  2. if (is_null($user_id)) $user_id = getRequest('param0');
  3.  
  4. $author_id = 0;
  5.  
  6. if (umiObjectsCollection::getInstance()->isExists($user_id) !== false) {
  7. $hierarchy_type_id =
    umiHierarchyTypesCollection::getInstance()->getTypeByName("users", "author")->getId();
  8. $object_type_id = umiObjectTypesCollection::getInstance()->getBaseType("users", "author");
  9. $object_type = umiObjectTypesCollection::getInstance()->getType($object_type_id);
  10. $user_field_id = $object_type->getFieldId('user_id');
  11.  
  12. $sel = new umiSelection;
  13. $sel->setLimitFilter();
  14. $sel->addLimit(1);
  15.  
  16. $sel->setPropertyFilter();
  17. $sel->addPropertyFilterEqual($user_field_id, $user_id);
  18.  
  19. $result = umiSelectionsParser::runSelection($sel);
  20.  
  21. if (sizeof($result)) {
  22. list($author_id) = $result;
  23. }
  24. }
  25.  
  26. return def_module::parseTemplate('', array('author_id'=>$author_id));
  27. }
  28. };

 Результатом работы данного макроса будет author_id принадлежащий данному пользователю.

XSLT-шаблон получения списка вопросов пользователя

 

  1. <xsl:variable name="author"
    select
    ="document(concat('udata://faq/get_user_author/',$user_reg))/udata/author_id" />
  2.  
  3. <xsl:apply-templates
    select
    ="document(concat('usel://getQuest/',$manager_faq,'/',$author,'/3/'))/udata" mode="diller_quest"/>
  4.  
  5. <xsl:template match="udata" mode="diller_quest">
  6. <dl class="quest">
  7. <xsl:apply-templates select="page" mode="diller_quest" />
  8. </dl>
  9. </xsl:template>
  10.  
  11. <xsl:template match="page" mode="diller_quest">
  12. <dt>
  13. <b><xsl:value-of select="name" /></b>
  14. </dt>
  15. <dd>
  16. <xsl:value-of
    select
    ="document(concat('upage://',@id,'.content'))//value" disable-output-escaping="yes" />
  17. </dd>
  18. </xsl:template>

 

Комментарии к коду:

1. Через написанный нами макрос получаем author_id указанного нами пользователя
3. Через протокол выборки usel получаем  3 вопроса от данного пользователя. Код выборки ниже.

 

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <selection mode="and">
  3. <target result="pages">
  4. <type module="faq" method="question" />
  5. <category>{1}</category>
  6. </target>
  7. <property name="author_id">
  8. <object>{2}</object>
  9. </property>
  10. <limit>{3}</limit>
  11. </selection>

 

Комментарий к коду:

7. Ищем все вопросы заданные пользователем с переданным author_id

Собственно все. Пользуйтесь на здоровье, готов ответить на ваши вопросы :)

Читайте также:

Категории

Теги

мероприятия версии UMICMS продукты UMI MySQL разделение баз данных партнеры технологии Кейсы обзоры маркетинг developer программинг менеджмент xslt документация шаблоны Служба Заботы маркетинг веб студии москва UMI события лицензии новинки UMI Edu UMI Cloud модуль UMISummit business облако тегов кастомы uwdc Челябинск разработчики конференция Конкурс UMIRU exchange 28 Обмен данными 1C Интеграция с 1С хостинг юмихост umihost UMICMS рейтинг flash actionscript каталог анимация видео техподдержка tpl local scope macro кейсы итоги года SAPE seo мероприятие рынок веб разработки экономика Алексей Самойлов Сергей Котырев KINETICA CMS Сибирская интернетнеделя UMIWorkshop интернетмагазин интернет-магазин интернет магазин интернет-маркетинг Золотой сайт umi_workshop акция стратегия партнерская_программа партнерство highload РуПромо Машков версия 2_7 кэширование скорость стихи день рождения статьи пресс конференция версия 2_5 Edit_in_Place онлайн платежи кризис достижения CeBIT внедрения umi cms блоги верстка релиз EditInPlace изучение Юми создание модуля модули ReMIX UMI_CMS_Net iPhone XML драйвер как убрать лампочку форма обратной связи языковые версии CMS Pistols музыка UMICMS 28 удобство юзабилити usability user experience интерфейсы CMS Eye tracking ай тракинг usability test UXRussia управление сайтом RIW Russian internet week Softool выставки интернет клиенты сайты umisound cms pistols РИФ 2011 Tagline качество 2012 UMISound Полюса Илья Разин Марат Машков

Авторы блога