Making Module TEMPLATE compliant questions
| Author |
Message |
MrPotatoes


Joined: Apr 23, 2005 Posts: 403 Location: Florida
|
Post subject: Making Module TEMPLATE compliant questions Posted: Tue Sep 06, 2005 4:38 am |
|
well i plan on making a custom propriatary module for my site that is very important to it. the most important module for my site. but i wanted to make it template compliant so that when i do make a theme i don't have to change the template within the code. that's just stupid
these are my findings and i can't really go any further without asking questions right now.
1. there is a template.php file. i want to know if i have to use this at all
2. there is a THEME_USES_TPL define that is defined in the config.inc in the includes folder. how do i use this? where do i use this?
3. when i'm creating the module i have to create some tags that i have to use in and for the template. i just create that array right? or is there some other special thing that i have to do?
4. lastly how do i default te theme? is there a way to do that or do i do i have to just do the PHP file and rock out with it?
this is what 'THEME_USES_TPL' means for an FYI:
define('THEME_USES_TPL', file_exists('themes/'.$ThemeSel.'/template/header.html')). oit's defined in config.inc in the includes folder.
thank you for the help in advance
Edit by Phoenix: DF no longer uses THEME_USES_TPL, but some other aspects in this discussion are still useful.
MrPotatoes's server specs (Server OS / Apache / MySQL / PHP / DragonflyCMS) Windows XP | P4HT 3.4| 1.5GB RAM | 256 Vid Card PCIX | Apache2.0.52 | MySQL 1.4.8 | PHP 4.3.10 | 9.03 |
|
| Back to top |
|
 |
Śyama_Dāsa


Joined: Apr 19, 2004 Posts: 2049 Location: Dragonfly CMS Tribe
|
Post subject: Re: Making Module TEMPLATE compliant questions Posted: Tue Sep 06, 2005 4:51 am |
|
MrPotatoes wrote:
1. there is a template.php file. i want to know if i have to use this at all
This is the class whose methods are called when writing to templates from within your application.
MrPotatoes wrote:
3. when i'm creating the module i have to create some tags that i have to use in and for the template. i just create that array right? or is there some other special thing that i have to do?
dragonflycms.org/Wiki/id=5.html
The module assigns variables to an array that is assigned to the template class and then the template is used by the module to write the page.
Check out the News module for a great example of using templates.
MrPotatoes wrote:
4. lastly how do i default tne theme?
As long as the default theme of the site has the modules templates in the templates folder it will work for the rest of the themes...
in your release ( if you plan to) can have a folder called YOUR_THEME.
_________________ AKA Akamu / Read these and your life will be successful | Find a Repair
--
Mods and Professional Support via YIM
Śyama_Dāsa's server specs (Server OS / Apache / MySQL / PHP / DragonflyCMS) win32 / Apache 1.3.33 / MySQL 4.1.16/PHP 4.4/CPG-CVS ( browsers: Mozilla 1.7.x / IE6 / Opera 8.0) |
|
| Back to top |
|
 |
MrPotatoes


