Documentation of the Freetag event plugin
(serendipity_event_freetag)

Documentary added by Ian on 2014-09-27. Informations given in The most current README, and older README.txt a and the most current ChangeLog file.

Scripting changes by options

Option: Extendet Smarty

When using extended smarty output, the following code illustrates how the smarty-variables could be used when dropped into the entries.tpl:

{if isset($entry.freetag.extended) && $entry.freetag.extended == 1}
    {if $entry.freetag.tags.tags}
        <div class="serendipity_freeTag">{$entry.freetag.tags.description}
            {foreach from=$entry.freetag.tags.tags item="tag"}
                {$tag}
            {/foreach}
        </div>

        {if $is_single_entry or $is_preview}
            {$entry.freetag.related.description}
            <ul class="serendipity_freeTag_related">
            {foreach from=$entry.freetag.related.entries item="link"}
                <li>{$link}</li>
            {/foreach}
            </ul>
        {/if}
    {/if}
{else}
    {$entry.freetag}
{/if}

Using this subquery you can convert existing categories to tags:

INSERT INTO serendipity_entrytags (entryid, tag) 
  SELECT serendipity_entries.id, serendipity_category.category_name 
    FROM serendipity_entries, serendipity_category, serendipity_entrycat 
   WHERE serendipity_entrycat.entryid = serendipity_entries.id 
     AND serendipity_category.categoryid = serendipity_entrycat.categoryid;

