标签 "PhpCms" 下的文章

phpcms/libs/functions/extention.func.php里面添加一个随机文章列表的函数:

/* * 随机读取文章列表 *
* @param $modelid 模型ID 必须
* @param $catid 栏目ID 可选,为0或未指定调去全模型的数据
* @param $siteid 站点ID 可选,默认为1
* @param $thumb 是否必须有缩微图 可选,默认为0
* @param $num 调用文章数量 可选,默认为10
* @return array 返回随机文章列表数组
*/
function suiji($modelid, $catid, $siteid = 1, $thumb = 0, $num = 10) {if(!$modelid = intval($modelid))return false;        $sitid = intval($siteid) ? intval($siteid) : 1;
                $catid = intval($catid);
                $num = intval($num);
                $thumb = intval($thumb) ? " AND thumb != ''" : '';
                $CATEGORYS = getcache('category_content_'.$siteid,'commons');
                if($CATEGORYS[$catid]['child']){
                                $catids_str = $CATEGORYS[$catid]['arrchildid'];
                                $pos = strpos($catids_str,',')+1;
                                $catids_str = substr($catids_str, $pos);
                                $sql = " AND catid IN ($catids_str)".$thumb;
                } elseif($catid) {
                                $sql = " AND catid='$catid'".$thumb;
                } else {
                                $sql = $thumb;
                }
                $c_db = pc_base::load_model('content_model');
                 $c_db->set_model($modelid);
                
                $id = '';
                
                for($i=1;$i<=$num;$i++)
                {
                                $not = $id ? " AND id NOT IN ($id) " : '';
                                $rs = $c_db->query("SELECT * FROM $c_db->table_name AS t1 JOIN (SELECT ROUND(RAND()*(SELECT MAX(id) FROM $c_db->table_name WHERE status = 99 $sql)) AS id2) AS t2 WHERE t1.id>=t2.id2 and t1.status = 99 $sql $not ORDER BY t1.id ASC LIMIT 1");
                                while($r = mysql_fetch_array($rs,MYSQL_ASSOC)){
                                                $return[]=$r;
                                                $id = $id ? $id.','.$r['id'] : $r['id'];
                                }
                }
                 return $return;
}

使用举例:

<div class="box">
     <h5 class="title-2">随机文章</h5>
     <ul class="content">
     {php $data = suiji(1,0,1,0,15)}
                {loop $data $r}
                <li> · <a href="{$r[url]}" target="_blank" title="{$r[title]}">{str_cut($r[title], 51, '')}</a></li>
                {/loop}
        </ul>
</div>

本修改不影响以后v9升级,因为extention.func.php文件就是官方专门用了让开放者放自己的扩展函数库的。

一般来说,phpcms官方给出的列表页调用demo是不能调用自定义字段的。他的代码是这样的:

{pc:content action="lists" catid="7" order="id DESC" num="4"}
<ul>
{loop $data $k $v}
<li> {$v[title]} </li>
{/loop}
</ul>
{/pc}

但如果你有个自定义字段叫:dl_url 又想在列表页调用,那直接写{$v[dl_url]}是肯定不行的,这个时候就需要在pc:声明的时候加入 moreinfo="1",既完整代码是:

{pc:content action="lists" catid="7" order="id DESC" num="4" moreinfo="1"}
<ul>
{loop $data $k $v}
<li>{$v[title]} </br> {$v[dl_url ]} </li>
{/loop}
</ul>
{/pc}

换句话说,moreinfo参数其实是控制phpcms是否读取*_data扩展字段表的关键参数。

主列字段 (未加入moreinfo参数也能使用的字段)

id
catid
typeid
title
style
thumb
keywords
description
posids
url
listorder
status
sysadd
islink
username
inputtime
updatetime

副列字段 (已加入moreinfo="1"才能使用的字段)

id
content
readpoint
groupids_view
paginationtype
maxcharperpage
template
paytype
allow_comment
relation
以及你所有的自定义字段

V9内容模块,标签多栏目数据调用支持。
打开\phpcms\modules\content\classes\content_tag.class.php文件,找到第61-75行

$catid = intval($data['catid']);
if(!$this->set_modelid($catid)) return false;
if(isset($data['where'])) {
						$sql = $data['where'];
} else {
		$thumb = intval($data['thumb']) ? " AND thumb != ''" : '';
		if($this->category[$catid]['child']) {
				$catids_str = $this->category[$catid]['arrchildid'];
				$pos = strpos($catids_str,',')+1;
				$catids_str = substr($catids_str, $pos);
				$sql = "status=99 AND catid IN ($catids_str)".$thumb;
		} else {
				$sql = "status=99 AND catid='$catid'".$thumb;
		}
}

修改为:

