<?xml version='1.0' encoding='UTF-8'?>
<rss version='2.0'>
	<channel>
		<title>Cotonti</title>
		<link>http://www.cotonti.com</link>
		<description>Open Source PHP Content Management Framework</description>
		<generator>Cotonti</generator>
		<language>en</language>
		<pubDate>Wed, 19 Jun 2013 18:12:13 -0000</pubDate>

		<item>
			<title>Tags Global (Global Tag Cloud)</title>
			<description><![CDATA[<p>This plugins enables you to place Tag Cloud in any template file. Just use {PHP.out.tagcloud} variable to use it anywhere you want.</p>

<p>NB: The generated cloud fall under the configuration set for the index tag cloud.</p>
]]></description>
			<pubDate>Thu, 13 Jun 2013 08:51:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/extensions/navigation-structure/tags-global]]></link>
		</item>
		<item>
			<title>Invite</title>
			<description><![CDATA[<p>A basic invitation and referral system allowing registered users to promote your site.</p>

<h1>Features</h1>

<ul><li>Allows registered users to send invitation emails for your site by either a list of emails they manually input or from their contacts ( basic <a href="http://openinviter.com/" rel="nofollow">http://openinviter.com</a> integration )</li>
	<li><span style="line-height:1.6em;">Ability to limit how many emails per time duration a user can send, and duplicate email invitation prevention.</span></li>
	<li>Links inviter to the invitee</li>
	<li>Basic referral system where users' have their own referral code that they can send to people and get credit for registration e.g yoursite.com/?rfc=816d9a0f96e55b39e420d35cc4224423 or any valid URL for your site with &amp;rfc=816d9a0f96e55b39e420d35cc4224423 appended</li>
	<li>Compatiable with esclkm's SMTP plugin (PHPMailer) for SMTP support. Just install and configure the SMTP plugin if you want SMTP support and you're good to go.</li>
</ul><h1>Installation</h1>

<ol><li style="margin:0px;padding:0px;border:0px;">Download, unzip and move 'invite' folder into your module directory</li>
	<li style="margin:0px;padding:0px;border:0px;">Install through the administration panel</li>
	<li style="margin:0px;padding:0px;border:0px;">Ensure the extension configurations are set to your preference</li>
	<li style="margin:0px;padding:0px;border:0px;">Edit invite/tpl/invite.tpl and invite/tpl/invite.contact.tpl to fit your theme</li>
	<li style="margin:0px;padding:0px;border:0px;">(optional) Add any of the tags ( found on <a href="https://github.com/xerora/cot-invite#tags" rel="nofollow">G</a><a href="https://github.com/xerora/cot-invite#tags" rel="nofollow">itHub</a> ) to your templates</li>
</ol><h1 style="margin:0px;padding:0px;border:0px;">Credits</h1>

<p>OpenInviter (<a href="http://openinviter.com/" rel="nofollow">http://openinviter.com</a>)</p>

<p>You can find additional information and documentation at <a href="https://github.com/xerora/cot-invite" rel="nofollow">GitHub</a>.</p>
]]></description>
			<pubDate>Tue, 11 Jun 2013 23:04:09 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/extensions/community-social/invite]]></link>
		</item>
		<item>
			<title>LinkedIn Badge</title>
			<description><![CDATA[<p>This is a very simple plugin to embed a badge for a LinkedIn profile onto your Cotonti website. Eventually there will be functionality to embed multiple types of LinkedIn badges, but it's a basic badge for now.</p>

<p>For the link to the user profile, use only the end of your profile link.</p>

<p>Example:</p>

<p>http://www.linkedin.com/in/<u><strong>brockburkholder</strong></u>/</p>

<p>This plugin can then be embedded by using the tag <strong>{PHP.linkedin.badge}</strong> globally on your website.</p>

<p>Note: Any width less than 300 will automatically be set to 300.</p>

<p>Example of how the badge will look:</p>

<p><img alt="LinkedIn Badge" src="http://www.cotonti.com/datas/users/badge_53.jpg" style="width:307px;height:146px;" /></p>

<p>Enjoy!</p>
]]></description>
			<pubDate>Sun, 02 Jun 2013 18:01:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/extensions/community-social/linkedin_badge]]></link>
		</item>
		<item>
			<title>Video</title>
			<description><![CDATA[<p>If you need to create a selection of videos from public video hostings (e.g. YouTube, Vimeo) and put it on your site with embedded player, this module is probably what you need.</p>

<h2>Features</h2>

<ul><li>Add videos from YouTube or Vimeo.</li>
	<li>Shows N last videos on the index page. </li>
	<li>Shows complete paginated listing on a standalone page.</li>
</ul><h2>Installation</h2>

<ol><li>Download the ZIP and unpack it somewhere.</li>
	<li>Copy "video" to your Cotonti module folder.</li>
	<li>Install it in Administration / Extensions.</li>
	<li>Add {INDEX_VIDEO} to your index.tpl if needed.</li>
</ol>]]></description>
			<pubDate>Sat, 18 May 2013 19:25:15 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/extensions/files-media/video_module]]></link>
		</item>
		<item>
			<title>Подключение php кода бирж ссылок к вашему сайту</title>
			<description><![CDATA[<h1>Введение</h1>

<p>Если вы решили продавать на своем сайте ссылки и для этого вам нужно установить php код какой-либо биржи ссылок то в данном уроке я покажу вам, как легко это сделать, что даже не нужно писать или устанавливать какие-либо плагины для этого. В уроке будет рассмотрено подключение трех бирж - <strong>sape</strong>, <strong>trusttrustlink</strong>, <strong>uniplacer</strong>. Сделать, кстати вы можете это как для одной из них, так и одновременно для всех - то есть держать свой сайт как площадку для продажи сразу в нескольких биржах.</p>

<p>Будет рассмотрен способ подключения кода бирж, который предусматривает продажу ссылок с их размещением в каком либо отведенном под такого вида ссылки месте на страницах вашего сайта работающего на CMS\CMF Cotonti, то есть продажа контекстных ссылок (то есть тех которые размещаются непосредственно в тексте страниц) предусматривает другой, более сложный способ установки кода биржи. Потому если вы решили продавать только контекстные ссылки, то к сожалению, вам данный урок, не подойдет - потому советую либо обратится за помощью к <a href="http://www.cotonti.com/users">специалистам</a> либо попросить помощи на нашем <a href="http://www.cotonti.com/forums?m=topics&amp;s=12">форуме</a>, кстати данный урок был написан по мотивам вот этой <a href="http://www.cotonti.com/forums?m=posts&amp;q=7394">темы на форуме</a> потому дабы не множить подобные темы свой вопрос предлагаю задавать именно там.</p>

<p>А если действия описанные здесь вам покажутся слишком сложными то могу предложить воспользоваться поиском в <a href="http://www.cotonti.com/ru/extensions/">хранилище расширений для Cotonti</a> что бы найти там плагин, который сделает часть работы за вас. Например, там уже есть <a href="http://www.cotonti.com/page/280">плагин для sape</a>.</p>

<h1>Требования</h1>

<p>Для начала вы должны на сайте бирж(и) ссылок выполнить начальные действия, в которые входят:</p>

<ul><li>скачать архив с php кодом который даст возможность торговать ссылками у себя на сайте, будем считать что вы его уже скачали;</li>
	<li>распаковать(разархивировать) скачанный архив у себя на компьютере;</li>
	<li>загрузить (чаще всего делают это с помощью ftp) распакованную папку в корень своего сайта. Можно, конечно, не в корень, а в другую папку, но этот и другие частные случаи я в этом уроке рассматривать не буду, потому будем полагать что папка с php кодом от бирж(и) ссылок уже загружена в корень сайта;</li>
	<li>выставить на эту папку соответвующие права.</li>
</ul><p>Теперь вам потребуется всего лишь любой текстовый редактор и знание идентификатора вашего сайта в системе биржи ссылок. Обычно он похож на вот такую строчку <strong>2fc411fd6328b7f4f854d5c6589d</strong> (имя загруженной на сайт папки с кодом соответвует ему). В примерах ниже этот идентификатор указан как <strong>xxxxxxxx</strong> или <strong>yyyyyyyyy.</strong></p>

<p>Так же в примерах я буду говорить о стандартном шаблоне\скине который идет в коробке с Cotonti который называется <strong>nemesis</strong> (для Cotonti Siena) или <strong>sed-light</strong> (для Cotonti Genoa).</p>

<h1>Установка</h1>

<p>Итак, приступим. В каждой из бирж, вам предлагают, разместить на страницах своего сайта определенный php код. Для каждой из систем он выглядит, примерно, так:</p>

<p><strong>sape</strong></p>

<pre class="brush:php;">
     if (!defined('_SAPE_USER')){
        define('_SAPE_USER', 'xxxxxxxxxxxxxxxxxxxxxxxxxxx');
     }
     require_once(realpath($_SERVER['DOCUMENT_ROOT'].'/'._SAPE_USER.'/sape.php'));
     $sape = new SAPE_client();
     echo $sape-&gt;return_links($n);</pre>

<p><strong>trusttrustlink</strong></p>

<pre class="brush:php;">
define('TRUSTLINK_USER', 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyy');
require_once($_SERVER['DOCUMENT_ROOT'].'/'.TRUSTLINK_USER.'/trusttrustlink.php');
$o['charset'] = 'cp1251';//кодировка сайта
$trustlink = new TrustlinkClient($o);
unset($o);
echo $trustlink-&gt;build_links();</pre>

<p><strong>uniplacer</strong></p>

<pre class="brush:php;">
require_once($_SERVER['DOCUMENT_ROOT'].'/uniplacer_config.php');
require_once($_SERVER['DOCUMENT_ROOT'].'/'._UNIPLACE_USER_.'/uniplacer.php');

$Uniplacer = new Uniplacer(_UNIPLACE_USER_);
$Uniplacer-&gt;GetCode();
$links = $Uniplacer-&gt;GetLinks();

if($links)
{
      foreach($links as $link)
      {
        echo $link.'&lt;br&gt;';
      }
}</pre>

<p>Что ж давайте откроем в текстовом редакторе файл <u><em>/themes/nemesis/nemesis.php</em></u> (если у вас Cotonti Genoa то <u><em>/skins/sed-light/sed-light.php</em></u> )</p>

<p> </p>

<p><strong>nemesis.php </strong></p>

<p> </p>

<pre class="brush:php;">
&lt;?php
/* ====================
[BEGIN_COT_THEME]
Name=Nemesis ver. 1.00
Schemes=default:Default
[END_COT_THEME]
==================== */

/**
 * Cotonti Model Theme
 *
 * @package Cotonti
 * @version 0.9.0
 * @author Cotonti Team
 * @copyright (c) Seditio.by 2010
 * @license BSD
 */

defined('COT_CODE') or die('Wrong URL');

//Вставлять код(ы) бирж(и) будем сюда

?&gt;</pre>

<p> </p>

<p><strong>sed-light.php </strong></p>

<p> </p>

<pre class="brush:php;">
&lt;?PHP
/* ====================
[BEGIN_SED]
Name=SED-Light
[END_SED]
==================== */

/**
 * Official skin
 *
 * @package Cotonti
 * @version 0.0.3
 * @author Xiode - XiodeStudios.Com http://www.xiodestudios.com , Cotonti Team
 * @copyright Copyright (c) Cotonti Team 2008-2009
 * @license BSD
 */

defined('SED_CODE') or die('Wrong URL');

// List of supported themes
$skin_themes = array('sed-light' =&gt; 'Light');

//Вставлять код(ы) бирж(и) будем сюда

?&gt;</pre>

<p> </p>

<p>И вставим в него вышеуказанный код системы (или несколько кодов для разных систем) с небольшой поправкой, вот такой:</p>

<p> </p>

<p><strong>sape</strong></p>

<p> </p>

<pre class="brush:php;">
if (!defined('_SAPE_USER'))
{
     define('_SAPE_USER', 'xxxxxxxxxxxxxxxxxxxxxxxxxxx');
}
require_once(realpath($_SERVER['DOCUMENT_ROOT'].'/'._SAPE_USER.'/sape.php'));
$o['charset'] = 'UTF-8';
$sape = new SAPE_client($o);
$sape_link_out = $sape-&gt;return_links();
</pre>

<p> </p>

<p><strong>trusttrustlink</strong></p>

<p> </p>

<pre class="brush:php;">
define('TRUSTLINK_USER', 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'); 
require_once($_SERVER['DOCUMENT_ROOT'].'/'.TRUSTLINK_USER.'/trusttrustlink.php'); 
$o['charset'] = 'UTF-8';
$trustlink = new TrustlinkClient($o); 
unset($o); 
$trust_link_out = $trustlink-&gt;build_links();
</pre>

<p> </p>

<p><strong>uniplacer</strong></p>

<p> </p>

<pre class="brush:php;">
require_once($_SERVER['DOCUMENT_ROOT'].'/uniplacer_config.php');
require_once($_SERVER['DOCUMENT_ROOT'].'/'._UNIPLACE_USER_.'/uniplacer.php'); 

$Uniplacer = new Uniplacer(_UNIPLACE_USER_);
$Uniplacer-&gt;GetCode();
$links = $Uniplacer-&gt;GetLinks();
  
 if($links)
{
    $uni_link_out = '';
    foreach($links as $link)
    {
      $uni_link_out .= $link.'&lt;br&gt;';
    }
}
</pre>

<p> </p>

<p>Не забыв при этом заменить <strong>xxxx...</strong> или <strong>yyyy...</strong> на свой идентификатор. Сохраняем измененный файл <strong>nemesis.php</strong> (или <strong>sed-light.php </strong>соответственно) на сервер.</p>

<p> </p>

<p>Теперь осталось выбрать место в шаблоне куда вы хотите вывести блок (обычно его размещают в подвале или в близи него потому подразумевая шаблон, речь идет о файле footer.tpl, но выводить можно в абсолютно любой другой шаблон) ссылок и вставить в это место - вот такую строчку:</p>

<p> </p>

<p><strong>sape</strong></p>

<p> </p>

<pre class="brush:php;">
{PHP.sape_link_out}</pre>

<p> </p>

<p><strong>trusttrustlink</strong></p>

<p> </p>

<pre class="brush:php;">
{PHP.trust_link_out}</pre>

<p> </p>

<p><strong>uniplacer</strong></p>

<p> </p>

<pre class="brush:php;">
{PHP.uni_link_out}</pre>

<p> </p>

<p>Вот и все. Сохранив шаблон со вставленной строкой на сервере (на всякий случай еще можно в админ панели вашего cotonti сайта очистить Дисковый кэш) ваш сайт готов размещать ссылки от бирж(и).</p>

<p> </p>
]]></description>
			<pubDate>Tue, 02 Apr 2013 01:23:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/docs/ru/misc/sape_trustlink_uniplacer]]></link>
		</item>
		<item>
			<title>FAQ</title>
			<description><![CDATA[<h2>Features</h2>

<ul><li>Provides a page with a list of questions and or questions and answers</li>
	<li>Users and guests can ask questions if they have the proper rights priviledge</li>
	<li>Manage and submit questions and answers in the admin panel</li>
	<li>Order questions by manually setting positions and, configuration options for default ordering of questions with the same position value</li>
	<li>Categories through structures (optional)​</li>
</ul><h2>Requirements</h2>

<ul><li>Cotonti 9.13 or greater​</li>
</ul><h2>Installation</h2>

<ol><li>Copy the plugin to your Cotonti plugins folder</li>
	<li>Install it in Administration / Extensions​</li>
</ol><h2>Categories</h2>

<p>The use of categories is optional and can be setup through Administation / Structure / FAQ. All categories will be created with guest as read only and will need to be configured under the structure other wise. You can setup category specific templates through structures configurations as well.</p>

<p>Question submission to the default page ( no category ) will follow rights based on the module wide rights under this modules rights configuration.</p>

<h2>Templates</h2>

<p>A couple of useful variables for template condition blocks to alter you templates:</p>

<p>{PHP.faq_uses_categories}: a boolean that states whether the FAQ module is using categories<br />
{PHP.faq_has_subcategories}: a boolean that states whether the current FAQ category has subcategories<br />
{PHP.faq_has_questions}: a boolean that states whether the current FAQ category (even on the default page) has questions</p>

<p>You can find further documentation about available tags and blocks under the /docs directory included with this plugin or <a href="https://github.com/xerora/cot-faq" rel="nofollow">https://github.com/xerora/cot-faq</a></p>
]]></description>
			<pubDate>Sun, 31 Mar 2013 18:39:23 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/extensions/forms-feedback/faq1866]]></link>
		</item>
		<item>
			<title>Spam Protection</title>
			<description><![CDATA[<h2>What this plugin does</h2>

<ul><li><span style="color:rgb(51,51,51);font-family:Helvetica, arial, freesans, clean, sans-serif;font-size:14px;line-height:22px;background-color:rgb(255,255,255);">Filters comment, forum and other spam with your choice of services (Akismet, Defensio, Typepad Anti-Spam). Comment and forum spam filtering is disabled by default. ( It is not recommended to use non-custom adapters for filtering if you use plugins that alter the extension you are filtering spam on. This could have unexpected results unless you know the specifics.)</span></li>
	<li><span style="font-family:Helvetica, arial, freesans, clean, sans-serif;font-size:14px;line-height:22px;">Provides an administration tool to manage items marked as spam.</span></li>
	<li><span style="font-family:Helvetica, arial, freesans, clean, sans-serif;font-size:14px;line-height:22px;">Allows you to filter spam in your extensions.</span></li>
	<li><span style="font-family:Helvetica, arial, freesans, clean, sans-serif;font-size:14px;line-height:22px;">​Add your own section adapters to enable your extensions to use the spam moderation queue when filtering spam.</span></li>
</ul><h2>Installation</h2>

<ol><li><span style="font-family:Helvetica, arial, freesans, clean, sans-serif;font-size:14px;line-height:22px;">Decide which spam service you wish to use. Register at the service you choose to use and obtain an API key.</span><span style="font-family:Helvetica, arial, freesans, clean, sans-serif;font-size:14px;line-height:22px;">​​​</span><span style="font-family:Helvetica, arial, freesans, clean, sans-serif;font-size:14px;line-height:22px;"><span style="font-family:Helvetica, arial, freesans, clean, sans-serif;font-size:14px;line-height:22px;">​ Akismet (</span></span><a href="http://akismet.com/" rel="nofollow" style="margin:0px;padding:0px;border:0px;color:rgb(65,131,196);text-decoration:none;font-family:Helvetica, arial, freesans, clean, sans-serif;font-size:14px;line-height:22px;">http://akismet.com</a>), Defensio (<a href="http://defensio.com/" rel="nofollow" style="margin:0px;padding:0px;border:0px;color:rgb(65,131,196);font-family:Helvetica, arial, freesans, clean, sans-serif;font-size:14px;line-height:22px;">http://defensio.com</a>), Typepad Anti-Spam (<a href="http://antispam.typepad.com/" rel="nofollow" style="margin:0px;padding:0px;border:0px;color:rgb(65,131,196);text-decoration:none;font-family:Helvetica, arial, freesans, clean, sans-serif;font-size:14px;line-height:22px;">http://antispam.typepad.com</a>)</li>
	<li><span style="font-family:Helvetica, arial, freesans, clean, sans-serif;font-size:14px;line-height:22px;">Download, unpack and upload the spam_protection plugin folder to your plugin directory.</span></li>
	<li><span style="font-family:Helvetica, arial, freesans, clean, sans-serif;font-size:14px;line-height:22px;">Install the plugin in the administration panel.</span></li>
	<li><span style="font-family:Helvetica, arial, freesans, clean, sans-serif;font-size:14px;line-height:22px;">Go into the plugin's configurations in the admin panel and select your spam service and enter your API key.</span></li>
	<li><span style="font-family:Helvetica, arial, freesans, clean, sans-serif;font-size:14px;line-height:22px;">Check to see that everything is configured to your preference.</span></li>
	<li><span style="font-family:Helvetica, arial, freesans, clean, sans-serif;font-size:14px;line-height:22px;">The rest is up to your spam service and you can find all spam items caught in Administration -&gt; Other -&gt; Spam Protection</span><span style="font-family:Helvetica, arial, freesans, clean, sans-serif;font-size:14px;line-height:22px;">​</span></li>
</ol><h2>Adding spam filtering to your extensions</h2>

<p><span style="font-family:Helvetica, arial, freesans, clean, sans-serif;font-size:14px;line-height:22px;">An example of what it would look like to add spam filtering to your extension:</span></p>

<pre class="brush:php;">
if(cot_plugin_active('spam_protection'))
{
    require_once cot_incfile('spam_protection', 'plug');
    $spam_data = array(
        'content' =&gt; $msg['text'],
        'authorname' =&gt; $usr['name'],
        'authoremail' =&gt; $usr['profile']['user_email'],
        'authorid' =&gt; $usr['id'],
        'authorip' =&gt; $usr['ip'],
        'date' =&gt; $sys['now'],
        'section' =&gt; 'guestbook',
        'data' =&gt; array(
            'guestbook' =&gt; $msg
        ), 
    );
    $spam_check_result = spam_protection_check($spam_data);
    if($spam_check_result['is_spam'])
    {
        // Item was returned as spam
        spam_protection_queue_add($spam_data); // Add to the moderation queue if you want. Not required.
    }
}</pre>

<p>See <a href="https://github.com/xerora/cot-spam_protection#spam_protection_checkdata" rel="nofollow">https://github.com/xerora/cot-spam_protection#spam_protection_checkdata</a> for more options to pass.</p>

<p>Go to <a href="https://github.com/xerora/cot-spam_protection" rel="nofollow">https://github.com/xerora/cot-spam_protection</a> or spam_protection/docs/README.htm for further documentation.</p>
]]></description>
			<pubDate>Thu, 21 Mar 2013 05:36:27 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/extensions/security-authentication/siena_spam_protection]]></link>
		</item>
		<item>
			<title>Cotonti Siena 0.9.13 &quot;Kingsley&quot;</title>
			<description><![CDATA[<p>Hello dear Community.</p>

<p>It's time to update your Cotonti instances to the latest and greatest 0.9.13 after several months since 0.9.12.1. Here is what we've got for you:</p>

<ul><li><a href="http://ckeditor.com/demo" rel="nofollow">CKEditor 4</a> is our new WYSIWYG editor by default.</li>
	<li><a href="https://github.com/Cotonti/Cotonti/issues/1167" rel="nofollow">Page cloning</a> feature.</li>
	<li>Draft pages are now <a href="https://github.com/Cotonti/Cotonti/issues/1160" rel="nofollow">easier to access</a>.</li>
	<li>Cotonti language files are compatible with <a href="https://www.transifex.com/projects/p/cotonti/" rel="nofollow">Transifex</a> translation service. <a href="http://www.cotonti.com/forums?m=posts&amp;q=7367">Discussion</a>. <a href="http://www.cotonti.com/docs/ext/lang/transifex">Documentation</a>.</li>
	<li>11 small enhancements.</li>
	<li>31 bug fixed.</li>
</ul><p>See <a href="http://www.cotonti.com/download/siena_0913">release notes</a> for more information.</p>

<p>This release is dedicated to Leslie "Kingsley" Gonggryp, a well known member of LDU, Seditio and then Cotonti community who <a href="http://www.fap-clan.com/index.php?e=page&amp;c=clannews&amp;al=RIP-Kingsley-1978---2013-You-will-be-missed" rel="nofollow">has recently passed away</a> at the age of 35. You can <a href="http://www.cotonti.com/forums?m=posts&amp;q=7359">join our condolences</a> if you knew this guy. Let's continue the good work that he would appreciate.</p>

<p>Rest in peace, Kingsley.</p>
]]></description>
			<pubDate>Sat, 16 Mar 2013 12:07:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/news/announce/siena_release_kingsley]]></link>
		</item>
		<item>
			<title>Cotonti Siena 0.9.13</title>
			<description><![CDATA[<h2>Package contents</h2>

<ul><li>Basic CMF.</li>
	<li>Modules: Forums, Homepage, Installation and Upgrade, Page, Personal File Space, Private Messages, Polls, RSS, Users, View.</li>
	<li>Plugins: AJAX autocomplete, Banlist, BBcode, CKEditor, Cleaner, Comments, Contact, Forum statistics, Genoa compatibility, Hidden groups, Hit statistics, HTML Purifier, Contents Internationalization, IPSearch, markItUp!, MassMoveTopics, MathCaptcha, News, Start Ratings, Recent Items, Referers, Search, Statistics, Tags, Trashcan, URLEditor, User images, User by first letter, Who is online.</li>
	<li>Themes: Nemesis (development), SymiSun-03 (showcase).</li>
	<li>Icon packs: Tango.</li>
	<li>Locales: English, Russian.</li>
</ul><h2>Requirements</h2>

<ul><li>PHP 5.2.3 or higher.</li>
	<li>MySQL 5.0.8 or higher.</li>
	<li>PHP extensions: GD, Hash, Mbstring, MySQL (mysqli, mysqlnd are suitable too), PCRE, PDO and PDO_MySQL, Sessions, Zlib.</li>
</ul><h2>What's new in Siena 0.9.13</h2>

<ul><li><a href="http://ckeditor.com/demo" rel="nofollow">CKEditor 4</a> is our new WYSIWYG editor by default.</li>
	<li><a href="https://github.com/Cotonti/Cotonti/issues/1167" rel="nofollow">Page cloning</a> feature.</li>
	<li>Draft pages are now <a href="https://github.com/Cotonti/Cotonti/issues/1160" rel="nofollow">easier to access</a>.</li>
	<li>Cotonti language files are compatible with <a href="https://www.transifex.com/projects/p/cotonti/" rel="nofollow">Transifex</a> translation service. <a href="http://www.cotonti.com/forums?m=posts&amp;q=7367">Discussion</a>. <a href="http://www.cotonti.com/docs/ext/lang/transifex">Documentation</a>.</li>
	<li>11 small enhancements.</li>
	<li>31 bug fixed.</li>
</ul><p>For more details please see <a href="https://github.com/Cotonti/Cotonti/issues?labels=&amp;milestone=43&amp;state=closed" rel="nofollow">this report</a>.</p>

<p>See the list of new TPL tags <a href="http://www.cotonti.com/tpltags?version=0.9.13">here</a>.</p>

<h2>Installation</h2>

<ol><li>Copy datas/config-sample.php to datas/config.php and make it writable with CHMOD 666 or CHMOD 664 (depending on your hosting configuration).</li>
	<li>Make the following folders and all their subfolders writable too with CHMOD 777 or CHMOD 775:
	<pre>
	/datas/avatars
	/datas/cache (and all its subfolders)
	/datas/defaultav
	/datas/extflds
	/datas/photos
	/datas/thumbs
	/datas/users
</pre>
	</li>
	<li>Open your favorite browser and locate the installation script in it, e.g.: <a href="http://example.com/install.php" rel="nofollow">http://example.com/install.php</a></li>
	<li>Follow the instruction on the screen up to the end of installation.</li>
</ol><h2>Update from 0.9.12.1</h2>

<p>See updating instructions <a href="http://www.cotonti.com/docs/start/updating">here</a>.</p>

<p>For the list of files updated from 0.9.12.1 please see <a href="https://github.com/Cotonti/Cotonti/compare/0.9.12.1...0.9.13" rel="nofollow">this diff</a> and click "Files Changed".</p>

<h2>Upgrade from Genoa</h2>

<p>All upgrading procedures are described in <a href="http://www.cotonti.com/docs/start/updating">this document</a>.</p>
]]></description>
			<pubDate>Sat, 16 Mar 2013 11:25:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/download/siena_0913]]></link>
		</item>
		<item>
			<title>Maintaining Cotonti translations with Transifex</title>
			<description><![CDATA[<h2>
	Introduction</h2>
<p>
	Since v.0.9.13 Cotonti's language files are compatible with <a href="https://www.transifex.com" rel="nofollow">Transifex</a> translation service and you can join our international translations teams there:</p>
<p>
	<a href="https://www.transifex.com/projects/p/cotonti/" rel="nofollow">https://www.transifex.com/projects/p/cotonti/</a></p>
<p>
	Please read <a href="http://help.transifex.com/" rel="nofollow">Transifex Help Pages</a> to get started with the service. In this document we will only cover some topics specific to Cotonti.</p>
<h2>
	Setting up the client tools</h2>
<p>
	You can edit everything online but as Cotonti has plenty of language files, in many cases it would be more comfortable to copy files on your disk and edit them with your favorite editor. For such a case Transifex has a console <a href="http://help.transifex.com/features/client/index.html#user-client" rel="nofollow">Client tool</a>.</p>
<p>
	Python interpreter is requried to use the client tools. If you don't have one, get it from <a href="http://python.org/download/" rel="nofollow">http://python.org/download/</a>. If you are using Windows, <a href="http://docs.python.org/2/using/windows.html#configuring-python" rel="nofollow">setting some shortcuts</a> would be handy too.</p>
<p>
	Then you can install Transifex 'tx' tool as described in <a href="http://help.transifex.com/features/client/index.html#getting-the-client" rel="nofollow">this section</a>.</p>
<p>
	We also maintain a set of helper tools to manipulate language files easier in this repo: <a href="https://github.com/trustmaster/cotlang" rel="nofollow">https://github.com/trustmaster/cotlang</a>. They are also written in Python and run in command line.</p>
<h2>
	Getting a working copy</h2>
<p>
	Transifex works much like a git repository, so what you'd probably like to do first is to checkout yourself a working copy.</p>
<p>
	First, make a new folder, e.g. called 'cot-lang' and enter it in the command line:</p>
<pre class="brush:bash;">
cd cot-lang</pre>
<p>
	Then initialize a Transifex repo in it:</p>
<pre class="brush:bash;">
tx init</pre>
<p>
	After doing so, import repository configuration using this command:</p>
<pre class="brush:bash;">
tx set --auto-remote  https://www.transifex.com/projects/p/cotonti/</pre>
<p>
	To map Transifex translations to Cotonti langfiles correctly, open '.tx/config' file that the previous command created for you and replace all of its contents with the actual Cotonti configuration for Transifex:</p>
<p>
	<a href="https://raw.github.com/trustmaster/cotlang/master/tx.config" rel="nofollow">https://raw.github.com/trustmaster/cotlang/master/tx.config</a></p>
<blockquote>
	<p>
		Note for advanced users: contents of this file were generated by 'cotlangtx.py' tool given current Cotonti source tree as an argument, e.g.:</p>
	<pre class="brush:bash;">
python cotlangtx.py ~/htdocs/cotonti</pre>
</blockquote>
<p>
	Now you can pull all the existing langfiles to your working copy:</p>
<pre class="brush:bash;">
tx pull -a</pre>
<p>
	Done, you now have a source tree with only language files in it.</p>
<h2>
	Making an existing locale compatible with Transifex</h2>
<p>
	If you have an existing locale prior to 0.9.13, you should update it to be compatible with Transifex. There is a tool in <a href="https://github.com/trustmaster/cotlang" rel="nofollow">cotlang</a> package called 'cotlangfix.py' for it. It automates 95% of the fixes that need to be applied. Invoke it this way:</p>
<pre class="brush:bash;">
python cotlangfix.py path/to/source</pre>
<p>
	It will print the results on screen. It will also print some strings that should be fixed manually. Below are some common cases.</p>
<h3>
	Multiline entries</h3>
<p>
	Transifex does not support strings that have line breaks in them. So you will have to merge them into a single line. To include line breaks though, you need to make sure the strings is in double quotes and then you can replace line breaks with \n. Also when changing from single quotes to double quotes, the '$' character needs to be escaped, so it becomes '\$'. For example,</p>
<pre class="brush:php;">
$L['multiline_example'] = 'Here is
some %1$s entry
with multiple lines';</pre>
<p>
	should become</p>
<pre class="brush:php;">
$L['multiline_example'] = "Here is\nsome %1\$s entry\nwith multiple lines";</pre>
<h3>
	Arrays of options</h3>
<p>
	You might also come across a few cases when values for some configuration option are localized like this:</p>
<pre class="brush:php;">
$L['cfg_array_params'] = array(
	'Foo',
	'Bar'
);</pre>
<p>
	or like this:</p>
<pre class="brush:php;">
$L['cfg_array2_params'] = array(
	'foo' =&gt; 'Foo',
	'bar' =&gt; 'Bar'
);</pre>
<p>
	They should become just a simple string too. So arrays are glued with ',' and associative arrays are glued this way: 'key1: value1, key2: value2'. So above examples become</p>
<pre class="brush:php;">
$L['cfg_array_params'] = 'Foo, Bar';</pre>
<p>
	and</p>
<pre class="brush:php;">
$L['cfg_array2_params'] = 'foo: Foo, bar: Bar';</pre>
<h2>
	Loading an existing locale to Transifex</h2>
<p>
	Before uploading files for a new locale, make sure this locale is already registered and listed with Cotonti project on Transifex. If it's not, log into Transifex and <a href="https://www.transifex.com/projects/p/cotonti/languages/add/" rel="nofollow">request adding a new language to Cotonti</a>. We will accept your request and create a new locale shortly.</p>
<p>
	There's a tool in the <a href="https://github.com/trustmaster/cotlang" rel="nofollow">cotlang</a> set called 'cotlangcp.py' which simplifies copying language files here and there a lot. It copies just the language files and keeps the directory structure. You can use it to copy all language files from one folder to another:</p>
<pre class="brush:bash;">
python cotlangcp.py path/to/source path/to/destination</pre>
<p>
	or you can even tell it to copy only language files for a specific locale, e.g. 'nl':</p>
<pre class="brush:bash;">
python cotlangcp.py path/to/source path/to/destination -l nl</pre>
<p>
	So, if you have an existing localization e.g. for the 'nl' locale in path '~/htdocs/cotonti' and you want to copy it to '~/cot-lang' repo, you can do it using cotlangcp.py this way:</p>
<pre class="brush:bash;">
python cotlangcp.py ~/htdocs/cotonti ~/cot-lang -l nl</pre>
<p>
	Now that you have copied new translation files, you can add and push them to the Transifex server:</p>
<pre class="brush:bash;">
tx push -t -l nl</pre>
<p>
	Replace 'nl' in the above examples with your locale code.</p>
<p>
	At this point your locale should be already on server and you should see it filled in <a href="https://www.transifex.com/projects/p/cotonti/" rel="nofollow">https://www.transifex.com/projects/p/cotonti/</a>.</p>
<h2>
	Updating locale files</h2>
<p>
	Language files get updated from times to times. There may be new strings to be translated and some strings may be removed if they are not needed anymore. With Transifex you can monitor all these changes online and find strings to be translated. The online editing is pretty self-explaining and it has some advanced tools like Translation Memory and Automatic Translation via Google. But you might also want to keep your local copy of all locales up2date and use your favorite editor to translate files. No problem, let's use command line tools for it.</p>
<p>
	It is always good to pull fresh files from server before doing any changes:</p>
<pre class="brush:bash;">
tx pull</pre>
<p>
	To pull everything, including new files, run this instead:</p>
<pre class="brush:bash;">
tx pull -a</pre>
<p>
	Then you can edit files directly in the current source tree. Or you can copy updated files for your locale from other location, e.g.:</p>
<pre class="brush:bash;">
python cotlangcp.py ~/htdocs/cotonti ~/cot-lang -l nl</pre>
<p>
	This command copies 'nl' locale files from ~/htdocs/cotonti folder to ~/cot-lang folder, assuming that ~/cot-lang is your Transifex repo copy and ~/htdocs/cotonti is where you keep the latest langfiles for 'nl' locale.</p>
<p>
	And vice versa, you can copy the latest files from the Transifex repo to your Cotonti site using the same cotlangcp.py tool:</p>
<pre class="brush:bash;">
python cotlangcp.py ~/cot-lang ~/htdocs/cotonti -l nl</pre>
<p>
	When you are done with translating a portion of files in the Transifex repo copy, you can push your changes to the server:</p>
<pre class="brush:bash;">
tx push -t -l nl</pre>
<p>
	Replace 'nl' with your locale code.</p>
<h2>
	Tips and tricks</h2>
<h4>
	Pull before you push</h4>
<p>
	This rule comes from git, but tx is not git so you need to be more careful. Normally you should do it in this order:</p>
<pre class="brush:bash;">
tx pull -a # get a fresh copy
cotlangcp.py # modify or copy updated files
tx push -t # push your updated translation</pre>
]]></description>
			<pubDate>Thu, 14 Mar 2013 11:22:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/docs/ext/lang/transifex]]></link>
		</item>
		<item>
			<title>Dutch (NL) Language Pack for Siena</title>
			<description><![CDATA[<p>
	<strong>Dutch (NL) Language Pack for Siena.</strong></p>
<p>
	This pack includes formal and informal versions of the Dutch language.<br />
	Formal Dutch is used on more professional business type websites.</p>
<p>
	<strong>Installation:</strong> Copy &amp; paste all the content from either the 'informal' or  'formal' folder in to your Cotonti root folder.</p>
<hr /><p>
	<strong>Nederlands (NL) Taalpakket voor Siena.</strong></p>
<p>
	Dit pakket is inclusief formele en informele versies van de Nederlandse taal.<br />
	Formeel Nederlands wordt gebruikt voor professionele en zakelijke websites.</p>
<p>
	<strong>Installatie:</strong> Kopieër &amp; plak de volledige inhoud van de 'informal' of 'formal' folder in je Cotonti root folder.</p>
]]></description>
			<pubDate>Thu, 07 Mar 2013 09:04:45 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/locales/449]]></link>
		</item>
		<item>
			<title>Blogster</title>
			<description><![CDATA[<h2>
	Blogster</h2>
<p>
	A responsive theme for Cotonti Siena, built with Twitter Bootstrap.</p>
<h2>
	Installation</h2>
<ol><li>
		Place the folder 'blogster' in your Cotonti themes folder.</li>
	<li>
		Enable the theme by setting: $cfg['defaulttheme'] = 'blogster'; in datas/config.php.</li>
</ol><h2>
	GitHub</h2>
<p>
	The Blogster theme can be found on GitHub: <a href="https://github.com/Twiebie/cot-blogster" rel="nofollow">https://github.com/Twiebie/cot-blogster</a><br />
	Feel free to fork it.</p>
]]></description>
			<pubDate>Thu, 07 Feb 2013 20:28:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/themes/Blogster]]></link>
		</item>
		<item>
			<title>Html5 Boilerplate</title>
			<description><![CDATA[<p>
	This is completely blank(as I could make it) theme for cotonti. It is a barebones theme with html5 boilerplate built in. Based on html5 it is up with the latest standard of html. This theme is meant to be a starting point for themes and is not to be used as is on sites. Download it and customize to your hearts content. The themes menus are set in the menu slots from the admin panel.</p>
<p>
	 </p>
<p>
	Support is offered on the github page(<a href="https://github.com/milleja46/HTML5BPCotonti" rel="nofollow">here</a>). Report issues, feedback, and suggestions on the repository. Or even in the topic for the theme <a href="http://www.cotonti.com/forums?m=posts&amp;q=7319">here</a>. Feel free to tell me what you think.</p>
]]></description>
			<pubDate>Mon, 04 Feb 2013 19:16:09 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/themes/594]]></link>
		</item>
		<item>
			<title>Barebones</title>
			<description><![CDATA[<h2>
	Barebones</h2>
<p>
	A completely barebones Bootstrap theme for Cotonti Siena for you to build on!</p>
<h2>
	Installation</h2>
<ol><li>
		Place the folder 'barebones' in your Cotonti themes folder.</li>
	<li>
		Enable the theme by setting: $cfg['defaulttheme'] = 'barebones'; in datas/config.php.</li>
</ol><h2>
	GitHub</h2>
<p>
	The barebones theme can be found on GitHub: <a href="https://github.com/Twiebie/cot-barebones" rel="nofollow">https://github.com/Twiebie/cot-barebones</a><br />
	Feel free to fork it.</p>
]]></description>
			<pubDate>Mon, 04 Feb 2013 12:03:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/themes/barebones]]></link>
		</item>
		<item>
			<title>Global variables reference</title>
			<description><![CDATA[<p>
	Most Cotonti scripts run in the global scope as it is historically built this way. Some variables are common enough to be seen in many places around the code. This article covers the most important globals.</p>
<blockquote>
	<p>
		<strong>Note</strong>: this guide comes handy for theme developers as well. You can use any of these global variables as global template tags as well. Just remember the CoTemplate syntax. E.g. $usr['profile']['user_avatar'] in a template becomes {PHP.usr.profile.user_avatar}.</p>
</blockquote>
<h2>
	Current user's profile</h2>
<p>
	$usr represents the current user and is the most popular global variable among the others.</p>
<p>
	You can distinct logged in users from guests by checking $usr['id']:</p>
<pre class="brush:php;">
if ($usr['id'] &gt; 0)
{
    // The user is logged in
}
else
{
    // It is a guest
}</pre>
<p>
	Here is the list of standard keys this array has:</p>
<ul><li>
		$usr['id'] - unique number of the user in the database;</li>
	<li>
		$usr['name'] - username (login) of the user;</li>
	<li>
		$usr['maingrp'] - identifier of the main group the user belongs to, grp_id value of the groups table;</li>
	<li>
		$usr['ip'] - current user's IP address;</li>
	<li>
		$usr['lang'] - user's language preference. Another global $lang is a shortcut for this;</li>
	<li>
		$usr['theme'] - user's theme preference;</li>
	<li>
		$usr['scheme'] - user's color scheme preference;</li>
	<li>
		$usr['timezone'] - user's timezone offset in hours;</li>
	<li>
		$usr['timezonename'] - the name of the user's timezone;</li>
	<li>
		$usr['lastvisit'] - a timestamp for the last user activity on site;</li>
	<li>
		$usr['lastlog'] - a timestamp for the last time user logged in;</li>
	<li>
		$usr['level'] - user's main group's level value;</li>
	<li>
		$usr['profile'] - an array providing access to all the fields in the users table, explained below.</li>
</ul><p>
	You can use $usr['profile'] to obtain raw values of user profile fields, including extra fields. It contains them prefixed with 'user_'. For instance, here are the standard ones:</p>
<ul><li>
		$usr['profile']['user_birthdate'] - user's birthdate in MySQL date format. You can display it using a combination of <a href="http://www.cotonti.com/reference/cotonti/package-functions.html#cot_date2stamp()">cot_date2stamp()</a> and <a href="http://www.cotonti.com/reference/cotonti/package-functions.html#cot_date()">cot_date()</a> functions;</li>
	<li>
		$usr['profile']['user_country'] - contains 2-char ISO country code of the user, if specified;</li>
	<li>
		$usr['profile']['user_email'] - user's email address;</li>
	<li>
		$usr['profile']['user_gender'] - one char for user's gender: 'M' for male, 'F' for female or 'U' for unknown;</li>
	<li>
		$usr['profile']['user_hideemail'] - true if the user prefers their email to stay private (default) or false if it can be displayed;</li>
	<li>
		$usr['profile']['user_logcount'] - the number of times a user has logged in;</li>
	<li>
		$usr['profile']['user_regdate'] - a timestamp for user registration date and time;</li>
	<li>
		$usr['profile']['user_text'] - user signature text.</li>
</ul><p>
	So if you added an extrafield to users table that is called "first_name", then it can be accessed as $usr['profile']['user_first_name'] in the $usr global.</p>
<h2>
	Current user's settings</h2>
<p>
	There are a few globals containing current values of per-user display settings for current request:</p>
<ul><li>
		$lang - current language code;</li>
	<li>
		$theme - current theme name;</li>
	<li>
		$scheme - current color scheme name.</li>
</ul><h2>
	Configuration variables</h2>
<p>
	All configuration variables are accessible via $cfg global. It has several levels of nesting:</p>
<ul><li>
		$cfg['<em>option_name</em>'] - one of the core settings;</li>
	<li>
		$cfg['<em>module_name</em>']['<em>option_name</em>'] - setting for a specific module;</li>
	<li>
		$cfg['plugin']['<em>plugin_name</em>']['<em>option_name</em>'] - plugin setting.</li>
</ul><h2>
	Extension environment</h2>
<p>
	The $env array contains information about current extension (module or plugin) being executed and status information of the request:</p>
<ul><li>
		$env['type'] - 'module' for modules or 'plug' for plugins;</li>
	<li>
		$env['ext'] - extension code, e.g. 'forums';</li>
	<li>
		$env['location'] - a string containing textual description of user's location on site, such as 'Home page';</li>
	<li>
		$env['status'] - HTTP rersponse status, e.g. '200 OK';</li>
</ul><h2>
	System variables</h2>
<p>
	There are temporary system variables that are used in several places and calculating them again and again would be a waste of resources.  Such variables may be contained in the global $sys array. Here are some of its common contents:</p>
<ul><li>
		$sys['now'] - an integer timestamp for the current time in UTC, same as calling time() function for UTC (Cotonti dates are stored in UTC and timezones are applied right before displaying them);</li>
	<li>
		$sys['site_id'] - some string unique for the site and used as its identifier (this data is public);</li>
	<li>
		$sys['parser'] - the code for the default parser plugin or the parser selected for the current data;</li>
	<li>
		$sys['xk'] - contains current value of CSRF protection token, used in forms;</li>
	<li>
		$sys['noindex'] - set this TRUE if current page should not be indexed by search engines;</li>
</ul><p>
	The following variables are related to runtime detection of current URL and its parts:</p>
<ul><li>
		$sys['scheme'] - URL scheme, like 'http' or 'https';</li>
	<li>
		$sys['secure'] - a flag which is TRUE for HTTPS protocol being used;</li>
	<li>
		$sys['host'] - full host part of the URL, e.g. 'my.example.com';</li>
	<li>
		$sys['domain'] - 2nd level domain of the URL, such as 'example.com';</li>
	<li>
		$sys['port'] - the port if other than 80, containing comma, e.g. ':8080';</li>
	<li>
		$sys['site_uri'] - relative path of the site root on server with trailing slash. E.g. if you run Cotonti in 'example.com/cotonti/' then this path will be '/cotonti/';</li>
	<li>
		$sys['abs_url'] - absolute URL to the site root, e.g. 'http://my.example.com/cotonti/'. This is normally same as $cfg['mainurl'] with a forward slash, but on sites using multiple subdomains this would be different from $cfg['mainurl'] if accessing from subdomain;</li>
	<li>
		$sys['canonical_url'] - is used to get and set the canonical URL for the current page (used in html head);</li>
	<li>
		$sys['uri_curr'] - contains the current request URI part of the URL, e.g. '/cotonti/foo?bar=baz';</li>
</ul><h2>
	Output variables</h2>
<p>
	These variables are used to make global tags to output them in multiple templates. They are collected in $out array. Here are some standard elements:</p>
<ul><li>
		$out['uri'] - the URI part of the current URL valid for HTML, e.g. '/index.php?foo=bar&amp;amp;boo=baz';</li>
	<li>
		$out['notices_array'] - user personal bar notifications array;</li>
	<li>
		$out['copyright'] - prints "Powered by Cotonti" link;</li>
	<li>
		$out['meta_contenttype'] - MIME type of the document, 'text/html' is default;</li>
	<li>
		$out['logstatus'] - displays user's login status as a string message;</li>
	<li>
		$out['userlist'] - displays the list of online users;</li>
	<li>
		$out['subtitle'] - sets the variable part of the head &lt;title&gt; tag. E.g. if you set it to 'Apples', the full title would look somewhat like 'Apples - Fruits - My Cool Garden Site';</li>
	<li>
		$out['meta_desc'] - sets meta description of the page;</li>
	<li>
		$out['meta_keywords'] - sets meta keywords of the page;</li>
	<li>
		$out['meta_lastmod'] - sets last modification date of the page;</li>
	<li>
		$out['adminpanel'] - displays the link to Administration panel for logged administrators;</li>
	<li>
		$out['loginout_url'] - a URL to log the current user out;</li>
	<li>
		$out['loginout'] - HTML link to log the current user out;</li>
	<li>
		$out['profile'] - HTML link to current user's profile settings;</li>
	<li>
		$out['guest_username'] - username form input for guests;</li>
	<li>
		$out['guest_password'] - user password input for guests;</li>
	<li>
		$out['guest_cookiettl'] - "remember me" checkbox for guests;</li>
	<li>
		$out['guest_register'] - a link to registration for guests;</li>
</ul><h2>
	Structure tree</h2>
<p>
	The entire tree of site's categories, managed in Administration / Structure, is accessed via $structure global. It has the signature:</p>
<pre class="brush:php;">
$structure['module_name']['category_code']</pre>
<p>
	Where <em>'module_name'</em> is the module code such as 'page' and <em>'category_code'</em> is the code of the category such as 'articles'. The returned element is an associative array containing the keys:</p>
<ul><li>
		'path' - the dot separated path of the codes from structure root, such as 'goods.electronics.blenders';</li>
	<li>
		'tpath' - a path consisting of category titles instead, e.g. 'Goods - Electronics - Blenders';</li>
	<li>
		'rpath' - raw path property of the category, e.g. 'goods.1.3';</li>
	<li>
		'id' - integer identifier;</li>
	<li>
		'title' - category title;</li>
	<li>
		'desc' - category description';</li>
	<li>
		'icon' - category icon path, if present;</li>
	<li>
		'locked' - whether category accepts adding new items;</li>
	<li>
		'count' - number of items contained.</li>
</ul><p>
	Structure extra fields are also accessible via $structure. For example, if you have added an extrafield with code 'specialty', then it is accessible as</p>
<pre class="brush:php;">
$structure['module_name']['category_code']['specialty']</pre>
<h2>
	Database and cache access</h2>
<p>
	There are two other rather important global variables:</p>
<ul><li>
		$db - an instance of <a href="http://www.cotonti.com/reference/cotonti/cotdb.html">CotDB</a> class used to query the database, see <a href="http://www.cotonti.com/reference/cotonti/cotdb.html">CotDB</a> class reference and <a href="http://www.php.net/manual/en/class.pdo.php" rel="nofollow">PDO</a> for more information;</li>
	<li>
		$cache - an instance of <a href="http://www.cotonti.com/reference/cotonti/cache.html">Cache</a> class, see <a href="http://www.cotonti.com/docs/devel/cache_guide">Cache API documentation</a> for more information.</li>
</ul><h2>
	Other global lists</h2>
<p>
	There are some other global collections good to be mentioned for extension developers:</p>
<pre class="brush:php;">
/**
 * Contains information about user groups, you'd better find yourself in system/common.php file
 */
$cot_groups = array();

/**
 * Registry for captcha functions
 */
$cot_captcha = array();

/**
 * Registry for hash functions
 */
$cot_hash_funcs = array('md5', 'sha1', 'sha256');

/**
 * Array of custom cot_import() filter callbacks
 */
$cot_import_filters = array();

/**
 * Custom e-mail send callbacks
 */
$cot_mail_senders = array();

/**
 * Custom parser functions registry
 */
$cot_parsers = array();

/**
 * Parameters to be automatically appended to all URLs if present
 */
$cot_url_appendix = array();</pre>
]]></description>
			<pubDate>Fri, 01 Feb 2013 20:27:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/docs/ext/extensions/global_vars]]></link>
		</item>
		<item>
			<title>Football League Tables</title>
			<description><![CDATA[<p>
	This plugin shows the popular football league rank table.</p>
<p>
	 </p>
<p>
	Demo: <a href="http://gokhan-yildiz.com/cot/index.php?e=leaguetables" rel="nofollow">http://gokhan-yildiz.com/cot/index.php?e=leaguetables</a></p>
]]></description>
			<pubDate>Fri, 04 Jan 2013 09:36:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/extensions/gaming-clans/football-league-tables]]></link>
		</item>
		<item>
			<title>HybridAuth</title>
			<description><![CDATA[<p>
	 </p>
<p>
	<a href="https://github.com/trustmaster/hybridauth.sourceforge.net" rel="nofollow">HybridAuth</a> is a self-hosted single sign on solution for PHP.</p>
<h2>
	Features</h2>
<ul><li>
		Quick login via social networks and services.</li>
	<li>
		Pre-filled fields on registration for new users.</li>
	<li>
		Linking multiple accounts to your profile: users will be able to login with social accounts after linking them to their profile on site.</li>
	<li>
		Auto-registration mode for sites which don't need standard registration and want to create accounts automatically from social networks.</li>
	<li>
		No extra JavaScripts and third-party requests on every page, this plugin has minimal footprint.</li>
</ul><p>
	See the list of supported auth providers <a href="http://hybridauth.sourceforge.net/userguide.html#index" rel="nofollow">here</a>.</p>
<h2>
	Demo</h2>
<p>
	The plugin is enabled on this site. If you are logged out, you can see social buttons in the "Sign-in" dropdown at the top of the page and on the <a href="http://www.cotonti.com/login">login page</a>. If you are logged in, you can link social accounts in <a href="http://www.cotonti.com/users?m=profile">your profile</a>.</p>
<h2>
	Requirements</h2>
<ul><li>
		Cotonti &gt;= 0.9.11</li>
	<li>
		PHP extensions: curl, json</li>
</ul><h2>
	Installation</h2>
<ol><li>
		Copy the plugin to your Cotonti plugins folder.</li>
	<li>
		Install it in Administration / Extensions.</li>
	<li>
		Edit plugins/hybridauth/conf/hybridauth.config.php according to <a href="http://hybridauth.sourceforge.net/userguide/Configuration.html" rel="nofollow">HybridAuth User Guide</a>.</li>
	<li>
		Go to Administration / Configuration / HybridAuth and click Update.</li>
	<li>
		Add <code>{PHP|hybridauth_login}</code> to your theme's login.tpl and <code>{PHP|hybridauth_accounts}</code> to your theme's users.profile.tpl. By default these widgets use templates called <em>hybridauth.login.tpl</em> and <em>hybridauth.accounts.tpl</em> accordingly, you can override them in your theme if you wish.</li>
</ol><h2>
	Configuration</h2>
<p>
	This single sign-on solution is self-hosted, so you don't depend on any middleware providers but you have to obtain API keys for each service yourself. The basics are covered in <a href="http://hybridauth.sourceforge.net/userguide.html#index" rel="nofollow">HybridAuth User Guide</a> and there are instructions for each provider in particular. For some providers you need to google how to register an app and get API keys yourself.</p>
<p>
	Every time you update <em>hybridauth.config.php</em> file you need to tell the plugin that there is a new provider available and it should create some database fields for it. To do so you should go to Administration / Configuration / HybridAuth and click Update. Configuration update forces hybridauth plugin to check for new providers and upgrade the database.</p>
<p>
	If you want to track user's real names in your database, it is recommended to add 2 extra fields to cot_users table in Administration / Other / Extra fields: firstname and lastname. They will be used to store names obtained from social profiles.</p>
<h2>
	Templates</h2>
<p>
	The plugin comes with two drop-in tags which help you to get going quickly: <code>{PHP|hybridauth_login}</code> and <code>{PHP|hybridauth_accounts}</code>. The first one renders large login buttons for your configured providers. The second one is used to link social accounts to user's profile.</p>
<p>
	You can customize those templates in your theme by copying <em>hybridauth.login.tpl</em> and <em>hybridauth.accounts.tpl</em> from plugin's tpl folder to your theme's plugins folder and editing them. You can also create more templates and pass them to these widgets as parameters, e.g. <code>{PHP|hybridauth_login('hybridauth.my_login')}</code> will use <em>hybridauth.my_login.tpl</em> as its template.</p>
<p>
	If you want to create direct login links for some providers, you can compose a URL this way:<code> {PHP|cot_url('plug', 'e=hybridauth&amp;a=login&amp;provider=Provider_name')}</code> where Provider_name is the name specified in hybridauth.config.php, such as Google or Facebook.</p>
<p>
	It is recommended to add a regular login form to your users.register.tpl for the following use-case: if the user has an account on your site and wants to log-in via provider but he has not linked the social account to his site account yet, then he needs to log in with his username and password and link the account in profile first.</p>
]]></description>
			<pubDate>Mon, 24 Dec 2012 20:29:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/extensions/security-authentication/hybridauth]]></link>
		</item>
		<item>
			<title>Interface Language Selector</title>
			<description><![CDATA[<p>
	<span class="short_text" lang="en" xml:lang="en"><span class="hps">To get the links</span> <span class="hps">to select the</span> <span class="hps">language</span></span> put this code anywhere in your theme files:<br />
	 </p>
<pre class="brush:php;">
{PHP|ilanguage('ru/Русский;en/English','selected_language_class')}</pre>
<p>
	Where selected_language_class is a name of selected language class to mark current language. You can leave it empty to use "current" value (it is default).</p>
<p>
	Use TPL file ilanguage.tpl to make your one design of language links.</p>
]]></description>
			<pubDate>Mon, 10 Dec 2012 21:47:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/extensions/customization-i18n/ilanguage]]></link>
		</item>
		<item>
			<title>Complete Clan Solution</title>
			<description><![CDATA[<p>
	This module is still in development so please test it and leave any feedback, fix or feature requests. <a href="https://github.com/lukgoh/ccm" rel="nofollow">https://github.com/lukgoh/ccm</a></p>
<p>
	Also see <a href="http://www.cotonti.com/forums?m=posts&amp;q=6825&amp;d=0">forum topic</a>. </p>
]]></description>
			<pubDate>Wed, 05 Dec 2012 14:57:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/extensions/gaming-clans/587]]></link>
		</item>
		<item>
			<title>0.9.12.1 follow-up</title>
			<description><![CDATA[<p>
	A critical bug was found in 0.9.12 package, so we're replacing it with 0.9.12.1 which contains a few other fixes, see <a href="https://github.com/Cotonti/Cotonti/issues?milestone=45&amp;state=closed" rel="nofollow">this report</a>.</p>
<p>
	Users who have already upgraded to 0.9.12, please download the new version and replace <a href="https://github.com/Cotonti/Cotonti/compare/cotonti-0.9.12...0.9.12.1" rel="nofollow">updated files</a>.</p>
<p>
	We are sorry about that. Please help us to improve Cotonti by submitting your bug reports to our <a href="https://github.com/Cotonti/Cotonti/issues" rel="nofollow">issues page</a>.</p>
]]></description>
			<pubDate>Tue, 04 Dec 2012 10:59:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/news/announce/siena_09121]]></link>
		</item>
		<item>
			<title>0.9.12 and 0.6.25</title>
			<description><![CDATA[<p>
	We have released 2 new packages to keep both your Siena and Genoa sites running smoothly.</p>
<p>
	Changes in Siena 0.9.12:</p>
<ul><li>
		<a href="https://github.com/Cotonti/Cotonti/issues/920#issuecomment-9576471" rel="nofollow">Page manipulation API</a> for extension developers.</li>
	<li>
		SEO: title and meta description for pages now editable out of the box.</li>
	<li>
		Forums: markers for topics where a user has posted (<a href="https://github.com/Cotonti/Cotonti/issues/978" rel="nofollow">#978</a>), timeout for post editing (<a href="https://github.com/Cotonti/Cotonti/issues/1025" rel="nofollow">#1025</a>).</li>
	<li>
		Added support for parsing and translation of name and notes of extensions. See <a href="https://github.com/Cotonti/Cotonti/issues/991" rel="nofollow">#991</a>.</li>
	<li>
		Added support for non-alphanumeric characters in passwords.</li>
	<li>
		CKEditor 3.6.5, markItUp! 1.1.13 and updated Star Ratings plugin</li>
	<li>
		<a href="https://github.com/Cotonti/Cotonti/issues/1095" rel="nofollow">Extended</a> SQL devmode with backtrace.</li>
	<li>
		Lots of small enhancements.</li>
	<li>
		38 bug fixes including some rather important ones.</li>
</ul><p>
	Changes in Genoa 0.6.25:</p>
<ul><li>
		Fixed changing passwords in profile.</li>
	<li>
		Added experimental support for IPv6.</li>
</ul>]]></description>
			<pubDate>Mon, 03 Dec 2012 14:06:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/news/announce/updates_dec_2012]]></link>
		</item>
		<item>
			<title>Cotonti Siena 0.9.12.1</title>
			<description><![CDATA[<h2>What's new in Siena 0.9.12.1</h2>

<ul><li><a href="https://github.com/Cotonti/Cotonti/issues/920#issuecomment-9576471" rel="nofollow">Page manipulation API</a> for extension developers.</li>
	<li>SEO: title and meta description for pages now editable out of the box.</li>
	<li>Forums: markers for topics where a user has posted (<a href="https://github.com/Cotonti/Cotonti/issues/978" rel="nofollow">#978</a>), timeout for post editing (<a href="https://github.com/Cotonti/Cotonti/issues/1025" rel="nofollow">#1025</a>).</li>
	<li>Added support for parsing and translation of name and notes of extensions. See <a href="https://github.com/Cotonti/Cotonti/issues/991" rel="nofollow">#991</a>.</li>
	<li>Added support for non-alphanumeric characters in passwords.</li>
	<li>CKEditor 3.6.5, markItUp! 1.1.13 and updated Star Ratings plugin</li>
	<li><a href="https://github.com/Cotonti/Cotonti/issues/1095" rel="nofollow">Extended</a> SQL devmode with backtrace.</li>
	<li>Lots of small enhancements.</li>
	<li>42 bug fixes including some rather important ones.</li>
</ul><p>For more details please see <a href="https://github.com/Cotonti/Cotonti/issues?milestone=42&amp;state=closed" rel="nofollow">this report</a> and <a href="https://github.com/Cotonti/Cotonti/issues?milestone=45&amp;state=closed" rel="nofollow">this one</a>.</p>

<p>See the list of new TPL tags <a href="http://www.cotonti.com/tpltags?version=0.9.12">here</a>.</p>

<h2>Update from 0.9.11</h2>

<p>See updating instructions <a href="http://www.cotonti.com/docs/start/updating">here</a>.</p>

<p>For the list of files updated from 0.9.11 please see <a href="https://github.com/Cotonti/Cotonti/compare/cotonti-0.9.11...0.9.12.1" rel="nofollow">this diff</a> and click "Files Changed".</p>
]]></description>
			<pubDate>Sun, 02 Dec 2012 18:24:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/download/siena_0912]]></link>
		</item>
		<item>
			<title>Cotonti Genoa 0.6.25</title>
			<description><![CDATA[<p>
	 </p>
<h2>
	Package contents</h2>
<ul><li>
		Basic CMF</li>
	<li>
		Standard modules: Admin, Forums, Lists and Pages, PFS, Plug, Private Messages, Polls, RSS, Users</li>
	<li>
		Standard plugins: Admin QuickView, Chili Highlighter, Cleaner, Comments Edit, Forums Stats, Index Polls, IPSearch, markItUp! editor, MassMoveTopics, News, Password Recovery, Recent Items, Search, Seditio Compatibility, Statistics, Tags, Who's Online</li>
	<li>
		Localizations: English, Russian</li>
</ul><h2>
	System Requirements</h2>
<ul><li>
		Webserver (we tested on Apache and Nginx).</li>
	<li>
		MySQL &gt;= 4.1</li>
	<li>
		<strong>PHP &gt;= 5.1</strong></li>
	<li>
		PHP extensions: gd, hash, mbstring, mysql, pcre, session</li>
</ul><h2>
	What's new in 0.6.25</h2>
<ul><li>
		Fixed changing passwords in profile.</li>
	<li>
		Added experimental support for IPv6.</li>
</ul><h2>
	Installation</h2>
<p>
	Just follow the INSTALL.txt instructions included in the package.</p>
<h3>
	Updating from 0.6.24</h3>
<ol><li>
		Replace these files with updated files: see <a href="https://github.com/Cotonti/Cotonti/compare/cotonti-0.6.24...cotonti-0.6.25" rel="nofollow">this diff page</a>.</li>
</ol><h3>
	See also:</h3>
<ul><li>
		<a href="http://www.cotonti.com/docs/en/admin/install_guide">Installation Guide</a></li>
	<li>
		<a href="http://www.cotonti.com/locales/">Other language packs</a></li>
	<li>
		<a href="https://github.com/Cotonti/Cotonti/tree/cotonti-0.6.25" rel="nofollow">Source code</a></li>
</ul>]]></description>
			<pubDate>Sun, 02 Dec 2012 18:05:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/download/genoa_0625]]></link>
		</item>
		<item>
			<title>Slots and Tags</title>
			<description><![CDATA[<h1>
		Slots and Tags</h1>
	<p>
		Plugin for Cotonti CMF. It allow to use tpl TAGs and function calls in menuslots.</p>
	<h2>
		Description</h2>
	<p>
		Cotonti have a predefined custom tags that admin can use in templates. Content of these tags called «menu slots» can be altered via administration web interface. As a default, menu slots allow to use only simple html text. With this extension you can use common TPL tags and function calls like in TPL files.</p>
	<p>
		<a href="https://a248.e.akamai.net/camo.github.com/2e5044603a747f116089f3b6ff276400b26de7d5/687474703a2f2f6d6163696b2e6769746875622e636f6d2f636f742d736c6f74735f6e5f746167732f696d616765732f74616773696e736c6f747330312e706e67" rel="nofollow"><img alt="Slots_n_tags screenshot" src="https://a248.e.akamai.net/camo.github.com/2e5044603a747f116089f3b6ff276400b26de7d5/687474703a2f2f6d6163696b2e6769746875622e636f6d2f636f742d736c6f74735f6e5f746167732f696d616765732f74616773696e736c6f747330312e706e67" /></a><a href="https://a248.e.akamai.net/camo.github.com/336c1fff77ca5906b40c542c364aa1611db48ba1/687474703a2f2f6d6163696b2e6769746875622e636f6d2f636f742d736c6f74735f6e5f746167732f696d616765732f74616773696e736c6f747330322e706e67" rel="nofollow"><img alt="Slots_n_tags screenshot" src="https://a248.e.akamai.net/camo.github.com/336c1fff77ca5906b40c542c364aa1611db48ba1/687474703a2f2f6d6163696b2e6769746875622e636f6d2f636f742d736c6f74735f6e5f746167732f696d616765732f74616773696e736c6f747330322e706e67" /></a></p>
	<h2>
		Features</h2>
	<ul><li>
			Parses text of menu slot as a tpl file</li>
		<li>
			Allow to use tags and Unified input field for time selections</li>
		<li>
			Allow to use function calls</li>
	</ul><h2>
		Requirements</h2>
	<p>
		Works starting from <code>Cotonti Siena v0.9.11</code>.</p>
	<h2>
		Version info</h2>
	<p>
		Plugin must works out from the box. But as it relies on <code>CoTemplate-&gt;compile()</code> function it worsk <strong>only from Cotonti v0.9.11</strong>. Some of lang file strings or resource strings may be undefined in menuslots if they init after <code>global</code> hook.</p>
	<h3>
		How extension works</h3>
	<p>
		Runs on <code>global</code> hook. And parses all menu slots with <code>CoTemplate-&gt;compile()</code>.</p>
	<h2>
		Install</h2>
	<ul><li>
			Unpack, copy files to plugins folder of your site.</li>
		<li>
			Install via Admin → Extensions menu (<code>Administration panel → Extensions</code>)</li>
	</ul><h2>
		References</h2>
	<ul><li>
			<a href="http://macik.github.com/cot-slots_n_tags/" rel="nofollow">«Slots and Tags»</a> -- Page on GitHub</li>
	</ul>]]></description>
			<pubDate>Sun, 02 Dec 2012 10:18:21 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/extensions/customization-i18n/slots_n_tags]]></link>
		</item>
		<item>
			<title>Comlist</title>
			<description><![CDATA[<p>
	Comlist Plugin shows commented pages, polls etc.</p>
<p>
	You can use it to generate last commented pages/polls/etc. list, most commented pages/polls/etc. list and so on.</p>
<p>
	As a Pagelist Plugin, Comlist is available via {PHP|comlist} callback from TPL file with <span class="short_text" lang="en" xml:lang="en"><span class="hps">the following settings:</span></span></p>
<p>
	$tpl - Template code (TPL file name without ".php" at the end)<br />
	$items - Number of items to show. 0 - all items<br />
	$order - Sorting order (SQL)<br />
	$condition - Custom selection filter (SQL)<br />
	$area - Custom comments areas list semicolon separated (both pages and polls by default)<br />
	$bwlist_cat - White and black lists of page categories. Mark categories with + or - to include them to the white or black list and separate with semicolon symbol. (+white_cat_1;...;+white_cat_N;-black_cat_1;...;-black_cat_Y;) O<span class="short_text" lang="en" xml:lang="en"><span class="hps">rder does not matter</span></span>.<br />
	$sub - Include subcategories in to the black and white lists of pages categorys TRUE/FALSE<br />
	$pagination - Pagination parameter name for the URL, e.g. 'pcm'. Make sure it does not conflict with other paginations. Leave it empty to turn off pagination</p>
<p>
	return string Parsed HTML</p>
<p>
	<span class="short_text" lang="en" xml:lang="en"><span class="hps">Examples</span></span>:</p>
<pre class="brush:java;">
{PHP|comlist('comlist', '10', 'com_maxdate DESC', '', 'page;polls', '', 'true')}</pre>
<p>
	shows 10 last commented pages and polls in all pages categorys without pagination</p>
<pre class="brush:java;">
{PHP|comlist('comlist', '5', 'com_maxdate DESC', '', 'page', '+news;-sport', 'TRUE', 'pcl')}</pre>
<p>
	shows 5 last commented pages in 'news' categorys without pages in 'news/sport' category with pagination</p>
<pre class="brush:java;">
{PHP|comlist('comlist', '5', 'com_count DESC', '', '', '', 'TRUE', 'pcl')}</pre>
<p>
	shows 5 most commented resources (pages,polls, etc.) in all availible areas with pagination</p>
<pre class="brush:java;">
{PHP|comlist('comlist', '5', 'com_count DESC', '', '', '+articles', 'FALSE')}</pre>
<p>
	shows 5 most commented pages of the root articles category without pagination</p>
<p>
	You can turn on/turn off caching and caching for <span class="short_text" lang="en" xml:lang="en"><span class="hps">authorized </span></span>users in administration panel.</p>
<p>
	Cache is <span class="short_text" lang="en" xml:lang="en"><span class="hps">sensitive to</span></span> TPL code, location, <span class="short_text" lang="en" xml:lang="en"><span class="hps">language and page number.</span></span></p>
]]></description>
			<pubDate>Thu, 22 Nov 2012 18:31:37 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/extensions/navigation-structure/581]]></link>
		</item>
		<item>
			<title>Attachments 2</title>
			<description><![CDATA[<p>
	With this plugin you can attach files and images to any Cotonti objects including pages, forum posts and organize them into galleries or downloads.</p>
<h2>
	Features</h2>
<ul><li>
		Modern upload dialog based on <a href="http://blueimp.github.com/jQuery-File-Upload/" rel="nofollow">jQuery File Upload</a>.</li>
	<li>
		Multi-upload support.</li>
	<li>
		Easy integration via TPL callbacks.</li>
	<li>
		Built-in gallery based on <a href="http://lokeshdhakar.com/projects/lightbox2/" rel="nofollow">Lightbox 2</a>.</li>
	<li>
		File downloads are counted and provided with original file names.</li>
	<li>
		Configurable on-the-fly thumbnail generation.</li>
	<li>
		Special BBcodes to paste images into content regardless of parser.</li>
</ul><h2>
	Installation</h2>
<ol><li>
		Download the plugin and extract "attach2" folder into your Cotonti plugins folder.</li>
	<li>
		Go to Administration / Extensions and install the Attachments plugin.</li>
	<li>
		Enter plugin Configuration and set the proper defaults there.</li>
	<li>
		Create the "Directory for files" on your host (by default it is "datas/attach") and make it writable for PHP (e.g. CHMOD 775 or CHMOD 777).</li>
</ol><h2>
	Basic usage</h2>
<p>
	This section covers plugin usage basics with Pages module and minimal customizations involved. Similar actions can be applied to other content such as Forums, Comments, etc.</p>
<p>
	All examples are given for the basic theme, feel free to customize them for your needs.</p>
<h3>
	Adding the attachment dialog</h3>
<p>
	First we need to be able to attach files to pages. You would expect to do it while editing the page itself, but in this plugin it can be done while browsing the page. So let's add an "Attach files" button to the page management menu in "<em>page.tpl"</em>:</p>
<p>
	<img alt="Link to attachment management" src="http://www.cotonti.com/datas/users/att2-link_5.jpg" style="width:541px;height:187px;" /></p>
<p>
	It can be done by adding following code in your <em>"page.tpl"</em>:</p>
<pre class="brush:xml;">
&lt;!-- IF {PHP|cot_auth('plug', 'attach2', 'W')} --&gt;
&lt;li&gt;{PAGE_ID|att_widget('page',$this,'attach2.link')}&lt;/li&gt;
&lt;!-- ENDIF --&gt;</pre>
<p>
	The link will only be displayed to users who have permission to attach files (controlled by Write access to Attachments plugin).</p>
<h3>
	Using the attachment dialog</h3>
<p>
	If you click the "Attach files" link, it opens attachment dialog:</p>
<p>
	<a href="http://www.cotonti.com/datas/users/att2-widget_5.jpg"><img alt="Attachment dialog" src="http://www.cotonti.com/datas/users/att2-widget-thumb_5.jpg" style="width:580px;height:386px;" /></a></p>
<p>
	The dialog is pretty straightforward. It lets you add one or several files at once, upload them, remove existing attachments, replace files and edit descriptions via AJAX. Drag &amp; Drop rows to reorder them. Once you're done with changes, click the "Close" button and it will refresh the page to show you results.</p>
<h3>
	Displaying all files at once</h3>
<p>
	The quickest way to display all files attached to a page is by using att_display() widget in <em>"page.tpl"</em>:</p>
<pre class="brush:xml;">
&lt;!-- IF {PAGE_ID|att_count('page',$this)} &gt; 0 --&gt;
&lt;div class="block"&gt;
	&lt;h3&gt;{PHP.L.att_attachments}&lt;/h3&gt;
	{PAGE_ID|att_display('page',$this)}
&lt;/div&gt;
&lt;!-- ENDIF --&gt;</pre>
<p>
	It renders to something like this:</p>
<p>
	<img alt="Attachments display all example" src="http://www.cotonti.com/datas/users/att2-display_5.jpg" style="width:659px;height:273px;" /></p>
<h3>
	Adding a simple gallery</h3>
<p>
	One of the most common tasks you'd like to complete is turning a page into an image gallery. You can add a simple gallery to <em>"page.tpl"</em> by pasting this code:</p>
<pre class="brush:xml;">
&lt;!-- IF {PAGE_ID|att_count('page',$this,'images')} &gt; 0 --&gt;
&lt;div class="block"&gt;
	&lt;h3&gt;{PHP.L.att_gallery}&lt;/h3&gt;
	{PAGE_ID|att_gallery('page',$this)}
&lt;/div&gt;
&lt;!-- ENDIF --&gt;</pre>
<p>
	It embeds a <a href="http://lokeshdhakar.com/projects/lightbox2/" rel="nofollow">Lightbox 2</a> gallery into a page:</p>
<p>
	<img alt="Attachments 2 gallery example" src="http://www.cotonti.com/datas/users/att2-gallery_5.jpg" style="width:571px;height:493px;" /></p>
<h3>
	Adding downloadable files block</h3>
<p>
	Another common task is providing multiple files for downloading on a page. Use att_downloads() widget to embed it in <em>"page.tpl"</em>:</p>
<pre class="brush:xml;">
&lt;!-- IF {PAGE_ID|att_count('page',$this,'files')} &gt; 0 --&gt;
&lt;div class="block"&gt;
	&lt;h3&gt;{PHP.L.att_downloads}&lt;/h3&gt;
	{PAGE_ID|att_downloads('page',$this)}
&lt;/div&gt;
&lt;!-- ENDIF --&gt;</pre>
<p>
	A typical downloads block renders like this:</p>
<p>
	<img alt="Attachments 2 downloads block example" src="http://www.cotonti.com/datas/users/att2-downloads_5.jpg" style="width:409px;height:170px;" /></p>
<h2>
	Advanced usage</h2>
<p>
	Pasting basic widgets into pages is easy. But what if you need something custom or if you are curious about how they work? This section has the answers.</p>
<h3>
	TPL callbacks and parameters</h3>
<p>
	Attachments are not limited to just pages and the standard templates. You can easily attach files to other content and customize templates. Let's have a look at TPL callbacks this plugin provides and parameters they have.</p>
<h4>
	att_widget()</h4>
<pre class="brush:php;">
/**
 * Generates a file upload/edit widget.
 * Use it as CoTemplate callback.
 * @param  string  $area    Target module/plugin code.
 * @param  integer $item    Target item id.
 * @param  string  $tpl     Template code
 * @return string           Rendered widget
 */
function att_widget($area, $item, $tpl = 'attach2.widget', $width = '100%', $height = '200')</pre>
<p>
	This callback is used to add the attachments management dialog to the content object. In previous chapter we used it to add a "Attach files" link together with the dialog to pages by editing <em>page.tpl</em>. In fact this callback is more powerful, look at its parameters:</p>
<ul><li>
		$area - Defines the type of content the files are attached to. Usually conains module or plugin code, such as 'page', 'forums', 'comments', etc.</li>
	<li>
		$item - This parameter accepts an integer ID of the item the files are attached to. For example, it can be a page ID, forums post ID or comment ID. <a href="http://www.cotonti.com/docs/ext/themes/cotemplate_statements#ch2.2">CoTemplate pipe operator</a> and "<em>$this</em>" keyword are used to pass the appropriate tag to this parameter.</li>
	<li>
		$tpl - Contains template code for the widget to be rendered. E.g. if you pass it <em>'attach2.my_widget'</em>, it will try to find the template in <em>"themes/your_theme/plugins/attach2.my_widget.tpl"</em>. Default (fallback) templates can be found in <em>"plugins/attach2/tpl"</em>, use them as reference. <em>'attach2.widget'</em> inserts the dialog as an iframe, whereas <em>'attach2.link'</em> (see previous chapter) adds a link + popup dialog.</li>
	<li>
		$width - Width of the iframe, optional.</li>
	<li>
		$height - Height of the iframe, optional. </li>
</ul><p>
	For example, here is how you can add "Attach files" link for forum posts in <em>"forums.posts.tpl"</em> inside the <em>FORUMS_POSTS_ROW</em> block:</p>
<pre class="brush:xml;">
&lt;!-- IF {FORUMS_POSTS_ROW_USERID} == {PHP.usr.id} --&gt;
{FORUMS_POSTS_ROW_ID|att_widget('forums',$this,'attach2.link')}
&lt;!-- ENDIF --&gt;</pre>
<h4>
	att_display()</h4>
<pre class="brush:php;">
/**
 * Renders attached items on page
 * @param  string  $area Target module/plugin code
 * @param  integer $item Target item id
 * @param  string  $tpl  Template code
 * @param  string  $type Attachment type filter: 'files', 'images'. By default includes all attachments.
 * @return string        Rendered output
 */
function att_display($area, $item, $tpl = 'attach2.display', $type = 'all')</pre>
<p>
	This callback is used to display files already attached to an item. It can render them all within one stream or include a certain type of files only. The paramters are similar with other callbacks:</p>
<ul><li>
		$area - Site area, same as for att_widget().</li>
	<li>
		$item - Item ID, same as for att_widget().</li>
	<li>
		$tpl - Template code, similar to att_widget(). The standard one for this widget is called 'attach2.display' and can be found in <em>"plugins/attach2/tpl/attach2.display.tpl"</em>.</li>
	<li>
		$type - Use this parameter to display images only or files only.</li>
</ul><p>
	Here is how you can display all files attached to a forums post in <em>"forums.posts.tpl"</em> inside the <em>FORUMS_POSTS_ROW</em> block:</p>
<pre class="brush:xml;">
{FORUMS_POSTS_ROW_ID|att_display('forums',$this)}</pre>
<h4>
	att_count()</h4>
<pre class="brush:php;">
/**
 * Returns number of attachments for a specific item.
 * @param  string  $area Target module/plugin code
 * @param  integer $item Target item id
 * @param  string  $type Attachment type filter: 'files', 'images'. By default includes all attachments.
 * @return integer       Number of attachments
 */
function att_count($area, $item, $type = 'all')</pre>
<p>
	This callback returns the number of files attached to an item but it is often used to check whether there are files attached or not. Parameters are common:</p>
<ul><li>
		$area - Site area, same as for att_widget().</li>
	<li>
		$item - Item ID, same as for att_widget().</li>
	<li>
		$type - Use this parameter to count images only or files only.</li>
</ul><p>
	Here is how you can use it to display attachments in "forums.posts.tpl" only if there are files attached:</p>
<pre class="brush:xml;">
&lt;!-- IF {FORUMS_POSTS_ROW_ID|att_count('forums',$this)} &gt; 0 --&gt;
{FORUMS_POSTS_ROW_ID|att_display('forums',$this)}
&lt;!-- ENDIF --&gt;</pre>
<h4>
	att_gallery()</h4>
<pre class="brush:php;">
/**
 * Renders images only as a gallery.
 * @param  string  $area Target module/plugin code
 * @param  integer $item Target item id
 * @param  string  $tpl  Template code
 * @return string        Rendered output
 */
function att_gallery($area, $item, $tpl = 'attach2.gallery')</pre>
<p>
	This is a shortcut to att_display() using 'attach2.gallery' as $tpl by default and $type set to 'images'. By default it shows you how to make a simple gallery using Lightbox 2, but you can make your own template and use any gallery script you wish. Parameters:</p>
<ul><li>
		$area - Site area, same as for att_widget().</li>
	<li>
		$item - Item ID, same as for att_widget().</li>
	<li>
		$tpl - Template code, see att_widget() for description.</li>
</ul><p>
	E.g. let's imagine we've made our own template located in "themes/your_theme/plugins/attach2.fancy-gallery.tpl". Here's how we attach it to <em>LIST_ROW</em> block in <em>"page.list.tpl"</em>:</p>
<pre class="brush:xml;">
{LIST_ROW_ID|att_gallery('page',$this,'attach2.fancy-gallery')}</pre>
<h4>
	att_downloads()</h4>
<pre class="brush:php;">
/**
 * Renders files only as downloads block.
 * @param  string  $area Target module/plugin code
 * @param  integer $item Target item id
 * @param  string  $tpl  Template code
 * @return string        Rendered output
 */
function att_downloads($area, $item, $tpl = 'attach2.downloads')</pre>
<p>
	Similarly to att_gallery(), this is a shortcut to att_display() using 'attach2.downloads' as $tpl by default and $type set to 'files'. It is normally used to provide downloadable files section. Parameters:</p>
<ul><li>
		$area - Site area, same as for att_widget().</li>
	<li>
		$item - Item ID, same as for att_widget().</li>
	<li>
		$tpl - Template code, see att_widget() for description.</li>
</ul><p>
	E.g. let's imagine we've made our own template located in "themes/your_theme/plugins/attach2.download-box.tpl". Here's how we attach it to a page in <em>"page.tpl"</em>:</p>
<pre class="brush:xml;">
{PAGE_ID|att_downloads('page',$this,'attach2.download-box')}</pre>
<h4>
	att_thumb()</h4>
<div>
	/**</div>
<div>
	 * Returns attachment thumbnail path. Generates the thumbnail first if</div>
<div>
	 * it does not exist.</div>
<div>
	 * @param  mixed   $id     Attachment ID or a row returned by att_get() function.</div>
<div>
	 * @param  integer $width  Thumbnail width in pixels</div>
<div>
	 * @param  integer $height Thumbnail height in pixels</div>
<div>
	 * @param  string  $frame  Framing mode: 'width', 'height', 'auto' or 'crop'</div>
<div>
	 * @return string          Thumbnail path on success or false on error</div>
<div>
	 */</div>
<p>
	function att_thumb($id, $width = 0, $height = 0, $frame = '')</p>
<p>
	This callback is mostly used in attach2 templates themselves. It generates a thumbnail for an image attachment and returns an URL to that thumbnail. The parameters are:</p>
<ul><li>
		$id - Attachment ID.</li>
	<li>
		$width - Max. thumbnail width in pixels.</li>
	<li>
		$height - Max. thumbnail height in pixels.</li>
	<li>
		$frame - Framing mode. 'width' fits to the width and saves image ratio, 'height' fits to the height and saves image ratio. 'auto' (default) keeps the original ratio and fits the image into the given rectangle, 'crop' crops the image into the exact width/height given.</li>
</ul><p>
	Thumbnails are generated on the fly and cached for futher use. Here is an example call from attach2.gallery.tpl:</p>
<pre class="brush:xml;">
&lt;img src="http://www.cotonti.com/{ATTACH_ROW_ID|att_thumb($this,200,200,'crop')}" alt="{ATTACH_ROW_FILENAME}" /&gt;</pre>
<h4>
	att_get()</h4>
<pre class="brush:php;">
/**
 * Fetches a single attachment object for a given item.
 * @param  string  $area   Target module/plugin code.
 * @param  integer $item   Target item id.
 * @param  string  $column Empty string to return full row, one of the following to return a single value: 'id', 'user', 'path', 'filename', 'ext', 'img', 'size', 'title', 'count'
 * @param  string  $number Attachment number within item, or one of these values: 'first', 'rand' or 'last'. Defines which image is selected.
 * @return mixed           Scalar column value, entire row as array or NULL if no attachments found.
 */
function att_get($area, $item, $column = '', $mode = 'first')</pre>
<p>
	This function is used to get data for a single attachment per item. Its main purpose is to create page covers in category lists. Parameters are:</p>
<ul><li>
		$area - Site area, same as for att_widget().</li>
	<li>
		$item - Item ID, same as for att_widget().</li>
	<li>
		$column - Name of the column to be returned by the function. If empty, the function returns an array with a row from the database. If one of the specified values is passed, the scalar column value is returned.</li>
	<li>
		$number - Affects the ordering. By default the first attachment is returned. You can change it to last with 'last' or to a random one with 'random'. You can also specify exact number of the attachment for the item, e.g. $number == 3 fetches the third image.</li>
</ul><p>
	Here is an example of how this function can be used to turn a first attachment per page into clickable page cover thumbnails in <em>"page.list.tpl"</em>:</p>
<pre class="brush:xml;">
&lt;a href="http://www.cotonti.com/{LIST_ROW_ID|att_get('page',$this,'path')}" title="{LIST_ROW_ID|att_get('page',$this,'title')}"&gt;
    &lt;img src="http://www.cotonti.com/{LIST_ROW_ID|att_get('page',$this)|att_thumb($this,240,160)}" alt="Foobar" /&gt;
&lt;/a&gt;</pre>
<p>
	As you see, this function can be used in conjunction with att_thumb() to generate thumbnails on the fly. The minimal Cotonti version for this feature to work is 0.9.12.</p>
<h3>
	BBcodes for embedding into content</h3>
<p>
	Images and thumbnails of the attachments can be pasted directly into content such as page_text, com_text, etc. However, you need to get the Attachment ID somehow first in order to paste it. The syntax of bbcode parameters is similar to URL query string. Available bbcodes are:</p>
<ul><li>
		[att_thumb] - inserts only a thumbnail &lt;img/&gt; tag.</li>
	<li>
		[att_image] - inserts a clickable image conisting of an &lt;img/&gt; thumbnail and a hyperlink to a full image.</li>
</ul><p>
	Usage example:</p>
<pre class="brush:plain;">
[att_thumb?id=15]
[att_image?id=11&amp;width=320&amp;height=240&amp;alt=Picture description&amp;class=foo]</pre>
<p>
	These bbcodes work regardless of the parser being used, including HTML and Markdown. If you want to disable them, just Pause the attach2.parser part of this plugin in Administration / Extensions / Attachments.</p>
<h3>
	Cleanup tool</h3>
<p>
	There's a tool in Administration / Other / Attachments. It is used to purge files attached to items which don't exist anymore. Sometimes items are removed but the code removing linked attachmehts is missing, so this tool may help.</p>
<h2>
	Contact</h2>
<p>
	Please use the <a href="http://www.cotonti.com/forums?m=topics&amp;s=3">Extensions forum</a> to discuss plugin features and <a href="https://github.com/trustmaster/cot-attach2/issues" rel="nofollow">GitHub tracker</a> to submit bug reports.</p>
<h2>
	Credits</h2>
<ul><li>
		Attachments 1.0 sponsored and tested by <a href="http://www.skuola.net/" rel="nofollow">Skuola.net</a>.</li>
	<li>
		Attachments 2.0 sponsored and tested by <a href="http://www.seditio.by/" rel="nofollow">Seditio.by</a>.</li>
	<li>
		<a href="http://blueimp.github.com/jQuery-File-Upload/" rel="nofollow">jQuery File Upload</a> by <a href="https://blueimp.net/" rel="nofollow">Sebastian Tschan</a>.</li>
	<li>
		<a href="http://lokeshdhakar.com/projects/lightbox2/" rel="nofollow">Lightbox 2</a> by <a href="http://lokeshdhakar.com/" rel="nofollow">Lokesh Dhakar</a> and <a href="http://www.dragonzap.szunyi.com/" rel="nofollow">Dragonzap</a>.</li>
</ul>]]></description>
			<pubDate>Sun, 28 Oct 2012 09:02:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/extensions/files-media/attach2]]></link>
		</item>
		<item>
			<title>Steam</title>
			<description><![CDATA[<p>
	 </p>
<p>
	This module displays in-game achievements of your Cotonti website users utilizing <a href="http://api.steampowered.com/" rel="nofollow">Steam API</a> and <a href="http://steamcommunity.com/" rel="nofollow">SteamCommunity</a>.</p>
<h2>
	Features</h2>
<ul><li>
		Global game achievement stats for all users of your site.</li>
	<li>
		Multiple games support.</li>
	<li>
		Automatic synchronization with Steam.</li>
	<li>
		Global, weekly, recents stats display.</li>
	<li>
		Top board among your users.</li>
	<li>
		Steam achievements box for user profile.</li>
</ul><h2>
	Demo</h2>
<p>
	<a href="http://www.cotonti.com/datas/users/steam_scrn_5.png" title="Steam module screenshot"><img alt="Steam module screenshot" src="http://www.cotonti.com/datas/thumbs/steam_scrn_5.png" /></a></p>
<p>
	See the module in action on <a href="http://www.fmscout.com/index.php?e=steam" rel="nofollow">FM Scout</a>.</p>
<h2>
	Installation</h2>
<ol><li>
		Copy steam module into your Cotonti modules folder.</li>
	<li>
		Install the module in Administration / Extensions.</li>
	<li>
		Proceed to configuration.</li>
</ol><h2>
	Configuration</h2>
<ol><li>
		Obtain your own <a href="http://steamcommunity.com/dev/apikey" rel="nofollow">Steam API Key</a> and specify it in the module configuration.</li>
	<li>
		Collect Steam appIDs for your games from <a href="http://steamcommunity.com/apps" rel="nofollow">SteamCommunity</a>, e.g. if the game URL looks like<code>http://steamcommunity.com/app/71270</code> then appID for the game is '71270'.</li>
	<li>
		Collect SteamCommunity shortcuts for your games by visiting Global Achievements for those games, e.g. if the achievements URL looks like <code>http://steamcommunity.com/stats/FM2012/achievements/</code> then SteamCommunityName for the game is 'FM2012'.</li>
	<li>
		Go to module configuration in Administration / Extensions / Steam and fill collected information in game configuration. Don't forget to specify default appID.</li>
</ol><p>
	Every time you change configuration and add/remove games, Steam module synchronizes its database with SteamCommunity and obtains properties and descriptions for those games.</p>
<h2>
	Usage</h2>
<p>
	This module installs a new extrafield for user profiles: SteamID. Add {USERS_PROFILE_STEAMID} it to your 'users.profile.tpl' file.</p>
<p>
	A user needs to specify his SteamID in profile for the module to start tracking their achievements. SteamID can be either a 64-bit SteamID (a big integer number) or a name part of Steam vanityURL. For example if your SteamCommmunity Profile URL looks like<code>http://steamcommunity.com/profiles/12345678901234567/</code> then your SteamID is '12345678901234567'. If your SteamCommmunity Profile URL looks like <code>http://steamcommunity.com/id/coolguy</code> then your SteamID (vanityURL) is 'coolguy'.</p>
<p>
	Once a user has specified his SteamID, the module starts synchronizing their achievements every time he comes back to the site from absence.</p>
<p>
	Add {USERS_DETAILS_STEAMBOX} tag to 'users.details.tpl' file to display user achievements on their public profile page.</p>
<p>
	The global stats URL is something like <a href="http://example.com/steam/" rel="nofollow">http://example.com/steam/</a> or <a href="http://example.com/index.php?e=steam" rel="nofollow">http://example.com/index.php?e=steam</a> depending on your site's URL settings.</p>
<h2>
	Customization</h2>
<p>
	You can easily customize Steam module templates. In order to do so, copy files from 'modules/steam/tpl' folder to 'themes/your_theme/modules' folder and edit them there.</p>
<h2>
	Credits</h2>
<ul><li>
		This module uses <a href="https://github.com/MattRyder/SteamAPI" rel="nofollow">PHP SteamAPI</a> by Matt Ryder.</li>
	<li>
		This module was sponsored and tested by <a href="http://www.fmscout.com/" rel="nofollow">FM Scout</a> community.</li>
</ul><p>
	 </p>
]]></description>
			<pubDate>Tue, 23 Oct 2012 13:58:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/extensions/gaming-clans/steam]]></link>
		</item>
		<item>
			<title>Social share</title>
			<description><![CDATA[<h1>
	Social share</h1>
<p>
	Plugin for Cotonti CMF. It adds «Share it» widget to pages of cite.</p>
<p>
	<a href="https://a248.e.akamai.net/camo.github.com/bc9596d86019b2c8b21e26178907d82d039afb14/687474703a2f2f6d6163696b2e6769746875622e636f6d2f636f742d736f6369616c5f73686172652f696d616765732f736f6369616c5f73686172655f30302e706e67" rel="nofollow"><img alt="Social share widget screenshot" src="https://a248.e.akamai.net/camo.github.com/bc9596d86019b2c8b21e26178907d82d039afb14/687474703a2f2f6d6163696b2e6769746875622e636f6d2f636f742d736f6369616c5f73686172652f696d616765732f736f6369616c5f73686172655f30302e706e67" /></a></p>
<h2>
	Description</h2>
<p>
	Adds easy to use widget for social networks sharing to pages of your site. You can setup list of allowed services choosing from more than 20 social sites. Basicly all you need to enable it - is to install Extension. It will automatically adds widget to bottom of you pages and news. Also you can finetune placement of widget with manually adding <code>{SOCIAL_SHARE}</code> tag in tpl files.</p>
<h2>
	Features</h2>
<ul><li>
		Easy «one-click-install» (for basic use you don't need adding TPL tags)</li>
	<li>
		Highly configurable (widget style and list of services)</li>
	<li>
		I18n for widget based on users profile</li>
	<li>
		No external dependencies (working without jQuery use)</li>
	<li>
		Allowed to insert in any block of site with <code>{PHP.social_share}</code> tag</li>
</ul><h2>
	Requirements</h2>
<p>
	Developed for Cotonti Siena (0.9.x branch). Worked with/or without jQuery enabled.</p>
<h2>
	Demo page</h2>
<p>
	Comming soon…</p>
<p>
	<a href="https://a248.e.akamai.net/camo.github.com/493f5606f8fea8c0434a2285b0f3e03cee56d001/687474703a2f2f6d6163696b2e6769746875622e636f6d2f636f742d736f6369616c5f73686172652f696d616765732f736f6369616c5f73686172655f30315f74626e2e706e67" rel="nofollow"><img alt="Social share widget screenshot 2" src="https://a248.e.akamai.net/camo.github.com/493f5606f8fea8c0434a2285b0f3e03cee56d001/687474703a2f2f6d6163696b2e6769746875622e636f6d2f636f742d736f6369616c5f73686172652f696d616765732f736f6369616c5f73686172655f30315f74626e2e706e67" /></a><a href="https://a248.e.akamai.net/camo.github.com/80b098356f84c4156f4b4889c3b440ab4b46df9f/687474703a2f2f6d6163696b2e6769746875622e636f6d2f636f742d736f6369616c5f73686172652f696d616765732f736f6369616c5f73686172655f30325f74626e2e706e67" rel="nofollow"><img alt="Social share widget screenshot 3" src="https://a248.e.akamai.net/camo.github.com/80b098356f84c4156f4b4889c3b440ab4b46df9f/687474703a2f2f6d6163696b2e6769746875622e636f6d2f636f742d736f6369616c5f73686172652f696d616765732f736f6369616c5f73686172655f30325f74626e2e706e67" /></a></p>
<h2>
	Version info</h2>
<p>
	Current version 1.3 tested with:</p>
<ul><li>
		<a href="http://www.cotonti.com">Cotonti</a> Siena. Versions on 0.9.5 - 0.9.11 (actual).</li>
	<li>
		Skins: <code>HTML Kickstart</code>, <code>Nemesis</code></li>
	<li>
		Admin skins: <code>standard</code>, <code>bootstrap</code>, <code>priori</code></li>
</ul><h3>
	How extension works</h3>
<p>
	Simply generates widget code based on your Extension settings (widget style and services list). Then auto insert widget code in bottom of pages or place specified with own tag in TPL files.</p>
<h2>
	Install</h2>
<ul><li>
		Unpack, copy files to root folder of your site.</li>
	<li>
		Install via Admin → Extensions menu (<code>Administration panel → Extensions</code>)</li>
</ul><h3>
	Comments</h3>
<p>
	After install you must see widget block on bottom of articles and news pages (accordingly you had <code>page</code> and <code>news</code> modules installed). You can choose used services, language and widget style in Extension config menu (<code>Administration panel → Extensions → Social share → Configuration</code>).</p>
<p>
	If you want to change location of widget switch off «autoinsertion» mode in Extension config menu and manually add tag <code>{SOCIAL_SHARE}</code> in one of the templates:</p>
<ul><li>
		<code>index.tpl</code></li>
	<li>
		<code>news.tpl</code></li>
	<li>
		<code>page.tpl</code></li>
	<li>
		<code>page.list.tpl</code></li>
	<li>
		<code>forum.posts.tpl</code></li>
</ul><p>
	If you suppose to insert widget in other templates — use <code>{PHP.social_share}</code> tag. If you want to change default <code>url</code>, <code>title</code> or <code>description</code> of sharing page — use funciton style tag <code>{PHP|social_share('url','title','tag')}</code>.</p>
<h2>
	References</h2>
<ul><li>
		<a href="http://macik.github.com/cot-social_share/index_ru.html" rel="nofollow">-- Source on GitHub</a></li>
</ul>]]></description>
			<pubDate>Sat, 20 Oct 2012 19:15:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/extensions/community-social/social_share]]></link>
		</item>
		<item>
			<title>Pagelist</title>
			<description><![CDATA[<h2>
	Description</h2>
<p>
	The Pagelist plugin is a universal solution that may be used to build widgets, virtual page lists and navigation. The plugin enables you to complete the following tasks:</p>
<ul><li>
		Output news feed without parent folder limitations with customized pagination, sorting and element (page) selection conditions.</li>
	<li>
		Build widgets of the following types: “Recent Additions”, “Top Pages”, “Random Pages” etc with customizable sorting and element selection conditions.</li>
	<li>
		Build navigation elements and any types of widgets based on the Page module.</li>
	<li>
		Add comments tags (optional).</li>
</ul><p>
	The Pagelist plugin is essentially the pagelist function and is used via callbacks:</p>
<pre class="brush:php;">
function pagelist(
    $tpl = 'pagelist',
    $items = 20,
    $order = 'page_date DESC',
    $condition = '',
    $cat = '',
    $blacklist = '',
    $whitelist = '',
    $sub = true,
    $pagination = 'pld',
    $noself = false
)</pre>
<p>
	The callback parameters are as follows:</p>
<ol><li>
		$tpl – template code (without extension, i.e. pagelist.recentitems)</li>
	<li>
		$items – numberof elements to display (optional, i.e. 5)</li>
	<li>
		$order – sorting order (optional, i.e. page_date DESC)</li>
	<li>
		$condition –query condition (optional, i.e. page_some-extrafield = “1”)</li>
	<li>
		$cat- parent folder (optional, i.e. blog)</li>
	<li>
		$blacklist – categoryblacklist (optional, separated with semicolon, i.e. system;some-cat)</li>
	<li>
		$whitelist – category whitelist (optional, separated with semicolon, i.e., hot;podcasts)</li>
	<li>
		$sub – include subcategories (optiomal, i.e. true)</li>
	<li>
		$pagination – pagination parameter name (optional, i.e. pld – make sure names do not conflict!)</li>
	<li>
		$noself – exclude current page from list (optional, i.e. true)</li>
</ol><h2>
	Examples</h2>
<p>
	The plugin uses the pagelist function to build own template in the specified placeholder. Due to this feature it enables website developer to build such blocks as blog feeds, recent items / top items widgets etc.</p>
<p>
	Build blog feed – selec t pages from all categories except system and archives, sort by date ASC and build pagination with 8 elements per page:</p>
<p>
	<code class="xml plain">{PHP|pagelist('pagelist.blog','8','page_date DESC','','','system;archives','','TRUE')}</code></p>
<p>
	Build “Top-3” widget – 3 pages with non-zero hits sorted by hits DESC except pages from the system category:</p>
<p>
	<code class="xml plain">{PHP|pagelist('pagelist.top','3','page_count DESC','page_count != "0"','','system','','')}</code></p>
<p>
	Build “About us” widget – 1 page with about alias from the system category:</p>
<p>
	<code class="xml plain">{PHP|pagelist('pagelist.about','','','page_alias = "about"','system','','','')}</code></p>
<h2>
	Template Structure</h2>
<p>
	The model template has the following format:</p>
<pre class="brush:xml;">
&lt;!-- BEGIN: MAIN --&gt;
    &lt;ul&gt;
&lt;!-- BEGIN: PAGE_ROW --&gt;
        &lt;li&gt;&lt;a href="http://www.cotonti.com/{PAGE_ROW_URL}"&gt;{PAGE_ROW_TITLE}&lt;/a&gt;&lt;/li&gt;
&lt;!-- END: PAGE_ROW --&gt;
    &lt;/ul&gt;
 
&lt;!-- IF {PAGE_TOP_PAGINATION} --&gt;
    &lt;div class="pagination"&gt;
        {PAGE_TOP_PAGEPREV} {PAGE_TOP_PAGINATION} {PAGE_TOP_PAGENEXT}
    &lt;/div&gt;
&lt;!-- ENDIF --&gt;
 
&lt;!-- END: MAIN --&gt;</pre>
<p>
	The PAGE_ROW_ regular block is used to output elements generated with the cot_generate_pagetags() function prefixed with PAGE_ROW_.</p>
<p>
	The following additional tags are available:</p>
<ul><li>
		{PAGE_ROW_NUM} (element number)</li>
	<li>
		{PAGE_ROW_ODDEVEN} (odd/even)</li>
	<li>
		{PAGE_ROW_RAW} (raw data from the db in the {PAGE_ROW_RAW.page_alias} format)</li>
</ul><p>
	Once Comments plugin linkage is enabled in the config the following tags become available: PAGE_ROW_COMMENTS and PAGE_ROW_COMMENTS_COUNT.</p>
<p>
	Feel free to discuss the plugin at our forums: <a href="http://www.cotonti.com/forums?m=posts&amp;q=7221">Pagelist Plugin</a></p>
]]></description>
			<pubDate>Tue, 16 Oct 2012 12:41:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/extensions/navigation-structure/pagelist]]></link>
		</item>
		<item>
			<title>LazyLoad</title>
			<description><![CDATA[<h1>
	LazyLoad</h1>
<p>
	Plugin for Cotonti CMF. Designed for implement images «lazy loading».</p>
<h2>
	Description</h2>
<p>
	Extends pages with «lazy loading» functionality. It speeds up loading of page with a lot of images. With this Extension images on the page are loading only when they appears on screen. So it is not loaded until you scroll page for certain image had visible.</p>
<h2>
	Features</h2>
<ul><li>
		Delays loading of images outside a viewport</li>
	<li>
		Pages containing many images loads faster</li>
	<li>
		Two different library for your choice</li>
	<li>
		Control what images to make «lazy»</li>
	<li>
		Works in browsers with JS switched off</li>
	<li>
		Sample page included</li>
</ul><h2>
	Demo page</h2>
<p>
	Sample page included in Extension pack. Just install and open plugin page (<a href="http://www.yoursite.com/lazyload/" rel="nofollow">http://www.yoursite.com/lazyload/</a>). View demo page without installation you can <a href="http://www.cotonti.com/demo.html">here</a>.</p>
<h3>
	Comments</h3>
<p>
	Plugin works out from the box. For better results you may setup <code>height</code> and <code>width</code> attributes for you images. In that case content structure won't be rearranges during «lazy» load.</p>
<h3>
	How extension works</h3>
<p>
	Extension parses page content for <code>img</code> tags checks <code>src</code> attribute and substitute it with dump (transparent) image. When page loads script processes that <code>img</code> tags to check is it visible at this moment or not. As image become visible it loads as standard one.</p>
<h2>
	Install</h2>
<ul><li>
		Unpack, copy files to root folder of your site.</li>
	<li>
		Install via Admin → Extensions menu (<code>Administration panel → Extensions</code>)</li>
	<li>
		Checks setting in config (<code>Administration panel → Extensions → LazyLoad → Configuration</code>).</li>
</ul><h3>
	Comments</h3>
<p>
	To see this Extension in action - open «LazyLoad» plugin page. There you can see sample page with multiple «lazyload» images.</p>
<h2>
	References</h2>
<ul><li>
		<a href="https://github.com/macik/cot-lazyload" rel="nofollow">LazyLoad sources</a> -- Actual code on GitHub</li>
</ul>]]></description>
			<pubDate>Mon, 08 Oct 2012 04:09:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/extensions/performance-seo/lazyload]]></link>
		</item>
		<item>
			<title>Multiselect in plugin config (for developers)</title>
			<description><![CDATA[<h1>
	ExtDev_multiselect</h1>
<p>
	Plugin for Cotonti CMF. Designed as helper for Cotonti Extension (plugin) developers.</p>
<h2>
	Description</h2>
<p>
	Extends standard controls types for plugin configuration screen. There are no multiselect type control that can be used in Cotonti plugin configuration parameters. This extension (ExtDev_multiselect) extends standard input fields with additional functionality to select multiple values at once.</p>
<p>
	With this extension there are three new types of multiselect control.</p>
<p>
	<img alt="extdev_en_2012-09-28_04-05_461.png" src="http://www.cotonti.com/datas/users/extdev_en_2012-09-28_04-05_461.png" /></p>
<h2>
	Features</h2>
<ul><li>
		Extending plugin configuration UI controls</li>
	<li>
		Three new types of multiselect control</li>
	<li>
		May be used as «supplementary» plugin without modification of current plugin code</li>
	<li>
		May be used as code snippet in your own plugins</li>
	<li>
		Easy to implement your own controls</li>
	<li>
		I18n</li>
</ul><h2>
	Demo page</h2>
<p>
	Just install and switch to plugin configuration page.</p>
<h3>
	Comments</h3>
<p>
	Plugin works out from the box. You can see new controls on plugin configuration page.</p>
<h3>
	How extension works</h3>
<p>
	Hooks only on Extension's own configuration page (switch to <code>global</code> mode for tracking all Extensions in system). And preprocess plugin parameters to create multiselect controls on Extension config page.</p>
<p>
	There are added three new types of controls with multiple selection:</p>
<ul><li>
		<code>simplelist</code> - shows as usual text input field that allowed to select items and presents it as comma separated list.</li>
	<li>
		<code>multiselect</code> - shows as common selectbox element with multiple selection support</li>
	<li>
		<code>checkboxlist</code> - presented as list of checkboxes.</li>
</ul><p>
	To enable new stye controls you must add specially named parameter of type text to your plugin setup file - <code>plugname.setup.php</code> (see <code>extdev_multiselect.setup.php</code> for examples).</p>
<p>
	Rules of naming config variable:</p>
<pre>
<code>`varname_type`, 
     where `varname` - variable name allowed 
           `type` - type of control: simplelist, multiselect, checkboxlist
</code></pre>
<p>
	So to make a multiselect field you can write this code: <code>VARNAME_multiselect=01:text:item1,item2,item3,item4,item5:item1,item3:«Multiselect» parameter</code></p>
<p>
	By default extension tracks controls only on own config (testing) page. If you want to enable multiselect controls in you plugin - enables <code>Global</code> mode.</p>
<h2>
	Install</h2>
<ul><li>
		Unpack, copy files to root folder of your site.</li>
	<li>
		Install via Admin → Extensions menu (<code>Administration panel → Extensions</code>)</li>
	<li>
		If you plan to use it as «supplementary» for your own plugins - select <code>global</code> mode in config (<code>Administration panel → Extensions → ExtDev_multiselect → Configuration</code>) and rename Config parameters in you plugin (see below).</li>
</ul><h3>
	Comments</h3>
<p>
	To use this Extension as helper for your own plug you must add (or rename existing ones) parameters of type text. See rules for naming in <code>How extension works</code> section.</p>
<h3>
	Compatibility</h3>
<p>
	Tested with Cotonti Siena 0.9.5 ­- 0.9.11</p>
<div>
	 </div>
<p>
	References</p>
<ul><li>
		<a href="http://Cotonti.com/" rel="nofollow">Cotonti.com</a> -- Home of Cotonti CMF</li>
</ul><h2>
	Actual code</h2>
<p>
	<a href="https://github.com/macik/cot-extdev_multiselect" rel="nofollow">https://github.com/macik/cot-extdev_multiselect</a></p>
<p>
	 </p>
]]></description>
			<pubDate>Fri, 28 Sep 2012 02:13:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/extensions/development-maintenance/extdev_multiselect]]></link>
		</item>
		<item>
			<title>UI_date/time</title>
			<description><![CDATA[<h1>
	UI_datetime</h1>
<p>
	(see the <a href="http://macik.github.com/cot_ui_datetime/demo.html" rel="nofollow">Demo page</a>)</p>
<p>
	Plugin for Cotonti CMF. It replaces common date/time selection controls with unified pretty style jQueryUI controls.</p>
<h2>
	Description</h2>
<p>
	Current date/time selection controls are presented as several separated dropdown select box. Separate for year, month, day for date and hour, minutes for time. The plugin hides this controls and bring to user unified one input field for date and one field for time respectively. In addition this fields supplied with easy-to-use dropdown UI controls to selec date/time in one-click.</p>
<h2>
	Features</h2>
<p>
	The following markups are supported. The dependencies listed are required if you wish to run the library.</p>
<ul><li>
		Unified input field for date selections</li>
	<li>
		Unified input field for time selections</li>
	<li>
		User friendly pop-up UI control attached for fast selection of date time</li>
	<li>
		I18n for datepicker control (date format, month and day of weeks names)</li>
	<li>
		Using jQueryUI library</li>
	<li>
		jQueryUI ThemeRoller ready</li>
	<li>
		By default working in add/edit page, edit users, user profile.</li>
	<li>
		Optional mode to track any date/time controls and replace with new one regardless opened page or extension</li>
</ul><h3>
	Comments</h3>
<p>
	Plugin must works out from the box. Tested on <code>Nemesis</code>, <code>HTML Kickstart</code>, <code>SymiSun-03</code> theme and must work on most common themes or extension that uses standard date/time controls that relies on <code>cot_selectbox_date</code> function and <code>$R['input_date*']</code> resource strings.</p>
<p>
	But if your use highly customized theme or your custom resource strings (<code>$R['input_date*']</code>) than extension may work uncorrectly.</p>
<h3>
	How extension works</h3>
<p>
	Old style controls simply hides with inline styles but still work as input fields for transfer parameters to server (while you save the data). New fancy style UI controls use jQuery UI library and dynamically added in pages in specially marked DIV containers.</p>
<p>
	Simply it maked by changing controls template in resource strings <code>$R['input_date']</code> and <code>$R['input_date_short']</code>.</p>
<p>
	The default <strong>ui_date/time</strong> template for <em>'short'</em> date is:</p>
<pre>
<code>&lt;div class="uidt_date"&gt;{$day} {$month} {$year}&lt;/div&gt;
&lt;div class="uidt_datetarget"&gt;&lt;/div&gt; 
</code></pre>
<p>
	(See <a href="https://github.com/macik/cot_ui_datetime/blob/master/plugins/ui_datetime/ui_datetime.rc.php" rel="nofollow"> <code>ui_datetime.rc.php</code></a> for details.)</p>
<p>
	Most part of magic happened after page loads. JS script searches for elements with <code>uidt_date</code> and <code>uidt_time</code> class then parse it and linked with new controls added in elements with <code>uidt_datetarget</code> and <code>uidt_timetarget</code> class respectively.</p>
<p>
	By default extension tracks controls only on these pages: add/edit page, edit users, user profile. You can switch on <code>global mode</code> in settings for trace all controls on all pages, but it's not recommened because will load extension files all the time.</p>
<h2>
	Install</h2>
<ul><li>
		Unpack, copy files to root folder of your site.</li>
	<li>
		Install via Admin → Extensions menu (<code>Administration panel → Extensions</code>)</li>
	<li>
		If you already use jQueryUI in your project than setup path for jQueryUI library in ui_datetime <a href="http://www.cotonti.com/www.example.com/admin/config?n=edit&amp;o=plug&amp;p=ui_datetime">settings</a> .</li>
</ul><h3>
	Comments</h3>
<p>
	After install you can see and test extension on Admin → Tools page (<code>Administration panel → Extensions → UI date/time picker → Administration</code>). You can Enable/Disable date and time controls separately via settings.</p>
<p>
	 </p>
<h3>
	Compatibility</h3>
<p>
	Tested with Cotonti Siena 0.9.5 ­- 0.9.11</p>
<div>
	Files</div>
<p>
	Actual version can be found on GitHub: <a href="https://github.com/macik/cot_ui_datetime" rel="nofollow">https://github.com/macik/cot_ui_datetime</a></p>
]]></description>
			<pubDate>Sun, 23 Sep 2012 08:44:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/extensions/customization-i18n/ui_datetime]]></link>
		</item>
		<item>
			<title>Building a Custom Site Quick Start</title>
			<description><![CDATA[<p>
	Installation for a particular website type, however, has some specifics that newbies and even experienced users do not know of or do not take into account. This small article describes Cotonti installation step-by-step and, hopefully, offers some valuable information for the Cotonti community.</p>
<h2>
	Step 1. Prepare Remote Host</h2>
<p>
	Hosting plans and tariffs differ, so here we give you a full freedom to:</p>
<ul><li>
		Setup the domain</li>
	<li>
		Create GIT or SVN repository</li>
</ul><h2>
	Step 2. Prepare Cotonti Package</h2>
<p>
	First download the package at <a href="http://cotonti.com/download/" rel="nofollow">http://cotonti.com/download/</a> and unpack it into the local folder of choice.</p>
<p>
	Now we proceed to the primary web engine configuration. Copy the contents of sef-urls.htaccess into the still empty .htaccess and add the www / non-www redirect:</p>
<pre class="brush:plain;">
RewriteCond %{HTTP_HOST} ^www.cotonti.by$ [NC]
RewriteRule ^(.*)$ http://cotonti.by/$1 [L,R=301]</pre>
<p>
	So as not to come back to .htaccess we add two more strings:</p>
<pre class="brush:plain;">
RewriteRule ^sitemap.xml?$  index.php?r=sitemap [QSA,NC,NE,L]
RewriteRule ^sitemap$  page.php?c=system&amp;al=sitemap [QSA,NC,NE,L]</pre>
<p>
	First one is required for the XML sitemap and the other one lets you create and use a system page with “sitemap” alias for a normal HTML sitemap.</p>
<p>
	The finalized .htaccess should look like this:</p>
<pre class="brush:plain;">
# Rewrite engine options
Options -Indexes
RewriteEngine On
 
# Server-relative path to Cotonti
# Replace it with your path if you run Cotonti in a subfolder
RewriteBase "/"
 
RewriteCond %{HTTP_HOST} ^www.cotonti.by$ [NC]
RewriteRule ^(.*)$ http://cotonti.by/$1 [L,R=301]
 
# Language selector
RewriteRule ^(en|ru|de|nl)/(.*) $2?l=$1 [QSA,NC,NE]
 
# Admin area and message are special scripts
RewriteRule ^admin/([a-z0-9]+) admin.php?m=$1 [QSA,NC,NE,L]
RewriteRule ^(admin|login|message)(/|\?|$) $1.php [QSA,NC,NE,L]
 
# System category has priority over /system folder
RewriteRule ^system/?$  index.php?rwr=system [QSA,NC,NE,L]
 
RewriteRule ^sitemap.xml?$  index.php?r=sitemap [QSA,NC,NE,L]
RewriteRule ^sitemap$  page.php?c=system&amp;al=sitemap [QSA,NC,NE,L]
 
# All the rest goes through standard rewrite gateway
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^?]+) index.php?rwr=$1 [QSA,NC,NE,L]</pre>
<p>
	One last thing left in the root folder is modification of robots.txt. We just add the <em>host</em> directive:</p>
