关于yourphp内容管理系统开启伪静态之后volist调用排序

本文介绍了解决YourPHP内容管理系统中伪静态模式下后台排序失效的问题。通过修改AdminbaseAction.class.php文件中的create_list()函数,实现了正确的排序并保持分页功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写这篇博客主要的目的是让大家开发起来少浪费一些时间在小问题上。

今日用yourphp内容管理系统做二次开发的时候遇到一个问题,就是网站开启伪静态之后,后台设置的排序无效,于是百度了一下,发现有很多人回答了,修改某某文件222行为->(listorder desc)然而并没有什么卵用, 伪静态根本不执行这个文件,于是各种翻墙加交流群,请教大神都未果,是的,使用YP:list 可以设置排序,但是无法使用分页。

列表页模版提供的是:

<div class="list pic_list"><ul class="pic">
<volist name="list" id="vo" key="k" order="listorder desc">
<li><span><a href="{$vo.url}"><img src="{$vo.thumb}"></a></span><a href="{$vo.url}" target="_blank">{$vo.title}{$vo.listorder}</a></li>
</volist>
</ul></div>
<div id="pages" class="page">{$pages}</div>

因此我只要找到list这个数据的由来就解决问题了,这貌似是yourphp2.*版本遗留下来的bug,我花了一天的时间查资料,请教大神,都没有解决,突然灵光一现,我应该根据代码的执行过程来寻找数据源,于是我根据后台网站更新里面的更新列表页的button,找到了触发生成静态页的函数,接下来就是顺藤摸瓜,哈哈

找到Lib/Action/AdminbaseAction.class.php的create_list()函数,将$list = $dao->field($field)->where($where)->order('id desc')->limit($page->firstRow . ',' . $page->listRows)->select();修改为$list = $dao->field($field)->where($where)->order('listorder desc')->limit($page->firstRow . ',' . $page->listRows)->select();就大功告成了,对了要记得更新列表页....