$arr_catid = explode(',',$data['catid']);
if(isset($data['where'])) {
		$sql = $data['where'];
} else {
		$thumb = intval($data['thumb']) ? " AND thumb != ''" : '';
		if(count($arr_catid) > 1){
				$val_arr = array();
				foreach($arr_catid as $key => $val){
						$str_catid = intval($val);
						if(!$this->set_modelid($str_catid)) return false;
						if($this->category[$val]['child']) {
								$catids_str = $this->category[$val]['arrchildid'];
								$pos = strpos($catids_str,',')+1;
								$val_arr[] = substr($catids_str, $pos);
						} else {
								$val_arr[] = $val;
						}
				}
				$imcatid = implode (",",$val_arr);
				$sql = "status=99 AND catid IN ($imcatid)".$thumb;
		}else{
				$catid = $arr_catid[0];
				if($this->category[$catid]['child']) {
						$catids_str = $this->category[$catid]['arrchildid'];
						$pos = strpos($catids_str,',')+1;
						$catids_str = substr($catids_str, $pos);
						$sql = "status=99 AND catid IN ($catids_str)".$thumb;
				} else {
						$sql = "status=99 AND catid='$catid'".$thumb;
				}
		}
		
}

使用范例:

{pc:content action="lists" catid="2,3,4" order="id DESC" num="4"}
<ul>
{loop $data $key $val}
<li> <a href="{$val['url']}">{$val['title']}</a></li>
{/loop}
</ul>
{/pc}

需求:
通过服务器的定时任务自动更新网站全站的所有文章,并生成sitemaps

以下代码为sitemaps crontab for phpcms v9,以下代码保存到phpcms 根目录下,配置cronTab定时生成即可

代码:

<?php
/**
 *  sitemap.php PHPCMS V9 sitemaps入口
 *
 * @copyright           (C) 2015-2018 piaoyun.cc
 * @license             http://piaoyun.cc
 * @lastmodify          2015-05-06
 */
if(PHP_SAPI != 'cli')
{
    header('location: sitemaps.xml');
    exit;
}
define('SITEMAP_SIZE', 10000);  //sitemaps中最大输出数量
define('MODEL_SIZE', 3000);     //每个模型中最大输出数量
$model_arr = array(1=>'资讯', 2=>'图片', 3=>'下载'); //定义需要生成sitemaps的模型
 
