Create a discussion board for Mindtouch wiki

A recent comment on my Mindtouch intro page asked how I built the discussion board.

I originally got the code from the Mindtouch Developer site here, however I can’t seem to find the complete source code anymore. Either way, I’m pretty sure neilw, a valuable contributor to the Mindtouch community is the author of this code and full credit goes to him.

The actual implementation is very simple. You just need to make a couple of templates.

First, create the discussion board page template, or topic list:

Template:/ForumTopicList

 
<div block="var homepath=(args.path ?? '/Forum_Topics');
if (homepath[0] == '/') {
let homepath = page.path .. homepath;
}">
	<p>{{wiki.create(&quot;Create New Topic&quot;,homepath,(args.template ?? &quot;ForumTopic&quot;),true,&quot;Put Your Title Here&quot;)}}</p>
	<table block="var homepage = wiki.getpage(homepath);
    var empty = true;
    if (homepage != nil) {
    let empty = (#homepage.subpages == 0);
    }
    var topics = [];
    if (!empty) {
    foreach (var p in homepage.subpages) {
    var entry = wiki.page(p.path);
    var originator = entry['//*[@id=\'ForumEntryOriginator\']'];
    if (xml.text(originator) == nil) { let originator = web.link(p.author.uri, p.author.name); }
    var lastAuthor = p.author;
    var lastDate = p.date;
    var lastChange = string.contains(p.editsummary, 'page created') ? '(new)' : '(E)';
    if (#p.comments != 0) {
    var lastComment = list.reverse(p.comments)[0];
    if (date.isafter(lastComment.date, p.date)) {
    let lastAuthor = lastComment.author;
    let lastDate = lastComment.date;
    let lastChange = '(C)';
    }
    }
    let lastAuthor = web.link(lastAuthor.uri, lastAuthor.name);
    let lastDate = date.format(lastDate, 's');
    var sticky = (p.tags.sticky != nil ? 'STICKY!' : '');
    let lastDate = (sticky != '' ? 'z' : 'a') .. lastDate;
    let topics ..= [ { page:p, originator:originator, author:lastAuthor, date:lastDate, change:lastChange, sticky:sticky } ];
    }
    let topics = list.sort(topics, 'date', true);
    }" border="1" cellpadding="4" cellspacing="0" class="table">
		<tbody>
			<tr>
				<th style="width: 55%" valign="top">Topic</th>
				<th style="text-align: center; width: 10%" valign="top">Starter</th>
				<th style="text-align: center; width: 5%" valign="top">Replies</th>
				<th style="text-align: center; width: 25%" valign="top">Last Comment(C) or Edit(E)</th>
				<th style="width: 5%" valign="top">Views</th>
			</tr>
			<tr class="{{__count % 2 == 0 ? 'bg1' : 'bg2'}}" foreach="var t in topics" if="!empty">
				<td valign="top"><font size="1" style="font-size: 16px"><strong><font style="color: #598527; font-size: 10px">{{t.sticky}}</font> {{web.link(t.page.uri, t.page.title)}}</strong></font><br />
					&nbsp;</td>
				<td style="text-align: center; vertical-align: top">{{ t.originator; }}</td>
				<td style="text-align: center; vertical-align: top">{{#t.page.comments}}</td>
				<td style="text-align: center" valign="top"><font style="font-size: 12px">{{date.format(string.substr(t.date,1),'yyyy-M-d H:mm');' '; if (t.change != '(new)') { 'by '; t.author; ' '; } t.change; }}<br />
					</font></td>
				<td style="text-align: center" valign="top">{{t.page.viewcount}}</td>
			</tr>
			<tr if="empty">
				<td colspan="5"><font style="font-size: 14px"><strong>(no topics yet)</strong></font></td>
			</tr>
		</tbody>
	</table>
	<br />
	&nbsp;</div>

Then call this template somewhere on your page, with this:

{{ template("ForumTopicList") }}

Now, you need to create the template for the actual new topic post:

Template:/ForumTopic

<table border="0" cellpadding="5" cellspacing="0" style="border-bottom: black thin solid; border-left: black thin solid; background-color: #eeeeee; width: 100%; border-top: black thin solid; border-right: black thin solid">
	<tbody style="vertical-align: top">
		<tr>
			<td>Created by <span id="ForumEntryOriginator">{{ edit: web.link(user.uri, user.name) }}</span> on {{ edit:&quot;{{ save:date.now}}&quot; }}<br />
				&nbsp;</td>
			<td style="text-align: center; vertical-align: top"><span style="color: #598527; font-weight: bold">{{ if (page.tags.sticky != nil) { &quot;STICKY&quot;; } }}</span></td>
			<td style="background-image: none; text-align: right; vertical-align: top">{{ web.link(page.feed, &quot;Track this page&quot;) }}<br />
				&nbsp;</td>
		</tr>
	</tbody>
</table>
<p>&nbsp;&nbsp;</p>
<p>&nbsp;</p>
<table border="1" cellpadding="5" cellspacing="0" class="comment" style="background-color: #ffdddd; border-collapse: separate; vertical-align: top">
	<tbody style="vertical-align: top">
		<tr>
			<td style="width: 100%">
				<p><span class="comment"><font style="font-size: 21px"><strong>Instructions:</strong></font></span></p>
				<ol>
					<li><span class="comment">These instructions will only appear while you are editing.&nbsp; No need to delete them!</span></li>
					<li style="font-weight: bold"><span class="comment">Please enter your Subject in the title above.</span></li>
					<li><span class="comment">Enter the content of your message in whatever form you like below.</span></li>
					<li><span class="comment"><span style="font-weight: bold">Adding comment: </span><em>If you're not the original creator of this topic, please reply by using the &quot;Add Comment&quot; field at the bottom of the page. </em>The comment added will be tabulated in the &quot;Reply&quot; field.<br />
						&nbsp;</span></li>
				</ol>
			</td>
		</tr>
	</tbody>
</table>
<p>&nbsp;</p>
<p>&lt;enter your topic message/description here&gt;</p>

You can modify this template to include whatever instructions you like.

That’s it! To create a new topic, navigate to the page that you call the ForumTopicList template, and click the “Create New Topic” button:

When others comment on the page that’s created, it will count as “replies” and show in the topic list.

One thought to “Create a discussion board for Mindtouch wiki”

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.