<pre class="brush:plain;">
User-agent: *
Disallow: /datas
Disallow: /images
Disallow: /js
Disallow: /lang
Disallow: /lib
Disallow: /themes
Disallow: /system
Host: cotonti.by</pre>
<p>
	If you’re planning to use the URL Editor plugin and modify a preset, copy it into datas/urltrans.dat. This would save your settings from accidental overwriting during the website engine upgrade.</p>
<p>
	This is also a good time to alter URL modification settings. If, in instance, you prefer to have trailing slashes in category URLs, you should change</p>
<pre class="brush:plain;">
page	c=*	{cot_url_catpath()}</pre>
<p>
	to</p>
<pre class="brush:plain;">
page	c=*	{cot_url_catpath()}/</pre>
<p>
	This way category and page URLs would look different for search engines.</p>
<h2>
	Step 3. Prepare the Theme</h2>
<p>
	Since we’re going to build a new the theme from scratch, we should use Nemesis theme as a model. Once it has been copied into a “themename” folder, rename the following files:</p>
<ul><li>
		nemesis.php</li>
	<li>
		nemesis.en.lang.php</li>
	<li>
		nemesis.rc.php</li>
	<li>
		nemesis.ru.lang.php</li>
</ul><p>
	into</p>
<ul><li>
		themename.php</li>
	<li>
		themename.en.lang.php</li>
	<li>
		themename.rc.php</li>
	<li>
		themename.ru.lang.php</li>