define('PHPCMS_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR);
include PHPCMS_PATH.'/phpcms/base.php';
 
$param = pc_base::load_sys_class('param');
 
$model_arr = empty($model_arr) ? getcache('model','commons') : $model_arr;
 
$map = array();
foreach ($model_arr as $modelid => $model)
{
    $tablename = $model['tablename'];
     
    $db = pc_base::load_model('content_model');
    $db->set_model($modelid);
     
    if($db->count() && count($map) < SITEMAP_SIZE)
    {
        $order = 'id desc';
        $arc = $db->select(array('status'=>99), 'url,updatetime', MODEL_SIZE, $order);
        $map = array_merge($map, $arc);
    }
}
 
/* 遍历生成 */
$html = '<?xml version="1.0" encoding="utf-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
 
foreach ($map as $row)
{
    if(empty($row) || empty($row['url'])) continue;
     
    $date = date("Y-m-d", $row['updatetime']);
    $url = str_replace(array('&', '\'', '"', '>', '<'), array('&amp;', '&apos;', '&quot;', '&gt;', '&lt;'), $row['url']);
    $html .= "
<url>
        <loc>{$url}</loc>
        <lastmod>{$date}</lastmod>
        <changefreq>daily</changefreq>
        <priority>0.8</priority>
</url>";
}
 
$html .= '</urlset>';
file_put_contents('./sitemaps.xml', $html);
?>

{loop subcat(0,0,0,$siteid) $r}
{php $num++}
<div class="w356 left display {if $num%2==0}marginleft10{/if}">
<div class="title left bold"><span class="right"><a href="{$r[url]}" class="bai">更多>></a></span>{$r[catname]}</div>
<ul class="clear left display">
{pc:content action="lists" catid="$r[catid]" num="5" order="id DESC" return="info"}
{loop $info $v}
<li>·<a href="{$v['url']}" target="_blank" title="{$v['title']}"{title_style($v[style])}>{str_cut($v['title'],100)}</a></li>
{/loop}
{/pc}
</ul>
</div>
{/loop}

上面这段代码是循环所有栏目的,

{loop subcat(0,0,0,$siteid) $r}
{php $num++}

看到这个没.这是循环所有栏目,没有过滤。在下面加上下面的代码即可只显示自己要的栏目。

{php if($r['catid']==1 || $r['catid']==2 || $r['catid']==3) continue;}

类似这样.要别的栏目就把id加到这里,格式如 $r['catid']==id 数字

|| 两竖线表示 或者 的意思。

PS:如果要现在某些栏目不出现,可以这样:

{php if($r['catid']==15) break;}

这样的话,栏目ID为15的不会显示在首页。

先上效果图:
20130527045719659

在这里的“1、2、3……8”就是所谓的标题前面的排行数字。

大家先想想应该怎么做呢?

假想一:

用背景图,具体用图片的方式,事先做好带有“1、2、3……8”的背景图,作为整个List的背景。
点评:可以实现,但是缺乏灵活性,而且图片会大,不够精简。

假想二:

把不同图标做成不同的小图标,然后手动写每一行li的class或者id,这样实现“1、2、3……8”。
点评:可以实现,但是不便于大量调用,不适合写在模板里边。

下面分享两个具体的Phpcms V9文章调用标题前面显示排行序号调用代码:

调用代码一:

{pc:content action="hits" catid="$catid" num="8" order="monthviews DESC" cache="3600"}
{loop $data $k $v}
<li><strong class="num2">{$n}</strong><a title="{$v[title]} - {number_format($v[monthviews])}" href="{$v[url]}">{str_cut($v[title],36,'...')}</a></li>
{/loop}
{/pc}

调用代码二:

{pc:content action="lists" catid="$catid" order="id DESC" num="10"}
{php $j=1;}
{loop $data $v}
<li>{php echo $j}<a href="{$v[url]}">{str_cut($v['title'],44,'')}</a></li>
{$j++}
{/loop}
{/pc}

调用代码三:

{php $i=0;}
{loop $data $n $r}
{php $i++;}
<dl class="f_{$i}">
<dt><a href="{userlink}" target="_blank">{username}</a></dt>
<dd>
<a href="{userlink}" alt="{username}" target="_blank"><img src="{photo}" alt="好友数:{friendnum}" width="40" height="40" /></a>
<STRONG> </STRONG> 
<div>人气:{viewnum}</div>
</dd>
</dl>
{/loop}

调用代码四:

{pc:content action="hits" catid="$catid" num="7" order="monthviews DESC" cache="3600" return="orderlist"}
{loop $orderlist $v}
{php if($n<=3){$s='t';}else{$s='';}}
{php if($n<=9){$m=0;}else{$m='';}}
<li><s class="{$s}">{$m}{$n}</s><a href="{$v[url]}"{title_style($v[style])} title="{$v[title]}">{str_cut($v['title'],50)}</a></li>
{/loop}
{/pc}

采用{$n}或者{$j++}的方式,让调用的数据前面的数字递增。

具体CSS方面的匹配,大家尝试下!相信不会难到大家!

修改实现方法:PHPCMS V9 自定义栏目伪静态实现方法

栏目页伪静态(不生成HTML)时,URL规则中{$categorydir}{$catdir}仍显示为{$categorydir}{$catdir}解决方法。

第一步:打开phpcms\modules\content\classes\url.class.php;

第二步:将122行

$url = str_replace(array('{$catid}', '{$page}'), array($catid, $page), $urlrule);

替换为

$category_dir = $this->get_categorydir($catid);
$url = str_replace(array('{$catid}', '{$page}','{$catdir}','{$categorydir}'), array($catid, $page,$category['catdir'],$category_dir), $urlrule);

第三步:保存
使用须知:
1.更改前请先备份原文件;官方升级如果升级此文件,需要再次修改;
2.{$categorydir}后默认有'/',{$catdir}后默认无 '/'

3.案例:

URL示例:guolei/index.html|guolei/list-2.html
URL规则:{$catdir}/index.html|{$catdir}/list-{$page}.html

伪静态规则:

RewriteRule ^guonei(/|/index.html)$ index.php?m=content&c=index&a=lists&catid=6
RewriteRule ^guonei/list-([0-9]+).html$ index.php?m=content&c=index&a=lists&catid=6&page=$1

4.如有不足之处,请在下方回复说明。

phpcmsV9栏目伪静态的修改方法(支持自定义目录名),官方程序默认伪静态是不支持自定义栏目名的,所以今天就做了以下修改,让其支持!

首先看urlrewrite的规则,这个是Apache下的,其它环境下的规则自己转换下

RewriteRule ^(.*)(.*)/$ /index.php?m=content&c=index&a=lists&catdir=$1
RewriteRule ^(.*)(.*)/index([0-9]+).html$ /index.php?m=content&c=index&a=lists&categorydir=$1&catdir=$2&page=$3

1、打开phpcms\modules\content目录下的index.php找到 public function lists() {,将$catid = intval($_GET['catid']);替换成:

if(isset ($_GET['catid'])){   
                    $catid = intval($_GET['catid']);   
                }else{   
                    $catdir=$_GET['catdir'];   
                    if($catdir==""){   
                        $catdir=$_GET['categorydir'];   
                    }   
                    $s=$this->_getCategoryId($catdir);   
                    $catid=$s[0][catid];                      
                }

并且在最后的 }?> 添加:

/**           *根据栏目名获得ID           
* @param <type> $catdir           */  
        function _getCategoryId($catdir){   
            $this->category_db = pc_base::load_model('category_model');   
            $result = $this->category_db->select(array('catdir'=>$catdir));   
           // print_r($result);   
            return $result;   
         }

2、打开phpcms\modules\content\classes目录中的url.class.php,找到

if (!$setting['ishtml']) { //如果不生成静态

将下面的:

$url = str_replace(array('{$catid}', '{$page}'), array($catid, $page), $urlrule);   
            if (strpos($urls, '\\')!==false) {  
                    $url = APP_PATH.str_replace('\\', '/', $urls);   
            }

替换成:

$domain_dir = '';   
            if (strpos($category['url'], '://')!==false && strpos($category['url'], '?')===false) {   
                if (preg_match('/^((http|https):\/\/)?([^\/]+)/i', $category['url'], $matches)) {   
                    $match_url = $matches[0];   
                    $url = $match_url.'/';   
                }   
                $db = pc_base::load_model('category_model');   
                $r = $db->get_one(array('url'=>$url), '`catid`');   
  
                if($r) $domain_dir = $this->get_categorydir($r['catid']).$this->categorys[$r['catid']]['catdir'].'/';   
            }   
            $categorydir = $this->get_categorydir($catid);   
            $catdir = $category['catdir'];   
            $year = date('Y',$time);   
            $month = date('m',$time);   
            $day = date('d',$time);   
            //echo $catdir;   
            $urls = str_replace(array('{$categorydir}','{$catdir}','{$year}','{$month}','{$day}','{$catid}','{$id}','{$prefix}','{$page}'),array($categorydir,$catdir,$year,$month,$day,$catid,$id,$prefix,$page),$urlrule);   
                       // echo $urls."<br>";   
                        if (strpos($urls, '\\')!==false) {  
                    $urls = APP_PATH.str_replace('\\', '/', $urls);   
            }   
                        $url = $domain_dir.$urls;

3、后台URL规则中添加:

url示例:1/
url规则:/{$categorydir}/{$catdir}/|/{$categorydir}/{$catdir}/index{$page}.html

更新栏目缓存就OK了。

在loop里面使用了{title_style($v[style])}标题样式,如果当前标题不存在样式(高亮、加粗),就会生成多余的废弃代码 style="" 。如:<a href="{$v['url']}" target="_blank" style="">标题</a>
看了不舒服吧。

修改:phpcms\libs\functions\global.func.php 1476行开始

/**
 * 生成标题样式
 * @param $style   样式
 * @param $html    是否显示完整的STYLE
 */

function title_style($style, $html = 1) {
	$str = '';
	if ($html) $str = ' style="';
	$style_arr = explode(';',$style);
	if (!empty($style_arr[0])) $str .= 'color:'.$style_arr[0].';';
	if (!empty($style_arr[1])) $str .= 'font-weight:'.$style_arr[1].';';
	if ($html) $str .= '" ';
	return $str;
}

修改成:

/**
 * 生成标题样式
 * @param $style   样式
 * @param $html    是否显示完整的STYLE
 */
function title_style($style, $html = 1) {
	if (!empty($style)){
	$str = '';
	if ($html) $str = ' style="';
	$style_arr = explode(';',$style);
	if (!empty($style_arr[0])) $str .= 'color:'.$style_arr[0].';';
	if (!empty($style_arr[1])) $str .= 'font-weight:'.$style_arr[1].';';
	if ($html) $str .= '"';
	return $str;
}
}

目前还无法确定这次漏洞是官方有人故意为之,还是被劫持,还是被黑....

目前解决方案就是断开在线更新检测
编辑修改phpcms\modules\admin\index.php
//被注释部分

	public function public_main() {
		pc_base::load_app_func('global');
		pc_base::load_app_func('admin');
		define('PC_VERSION', pc_base::load_config('version','pc_version'));
		define('PC_RELEASE', pc_base::load_config('version','pc_release'));	

		$admin_username = param::get_cookie('admin_username');
		$roles = getcache('role','commons');
		$userid = $_SESSION['userid'];
		$rolename = $roles[$_SESSION['roleid']];
		$r = $this->db->get_one(array('userid'=>$userid));
		$logintime = $r['lastlogintime'];
		$loginip = $r['lastloginip'];
		$sysinfo = get_sysinfo();
		$sysinfo['mysqlv'] = mysql_get_server_info();
		$show_header = $show_pc_hash = 1;
		/*检测框架目录可写性*/
		$pc_writeable = is_writable(PC_PATH.'base.php');
		$common_cache = getcache('common','commons');
		$logsize_warning = errorlog_size() > $common_cache['errorlog_size'] ? '1' : '0';
		$adminpanel = $this->panel_db->select(array('userid'=>$userid), '*',20 , 'datetime');
		$product_copyright = base64_decode('5LiK5rW355ub5aSn572R57uc5Y+R5bGV5pyJ6ZmQ5YWs5Y+4');
		$architecture = base64_decode('546L5Y+C5Yqg');
		$programmer = base64_decode('546L5Y+C5Yqg44CB6ZmI5a2m5pe644CB546L5a6Y5bqG44CB5byg5LqM5by644CB6YOd5Zu95paw44CB6YOd5bed44CB6LW15a6P5Lyf');
 		$designer = base64_decode('5byg5LqM5by6');
		//ob_start();      //注释此行,By:PiaoYun.CC
		include $this->admin_tpl('main');
		//$data = ob_get_contents();      //注释此行,By:PiaoYun.CC
		//ob_end_clean();      //注释此行,By:PiaoYun.CC
		//system_information($data);      //注释此行,By:PiaoYun.CC
	}

修改phpcms\modules\admin\templates\main.tpl.php

查找:

class="pad-10 display"

修改为:

class="pad-10"

至此结束

至于已经被添加了用户的请注意,以上操作并不能完全解决
目前发现的到后台模块->数据源 查看有没有一个名为123的调用,有删除
到caches目录下看是否有error_logaa.php文件删除.

目前发现的就是这些,因为自己没有出现也无法深入跟踪
没有发现以上的也不要以为就没事了,因为你的信息已经被提交到人家哪?
想搞你看心情的事情了.

所以还是替换加密解密函数吧!

在做开发的时候也做了一把编辑,突然发现在加内容的时候发现有时要在phpcms v9编辑器加文字超链接,每加一个就要设置下它的属性及打开方式,于是就想修改phpcms v9编辑器超链接默认新窗口打开。开始在网上找了些内容有的是修改图片添加属性的,就是没有修改链接的,于是看到了一个dedecms修改的,按照其类似方法摸索,找了phpcms v9编辑器超链接的修改方法。方法如下:

首先找到link.js文件的路径\statics\js\ckeditor\plugins\link\dialogs,然后“Ctrl+F”工具搜索查找

'default':'notSet'

代码这个就是设置超链接打开方式target属性的,把其改为

'default':'_blank'

即可。记得上传你的服务器后清理缓存文件,后面添加内容效果默认如下图:
phpcms V9编辑器添加超链接后默认新窗口打开的修改方法

phpcms V9是一个非常优秀的CMS管理系统,但是每一个CMS都不可能是完美的,很多功能需要经过二次开发,修改部分内核才能得到自己想要的效果,比如:在默认情况下,phpcms不支持调用全站文章排行。phpcms只支持调用当前文章排行,代码如下:

{pc:content action="hits" catid="$catid" num="10" order="views DESC" cache="3600"}

其中$catid为待调用栏目的id,如果想实现全站调用,需要修改phpcms\modules\content\classes\content_tag.class.php文件,找到以下函数(大概在:148——196行):

/**
 * 排行榜标签
 * @param $data
 */
public function hits($data) {
    $catid = intval($data['catid']);
    if(!$this->set_modelid($catid)) return false;

    $this->hits_db = pc_base::load_model('hits_model');
    $sql = $desc = $ids = '';
    $array = $ids_array = array();
    $order = $data['order'];
    $hitsid = 'c-'.$this->modelid.'-%';
    $sql = "hitsid LIKE '$hitsid'";
    if(isset($data['day'])) {
        $updatetime = SYS_TIME-intval($data['day'])*86400;
        $sql .= " AND updatetime>'$updatetime'";
    }
    if($this->category[$catid]['child']) {
        $catids_str = $this->category[$catid]['arrchildid'];
        $pos = strpos($catids_str,',')+1;
        $catids_str = substr($catids_str, $pos);
        $sql .= " AND catid IN ($catids_str)";
    } else {
        $sql .= " AND catid='$catid'";
    }
    $hits = array();
    $result = $this->hits_db->select($sql, '*', $data['limit'], $order);
    foreach ($result as $r) {
        $pos = strpos($r['hitsid'],'-',2) + 1;
        $ids_array[] = $id = substr($r['hitsid'],$pos);
        $hits[$id] = $r;
    }
    $ids = implode(',', $ids_array);
    if($ids) {
        $sql = "status=99 AND id IN ($ids)";
    } else {
        $sql = '';
    }
    $this->db->table_name = $this->tablename;
    $result = $this->db->select($sql, '*', $data['limit'],'','','id');
    foreach ($ids_array as $id) {
        if($result[$id]['title']!='') {
            $array[$id] = $result[$id];
            $array[$id] = array_merge($array[$id], $hits[$id]);
        }
    }
    return $array;
}

将此段代码修改为:

/**
 * 排行榜标签
 * @param $data
 */
public function hits($data) {
    $catid = intval($data['catid']);

    $this->hits_db = pc_base::load_model('hits_model');
    $sql = $desc = $ids = '';
    $array = $ids_array = array();
    $order = $data['order'];
    $hitsid = 'c-'.$this->modelid.'-%';
    $sql = "hitsid LIKE '$hitsid'";
    if(isset($data['day'])) {
        $updatetime = SYS_TIME-intval($data['day'])*86400;
        $sql .= " AND updatetime>'$updatetime'";
    }
    if(!empty($catid) && $catid>0) { //添加判断:id是否为空
        if(!$this->set_modelid($catid)) return false;
        if($this->category[$catid]['child']) {
            $catids_str = $this->category[$catid]['arrchildid'];
            $pos = strpos($catids_str,',')+1;
            $catids_str = substr($catids_str, $pos);
            $sql .= " AND catid IN ($catids_str)";
        } else {
            $sql .= " AND catid='$catid'";
        }
    }

    $hits = array();
    $result = $this->hits_db->select($sql, '*', $data['limit'], $order);
    foreach ($result as $r) {
        $pos = strpos($r['hitsid'],'-',2) + 1;
        $ids_array[] = $id = substr($r['hitsid'],$pos);
        $hits[$id] = $r;
    }
    $ids = implode(',', $ids_array);
    if($ids) {
        $sql = "status=99 AND id IN ($ids)";
    } else {
        $sql = '';
    }
    $this->db->table_name = $this->tablename;
    $result = $this->db->select($sql, '*', $data['limit'],'','','id');
    foreach ($ids_array as $id) {
        if($result[$id]['title']!='') {
            $array[$id] = $result[$id];
            $array[$id] = array_merge($array[$id], $hits[$id]);
        }
    }
    return $array;
}

修改代码后,无论设置栏目id为0或空,都能调取全站文章排行。

调用方法1:

{pc:content action="hits" catid="0" num="10" order="views DESC" cache="3600"}

调用方法2:

{pc:content action="hits" num="10" order="views DESC" cache="3600"}

nopri

 

最简单的改法是不需要动数据库,直接在后台操作,这种方法强力推荐,操作如下:

1、登陆phpcms后台,扩展管理->菜单管理->移动内容->编辑

方法名本来是move现改成:remove ,这样以后移动的方法在数据库中就是remove了……

2、登陆phpcms后台,设置->角色管理->找到要编辑的角色->权限设置

继续进入要编辑的站点,我没改名字,默认是:默认站点

点设置 找到内容->内容发布管理->管理内容->移动内容

把前面的勾去掉,提交……

再次找到 内容->内容发布管理->管理内容->移动内容

把前面的勾勾上……

到此一切搞定……

原因就是:后台菜单的移动内容是move导致设置权限之后的权限也是move。

修改菜单为remove后重新设置一遍程序会自动把数据库的move全部改成remove……这样就做到了后台 和数据库统一,才能正确判断权限……

其他角色也这样操作一遍……

完全搞定,手工……

很多时候,希望调用多个模型下的最新内容,但是因为V9的模型使用分表储存,使用GET来IN catid却要连表查询十分麻烦,所以使用下面的办法即可搞定:

第一步:

phpcms\libs\functions\extention.func.php

里面增加

function news($limit="",$modelid="",$where="")
{
  $db=pc_base::load_model('content_model');
  if((strpos($modelid,",")>=0))
  {
   $modelid=explode(",",$modelid);
   $midarr=$dot='';
   foreach($modelid as $mid)
   {
    $midarr=$midarr.$dot.$mid;
    $dot=',';
   }
   $sq="`modelid` IN ({$midarr})";
  }
  else
  {
   $sq="`modelid`={$modelid}";
  }
  $db->table_name='v9_model';
  $models=$db->select($sq,"tablename");
  $sql='';
  $lianhe='';
  foreach($models as $name)
  {
   $sql=$sql.$lianhe."SELECT id,catid,title,url,inputtime FROM v9_{$name['tablename']}";
   $lianhe=' UNION ALL ';
  }

  $time=time();
  $sql=$sql." ".$where." order by inputtime desc limit  ".$limit;

  $allnews=$db->query($sql);
  while($r = $db->fetch_array($allnews))
  {
   if($keyfield)
   {
    $key = $r[$keyfield];
    $array[$key] = $r;
   }
   else
   {
    $array[] = $r;
   }
  }
  return $array[0];
}

以上代码需要注意的是里面表前缀,这里是V9,使用的时候改成你自己的表前缀,默认是V9

第二步:

调用的方式为:

<?php $recent=news("0,8","1,12");?>
{loop $recent $r}
<li><a href=”{$r['url']}” target=”_blank” title=”{$r['title']}”>{str_cut($r[title],54,”)}</a></li>
{/loop}
{/pc}

解释:
红色数字是调用条数,从0开始调用8条蓝色数字模型ID,不是栏目的ID,多个模型用,分开

在栏目数据调用中从指定行数开始,比如从第2条或第N条开始调用。

这种方法适合的场景:栏目第一条调用缩略图、文章简介,从第二条开始才是标题列表。抓图如下:

phpcms栏目数据定制:第一栏调用缩略图和简介,第二条开始调用标题

 20121105031550373

上图可以看出,一条数据是带有缩略图和简介,而第二条才是是标题列表,这样会导致同项目中显示内容重复。为了避免这种情况发生,我们可以通过order里的LIMIT指明从第N条开始调用数据。

具体方法:

{pc:content action="lists" catid="10" order="id DESC LIMIT 1,4--" num="4"}
<ul class="list lh24 f14">
{loop $data $r}
<li><span class="rt">{date('Y-m-d H:i:s',$r[inputtime])}</span>·<a href="{$r[url]}" target="_blank"{title_style($r[style])}>{$r[title]}</a></li>
{if $n%5==0}<li class="bk20 hr"></li>{/if}
{/loop}
</ul>
{/pc}

这个代码是从第2条开始调用数据,一共调用4篇文章。

其中order="id DESC LIMIT 1,4--"里的两个数字,第1个数字1表示从第2条开始调用,第2个数字4表示共调用4条。

如果改成order="id DESC LIMIT 0,4--"那么就表示从第1条开始调用,共调用4条。如果改成order="id DESC LIMIT 2,4--"那么就表示从第3条开始调用,共调用4条。

大家不妨试试看,这样栏目列表从N条开始选择性调用数据方法,避免内容重复。

列表页想弄成两栏布局,左栏显示最新文章,右栏显示第一篇文章内容,查找了资料,可以直接用下面的标签调用出来,标签如下:

{pc:content action="lists" order="id DESC" num="1" moreinfo="1"}
{loop $data $key $val}
标题:{$val['title']}
内容:{$val['content']}
{/loop}
{/pc}

但是又想固定显示某篇文章,研究了一下只能用推荐位来实现,但是推荐位不能调用附表,所以只能用GET标签了,标签如下:

{php $j=$catid;}
{pc:get sql="select `d`.`content` from `v9_jc8883_data` as `d` left join `v9_position_data` as `p` on `d`.`id`=`p`.`id` where `p`.`posid`='14' and `p`.`catid`='$j' order by `d`.`id` desc" num="10"}
{loop $data $r}
{$r[content]}
{/loop}
{/pc}

或者下面的标签页可以:

{pc:content action="position" posid="14" catid="59" order="listorder DESC" num="1"}
{loop $data $r}
<?php $id = $r['id'];
$sql = "SELECT `content` FROM `v9_jc8883_data` WHERE `id`='$id' LIMIT 0 , 1";
$query = mysql_query($sql);
while($row=mysql_fetch_array($query)){
echo $row[content];
}
?>
{/loop}
{/pc}

关键是moreinfo="1",把附表的内容页调出来。
http://v9.help.phpcms.cn/html/2010/modules_0916/33.html#lists

首先要获取userid

{php $userid= param::get_cookie('_userid');}

然后再判断是否为空

{if $userid}
。。。这里写已经登录之后的代码。。。
{else}
。。。这里写已经登录之后的代码。。。
{/if}

搞定。
如果想要扩展更多的功能,比如内容增加  登录后查看联系方式  的功能,此时我们需要声明一个变量,用来控制登录后的返回页面。

$forward = trim($url);

未登录时的代码

<a href="{APP_PATH}index.php?m=member&c=index&a=login&forward={urlencode($url)}&siteid={$siteid}" >登录查看联系方式</a>

注意链接地址里面要有参数forward={urlencode($url)}   这样用户登录后才能成功返回到之前的内容页面。

完整的代码

{php $userid = param::get_cookie('_userid'); $forward = trim($url);}
{if $userid}
登录后的内容
 {else}
 <a href="{APP_PATH}index.php?m=member&c=index&a=login&forward={urlencode($url)}&siteid={$siteid}" target="_top">
登录查看联系方式
</a>
{/if}

但是如果我们想在首页想要实现的话用这样的方法就行不通了,因为首页为静态,我们可以通过写一个方法来实现。
打开/phpcms/modules/content/index.php  增加

//首页用户登录
public function member() {
$_username = param::get_cookie('_username');
$_userid = param::get_cookie('_userid');
$siteid = isset($_GET['siteid']) ? intval($_GET['siteid']) : '';
//定义站点id常量
if (!defined('SITEID')) {
  define('SITEID', $siteid);
}

$snda_enable = pc_base::load_config('system', 'snda_enable');
include template('member', 'afterlogin');
}

方法名可以自己根据实际情况来定义。然后在首页模板上需要显示的位置增加

<script type="text/javascript">document.write('<iframe src="{APP_PATH}index.php?m=content&c=index&a=member&forward='+encodeURIComponent(location.href)+'&siteid={get_siteid()}" allowTransparency="true"  width="125" height="98" frameborder="0" scrolling="no"></iframe>')</script>

此方法是借鉴了头部mini登录条登录的用法

修改方法:

第一步、

修改 phpcms\modules\content\classes\content_tag.class.php  在最后面的}上面添加

    public function newcontent($data){
    $num = intval($data['limit']) ? intval($data['limit']) : '20';
    // 设置排序
    switch($data['order']){
    case '1':
    $order = ' `id` ASC ';
    break;
    case '2':
    $order = ' `id` DESC ';
    break;
    case '3':
    $order = ' `inputtime` ASC ';
    break;
    case '4':
    $order = ' `inputtime` DESC ';
    break;
    case '5':
    $order = ' `updatetime` ASC ';
    break;
    case '6':
    $order = ' `updatetime` DESC ';
    break;
    default:
    $order = ' `id` DESC ';
    }
    if($data['catid']){
    $catids = explode(',', $data['catid']);
    foreach($catids as $catid){
    $catid = intval($catid);
    if(empty($catid))continue;
    $this->set_modelid($catid);
    $where = $this->category[$catid]['child'] ? ' `catid` IN ('.$this->category[$catid]['arrchildid'].')' : " `catid` = $catid";
    $datas = $this->db->select($where, '*', $num, $order);
    $data[$catid]['data'] = $datas;
    // 记录本次的文章数
    $data['num'][] = count($datas);
    $model_num++;
    }
    }else{
    $models = getcache('model', 'commons');
    foreach($models as $model){
    $this->db->set_model($model['modelid']);
    $datas = $this->db->select('', '*', $num, $order);
    $data[$model['modelid']]['data'] = $datas;
    // 记录本次的文章数
    $data['num'][] = count($datas);
    $model_num++;
    }
    }
    if($data){
    // 获取每个模型应该截取的条数
    $num = ceil($num/$model_num);
    // 循环条数记录用于找出条数不满足的数量然后进行平均
    $w_num = $w_num_t = '';
    foreach($data['num'] as $num_t){
    if($num_t < $num){
    $w_num += $num-$num_t;
    $w_num_t++;
    }
    }
    // 判断是否有不满足平均数的 如果有那么就增加平均值
    if($w_num_t){
    $num += ceil($w_num/($model_num-$w_num_t));
    }
    $datas = array();
    foreach($data as $r){
    $r_n = '';
    if(is_array($r['data']))
    foreach($r['data'] as $r_t){
    $datas[] = $r_t;
    if(++$r_n == $num)break;
    }
    }
    return $datas;
    }else{
    return false;
    }
    }

 第二步:模板调用 、

其实就和默认的文章列表调用差不多

{pc:content action="newcontent" catid="1" num="24" order="1"}

参数说明:
catid:可有可无  加了就只调用指定栏目的信息  多个栏目请使用英文半角的 ,间隔
order:排序 参数值:1-7  具体的含义在代码里面很容易看明白 不祥述
num:调用数量  不指定默认调用20条

1、修改文章后,会重复在v9_keyword_data插入数据
解决办法:
官方最新下载的版本修复了此BUG,对于之前下载的9.3.2版本
在/phpcms/modules/content/fields/keyword/updata.inc.php中找到:

$keyword_data_db->insert(array('tagid'=>$tagid, 'siteid'=>$siteid, 'contentid'=>$contentid));

修改为:

if (!$keyword_data_db->get_one(array('tagid'=>$tagid, 'siteid'=>$siteid, 'contentid'=>$contentid))) {
        $keyword_data_db->insert(array('tagid'=>$tagid, 'siteid'=>$siteid, 'contentid'=>$contentid));
}

2、删除文章不能同时删除对应关键词的问题
解决办法:
在/phpcms/modules/content/content.php找到:
delete函数里

//删除内容

之前加上如下代码:

//删除关键字
$this->keyword_db = pc_base::load_model('keyword_model');
$this->keyword_data_db = pc_base::load_model('keyword_data_model');
$keyword_temp=$this->keyword_data_db->listinfo(array('contentid'=>$id.'-'.$modelid));
$this->keyword_data_db->delete(array('contentid'=>$id.'-'.$modelid));
foreach($keyword_temp as $one){
        $same_keyword=$this->keyword_data_db->listinfo(array('tagid'=>$one[tagid]));
        if(empty($same_keyword)){
                $this->keyword_db->delete(array('id'=>$one[tagid]));
        }
}