public function create_list($catid,$p=1,$count=0)
    {
C('DEFAULT_THEME_NAME',$this->sysConfig['DEFAULT_THEME']);
C('HTML_FILE_SUFFIX',$this->sysConfig['HTML_FILE_SUFFIX']);
C('TMPL_FILE_NAME',str_replace('Admin/Default','Home/'.$this->sysConfig['DEFAULT_THEME'],C('TMPL_FILE_NAME')));


if(APP_LANG){
C('TMPL_CACHFILE_SUFFIX','_'.LANG_NAME.'.php');
$lang =  C('URL_LANG')!=LANG_NAME ? $lang = LANG_NAME.'/' : '';
L(include LANG_PATH.LANG_NAME.'/common.php');
$T = F('config_'.LANG_NAME,'', './Yourphp/Tpl/Home/'.$this->sysConfig['DEFAULT_THEME'].'/'); 
}else{
L(include LANG_PATH.$this->sysConfig['DEFAULT_LANG'].'/common.php');
$T = F('config_'.$this->sysConfig['DEFAULT_LANG'],'', './Yourphp/Tpl/Home/'.$this->sysConfig['DEFAULT_THEME'].'/');
}
$this->assign('T',$T);
foreach((array)$this->module as $r){
if($r['issearch'])$search_module[$r['name']] = L($r['name']);
}
$this->assign('search_module',$search_module);
$this->assign ( 'form',new Form());


$this->assign($this->Config);
$this->assign('Categorys',$this->categorys);
$this->assign('Module',$this->module);
$this->assign('Type',$this->Type);
$catid =intval($catid);
if(empty($catid)) $this->success (L('do_empty'));


$cat = $this->categorys[$catid];
$this->assign('catid',$catid);
if($cat['type']) return;
if(empty($cat['ishtml'])) return;
unset($cat['id']);
$this->assign($cat);
$cat['id']=$catid;
$bcid = explode(",",$cat['arrparentid']);
$bcid = $bcid[1];
if($bcid == '') $bcid=intval($catid);
$this->assign('bcid',$bcid);

$urlrule = geturl($cat,'',$this->Urlrule);
$url= ($p > 1 ) ? $urlrule[1] :  $urlrule[0];
$url = str_replace('{$page}', $p, $url);
if(strstr($url,C('HTML_FILE_SUFFIX'))){
$filename = basename($url,C('HTML_FILE_SUFFIX'));
$dir = dirname($url).'/';
}else{
$filename = 'index';
$dir= $url; 
}
$dir = substr($dir,strlen(__ROOT__.'/'));
if(empty($module))$module=$cat['module'];
$this->assign('module_name',$module);




$this->assign ( 'fields', F($cat['moduleid'].'_Field') ); 
$this->assign ( 'form',new Form());




if($cat['moduleid']==1){
$cat['listtype']=2;
$module = $cat['module'];
$dao= M($module);
$data = $dao->find($catid);
$seo_title = $cat['title'] ? $cat['title'] : $data['title'];
$this->assign ('seo_title',$seo_title);
$this->assign ('seo_keywords',$data['keywords']);
$this->assign ('seo_description',$data['description']);


$template = $cat['template_list']? $cat['template_list'] : 'index';
//手动分页
$CONTENT_POS = strpos($data['content'], '[page]');


if($CONTENT_POS !== false){


$contents = array_filter(explode('[page]',$data['content']));
$pagenumber = count($contents);
for($i=1; $i<=$pagenumber; $i++) {
$pageurls[$i] = str_replace('{$page}',$i,$urlrule);
}
//生成分页
foreach ($pageurls as $p=>$urls) {
$pages = content_pages($pagenumber,$p, $pageurls);
$this->assign ('pages',$pages);
$data['content'] = $contents[$p-1];
$this->assign ($data);
if($p > 1)$filename = basename($pageurls[$p]['1'],C('HTML_FILE_SUFFIX'));
//$this->buildHtml($filename,$dir,'Home/'.$template);
$r=$this->buildHtml($filename,$dir,'./Yourphp/Tpl/Home/'.$this->sysConfig['DEFAULT_THEME'].'/Page_'.$template.C('TMPL_TEMPLATE_SUFFIX'));
}
}else{
$this->assign($data);
//$r=$this->buildHtml($filename,$dir,'Home/'.$template);
$r=$this->buildHtml($filename,$dir,'./Yourphp/Tpl/Home/'.$this->sysConfig['DEFAULT_THEME'].'/Page_'.$template.C('TMPL_TEMPLATE_SUFFIX'));
}
 
}else{


$seo_title = $cat['title'] ? $cat['title'] : $cat['catname'];
$this->assign ('seo_title',$seo_title);
$this->assign ('seo_keywords',$cat['keywords']);
$this->assign ('seo_description',$cat['description']);


if($cat['listtype']==1){
$template_r = 'index';
}else{
$where = " status=1 ";
if($cat['child']){
$where .= " and catid in(".$cat['arrchildid'].")";
}else{
$where .=  " and catid=".$catid;
}


$module = $cat['module'];
$dao= M($module);
if(empty($count))$count = $dao->where($where)->count();
if($count){
import ( "@.ORG.Page" );
$listRows =  !empty($cat['pagesize']) ? $cat['pagesize'] : C('PAGE_LISTROWS');
$page = new Page ( $count, $listRows ,$p );
$page->urlrule = $urlrule;
$pages = $page->show();
$field =  $this->module[$this->mod[$module]]['listfields'];
$field =  $field ? $field : 'id,catid,userid,url,username,title,title_style,keywords,description,thumb,createtime,hits';


$list = $dao->field($field)->where($where)->order('listorder desc')->limit($page->firstRow . ',' . $page->listRows)->select();
$this->assign('pages',$pages);
$this->assign('list',$list);
}
$template_r = 'list';
}


$template = $cat['template_list']? $cat['template_list'] : $template_r;
$r=$this->buildHtml($filename,$dir,'./Yourphp/Tpl/Home/'.$this->sysConfig['DEFAULT_THEME'].'/'.$cat['module'].'_'.$template.C('TMPL_TEMPLATE_SUFFIX'));


}
if($r) return true;
}