[quoted from: http://pixelated-dreams.com/archives/229-Spring-Cleaning.html]

Or using this script you can convert existing categories to tags:

<?php
include 'serendipity_config.inc.php';

$rows = serendipity_db_query("SELECT e.id, e.title, c.category_name
                                FROM {$serendipity['dbPrefix']}entries AS e
                                JOIN {$serendipity['dbPrefix']}entrycat AS ec
                                  ON ec.entryid = e.id
                                JOIN {$serendipity['dbPrefix']}category AS c
                                  ON ec.categoryid = c.categoryid");

foreach($rows AS $row) {
    serendipity_db_query(
        sprintf(
            "REPLACE INTO {$serendipity['dbPrefix']}entrytags (entryid, tag) VALUES (%d, %s)",
            (int)$row['id'],
            serendipity_db_escape_string($row['category_name'])
        )
    );

    printf(
        "Category '%s' added as Tag for Entry #%d, '%s'<br />\n",
        htmlspecialchars($row['category_name']),
        (int)$row['id'],
        htmlspecialchars($row['title'])
    );
}

 

Option: Tags-as-list

The following code illustrates on how to change your templates entries.tpl file (all + lines, without '+ '):

{serendipity_hookPlugin hook="entries_header" addData="$entry_id"}
+ {if $taglist}
+     <article id="taglistentries" class="clearfix serendipity_entry">
+         <div class="clearfix content serendipity_entry_body">
+             <h2>{$head_subtitle}</h2>
+     {foreach from=$entries item="dategroup"}
+         {foreach from=$dategroup.entries item="entry"}
+
+             <div class="static-entries-list">
+                 ({$dategroup.date|date_format:"%d.%m.%Y"}) <a href="{$entry.link}">{$entry.title|default:$entry.id}</a>
+             </div>
+
+         {/foreach}
+     {/foreach}
+
+         </div>
+     </article>
+
+ {else}
+
{foreach from=$entries item="dategroup"}
    {foreach from=$dategroup.entries item="entry"}
    {assign var="entry" value=$entry scope="parent"}
    <article id="post_{$entry.id}" class="clearfix serendipity_entry{if $dategroup.is_sticky} sticky{/if}">
        <header class="clearfix">

            <h2><a href="{$entry.link}">{$entry.title}</a></h2>

            <span class="serendipity_byline block_level"><span class="single_user">{$CONST.POSTED_BY} <a href="{$entry.link_author}">{$entry.author}</a> {$CONST.ON} </span><time datetime="{$entry.timestamp|@serendipity_html5time}">{$entry.timestamp|@formatTime:$template_option.date_format}</time>{if $entry.is_entry_owner and not $is_preview} | <a href="{$entry.link_edit}">{$CONST.EDIT_ENTRY}</a>{/if}</span>
        </header>

        <div class="clearfix content serendipity_entry_body">
        {if $entry.categories}{foreach from=$entry.categories item="entry_category"}{if $entry_category.category_icon}<a href="{$entry_category.category_link}"><img class="serendipity_entryIcon" title="{$entry_category.category_name|@escape}{$entry_category.category_description|@emptyPrefix}" alt="{$entry_category.category_name|@escape}" src="{$entry_category.category_icon}"></a>{/if}{/foreach}{/if}
        {$entry.body}
        {if $entry.has_extended and not $is_single_entry and not $entry.is_extended}
        <a class="read_more block_level" href="{$entry.link}#extended">{$CONST.VIEW_EXTENDED_ENTRY|@sprintf:$entry.title}</a>
        {/if}
        </div>
        {if $entry.is_extended}
        <div id="extended" class="clearfix content">
        {$entry.extended}
        </div>
        {/if}
        {if $entry.plugin_display_dat}
        {$entry.plugin_display_dat}
        {/if}

        <footer class="clearfix">
        {if $entry.categories}
            <span class="visuallyhidden">{$CONST.CATEGORIES}: </span>{foreach from=$entry.categories item="entry_category" name="categories"}<a href="{$entry_category.category_link}">{$entry_category.category_name|@escape}</a>{if not $smarty.foreach.categories.last}, {/if}{/foreach}
        {/if}
        {if $entry.categories and ($entry.has_comments or $entry.has_disqus)} | {/if}
        {if ($entry.has_comments or $entry.has_disqus)}
        {if $entry.has_disqus }
            {$entry.comments}{if $entry.has_trackbacks}, <a href="{$entry.link}#trackbacks">{$entry.trackbacks} {$entry.label_trackbacks}</a>{/if}
        {else}
            <a href="{$entry.link}#comments" title="{$entry.comments} {$entry.label_comments}{if $entry.has_trackbacks}, {$entry.trackbacks} {$entry.label_trackbacks}{/if}">{$entry.comments} {$entry.label_comments}</a>
        {/if}
        {/if}
        {if $entry.url_tweetthis}
            | <a href="{$entry.url_tweetthis}" title="{$CONST.TWOK11_TWEET_THIS}">Twitter</a>
        {/if}
        {if $entry.url_dentthis}
            | <a href="{$entry.url_dentthis}" title="{$CONST.TWOK11_DENT_THIS}">Identica</a>
        {/if}
        {if $entry.url_shorturl}
            | <a href="{$entry.url_shorturl}" title="{$CONST.TWOK11_SHORT_URL_HINT}" class="short-url">{$CONST.TWOK11_SHORT_URL}</a>
        {/if}
            {$entry.add_footer}
        </footer>

        <!--
        <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
                 xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"
                 xmlns:dc="http://purl.org/dc/elements/1.1/">
        <rdf:Description
                 rdf:about="{$entry.link_rdf}"
                 trackback:ping="{$entry.link_trackback}"
                 dc:title="{$entry.title_rdf|@default:$entry.title}"
                 dc:identifier="{$entry.rdf_ident}" />
        </rdf:RDF>
        -->

    {if $is_single_entry and not $is_preview}
        {if $CONST.DATA_UNSUBSCRIBED}
        <p class="serendipity_msg_notice">{$CONST.DATA_UNSUBSCRIBED|@sprintf:$CONST.UNSUBSCRIBE_OK}</p>
        {/if}
        {if $CONST.DATA_TRACKBACK_DELETED}
        <p class="serendipity_msg_notice">{$CONST.DATA_TRACKBACK_DELETED|@sprintf:$CONST.TRACKBACK_DELETED}</p>
        {/if}
        {if $CONST.DATA_TRACKBACK_APPROVED}
        <p class="serendipity_msg_notice">{$CONST.DATA_TRACKBACK_APPROVED|@sprintf:$CONST.TRACKBACK_APPROVED}</p>
        {/if}
        {if $CONST.DATA_COMMENT_DELETED}
        <p class="serendipity_msg_notice">{$CONST.DATA_COMMENT_DELETED|@sprintf:$CONST.COMMENT_DELETED}</p>
        {/if}
        {if $CONST.DATA_COMMENT_APPROVED}
        <p class="serendipity_msg_notice">{$CONST.DATA_COMMENT_APPROVED|@sprintf:$CONST.COMMENT_APPROVED}</p>
        {/if}

        <section id="trackbacks" class="serendipity_comments serendipity_section_trackbacks">
            <h3>{$CONST.TRACKBACKS}</h3>

            <div id="trackback_url" class="block_level"><a rel="nofollow" href="{$entry.link_trackback}" title="{$CONST.TRACKBACK_SPECIFIC_ON_CLICK|@escape}">{$CONST.TRACKBACK_SPECIFIC}</a></div>

            {serendipity_printTrackbacks entry=$entry.id}
        </section>

        <section id="comments" class="serendipity_comments serendipity_section_comments">
            <h3>{$CONST.COMMENTS}</h3>

            <p class="manage_comments">{$CONST.DISPLAY_COMMENTS_AS}
            {if $entry.viewmode eq $CONST.VIEWMODE_LINEAR}
               {$CONST.COMMENTS_VIEWMODE_LINEAR} | <a href="{$entry.link_viewmode_threaded}#comments" rel="nofollow">{$CONST.COMMENTS_VIEWMODE_THREADED}</a>
            {else}
               <a rel="nofollow" href="{$entry.link_viewmode_linear}#comments">{$CONST.COMMENTS_VIEWMODE_LINEAR}</a> | {$CONST.COMMENTS_VIEWMODE_THREADED}
            {/if}
            </p>

            {serendipity_printComments entry=$entry.id mode=$entry.viewmode}
        {if $entry.is_entry_owner}
            <p class="manage_comments">
            {if $entry.allow_comments}
            <a href="{$entry.link_deny_comments}">{$CONST.COMMENTS_DISABLE}</a>
            {else}
            <a href="{$entry.link_allow_comments}">{$CONST.COMMENTS_ENABLE}</a>
            {/if}
            </p>
        {/if}
        </section>
            <a id="feedback"></a>
        {foreach from=$comments_messagestack item="message"}
            <p class="serendipity_msg_important">{$message}</p>
        {/foreach}
        {if $is_comment_added}
            <p class="serendipity_msg_notice">{$CONST.COMMENT_ADDED}</p>
        {elseif $is_comment_moderate}
            <p class="serendipity_msg_notice">{$CONST.COMMENT_ADDED}: {$CONST.THIS_COMMENT_NEEDS_REVIEW}</p>
        {elseif not $entry.allow_comments}
            <p class="serendipity_msg_important">{$CONST.COMMENTS_CLOSED}</p>
        {/if}
        <section id="respond" class="serendipity_section_commentform">
            <h3>{$CONST.ADD_COMMENT}</h3>
            {$COMMENTFORM}
        </section>

    {/if}
    {$entry.backend_preview}
    </article>
    {/foreach}
{foreachelse}
    {if not $plugin_clean_page}
    <p class="nocontent">{$CONST.NO_ENTRIES_TO_PRINT}</p>
    {/if}
{/foreach}
+
+ {/if}{* not taglist end *}
+
{if $footer_info or $footer_prev_page or $footer_next_page}
    <nav class="serendipity_pagination block_level">
        <h2 class="visuallyhidden">{$CONST.TWOK11_PAG_TITLE}</h2>

        <ul class="clearfix">
            {if $footer_info}
            <li class="info"><span>{$footer_info}</span></li>
            {/if}
            <li class="prev">{if $footer_prev_page}<a href="{$footer_prev_page}">{/if}{if $footer_prev_page}&larr; {$CONST.PREVIOUS_PAGE}{else}&nbsp;{/if}{if $footer_prev_page}</a>{/if}</li>
            <li class="next">{if $footer_next_page}<a href="{$footer_next_page}">{/if}{if $footer_next_page}{$CONST.NEXT_PAGE} &rarr;{else}&nbsp;{/if}{if $footer_next_page}</a>{/if}</li>
        </ul>
    </nav>
{/if}
    {serendipity_hookPlugin hook="entries_footer"}