</ul><p>
	In the themename.php change the theme name from Nemesis to whatever name you got for it. I would strongly recommend not skipping theme cloning step so as to save it from accidental overwriting during future upgrades.</p>
<h2>
	Step 4. Upload the Package</h2>
<p>
	This is simple – deploy the package in a preferable way: repository or FTP client.</p>
<h2>
	Step 5. Initial Setup</h2>
<p>
	Any attempt to open Cotonti-powered website with missing config.php starts Cotonti installer. All operations here are pretty much understandable and normally do not cause any problems. All you have to do is provide MySQL server address, database name, user and password.</p>
<p>
	Next comes extensions selection. The choice here depends on the website type and overall requirements, in each case the list would be different. Couple of things shall be kept in mind:</p>
<ul><li>
		Any module and plugin can be paused, uninstalled and reinstalled at any time.</li>
	<li>
		Third party extensions can be added to the list, installed, uninstalled and removed at any time.</li>
	<li>
		There exist dependencies according to which some extensions require other extensions to run. Cotonti tracks such dependencies and lets you know if a required module or plugin is missing or not installed.</li>
</ul><p>
	Last thing to do here is specify Superadmin login and password.</p>
<p>
	Once the installation routine is finished, there are three more operations to complete:</p>
<p>
	If GIT repository is used, exclusions specified in .gitignore shall be uploaded manually via FTP (i.e. urltrans.dat).</p>
