做織夢(5.7)商城,會用到按銷量,價格等自定義模型字段排序列表,這時就需使用freelist標簽。但freelist標簽
不支持按照自定義字段排序,實現此功能的解決辦法如下:
以添加按商品價格(自定義字段名:price)排序為例
1、打開后臺模板dede/templets/freelist_add.htm
找到大概243行<select name="orderby" id="orderby" style="width:120">,為其添加一個選項到最后
結果如下:
<select name="orderby" id="orderby" style="width:120">
<option value="sortrank">置頂權限值</option>
<option value="pubdate" selected>發(fā)布時間</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>
保存關閉
2、打開后臺模板dede/templets/freelist_edit.htm
找到大概219行 $sorta = "sortrank,置頂權限值;pubdate,發(fā)布時間;... ,為其添加一個選項到最后
結果如下:
$sorta = "sortrank,置頂權限值;pubdate,發(fā)布時間;senddate,錄入時間;click,點擊量;id,文檔ID,lastpost,最后評論時間;postnum,評論總數;rand,隨機獲取;price,商品價格";
然后在下方<select name="orderby" id="orderby" style="width:120">最后同樣添加一個選項
<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">發(fā)布時間</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
找到
//排序方式
$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;
}
}
}
}
}
//排序方式
$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";
}
保存關閉。
至此,大功告成,如需添加其他字段,按照此方法處理即可。
此方法較適用于分類不太多的情況,如果分類太多,那生成的列表就太多,需要考慮別的解決方案了。