phpcms文章内容页如何自定义url
本教程是根据网上的教程做的简单调整
1、添加字段
内容-模型管理-选择你要修改的模型,一般是文章模型,然后是字段管理,添加字段
作为主表字段,选择 是,非常重要,否则在批量生成url中会无法生成自定义字段
字段名为prefix 不建议修改,因为要跟后面的代码关联起来(为什么网上的所有教程都是用的prefix字段么?因为生成url的方法public function show($id, $page = 0, $catid = 0, $time = 0, $prefix = '',$data = '',$action = 'edit',$upgrade = 0)中就有一个prefix字段,默认我们是用不到的,闲着也是闲着,正好我们可以使用此字段,这样就不需要改这个方法了)
字段别名为 html文件名 ,这个随意,好记即可
值唯一选 是,
2、.phpcms\modules\content\classes\url.class.php
查找:$day = date('d',$time);(约第67行)
在其下面增加以下代码:
- $tempid = $id;//赋值给临时id
- if($content_ishtml) {
- if($prefix) {
- $prefix = strtolower(str_replace(" ","-",$prefix));//空格用-代替并小写
- $tempid = $prefix;
- }
- }
再找到代码
- $urls = str_replace(array('{$categorydir}','{$catdir}','{$year}','{$month}','{$day}','{$catid}','{$id}','{$page}'),array($categorydir,$catdir,$year,$month,$day,$catid,$id,$page),$urlrule);
改为:
- $urls = str_replace(array('{$categorydir}','{$catdir}','{$year}','{$month}','{$day}','{$catid}','{$id}','{$page}'),array($categorydir,$catdir,$year,$month,$day,$catid,$tempid,$page),$urlrule);//$id改成$tempid;
3.phpcms\modules\content\classes\html.class.php
查找:
$pageurls[$i] = $this->url->show($id, $i, $catid, $data['inputtime'],'','','edit',$upgrade);
(约第117行)修改为:
$pageurls[$i] = $this->url->show($id, $i, $catid, $data['inputtime'],$data['prefix'],'','edit',$upgrade);
4./phpcms/modules/content/create_html.php
查找:
$urls = $this->url->show($r['id'], '', $r['catid'],$r['inputtime']);
共有三处,批量替换成:
$urls = $this->url->show($r['id'], '', $r['catid'],$r['inputtime'],$r['prefix']);
因为phpcms生成内容页html文件共有三个地方,所以上面的替换就有三处:
a.创建或编辑内容时会生成HTML
b.“内容管理”里下面有个“批量生成HTML”按钮
c.发布管理的“批量更新内容页”,它又包含了选择模型更新和选择栏目更新
最后一步:
修改增加是否唯一判断:(用了我的校验text字段是否唯一的方法之后,此步骤改不改都行)
我新加的自定义字段,设置了判断唯一值。但是当我不想填写这个字段时,他也提示 重复。所以我想有没有办法让他判断,只有在非空值时才判断唯一值?
打开 /phpcms/modules/content/fields/content_input.class.php
查找
if($this->fields[$field]['isunique'] && $this->db->get_one(array($field=>$value),$field) && ROUTE_A != 'edit') showmessage($name.L('the_value_must_not_repeat'));
替换成
if($this->fields[$field]['isunique'] && $value && $this->db->get_one(array($field=>$value),$field) && ROUTE_A != 'edit') showmessage($name.L('the_value_must_not_repeat'));