Joined: Apr 23, 2005 Posts: 403 Location: Florida
|
Post subject: Re: Making Module TEMPLATE compliant questions Posted: Tue Sep 06, 2005 7:58 pm |
|
yea, i was looking at index.php from the news module. and anywhere in news module there is no template.php included or mentioned anywhere. that's why i'm asking if it's called in some other file or something. if that's the case and it's called somewhere else like main.php or something like that then that file handles the template functionality and then i have to work with it somehow. the problem is i'm not sure how that's being achieved.
there are 4 sections in index.php in news module that call to 'THEME_USES_TPL'. they are all if checks and they are basically telling you how it's gonna look i'm guessing. because within those if checks there is code that creates an array for the template tags. such as this here:
Code:
// line 108 in from modules/news/index.php
if (THEME_USES_TPL)
{
$cpgtpl->assign_block_vars('newscat', array(
'S_GOHOME' => _GOTOHOME,
'S_SEARCH' => _SEARCH,
'S_SEARCHON' => _SEARCHONTOPIC,
'S_SELECT' => _SELECTNEWTOPIC,
'S_SITENAME' => $sitename,
'S_TOPIC_T' => $topic_title,
'I_TOPIC' => $topic,
'U_HOME' => $mainindex,
'U_SEARCH' => getlink('Search'),
'U_TOPICS' => getlink('Topics'))
);
i understand that this is used in the TAGS. for instance I_TOPIC in the template is {I_TOPIC}. then i call that and that is where the I_TOPIC from the array is put. i also understand that this index is basically what i would call a draw or show function in C++ for any of my games that i would create or a windows application that i would make. i also understand that when these arrays are created they are made only at the time when something is to be drawn or something to that extent.
what i'm not sure about is if i'm right or not. i just need the corrections. this is not only going in my tutorials for creating themes and modules for Draginfly but this is also for myself and my web app creator.
now, if what i said is the case then all i really have to do is create
the index.php (the show file). then i declare what is being shown depending on where they are and i use the THEME_USES_TPL and declare the tags that are used in the template.html and go from there right?
if i'm wrong please, correct me
_________________ i'm just that sweet
MrPotatoes's server specs (Server OS / Apache / MySQL / PHP / DragonflyCMS) Windows XP | P4HT 3.4| 1.5GB RAM | 256 Vid Card PCIX | Apache2.0.52 | MySQL 1.4.8 | PHP 4.3.10 | 9.03 |
|
| Back to top |
|
 |
Śyama_Dāsa


Joined: Apr 19, 2004 Posts: 2049 Location: Dragonfly CMS Tribe
|
Post subject: Re: Making Module TEMPLATE compliant questions Posted: Tue Sep 06, 2005 8:55 pm |
|
You also have to have a template...
open template/news/index.html
find
Code:
<!-- BEGIN newscat -->
<table class="newsindex"><tr><td>
<center><font class="title">{newscat.S_SITENAME}: {newscat.S_TOPIC_T}</font><br /><br />
<form action="{newscat.U_SEARCH}" method="post" {I18N}>
<input type="hidden" name="topic" value="{newscat.I_TOPIC}" />
{newscat.S_SEARCHON}: <input type="name" name="search" size="30" maxlength="255" />
<input type="submit" value="{newscat.S_SEARCH}" />
</form>
[ <a href="{newscat.U_HOME}">{newscat.S_GOHOME}</a> | <a href="{newscat.U_TOPICS}">{newscat.S_SELECT}</a> ]</center>
</td></tr></table><br />
<!-- END newscat -->
This is where the assigned vars from above are assigned to.
open News/index.php
find:
Code:
if (THEME_USES_TPL) {
pagination('News&page=', $pages, 1, $page);
$cpgtpl->set_filenames(array('body' => 'news/index.html'));
$cpgtpl->display('body');
}
so you need all 3 parts: assign the vars, the template and the actual writing of the page in this last part
_________________ AKA Akamu / Read these and your life will be successful | Find a Repair
--
Mods and Professional Support via YIM
Śyama_Dāsa's server specs (Server OS / Apache / MySQL / PHP / DragonflyCMS) win32 / Apache 1.3.33 / MySQL 4.1.16/PHP 4.4/CPG-CVS ( browsers: Mozilla 1.7.x / IE6 / Opera 8.0) |
|
| Back to top |
|
 |
MrPotatoes


Joined: Apr 23, 2005 Posts: 403 Location: Florida
|
Post subject: Re: Making Module TEMPLATE compliant questions Posted: Tue Sep 06, 2005 9:45 pm |
|
ok so i'm getting this almost totally from what i get.
$cpgtpl is declared in cmsinit.inc. it's shown as this:
Code:
$ThemeSel = get_theme();
define('THEME_USES_TPL', file_exists('themes/'.$ThemeSel.'/template/header.html'));
// Load template handler
$cpgtpl =& new cpg_template();
$cpgtpl->set_template(); // dynamic language
//$cpgtpl->set_template(true); // static language
//$cpgtpl->cachepath = '';
if (THEME_USES_TPL) { $template =& $cpgtpl; }
$SESS->init_info();
that gets the theme and sets it. then loads the template handler.
the cpg_template() is part of the template.php and that sucker handles the get and display that i've seen in $cpgtpl. so i don't have to handle the template.php unless for some reason i have to go in there. doubt it tho. i don't want to screw things up for when i upgrade lmao
now that it's set there i go into my module/index.php and set the variables in the new $cpgtpl. after that, i goto the template and declare then there between the curly brackets -> '{}'. then i'm all set and i've complied with the template handling system.
to be perfectly clear and to re-iterate what you have already said:
1. whatever draw function that i have i create an array in the $cpgtpl and make and set the tags in that array.
Code:
if (THEME_USES_TPL)
{
$cpgtpl->assign_block_vars('newscat', array(
'S_GOHOME' => _GOTOHOME,
'S_SEARCH' => _SEARCH,
'S_SEARCHON' => _SEARCHONTOPIC,
'S_SELECT' => _SELECTNEWTOPIC)
);
2. set the template in my themes to body
Code:
// take the template from here and use the tags
$cpgtpl->set_filenames(array('body' => 'news/index.html'));
3. draw the body. body is set to the template here:
Code:
// draw 'body'. it was declared in previous line
$cpgtpl->display('body');
the last confusion that i've got now is that i've got a variable that i'm not sure where it's coming from. i know '$cpgtpl is defined in cmsinit.inc like i showed up above. and i know that it is included in a few other files. in header.php it's called to as a global and used in that file. it's defined here with it's own array. after this i'm stumped
header is included in modules/news/index.php. so i understand if it gets that global. bud i do NOT understand where header gets it's global. and there, i'm confused. and i bet after i understand that then i won't have any more questions
thank you for helping me out thus far
_________________ i'm just that sweet
MrPotatoes's server specs (Server OS / Apache / MySQL / PHP / DragonflyCMS) Windows XP | P4HT 3.4| 1.5GB RAM | 256 Vid Card PCIX | Apache2.0.52 | MySQL 1.4.8 | PHP 4.3.10 | 9.03 |
|
| Back to top |
|
 |
Śyama_Dāsa


Joined: Apr 19, 2004 Posts: 2049 Location: Dragonfly CMS Tribe
|
Post subject: Re: Making Module TEMPLATE compliant questions Posted: Wed Sep 07, 2005 3:23 am |
|
$cpgtpl has global scope as is unless you are inside a function and only then do you have to declare it global.
_________________ AKA Akamu / Read these and your life will be successful | Find a Repair
--
Mods and Professional Support via YIM
Śyama_Dāsa's server specs (Server OS / Apache / MySQL / PHP / DragonflyCMS) win32 / Apache 1.3.33 / MySQL 4.1.16/PHP 4.4/CPG-CVS ( browsers: Mozilla 1.7.x / IE6 / Opera 8.0) |
|
| Back to top |
|
 |
MrPotatoes


Joined: Apr 23, 2005 Posts: 403 Location: Florida
|
Post subject: Re: Making Module TEMPLATE compliant questions Posted: Wed Sep 07, 2005 3:59 am |
|
ok thank you. you seriously rock alot!
i thought that's what it meant. i just never ever ever used globals in my C++ programming. i was taught that it was bad OPP programming so i didn't ever use them. but either way, thanx alot. i'm gonna get back to that module and documentation that i was writing
thumbs up to you :D
_________________ i'm just that sweet
MrPotatoes's server specs (Server OS / Apache / MySQL / PHP / DragonflyCMS) Windows XP | P4HT 3.4| 1.5GB RAM | 256 Vid Card PCIX | Apache2.0.52 | MySQL 1.4.8 | PHP 4.3.10 | 9.03 |
|
| Back to top |
|
 |
PartyMarty


Joined: Apr 24, 2005 Posts: 156
|
Post subject: Re: Making Module TEMPLATE compliant questions Posted: Fri Sep 23, 2005 2:57 pm |
|
Hello Everybody,
I am starting to play with Templating a module as a test I set up the following function:
Code:
function ShowCat();
Global $module_name, $cpgtpl;
if (THEME_USES_TPL) {
$cpgtpl->assign_block_vars('SysCatHeader', array(
'MOD_STRUCTURE' => $module_name
)
);
}
if (THEME_USES_TPL) {
$cpgtpl->set_filenames(array('Directory' => 'ShowAll/SysCategories.html'));
$cpgtpl->display('Directory');
}
}
Code:
<!-- Begin SysCatHeader -->
<tr>
<td colspan="2" width= "100%" style="padding-top:10px; padding-bottom:10px; padding-left:10px; padding-right:10px;">
<table class="BlockBorder" cellpadding="0", cellspacing="0">
<tr>
<td colspan="3" nowrap class="BlockTitle" align="center">{SysCatHeader.MOD_STRUCTURE}</td>
</tr>
<tr>
<td align="center" class="OptionDescNoBorder">Postion</td>
<td align="center" class="OptionDescLeftRight">Structure</td>
<td align="center" class="OptionDescNoBorder">Tools</td>
</tr>
</table>
</td>
</tr>
<!-- End SYSCATHEADER -->
The thing seems to work! So the block gets displayed as expected except for the fact that the {SysCatHeader.MOD_STRUCTURE} displays as shown not as the contents of the variable. I have probly missed something really stupid so hopefully somebody can spot it for me!
PartyMarty's server specs (Server OS / Apache / MySQL / PHP / DragonflyCMS) Windows_NT/Apache/1.3.33 (Win32) PHP/4.3.10/4.1.9-max/4.3.10/9.0.4.0 |
|
| Back to top |
|
 |
Biggles


Joined: Aug 03, 2005 Posts: 637 Location: St. Louis, MO
|
Post subject: Re: Making Module TEMPLATE compliant questions Posted: Fri Sep 23, 2005 4:13 pm |
|
Put "SysCatHeader" in lower case in all locations. And the "Begin" and "End" should be in all upper case in the template file.
Biggles's server specs (Server OS / Apache / MySQL / PHP / DragonflyCMS) Win, Linux/1.3.34/4.0.26, 5.0.19/4.3.10, 5.1.2, 8.1.4(PostgresSQL)/9.0.6.1, CVS |
|
| Back to top |
|
 |
PartyMarty


Joined: Apr 24, 2005 Posts: 156
|
Post subject: Re: Making Module TEMPLATE compliant questions Posted: Fri Sep 23, 2005 4:17 pm |
|
I figured it was something that stupid Thanks dude
PartyMarty's server specs (Server OS / Apache / MySQL / PHP / DragonflyCMS) Windows_NT/Apache/1.3.33 (Win32) PHP/4.3.10/4.1.9-max/4.3.10/9.0.4.0 |
|
| Back to top |
|
 |
DJ Maze


Joined: Apr 19, 2004 Posts: 5668 Location: http://tinyurl.com/5z8dmv
|
Post subject: Re: Making Module TEMPLATE compliant questions Posted: Fri Sep 23, 2005 6:23 pm |
|
MrPotatoes wrote:
i just never ever ever used globals in my C++ programming. i was taught that it was bad OPP programming so i didn't ever use them.
No it's not bad, in C/C++ you just use it differently.
Think about cmsinit.inc as being your <namespace> in C++ and all functions and variables in that namespace.
For example in C++ you use "namespace std" so that you won't have to use std::String, you just use String.
But PHP doesn't understand namespacing so you need to use "global $cpgtpl" or "$GLOBAL['cpgtpl']" inside functions and classes.
Another way to see it is like "half baked" static variables. In C++ you can access static functions and variables from anywhere and you can only create one static name in the whole system. In PHP you can access these "static" variables only if you use global or $GLOBAL.
My conclusion: Think about cmsinit.inc being the "base class" and everything else is a child. To overwrite the baseclass variables (__protected) you must setup the globals in your child as well.
DJ Maze's server specs (Server OS / Apache / MySQL / PHP / DragonflyCMS) Fedora 12 / 2.2.15 / 5.1.47 / 5.3.3 / CVS |
|
| Back to top |
|
 |
PartyMarty


Joined: Apr 24, 2005 Posts: 156
|
Post subject: Re: Making Module TEMPLATE compliant questions Posted: Fri Sep 23, 2005 9:35 pm |
|
I think I have missunderstood how to use templates. My orignal thinking was that everytime I do a $cpgtpl->assign_block_values(....) it kinds of justs adds html to the end of all the other html in $cpgtpl. Well after tying the function bellow I have determined that either I got a problem with my code or I got the concept of a Templates wrong!
What I am trying to do below is build a table one row at time!
Code:
//*******************************************************************************************************************************************************************
function ShowAdminCatNew()
{
Global $db, $prefix, $module_name, $MAIN_CFG, $cpgtpl;
$config = $MAIN_CFG[''.$module_name.''];
$SubCats =$config['Subs'];
$PrefixData = $config['Database'];
$MenuArray=$_SESSION['MenuControl'];
$CatList = $db->sql_query('SELECT * FROM '.$prefix.'_'.$PrefixData.'_categories ORDER BY cat_pos DESC', SQL_NUM, __FILE__);
$CatCount = $db->sql_numrows($CatList);
$CurrentCount = 1;
$cpgtpl->assign_block_vars('syscatheader', array('MOD_STRUCTURE'=>$module_name));
while($Cat = $db->sql_fetchrow($CatList))
{
if ($CurrentCount==1)
{
$cpgtpl->assign_block_vars('catitemmove', array('LIST_END' => TRUE,
'DIR_LINK' => adminlink("".$module_name."&mode=MoveDown&id=".$Cat['cat_id'].""),
'GRAPHIC' => "/modules/$module_name/Graphics/Down.gif"));
}
elseif ($CurrentCount==$CatCount)
{
$cpgtpl->assign_block_vars('catitemmove', array('LIST_END' => TRUE,
'DIR_LINK' => adminlink("".$module_name."&mode=MoveUp&id=".$Cat['cat_id'].""),
'GRAPHIC' => "/modules/$module_name/Graphics/Up.gif"));
}
else
{
$cpgtpl->assign_block_vars('catitemmove', array('LIST_END' => FALSE,
'DIR_LINK1' => adminlink("".$module_name."&mode=MoveUp&id=".$Cat['cat_id'].""),
'DIR_LINK2' => adminlink("".$module_name."&mode=MoveDown&id=".$Cat['cat_id'].""),
'GRAPHIC1' => "/modules/$module_name/Graphics/Up.gif",
'GRAPHIC2' => "/modules/$module_name/Graphics/Down.gif"));
}
$cpgtpl->assign_block_vars('catitemmain', array('MAINCAT' => $Cat['cat_title']));
$cpgtpl->assign_block_vars('catitemmaintools', array('MAINCAT' => $Cat['cat_title']));
$CurrentCount++;
}
$cpgtpl->assign_block_vars('syscatfooter',array('MAINCAT' => $Cat['cat_title']));
if (THEME_USES_TPL) {
$cpgtpl->set_filenames(array('body' => 'ShowAll/SysCategories.html'));
$cpgtpl->display('body');
}
}
Code:
<!-- BEGIN syscatheader -->
<TR>
<TD colspan="2" width= "100%" style="padding-top:10px; padding-bottom:10px; padding-left:10px; padding-right:10px;">
<Table class="BlockBorder" cellpadding="0", cellspacing="0">
<TR>
<TD colspan="3" nowrap class="BlockTitle" align="center">Current {syscatheader.MOD_STRUCTURE} Structure</TD>
</TR>
<TR>
<TD align="center" class="OptionDescNoBorder">Postion</TD>
<TD align="center" class="OptionDescLeftRight">Structure</TD>
<TD align="center" class="OptionDescNoBorder">Tools</TD>
</TR>
<!-- END syscatheader -->
<!-- BEGIN catitemmove -->
<TR>
<!-- IF catitemmove.LIST_END -->
<TD class="OptionDescTop" align="center"><a HREF={catitemmove.DIR_LINK}><img SRC={catitemmove.GRAPHIC}></a></TD>
<!-- ELSE -->
<TD class="OptionDescTop" align="center">
<Table cellpadding="0", cellspacing="0">
<TR>
<TD><a HREF={catitemmove.DIR_LINK1}><img SRC={catitemmove.GRAPHIC1}></a></TD>
<TD style = "padding-left:10px"><a HREF={catitemmove.DIR_LINK2}><img SRC={catitemmove.GRAPHIC2}></a></TD>
</tr>
</table>
</TD>
<!-- ENDIF -->
<!-- END catitemmove -->
<!-- BEGIN catitemmain -->
<TD class="OptionDescTop" align="center">Hello</TD>
<!-- END catitemmain -->
<!-- BEGIN catitemmaintools -->
<TD class="OptionDescTop" align="center">Bonjor</TD>
</TR>
<!-- END catitemmaintools -->
<!-- BEGIN syscatfooter -->
</Table>
</Td>
</TR>
<!-- END syscatfooter -->
PartyMarty's server specs (Server OS / Apache / MySQL / PHP / DragonflyCMS) Windows_NT/Apache/1.3.33 (Win32) PHP/4.3.10/4.1.9-max/4.3.10/9.0.4.0 |
|
| Back to top |
|
 |
PartyMarty


Joined: Apr 24, 2005 Posts: 156
|
Post subject: Re: Making Module TEMPLATE compliant questions Posted: Sun Sep 25, 2005 3:14 pm |
|
Ok I think I kind of got a hang of this templating stuff! I noticed in Template.php that many functions reference "smarty" I google the class and read about all kinds of neat stuff that can be done with it. Now I was wondering if the following is possible inside the Dragonfly templating system!
There are some nice functions that automate tasks such as html dropdown boxes. One is html_options. You assign the arrays of data to the template, then this function does all the work to generate the HTML output for it.
Quote:
index.php
include('Smarty.class.php');
// create object
$smarty = new Smarty;
// assign options arrays
$smarty->assign('id', array(1,2,3,4,5));
$smarty->assign('names', array('bob','jim','joe','jerry','fred'));
// display it
$smarty->display('index.tpl');
index.tpl
<select name=user>
{html_options values=$id output=$names selected="5"}
</select>
output
<select name=user>
<option label="bob" value="1">bob</option>
<option label="jim" value="2">jim</option>
<option label="joe" value="3">joe</option>
<option label="jerry" value="4">jerry</option>
<option label="fred" value="5" selected="selected">fred</option>
</select>
Smarty facilitates a convenient way to loop over arrays of data with the section function. Here's an example of that, and we also threw in alternating row colors via the cycle function, and we use the strip function to strip out newlines and white space.
index.php
include('Smarty.class.php');
// create object
$smarty = new Smarty;
// assign an array of data
$smarty->assign('name', array('bob','jim','joe','jerry','fred'));
// assign an associative array of data
$smarty->assign('users', array(
array('name' => 'bob', 'phone' => '555-3425'),
array('name' => 'jim', 'phone' => '555-4364'),
array('name' => 'joe', 'phone' => '555-3422'),
array('name' => 'jerry', 'phone' => '555-4973'),
array('name' => 'fred', 'phone' => '555-3235')
));
// display it
$smarty->display('index.tpl');
index.tpl
<table>
{section name=mysec loop=$name}
{strip}
<tr bgcolor="{cycle values="#eeeeee,#dddddd"}">
<td>{$name[mysec]}</td>
</tr>
{/strip}
{/section}
</table>
<table>
{section name=mysec loop=$users}
{strip}
<tr bgcolor="{cycle values="#aaaaaa,#bbbbbb"}">
<td>{$users[mysec].name}</td>
<td>{$users[mysec].phone}</td>
</tr>
{/strip}
{/section}
</table>
output
<table>
<tr bgcolor="#eeeeee"><td>bob</td></tr>
<tr bgcolor="#dddddd"><td>jim</td></tr>
<tr bgcolor="#eeeeee"><td>joe</td></tr>
<tr bgcolor="#dddddd"><td>jerry</td></tr>
<tr bgcolor="#eeeeee"><td>fred</td></tr>
</table>
<table>
<tr bgcolor="#aaaaaa"><td>bob</td><td>555-3425</td></tr>
<tr bgcolor="#bbbbbb"><td>jim</td><td>555-4364</td></tr>
<tr bgcolor="#aaaaaa"><td>joe</td><td>555-3422</td></tr>
<tr bgcolor="#bbbbbb"><td>jerry</td><td>555-4973</td></tr>
<tr bgcolor="#aaaaaa"><td>fred</td><td>555-3235</td></tr>
</table>
I guess what I am asking is "Is it possible to do this looping with the Dragonfly templating system?"
PartyMarty's server specs (Server OS / Apache / MySQL / PHP / DragonflyCMS) Windows_NT/Apache/1.3.33 (Win32) PHP/4.3.10/4.1.9-max/4.3.10/9.0.4.0 |
|
| Back to top |
|
 |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You cannot download files in this forum
|

|
User Info ![Show/hide content [x]](themes/dragonfly/images/minus.png)
 Welcome Anonymous
Last CVS commits ![Show/hide content [x]](themes/dragonfly/images/minus.png)
Languages ![Show/hide content [x]](themes/dragonfly/images/minus.png)
Community ![Show/hide content [x]](themes/dragonfly/images/minus.png)
 Support for DragonflyCMS in a other languages:
• Deutsch
• Español
X-links ![Show/hide content [x]](themes/dragonfly/images/minus.png)
Preview theme ![Show/hide content [x]](themes/dragonfly/images/minus.png)
Each user can view the site with a different theme.
Themes marked with a * also change the forum look.
|