Привет, интернет =)
На одном из проектов, заказчик хотел что-то на подобии форума, где пользователи могли бы создать свою тему с вопросом и ждать ответы (комментарии). Сказано — сделано =)Все новые темы, в админке MODX — отображаются в виде ресурсов.
Проект где реализован данный форум — prodush.by
Компоненты которые потребуются:
— MODX Evolution
— eForm
— Ditto
— JoCo & JotX
Приступаем к работе:
1. Создаем новый ресурс (страницу), назовем его «Форум». Данный ресурс будет контейнером и в нем у нас будут создаваться темы форума.
2.Создаем новый шаблон для ресурса «Форум» (с аналогичным названием) и в нем прописываем вызовы сниппетов (не имейте привычку писать вызовы сниппетов в контенте ресурса — их может удалить пользователь):
<div class="page__content">
<div class="forum">
<table>
<tr>
<th class="th_l"><strong>Темы</strong></th>
<th><strong>Комментарии</strong></th>
<th class="th_r"><strong>Дата</strong></th>
</tr>
<tr>
<td colspan="3" class="td_emp"></td>
</tr>
[!Ditto? &tpl=`forumRow` &extenders=`jotcount` &display=`all`!]
</table>
</div>
<!-- Сниппет содержит функцию создания нового ресурса -->
[!NewArticleEvent!]
[!eForm?
&report=`forumReport`
&to=`[[DocInfo? &docid=`[*id*]` &field=`forum-email`]]`
&gotoid=`[*id*]`
&vericode=`0`
&formid=`newArticle`
&subject=`Посетители прислали новый топик на форуме`
&tpl=`new-topic`
&eFormOnBeforeMailSent=`CreateNewArticle`!]
<!-- Запуск редактора TinyMCE для всех полей типа <textarea> -->
<script language="javascript" type="text/javascript" src="assets/plugins/tinymce/tiny_mce/tiny_mce.js"></script>
<script language="javascript" type="text/javascript">
tinyMCE.init({
// Общие настройки
language : 'ru',
mode : "textareas",
theme : "advanced",
plugins : "emotions,preview,searchreplace,contextmenu,paste,fullscreen,visualchars",
// Настройки темы
theme_advanced_buttons1 : "code,|,undo,redo,|,bold,italic,underline,strikethrough,|,removeformat,cut,copy,paste,|,bullist,numlist,|,link,unlink,|,image,|,sub,sup,|,charmap,formatselect",
theme_advanced_buttons2 : "",
theme_advanced_toolbar_location : "top",
theme_advanced_toolbar_align : "left",
theme_advanced_statusbar_location : "bottom",
theme_advanced_resizing : true,
// Подключение нужного CSS стиля
content_css : "assest/templates/me_template/style.css"
});
</script>
3. Создаем сниппет NewArticleEvent и чанки с шаблонами
NewArticleEvent
<?php
function CreateNewArticle(&$fields){
// Массив $fields будет содержать данные всех полей формы
// Создания документа с описанием.
require_once('assets/libs/document.class.inc.php');
$doc = new Document(); // создаем документ
$doc->Set('parent',35); // определяем в какую папку положить
$doc->Set('template','Тема форума'); // задаем шаблон
$doc->Set('content',$fields['content']); // основное содержимое
$doc->Set('pagetitle',$fields['pagetitle']);
$doc->Set('tvavtor',$fields['avtor']); // автор
$doc->Set('tvemail_tc',$fields['email']); // e-mail
$doc->Set('published',0);
$doc->Save(); // сохраняем
return true;
}
?>
Чанк new-topic (шаблон формы)
<div class="wform__submit" style="text-align: center; font-size: 20px; padding: 7px 0; margin-top: 20px;" onclick="$(this).next().slideDown();$(this).hide();">Создать новую тему</div>
<div style="display:none;">
<h2>Создание новой темы</h2>
<p class="error">[+validationmessage+]</p>
<form action="[~[*id*]~]" method="post" enctype="multipart/form-data">
<div style="width:45%; float:left;">
<input type="hidden" name="formid" value="newArticle">
<p><label>Автор *</label></p>
<p><input class="field" type="text" style="width:100%; height:32px;" name="avtor" eform=" Имя автора :string:1"></p>
<p><label>Email *</label></p>
<p><input class="field" type="text" name="email" size="40" style="width:100%; height:32px;" eform=" Адрес почты :email:1"></p>
<p><label>Название темы *</label></p>
<p><input name="pagetitle" type="text" style="width:100%; height:32px;" eform=" Название темы :string:1">
</div>
<div style="width:45%; margin-left:5%;float:left;">
<p> Текст темы *</p>
<textarea name="content" cols="40" rows="10" eform=" Текст темы :string:1"></textarea>
<p><input type="submit" name="frmGo" class="wform__submit" value="Опубликовать"></p>
</div>
<div style="clear:both;"></div>
</form>
</div>
чанк forumRow вывод тем формуа
<tr>
<td class="td_l">
<a href="[~[+id+]~]" class="theme">[+pagetitle+]</a>
</td>
<td>[+jotcount+]</td>
<td>[[DateFormat? &create=`[*createdon*]`]]</td>
</tr><tr>
4. Теперь создаем шаблон для страницы с темой «Тема форума», на ней у нас должен быть вывод контента страницы и вызов JotX
<p><b>Автор:</b> <a href="mailto:[*email_tc*]">[*avtor*]</a></p>
<div class="page__content">
[*content*]
[!JotX?
&config=`tree`
&subscribe=`1`
&moderated=`1`
&Emails=`[[DocInfo? &docid=`1` &tv=`1` &field=`forum-email`]]`
&Author=`1`
!]
</div>
5. Не забудьте создать соответствующие TV поля
6. Готово.
Спасибо Алексею Либеру за помощь в реализации идеи.
Вопросы, дополнения, пожелания пишите в комментариях.
Алексей Либер 14.04.2016 19:47 #
ProuD 01.06.2016 14:23 #