Задача: в одном оптовом интернет-магазине присутствуют клиенты фирмы под наименованием "дилеры". У каждого дилера есть персональный менеджер. Соотвественно у менеджера есть много "дилеров". Необходимо создать функциональность "Задать вопрос менеджеру" для каждого "дилера". Также "дилер" может видеть только свои вопросы и ответы на них.
Используемые технологии: - модуль "Шаблоны данных", модуль "FAQ", xslt-шаблонизатор, протокол usel и немного php.
1. Организация типов данных
С помощью модуля "Шаблона данных" создаем справочник "Менеджеры" со следющими полями - ФИО, e-mail, номер телефона. Для всех полей ставим галочку "Обязательное" - это необходимо для предотвращения неправильного ввода информации о менеджере. Система UMI.CMS не даст занести значение в справочник с пустыми полями.
Далее переходим к редактированию типа данных "Зарегистрированный пользователь" и создаем в нем дополнительное поле типа "Выбор из списка", которое свяжем с созданным справочником "Менеджеры".
Также редактируем тип данных "Категория в FAQ", куда вводим такое же дополнительное поле как в типе данных "Зарегистрированный пользователь". Создаем дополнительное поле типа "Выбор из списка", которое свяжем с созданным справочником "Менеджеры".
2. Регистрация дилера
Для того, чтобы в интернет-магазине не появился дилер, который не привязан к менеджеру немного переделаем стандартную регистрацию. Для этого в custom.php переносим под другим наименованием, например registrate_diler, стандартную функцию registrate. Из скопированной функции удаляем отправку активационного кода пользователю.
$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 нужного менеджера и построение формы отправки вопроса
<xsl:template name="manager_answer"> <xsl:variable name="user_reg"
select="document('udata://users/auth')/udata/user_id" /> <xsl:variable name="user_tree"
select="document(concat('uobject://',$user_reg))/udata" /> <xsl:variable name="manager_id"
select="$user_tree//property[@id='9129']/value/item/@id" /> <xsl:variable name="manager_faq"
select="document(concat('usel://getFaq/1053/',$manager_id))/udata/page/@id" /> <xsl:apply-templates
select="document(concat('udata://faq/addQuestionForm//',$manager_faq))/udata"> <xsl:with-param name="cat"><xsl:value-of select="$manager_faq" /></xsl:with-param> <xsl:with-param name="manager_mail"> <xsl:value-of
select="document(concat('uobject://',$manager_id,'.managers_mail'))//value" /> </xsl:with-param> </xsl:apply-templates> </xsl:template> <xsl:template match="udata[@module = 'faq'][@method = 'addQuestionForm']"> <xsl:param name="cat" /> <xsl:param name="manager_mail" /> <h2>Задать вопрос</h2> <form method="post" id="questionForm"
action="/faq/post_question/{$cat}/" onSubmit="return checkForm(this);"> <xsl:if test="$_err"><xsl:call-template name='errors' /></xsl:if> <div> <label for="title">Тема<span>*</span>:</label> <input style="width: 100%;" class="formField" type="text" name="title" id="title" /> </div> <div> <label for="question">Вопрос<span>*</span>:</label> <textarea style="width: 100%;" rows="5" class="formField"
name="question" id="question" ></textarea> </div> <xsl:apply-templates select="document('udata://system/captcha')/udata" /> <input type="submit" class="formButton" value="Отправить" /> </form> </xsl:template>
Комментарии к коду
2. Получаем id авторизованного пользователя
3. Получаем дерево xml свойств авторизованного пользователя
4. Получаем id менеджера пользователя. В созданной системе идентификатор поля "менеджер" для типа зарегистрированный пользователь был 9129. Будет другой, но можно обратиться и по имени свойства.
5. Получаем id категории faq нужного менеджера через выборку usel. Код будет приведен ниже. В созданной системе корневой проект FAQ, содержащий категории FAQ менеджеров, имел идентификатор 1052. Будет меняться.
Получение id нужной категории FAQ
Для решения данной задачи возпользуемся протоколом выборки usel.
<?xml version="1.0" encoding="utf-8"?> <selection mode="and"> <target result="pages"> <type module="faq" method="category" /> <category>{1}</category> </target> <property name="menedzher_vetki"> <object>{2}</object> </property> </selection>
Комментарий к коду:
7. Вторым параметром передаем id менеджера, который хранится в созданном нами свойстве "Менеджер ветки" в шаблоне данных и который имеет имя "menedzher_vetki"
5. Получаем список вопросов дилера менеджеру
Проблема заключатся в том, что в системе у каждого вопроса есть автор, в котором хранится идентификатор "автора", но не пользователя, который послал вопрос. Это сделано для тех режимов, когда вопросы могут задавать еще и гости. Внутри UMI.CMS существует макрос %users viewAuthor%, но мы будем писать противоположный, так как нам надо по id пользователя получить его author_id.
Cоздаем custom.php со следующей функцией:
public function get_user_author($user_id = null) { if (is_null($user_id)) $user_id = getRequest('param0'); $author_id = 0; if (umiObjectsCollection::getInstance()->isExists($user_id) !== false) { $hierarchy_type_id =
umiHierarchyTypesCollection::getInstance()->getTypeByName("users", "author")->getId(); $object_type_id = umiObjectTypesCollection::getInstance()->getBaseType("users", "author"); $object_type = umiObjectTypesCollection::getInstance()->getType($object_type_id); $user_field_id = $object_type->getFieldId('user_id'); $sel = new umiSelection; $sel->setLimitFilter(); $sel->addLimit(1); $sel->setPropertyFilter(); $sel->addPropertyFilterEqual($user_field_id, $user_id); $result = umiSelectionsParser::runSelection($sel); if (sizeof($result)) { list($author_id) = $result; } } return def_module::parseTemplate('', array('author_id'=>$author_id)); } };
Результатом работы данного макроса будет author_id принадлежащий данному пользователю.
XSLT-шаблон получения списка вопросов пользователя
<xsl:variable name="author"
select="document(concat('udata://faq/get_user_author/',$user_reg))/udata/author_id" /> <xsl:apply-templates
select="document(concat('usel://getQuest/',$manager_faq,'/',$author,'/3/'))/udata" mode="diller_quest"/> <xsl:template match="udata" mode="diller_quest"> <dl class="quest"> <xsl:apply-templates select="page" mode="diller_quest" /> </dl> </xsl:template> <xsl:template match="page" mode="diller_quest"> <dt> <b><xsl:value-of select="name" /></b> </dt> <dd> <xsl:value-of
select="document(concat('upage://',@id,'.content'))//value" disable-output-escaping="yes" /> </dd> </xsl:template>
Комментарии к коду:
1. Через написанный нами макрос получаем author_id указанного нами пользователя
3. Через протокол выборки usel получаем 3 вопроса от данного пользователя. Код выборки ниже.
<?xml version="1.0" encoding="utf-8"?> <selection mode="and"> <target result="pages"> <type module="faq" method="question" /> <category>{1}</category> </target> <property name="author_id"> <object>{2}</object> </property> <limit>{3}</limit> </selection>
Комментарий к коду:
7. Ищем все вопросы заданные пользователем с переданным author_id
Собственно все. Пользуйтесь на здоровье, готов ответить на ваши вопросы :)

Комментирование доступно только авторизованным пользователям.
Пожалуйста, зарегистрируйтесь или войдите на сайт.
Полезная вещь - пригодится.