在使用Dedecms CMS构建网店商城时,您可能需要按照销量、价格等自定义模型字段对列表进行排序。这时可以使用freelist标签来实现这一功能。然而,默认情况下,freelist标签并不支持按照自定义字段排序。以下是一个解决方法,帮助您实现按商品价格(自定义字段名: price)排序的功能。
### 步骤1:修改后台模板dede/templets/freelist_add.htm 打开文件`dede/templets/freelist_add.htm`,找到大约第243行的代码: ```html `标签中同样添加一个选项:

<select name="orderby" id="orderby" style="width:120">
    <?php echo "<option value=\\\\"$orderby\\\\" selected>{$sortarrs[$orderby]}</option>\\\\r\\\\n"; ?>
    <option value="sortrank">置顶权限值</option>
    <option value="pubdate">发布时间</option>
    <option value="senddate">录入时间</option>
    <option value="click">点击量</option>
    <option value="id">文档ID</option>
    <option value="lastpost">最后评论时间</option>
    <option value="postnum">评论总数</option>
    <option value="price">商品价格</option>
</select>
    
保存并关闭文件。
### 步骤3:添加自由列表 完成上述步骤后,当您添加自由列表时,就可以选择“商品价格”这个排序选项了。
### 步骤4:修改include/arc.freelist.class.php 打开文件`include/arc.freelist.class.php`,找到以下代码段: ```php // 排序方式 $ordersql = ""; if($orderby=="senddate") ``` 在最后一个`else`前面添加一段代码,结果如下:

// 排序方式
$ordersql = "";
if($orderby=="senddate")
{
    $ordersql=" ORDER BY arc.senddate $orderWay";
}
else if($orderby=="pubdate")
{
    $ordersql=" ORDER BY arc.pubdate $orderWay";
}
else if($orderby=="id")
{
    $ordersql="  ORDER BY arc.id $orderWay";
}
else if($orderby=="hot"||$orderby=="click")
{
    $ordersql = " ORDER BY arc.click $orderWay";
}
else if($orderby=="lastpost")
{
    $ordersql = "  ORDER BY arc.lastpost $orderWay";
}
else if($orderby=="scores")
{
    $ordersql = "  ORDER BY arc.scores $orderWay";
}
else if($orderby=="rand")
{
    $ordersql = "  ORDER BY rand()";
}
else if($orderby=="price")  // 自定义商品频道按价格排序
{
    $ordersql = "  ORDER BY ".$addtable.".price";
}
else
{
    $ordersql=" ORDER BY arc.sortrank $orderWay";
}
    
确保将以下代码块提前到排序代码之前,以确保能够正确获取`$addtable`的值:

// 获得附加表的相关信息
$addField = "";
$addJoin = "";
if(is_object($this->ChannelUnit))
{
    $addtable  = $this->ChannelUnit->ChannelInfos['addtable'];
    if($addtable!="")
    {
        $addJoin = " LEFT JOIN $addtable ON arc.id = ".$addtable.".aid ";
        $addField = "";
        $fields = explode(",",$this->ChannelUnit->ChannelInfos['listfields']);
        foreach($fields as $k=>$v)
        {
            $nfields[$v] = $k;
        }
        foreach($this->ChannelUnit->ChannelFields as $k=>$arr)
        {
            if(isset($nfields[$k]))
            {
                if(!empty($arr['rename']))
                {
                    $addField .= ",".$addtable.".".$k." as ".$arr['rename'];
                }
                else
                {
                    $addField .= ",".$addtable.".".$k;
                }
            }
        }
    }
}
    
保存并关闭文件。 至此,您已经成功实现了按商品价格排序的功能。如需添加其他字段,可参照此方法处理。这种方法适用于分类不多的情况,如果分类过多,则需要考虑其他解决方案。