Of course. Let's dive deep into channel in the DedeCMS (织梦内容管理系统) templating system.

The channel tag is one of the most fundamental and frequently used tags in DedeCMS. Its primary purpose is to generate a list of channels (also known as categories, sections, or栏目). These channels are typically used to create your website's main navigation menu.
Basic Syntax
The channel tag is a single-line tag, similar to arclist or flink.
{dede:channel}
<a href='[field:typelink/]'>[field:typename/]</a>
{/dede:channel}
What It Does
By default, the channel tag retrieves all top-level (一级) channels from your DedeCMS database. It loops through each channel and executes the code within its block once for every channel found.
Inside the block, special placeholder variables (called "fields") are available, like [field:typename/] and [field:typelink/], which are replaced with the actual data for the current channel in the loop.

Key Attributes (Parameters)
The power of the channel tag comes from its attributes, which allow you to control exactly which channels are displayed and how they are formatted.
Here are the most important attributes:
a. type: The Most Important Attribute
This attribute determines the type of channels to display.
-
top(Default): Displays only top-level channels.
(图片来源网络,侵删){dede:channel type='top'} <a href="[field:typelink/]">[field:typename/]</a> {/dede:channel} -
son: Displays the child channels of a specific parent channel. You must use this with thereidattribute.{dede:channel type='son' reid='2'} <!-- This will display all child channels of the channel with ID 2 --> <a href="[field:typelink/]">[field:typename/]</a> {/dede:channel} -
self: Displays the current channel and its child channels. Also requires thereidattribute.{dede:channel type='self' reid='2'} <!-- This will display channel 2 and all its children --> <a href="[field:typelink/]">[field:typename/]</a> {/dede:channel}
b. reid: Parent Channel ID
This attribute is used in conjunction with type='son' or type='self' to specify the parent channel whose children you want to display.
- Example: To get all sub-channels under a channel with ID
5:{dede:channel type='son' reid='5'} <a href="[field:typelink/]">[field:typename/]</a> {/dede:channel}
c. row: Number of Channels to Display
Limits the number of channels output by the tag.
- Example: Display only the first 5 top-level channels.
{dede:channel type='top' row='5'} <a href="[field:typelink/]">[field:typename/]</a> {/dede:channel}
d. typeid: Specific Channel ID(s)
If you want to display a specific channel or a list of channels (comma-separated), you can use typeid. This overrides the type attribute.
- Example: Display only the channels with ID 1 and 3.
{dede:channel typeid='1,3'} <a href="[field:typelink/]">[field:typename/]</a> {/dede:channel}
e. currentstyle: Styling the Active Channel
This is a very useful attribute for navigation menus. It allows you to apply a specific CSS class or style to the link of the channel that the user is currently viewing.
- Example: Add the class
activeto the current channel's link.{dede:channel type='top' currentstyle="<a href='~typelink~' class='active'>~typename~</a>"} <a href="[field:typelink/]">[field:typename/]</a> {/dede:channel}~typelink~and~typename~are placeholders that will be replaced by the actual link and name.- If the current page belongs to one of the channels in the list, that specific
<a>tag will be replaced by the content ofcurrentstyle.
f. noself: Exclude Current Channel
When using type='son', this attribute prevents the parent channel itself from being included in the list.
- Example: Get children of channel 2, but don't show channel 2 in the list.
{dede:channel type='son' reid='2' noself='yes'} <a href="[field:typelink/]">[field:typename/]</a> {/dede:channel}
Available Fields (Placeholders)
Inside the {dede:channel}...{/dede:channel} block, you can use the following fields:
| Field Name | Description |
|---|---|
[field:id/] |
The ID of the channel. |
[field:typename/] |
The name of the channel (e.g., "Company News", "Products"). |
[field:typelink/] |
The full URL of the channel's main page. |
[field:seotitle/] |
The SEO title of the channel. |
[field:description/] |
The description of the channel. |
[field:typedir/] |
The physical directory path of the channel on the server. |
[field:isdefault/] |
Is this the default channel? (0 for No, 1 for Yes). |
[field:content/] |
The introduction content of the channel. |
Practical Examples
Example 1: Creating a Main Navigation Menu
This is the most common use case. You want to list all top-level channels.
<!-- In your header.html or main template -->
<div class="main-nav">
<ul>
{dede:channel type='top'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
</div>
Example 2: Creating a Sub-Navigation Menu (Dropdown)
This is a nested channel tag. The outer one gets the top-level channels, and the inner one gets the children of the current top-level channel.
<div class="main-nav">
<ul>
{dede:channel type='top'}
<li>
<!-- Link to the main channel -->
<a href="[field:typelink/]">[field:typename/]</a>
<!-- Check if this channel has children before showing the sub-menu -->
{dede:channel type='son' reid='[field:id/]'}
<ul class="sub-nav">
{dede:channel}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
{/dede:channel}
</li>
{/dede:channel}
</ul>
</div>
Note: The above nested example has a limitation. A more robust way is to use the typeid attribute on the inner channel tag, passing the ID of the parent channel. However, DedeCMS's native templating doesn't easily allow variable passing between tags like this. The method shown above is a common workaround, but for complex menus, a PHP solution or a more advanced tag might be needed.
Example 3: Main Menu with Active Styling
This improves Example 1 by highlighting the current page's channel in the navigation.
<div class="main-nav">
<ul>
{dede:channel type='top' currentstyle="<li class='active'><a href='~typelink~'>~typename~</a></li>"}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
</div>
This will automatically output <li class="active">...</li> for the channel that matches the current page.
Important Considerations & Best Practices
- Cache: DedeCMS templates are cached. If you make changes to a template file, you need to regenerate the HTML for the pages using that template (often via the "Generate HTML" feature in the backend) or clear the cache to see the changes.
- Performance: For very large sites with hundreds of channels, complex nested
channeltags can have a minor performance impact. For 99% of websites, this is not a concern. - Flexibility: The
channeltag is powerful, but for highly dynamic or complex menu structures, sometimes a small PHP snippet directly in the template (if your server configuration allows<?php ?>tags) can offer more control. However, sticking to the native DedeCMS tags is always the recommended and safer approach.