博主第一次写博客,可能写得很啰嗦,主要是太紧张,担心写不好,大家看不懂,写这篇博客主要的目的是让大家开发起来少浪费一些时间在小问题上(长沙臭豆腐)


<think>我们正在讨论的是ThinkPHP模板引擎中的volist标签的使用方法。根据引用内容,volist标签用于循环输出数据集,并且支持一些属性来控制循环行为。 引用[1]展示了一个volist嵌套使用的例子:外层volist循环输出condition数组,内层再循环输出当前元素的csa数组。 引用[2]提到了volist的mod属性,用于控制循环的步长和换行等。 引用[3]提到在ThinkPHP5.1中使用volist标签循环数据集,并提到可以在volist中使用自定义函数处理数据。 因此,我们可以总结volist标签的基本用法和一些高级用法。 基本语法: {volist name="数据集变量名" id="当前循环项" key="索引(可选)"} 循环内容 {/volist} 属性: name:要循环的数据集变量(在模板中传入的变量名) id:当前循环项的变量名,在循环体内使用 key:循环索引(从1开始,除非指定了offset),也可以用于记录当前是第几次循环 mod:取模运算,用于控制循环的样式(如隔行换色、换行等) offset:从第几条开始显示(默认0,即第一条) length:显示多少条数据 empty:当数据集为空时显示的字符串(可选) 示例1:基本循环 {volist name="list" id="vo"} {$vo.id}:{$vo.name} {/volist} 示例2:使用key(索引) {volist name="list" id="vo" key="k"} 第{$k}个: {$vo.name} {/volist} 注意:这里的key是从1开始的。 示例3:使用mod属性控制换行(如每5行换行) {volist name="list" id="vo" mod="5"} {$vo.name} {eq name="mod" value="4"}<br/>{/eq} {/volist} 解释:mod属性会将当前循环索引(从0开始)对5取模,然后在eq标签中判断当mod等于4(即每5个中的最后一个)时输出换行。 示例4:使用offset和length {volist name="list" id="vo" offset="5" length="10"} {$vo.name} {/volist} 表示从第6条开始(offset=5,索引从0开始,所以第5条实际上是第6条)显示10条。 示例5:使用empty处理空数据 {volist name="list" id="vo" empty="没有数据"} {$vo.name} {/volist} 当list为空时,显示“没有数据”。 示例6:嵌套循环(如引用[1]中的例子) {volist name="condition" id="v" key="k"} 外层:{$v.name} <select name="key{$k}"> <option value="{$v.name}">{$v.name}</option> {volist name="$v.csa" id="s"} <option value="{$s.names}">{$s.names}</option> {/volist} </select> {/volist} 注意:在嵌套循环中,内层循环的name属性可以是一个变量,如$v.csa,表示当前外层循环项v的csa字段(数组)。 示例7:在volist中使用函数处理数据(如引用[3]中提到的自定义函数) 可以在循环体内使用函数,例如: {volist name="list" id="vo"} {$vo.name|mb_substr=0,5,'utf-8'} // 截取前5个字符 {/volist} 或者在控制器中处理数据,然后直接输出。 高级技巧:使用mod实现隔行换色 {volist name="list" id="vo" mod="2"} <div class="{eq name="mod" value="0"}row1{else/}row2{/eq}">{$vo.name}</div> {/volist} 总结: volist标签是ThinkPHP模板中用于循环输出数组或对象的强大标签,通过设置不同的属性可以实现各种循环控制。 相关问题: 1. volist标签中如何获取当前循环的索引(从0开始)? 2. 在volist循环中如何使用条件判断(如eq标签)? 3. 如何用volist标签实现分页显示? 4. volist标签和foreach标签有什么区别?</think>### PHP 前端模板中 `volist` 标签的使用方法(ThinkPHP 框架) `volist` 是 ThinkPHP 模板引擎的核心标签,用于循环遍历数据集(数组或对象)。以下是详细用法及示例: --- #### 一、基础循环语法 ```php {volist name="数据集变量" id="当前项变量" key="索引变量(可选)"} <!-- 循环内容 --> {/volist} ``` **参数说明**: - `name`:控制器传递到模板的数据集变量名 - `id`:当前遍历项的临时变量名 - `key`:循环索引(可选,从1开始计数) **示例**: ```php <!-- 控制器传递数据 --> $data = ['苹果', '香蕉', '橙子']; $this->assign('fruits', $data); <!-- 模板中使用 --> <ul> {volist name="fruits" id="fruit" key="k"} <li>第{$k}个水果: {$fruit}</li> {/volist} </ul> ``` 输出结果: ``` 1. 第1个水果: 苹果 2. 第2个水果: 香蕉 3. 第3个水果: 橙子 ``` --- #### 二、高级用法 1. **嵌套循环**(引用[1]) ```php {volist name="categories" id="category"} <h3>{$category.name}</h3> <select> {volist name="category.subs" id="sub"} <option value="{$sub.id}">{$sub.name}</option> {/volist} </select> {/volist} ``` 2. **MOD 属性控制样式**(引用[2]) ```php {volist name="list" id="item" mod="4"} <div class="{eq name="mod" value="0"}row-highlight{/eq}"> {$item.title} </div> {eq name="mod" value="3"}<br/>{/eq} <!-- 每4个换行 --> {/volist} ``` 3. **空数据处理** ```php {volist name="emptyList" id="item" empty="<span class='empty'>暂无数据</span>"} {$item.name} {/volist} ``` 4. **控制显示范围** ```php {volist name="bigList" id="item" offset="5" length="10"} <!-- 从第6条开始显示10条 --> {$item.id} {/volist} ``` --- #### 三、配合自定义函数(引用[3]) 在控制器中处理数据: ```php // 控制器 $data = Db::name('product')->select(); $processed = array_map(function($item){ $item['price'] = price_format($item['price']); // 自定义函数处理 return $item; }, $data); $this->assign('products', $processed); ``` 模板中直接使用: ```php {volist name="products" id="prod"} <div>{$prod.name} - 折扣价: {$prod.price}</div> {/volist} ``` --- #### 四、特殊技巧 1. **获取循环索引**(从0开始) ```php {volist name="list" id="item" key="k"} 索引: {$k-1} <!-- 输出0,1,2... --> {/volist} ``` 2. **奇偶行样式** ```php {volist name="rows" id="row"} <tr class="{eq name="mod" value="1"}odd{else/}even{/eq}"> {$row.content} </tr> {/volist} ``` --- #### 五、注意事项 1. 数据集变量需通过`assign()`方法传递到模板 2. 嵌套循环时内层`name`需用`$`引用外层变量(如`$category.subs`) 3. `mod`属性的值表示分组数量(非索引值) 4. 在ThinkPHP 5.1+中支持直接使用PHP函数处理数据[^3] > 通过灵活组合这些用法,可高效实现商品列表、多级菜单、表格数据等动态内容渲染。 --- ### 相关问题 1. 如何在 `volist` 循环中调用自定义模型方法? 2. `volist` 和 `foreach` 标签在性能上有何差异? 3. 如何实现 `volist` 循环的分页加载? 4. 在嵌套循环中如何访问外层循环的变量? 5. `volist` 的 `mod` 属性有哪些高级应用场景?[^2] [^1]: 这里使用最简单的方法,写在option里面是无效的(这里是我用的方法):{volist name="condition" id="v" key="k"}...{/volist} [^2]: Thinkphp中,volist模板标签的Mod属性的使用方法。Mod属性还用于控制一定记录的换行 [^3]: php赋值数据集,thinkphp5.1程序:volist中使用自定义函数设定数据集
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值