<p>
	Caching should be disabled in config.php so that all changes at the development stage could be visualized immediately:</p>
<pre class="brush:plain;">
$cfg['cache'] = FALSE;			// Enable data caching
$cfg['cache_drv'] = '';			// Cache driver name to use on your server (if available)
								// Possible values: APC, eAccelerator, Memcache, Xcache
$cfg['xtpl_cache'] = FALSE;		// Enable XTemplate structure disk cache. Should be TRUE on production sites</pre>
<p>
	Delete Install.php until next update.</p>
<h2>
	The Summary</h2>
<p>
	We have prepared Cotonti Siena package for the development stage. The next actions would differ depending on the website type and requirements. I’ll describe those later in the coming tutorials.</p>
]]></description>
			<pubDate>Sat, 22 Sep 2012 08:35:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/docs/help/cotonti-quick-install-guide]]></link>
		</item>
		<item>
			<title>Battlefield 3 Server Status</title>
			<description><![CDATA[<p>
	This plugin displays information about your Battlefield 3 server.<br />
	The BF3 Server Status plugin will save the data in your website's cache to minimize traffic and maintain performance.</p>
<div>
	<h3>
		Features</h3>
	<ul><li>
			A basic index version and a standalone version with more information are included.</li>
		<li>
			Easy installation.</li>
		<li>
			Shows IP, port, current players, gamemode, current map, platform, preset, country, map rotation, server banner. </li>
		<li>
			Can be extended with more data by using the BF3Stats API.</li>
	</ul></div>
<h3>
	Installation</h3>
<ul><li>
		Download and extract the plugin to your Cotonti plugins folder.</li>
	<li>
		Install the plugin in the administration panel.</li>
	<li>
		Enter your BF3Stats server ID in the plugins' configuration.<br />
		Your server ID can be found by searching for your server on <a href="http://bf3stats.com/servers/all" rel="nofollow">BF3Stats</a>.</li>
	<li>
		To include the plugin on your index you can use the tag: {BF3S_INDEX}</li>
</ul>]]></description>
			<pubDate>Sun, 09 Sep 2012 02:51:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/extensions/gaming-clans/Battlefield%203%20Server%20Status]]></link>
		</item>
		<item>
			<title>Validation and Messages</title>
			<description><![CDATA[<h2>
	Input and validation</h2>
<p>
	As a PHP coder you might be used to $_GET, $_POST, $_COOKIE and such, but raw user input is not always good for your security and data integrity. That's why in Cotonti we import all data with <a href="http://www.cotonti.com/reference/cotonti/package-functions.html#cot_import()">cot_import()</a> function:</p>
<pre class="brush:php;">
function cot_import($name, $source, $filter, $maxlen = 0, $dieonerror = false, $buffer = false)</pre>
<p>
	Parameters explained:</p>
<ul><li>
		$name - the name of the input in the HTML form.</li>
	<li>
		$source - source type of the data. Possible values are:
		<ul><li>
				'G' or 'GET' - for GET parameters;</li>
			<li>
				'P or 'POST' - for POST data;</li>
			<li>
				'C' or 'COOKIE' - to import data from cookies;</li>
			<li>
				'R' or 'REQUEST' - to import from PHP's $_REQUEST;</li>
			<li>
				'D' or 'DIRECT' - used to filter data passed in the $name argument;</li>
			<li>
				'PUT' - to import data from HTTP PUT request (for REST services);</li>
			<li>
				'DELETE' - to import data from HTTP DELETE request (for REST);</li>
			<li>
				'PATCH' - to import data from HTTP PATCH request (for REST).</li>
		</ul></li>
	<li>
		$filter - filter name against which the data is validated. Supported filters:
		<ul><li>
				'ALP' - passes digits, latin alphabet characters, dashes and underscores, useful for identifiers;</li>
			<li>
				'ARR' - imports an unfiltered array, each array item needs further validation after this import;</li>
			<li>
				'BOL' - import for booleans and checkboxes, returns TRUE if the input is checked or positive, FALSE if it is unchecked or zero and NULL if the input was not present in the form which sent the data;</li>
			<li>
				'HTM' - passes any text and trims whitespace from the beginning and ending of it, HTML is passed by this filter;</li>
			<li>
				'INT' - passes integer values only, a PHP (int) is returned or NULL if validation fails;</li>
			<li>
				'NOC' - no check/encoding, passes everything as is;</li>
			<li>
				'NUM' - passes numeric values only, PHP (float) is returned or NULL if validation fails;</li>
			<li>
				'PSW' - special filter for passwords, removes quotes , &amp;, &lt;, &gt; from input and limits its length to 32 characters;</li>
			<li>
				'TXT' - filter accepting plain text except for HTML, in HTML some characters are replaced with HTML entities on import;</li>
		</ul></li>
	<li>
		$maxlen - limits max. lenght of the input, 0 means unlimited;</li>
	<li>
		$dieonerror - stop script execution with a fatal error if validation fails;</li>
	<li>
		$buffer - enables import buffer feature, used by Forms API.</li>
</ul><p>
	The returned value is either a value with a filter applied or NULL if validation failed and a user must enter another value instead. Here are some example calls:</p>
<pre class="brush:php;">
$title  = cot_import('title',  'P', 'TXT');
$code   = cot_import('code',   'P', 'ALP');
$count  = cot_import('count',  'P', 'INT');
$text   = cot_import('text',   'P', 'HTM');
$notify = cot_import('notify', 'P', 'BOL');</pre>
<p>
	After you have imported the values, you might want to check them against some value (first of all NULL which is returned if the input was not present or validation failed against the filter) and emit an error message.</p>
<p>
	In a verbose form you could do it like this:</p>
<pre class="brush:php;">
if (is_null($count))
{
	cot_error('Please enter a correct integer count', 'count');
}</pre>
<p>
	<a href="http://www.cotonti.com/reference/cotonti/package-functions.html#cot_error()">cot_error()</a> is a standard way to inform the system that something went wrong and to emit an error message that can be displayed later on. It has two parameters:</p>
<ul><li>
		$message - message text or language string code for the message to be displayed. E.g. if there is a language string $L['my_err_msg'] in connected language files, you can just pass 'my_err_msg' and localized message will be displayed to a user.</li>
	<li>
		$src - name of the input where wrong data was entered (optional), this is used to display the error message next to the input depending on template configuration.</li>
</ul><p>
	There is actually a shorter (and recommended) way to combine "if" and "cot_error()" call in case of error:</p>
<pre class="brush:php;">
cot_check(is_null($count), 'Please enter a correct integer count', 'count');</pre>
<p>
	<a href="http://www.cotonti.com/reference/cotonti/package-functions.html#cot_check()">cot_check()</a> function has parameters:</p>
<ul><li>
		$condition - a boolean expression which checks for an error, if it evaluates to TRUE, then the error will be triggered;</li>
	<li>
		$message - error message displayed if $condition is TRUE, same as in cot_error();</li>
	<li>
		$src - input name (optional) for the source of invalid data, same as in cot_error().</li>
</ul><p>
	You should check whether any errors have been found in the system before proceeding to action such as saving data in database using <a href="http://www.cotonti.com/reference/cotonti/package-functions.html#cot_error_found()">cot_error_found() </a>function:</p>
<pre class="brush:php;">
if (!cot_error_found())
{
	// OK, we can save our data here because validation passed
}</pre>
<p>
	This is it, now you know the basics of input validation in Cotonti.</p>
<h2>
	Emitting messages and using other functions</h2>
<p>
	Not all messages are error messages. You might as well inform the user that some operation ended successfully or warn him about something non-critical. Cotonti's messages API covers those cases too.</p>
<p>
	Here is the list of other Errors and Messages API functions:</p>
<ul><li>
		<a href="http://www.cotonti.com/reference/cotonti/package-functions.html#cot_check_messages()">cot_check_messages()</a> - mostly used by messages display function itself;</li>
	<li>
		<a href="http://www.cotonti.com/reference/cotonti/package-functions.html#cot_clear_messages()">cot_clear_messages()</a> - normally used by Cotonti itself too;</li>
	<li>
		<a href="http://www.cotonti.com/reference/cotonti/package-functions.html#cot_die()">cot_die()</a> - immediately terminates script execution if passed condition is true;</li>
	<li>
		<a href="http://www.cotonti.com/reference/cotonti/package-functions.html#cot_die_message()">cot_die_message()</a> - outputs a standard error page and custom message if necessary;</li>
	<li>
		<a href="http://www.cotonti.com/reference/cotonti/package-functions.html#cot_diefatal()">cot_diefatal()</a> - terminates script execution and prints not-so-fancy error page (normally for developers);</li>
	<li>
		<a href="http://www.cotonti.com/reference/cotonti/package-functions.html#cot_display_messages()">cot_display_messages()</a> - use this function to display messages in your template (see next chapter);</li>
	<li>
		<a href="http://www.cotonti.com/reference/cotonti/package-functions.html#cot_get_messages()">cot_get_message()</a> - returns an array of raw message strings, normally used by messages display function;</li>
	<li>
		<a href="http://www.cotonti.com/reference/cotonti/package-functions.html#cot_implode_messages()">cot_implode_messages()</a> - glues all messages into a single string;</li>
	<li>
		<a href="http://www.cotonti.com/reference/cotonti/package-functions.html#cot_message()">cot_message()</a> - emits a generic non-error message.</li>
</ul><p>
	Most of these functions are rather advanced and you will never have to use it in your modules or plugins. Let's have a look at the most common ones.</p>
<p>
	<a href="http://www.cotonti.com/reference/cotonti/package-functions.html#cot_message()">cot_message()</a> function is similar to cot_error() but it is more generic. Here is the list of its parameters:</p>
<ul><li>
		$text - message text or language string code;</li>
	<li>
		$class - type or CSS class of the message, common values are 'error', 'success', warning', 'ok';</li>
	<li>
		$src - source input name where the message was caused, used to display the message next to it in some configurations.</li>
</ul><p>
	Use this function to inform the user about operation status when handling forms and returning back to the normal page:</p>
<pre class="brush:php;">
cot_check($some_input != '', 'some_err_msg', 'some_input');
if (!cot_error_found())
{
	// OK
	// Save the data...
	// ...
	// Emit the message
	cot_message('New item added successfully');
	// Return to the interface
	cot_redirect(cot_url('mymod', 'm=edit'));
}</pre>
<p>
	Use cot_die() if something went wrong and you want to prevent further script execution:</p>
<pre class="brush:php;">
if ($something_really_wrong)
{
	// How did the user get here?
	cot_die();
}</pre>
<p>
	If that "something went wrong" is a standard situation that can be represented with a common HTTP error code and message, then use cot_die_message() function providing an error code:</p>
<pre class="brush:php;">
if ($page_not_found)
{
	// Print a standard 404 page with a correct HTTP code
	cot_die_message(404);
}</pre>
<p>
	You can also use cot_die_message() to handle non-standard errors and pass error page title and contents as 3rd and 4th arguments.</p>
<h2>
	Displaying messages</h2>
<p>
	Now you can validate data and emit messages but how do you display them? Normally you need to add just two lines to add errors and messages display to your module or plugin.</p>
<p>
	The first one is in your template, add a line that includes standard template for messages output:</p>
<pre class="brush:xml;">
{FILE "{PHP.cfg.themes_dir}/{PHP.cfg.defaulttheme}/warnings.tpl"}</pre>
<p>
	And the second one should be put in your PHP code somewhere before the MAIN is parsed, e.g.:</p>
<pre class="brush:php;">
cot_display_messages($t);</pre>
<p>
	The above example assumes that:</p>
<ul><li>
		$t is the current XTemplate object;</li>
	<li>
		You have put the line connecting the standard warnings.tpl template in the outer block called MAIN.</li>
</ul><p>
	This assumption may be incorrect, so here is the explanation of <a href="http://www.cotonti.com/reference/cotonti/package-functions.html#cot_display_messages()">cot_display_messages()</a> parameters:</p>
<ul><li>
		$tpl - XTemplate object where messages should be displayed;</li>
	<li>
		$block - full block name where messages template is included. For example, if you have put it in the RESULTS block contained within MAIN block, then the value of this argument should be 'MAIN.RESULTS'.</li>
</ul><h2>
	All together now</h2>
<p>
	Now that you know the pieces of the puzzle, here is a complete picture of a real application for you:</p>
<pre class="brush:php;">
// Connect language file with messages
require_once cot_langfile('mailout', 'plug');

if ($a == 'send' &amp;&amp; $_SERVER['REQUEST_METHOD'] == 'POST')
{
	// Handle form submission
	$subject = cot_import('subject', 'P', 'TXT');
	$limit   = cot_import('limit',   'P', 'INT');
	$content = cot_import('content', 'P', 'HTM');

	// Input validation
	cot_check(empty($subject), 'mailout_err_subject_empty', 'subject');
	cot_check(empty($content), 'mailout_err_content_empty', 'content');
	cot_check($limit &lt;= 0,     'mailout_err_invalid_limit', 'limit');

	if (!cot_error_found())
	{
		// Passed, save changes
		$sql_limit = $limit &gt; 0 ? "LIMIT $limit" : '';
		$res = $db-&gt;query("SELECT user_name, user_email FROM $db_users $sql_limit");
		$counter = 0;
		foreach ($res-&gt;fetchAll() as $row)
		{
			$to = '"' . addslashes($row['user_name']) . '" &lt;' . $row['user_email'] . '&gt;';
			cot_mail($to, $subject, $content, '', false, null, true);
			$counter++;
		}
		// Emit success message
		cot_message("$counter messages sent.");
	}

	// Redirect back to the original form and show messages there
	cot_redirect(cot_url('admin', 'm=other&amp;p=mailout', '', true));
}

// Display the user interface with the form
$t = new XTemplate(cot_tplfile('mailout.tools', 'plug'));

// Work with the template, assign tags and render blocks

// Don't forget to display the messages if they are present
cot_display_messages($t);</pre>
<p>
	 </p>
]]></description>
			<pubDate>Fri, 07 Sep 2012 16:14:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/docs/devel/validation_messages]]></link>
		</item>
		<item>
			<title>Adding inline pictures with popups using BBCodes / Pageavatar / Fancybox</title>
			<description><![CDATA[<p>
	Using HTML parser with elRTE / elFinder is cool. BBCodes, however, remain simple yet powerful tool that can be used not only to maintain full control over the text markup. It enables an easy way to embed pictures into the page main text (PAGE_TEXT). This is how you do it:</p>
<ol><li>
		Install Fancybox (<a href="http://www.cotonti.com/docs/help/fancybox_integration">see how</a>)</li>
	<li>
		Install Pagemavatar</li>
	<li>
		Configure picture upload:<br /><pre class="brush:php;">
somecat|datas/photos|s_-200-200-crop|0||</pre>
	</li>
	<li>
		Go for BBCodes list and add a new one name inline:<br /><pre class="brush:java;">
\[inline=(\d+),(\d+),(.+?),(.+?)\]
&lt;a href="http://www.cotonti.com/datas/photos/page_$1_$2.jpg" class="fancybox" title="$3"&gt;&lt;img src="http://www.cotonti.com/datas/photos/s_page_$1_$2.jpg" alt="$3" class="inline col$4" /&gt;&lt;/a&gt;</pre>
	</li>
	<li>
		Add / check styles for .colleft / .colright / .inline classes</li>
	<li>
		In the page text insert pictures using following tags:<br /><pre class="brush:java;">
[inline=23,1,This is alt text for the picture and title for the link,right]</pre>
		<p>
			Parameters: page ID (you can use pictures uploaded for other pages too), picture number, alt text, float direction (left or right)</p>
	</li>
</ol>]]></description>
			<pubDate>Thu, 23 Aug 2012 05:47:36 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/docs/help/use-bbcodes-and-fancybox-to-add-inline-pictures]]></link>
		</item>
		<item>
			<title>Turkish (TR) Language Pack for Cotonti Siena 0.9.11 (Beta)</title>
			<description><![CDATA[<p>
	 </p>
<p>
	This is the first version of Turkish (TR) language pack for Cotonti Siena 0.9.11 (Beta)<br /><br />
	Please contact me by PM if you have any suggestions or corrections of this translation.<br /><br />
	Installation:<br />
	1. Unpack cotonti-0.9.11-turkish-language-files_109.zip<br />
	2. Upload folders: plugins, modules and lang to your /www folder (or any folder where you've installed Cotonti)<br />
	3. Open datas/config.php<br />
	4. Find</p>
<div class="highlight">
	<pre class="php">
$cfg['defaultlang'] = 'en';</pre>
</div>
<p>
	5.Replace</p>
<div class="highlight">
	<pre class="php">
$cfg['defaultlang'] = 'tr';</pre>
</div>
<p>
	<br />
	Cotonti Siena 0.9.11 sürümü Türkçe dil dosyasını incelemektesiniz.<br /><br />
	Herhangi bir problem veya çeviri hatası ile karşılaşırsanız lütfen özel mesaj yolu ile bana ulaşınız.<br /><br />
	Kurulum:<br />
	1. İndirdiğiniz cotonti-0.9.11-turkish-language-files_109.zip adlı dosyayı sıkıştırılmış klasörden çıkarınız.<br />
	2. plugins, system ve lang klasörlerini olduğu gibi public_html veya www dizinine (ya da cotonti hangi dizinde kuruluysa) kopyalayınız.<br />
	3. datas/config.php dosyasını açın<br />
	4. Bul</p>
<div class="highlight">
	<pre class="php">
$cfg['defaultlang'] = 'en';</pre>
</div>
<p>
	5.Değiştir</p>
<div class="highlight">
	<pre class="php">
$cfg['defaultlang'] = 'tr';</pre>
</div>
<p>
	<strong>UYARI: </strong>Bu Türkçe dil dosyası Cotonti Siena 0.9.11 (Beta) sürümüne ait olup 0.6.X ve alt sürümlerini desteklememektedir. Cotonti'nin alt yapısının tamamiyle değişecek olması sebebiyle beta sürümü için dil dosyası hazırlanılmış olup, bir sonraki sürümler için yeni dil dosyaları bu dosyanın geliştirilmesiyle oluşturulacaktır. Eski sürümler için dil dosyasına ihtiyacı olanlar <a href="http://www.cotonti.com/locales/turkish-tr-language-pack-for-cotonti-065">http://www.cotonti.com/locales/turkish-tr-language-pack-for-cotonti-065</a> sayfasından 0.6.5 için hazırlamış olduğum dil dosyasını indirerek eksiklikleri tamamlayabilir.</p>
<p>
	Bu sürüm'ün <strong>(0.9.11) </strong>altındaki herhangi bir Cotonti versiyonu için Türkçe Dil çalışması yapmayacağımı bildirir, bu yönde bir talep yapmamanızı da rica ederim.</p>
<p>
	 </p>
<p>
	 </p>
]]></description>
			<pubDate>Mon, 13 Aug 2012 10:38:33 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/locales/cotonti-siena-0-9-11-turkish-language-files]]></link>
		</item>
		<item>
			<title>Forum footer Archive</title>
			<description><![CDATA[<p>
	Forum footer Archive system, you can put web site footer your pages links ! like [1]-[2-[3]-[4].. like this, forum archive vb system</p>
]]></description>
			<pubDate>Sun, 12 Aug 2012 12:15:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/extensions/community-social/565]]></link>
		</item>
		<item>
			<title>User profile video player</title>
			<description><![CDATA[<p>
	User profile video player, you can play video with your profile.</p>
]]></description>
			<pubDate>Sun, 12 Aug 2012 06:50:55 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/extensions/files-media/564]]></link>
		</item>
		<item>
			<title>Last new actions in the site</title>
			<description><![CDATA[<p>
	Last new actions on the site for example last forum post, who answered, who registered, who was banned..</p>
]]></description>
			<pubDate>Sun, 12 Aug 2012 06:33:00 -0000</pubDate>
			<link><![CDATA[http://www.cotonti.com/extensions/publications-events/562]]></link>
		</item>
	</channel>
</rss>