+ -
当前位置:首页 → 问答吧 → phpcms2007标签模板技术分析--大伙一块讨论啊

phpcms2007标签模板技术分析--大伙一块讨论啊

时间:2008-07-22

来源:互联网

根目录/include/global.func.php里的三个与tag标签有关的函数
复制内容到剪贴板
代码:
function tag_write($keyid, $name)
{
        global $mod,$channelid;
        ob_start();
        tag_data($keyid, $name);
        $data = ob_get_contents();
        ob_clean();
        $dir = PHPCMS_ROOT.'/data/tagscache/'.$keyid.'/';
        $file = $dir.$mod.'_'.$channelid.'_'.urlencode($name).'.html';
        dir_create($dir);
        file_put_contents($file, $data);
        @chmod($file, 0777);
        return $data;
}

function tag_read($keyid, $name)
{
        global $CONFIG,$PHP_TIME;
        if(!isset($keyid) || !$keyid) return '<span style="color:red">$keyid undefined</span>';
        if(defined('CREATEHTML') || $CONFIG['phpcache'] != '1') return tag_data($keyid, $name);
        $file = PHPCMS_ROOT.'/data/tagscache/'.$keyid.'/'.urlencode($name).'.html';
        if(!file_exists($file) || (filemtime($file) < $PHP_TIME - $CONFIG['phpcacheexpires'])) return tag_write($keyid, $name);
        include $file;
}

function tag_data($keyid, $name)
{
        global $tags,$mod,$MODULE,$CHANNEL,$CONFIG;
    if(!$tags) require PHPCMS_ROOT.'/templates/'.$CONFIG['defaulttemplate'].'/tags.php';
    if(is_numeric($keyid))
        {
                $channelid = intval($keyid);
                $module = $CHANNEL[$channelid]['module'];
        }
        else
        {
                $channelid = $GLOBALS['channelid'];
                $module = $keyid;
        }
    if(isset($MODULE[$module]))
        {
                require_once PHPCMS_ROOT.'/'.moduledir($module).'/include/tag.func.php';
                eval($tags[$name].';');
        }
}
意思大概都懂吧,tag_write和tag_read供调用,tag_data干实际的事儿,

另外: eval($tags[$name].';'); 这句啥意思大虾给点一下

PHPCMS_ROOT.'/templates/'.$CONFIG['defaulttemplate'].'/tags.php'; 这个文件里定义了$tags数组中文标签名对应的函数,比如
复制内容到剪贴板
代码:
$tags = array (
  '专题幻灯片' => 'phpcms_special_slide(0,1,5,24,0,30,250,220,5000,-1)',
  '类别导航' => 'phpcms_type(0,$keyid)',
......
  '专题文章' => 'article_list(0,1,0,1,2,0,10,30,0,0,0,0,0,0,0,0,0,0,1,\'\')',
  '类别最新文章' => 'article_list(0,$channelid,0,1,0,0,10,68,0,$typeid,0,0,0,2,1,0,0,1,1,\'\')',
.......
然后根据module来决定要引入的tag.func.php, module是phpcms就引入根目录/include/tag.func.php, 里面有专门处理以phpcms_开头的标签函数;
module是article就引入根目录/module/article/include/tat.func.php,里面有专门处理以article_开头的标签函数;

难点就在tag.func.php里的函数上,以及怎么新建标签和修改标签,听说新建标签是选择相应的标签模板,不知道啥意思,

大虾们跟帖啊...

老逆你就歇着吧,雷声大,雨点小

[ 本帖最后由 fan12 于 2008-7-21 18:40 编辑 ]

作者: fan12   发布时间: 2008-07-21

掉出首页前给它来一顶

作者: fan12   发布时间: 2008-07-22

我支持。  我时间的确比较少。人到中年是比较忙了。不好意思了各位兄弟。  继续讲解。我帮你每天顶下

呵呵

作者: 逆雪寒   发布时间: 2008-07-23

老大,终于出现了,不过我比你老,

我是要用这个做网站,不是为了学编程, 所以希望有人出来讲,

其实程序不难看懂, 主要是应用逻辑不太了解,所以看起来特别慢

慢慢前行吧

作者: fan12   发布时间: 2008-07-24

eval($tags[$name].';');之后, 相应的tag.func.php里的标签处理函数开始执行, 比如下面是module\article\include\tag.func.php里的函数:
复制PHP内容到剪贴板
PHP代码:
function article_list($templateid = '', $channelid = 1, $catid = 0, $child = 1, $specialid = 0, $page = 0, $articlenum = 10, $titlelen = 30, $introducelen = 0, $typeid = 0, $posid = 0, $datenum = 0, $ordertype = 0, $datetype = 0, $showcatname = 0, $showauthor = 0, $showhits = 0, $target = 0, $cols = 1, $username = '') 
{
 global $db, $PHP_TIME, $CONFIG, $CHANNEL, $CHA, $CATEGORY, $MODULE, $FIELD, $TEMP, $skindir;
 $temp_id = 0;
 if($page == 0 && defined('CREATEHTML'))
 {
  $temp_id = $templateid.$channelid.$catid.$child.$specialid.$page.$articlenum.$titlelen.$introducelen.$typeid.$posid.$datenum.$ordertype.$datetype.$showcatname.$showauthor.$showhits.$target.$cols.$username;
 }
 if($temp_id && isset($TEMP['tag'][$temp_id])) 
 {
        $articles = $TEMP['tag'][$temp_id];
 }
 else
 {
  if(!isset($CHA) || $CHA['channelid'] != $channelid) channel_setting($channelid);
  $datetypes = array('', 'Y-m-d', 'm-d', 'Y/m/d', 'Y.m.d', 'Y-m-d H:i:s', 'Y-m-d H:i');
  $ordertypes = array('listorder DESC, articleid DESC', 'edittime DESC', 'edittime ASC', 'hits DESC', 'hits ASC', 'comments DESC', 'comments ASC');
  $page = isset($page) ? intval($page) : 1;
  $specialid = intval($specialid);
  $typeid = intval($typeid);
  if($datetype < 0 || $datetype > 6) $datetype = 0;
  if($ordertype < 0 || $ordertype > 6) $ordertype = 0;
  $tablename = $CONFIG['tablepre'].'article_'.$channelid;
  $listpages = 0;
  $condition = '';
  if($catid) 
  {
   if(is_numeric($catid))
   {
    if($child && $CATEGORY[$catid]['child'] && $CATEGORY[$catid]['arrchildid'])
    {
     $condition .= ' AND catid IN ('.$CATEGORY[$catid]['arrchildid'].') ';
    }
    else
    {
     $condition .= " AND catid=$catid ";
     $listpages = 1;
    }
   }
   else
   {
    $condition .= " AND catid IN ($catid) ";
   }
  }
  if($posid)
  {
   $articleids = @file_get_contents(PHPCMS_ROOT.'/'.$CHANNEL[$channelid]['channeldir'].'/pos/'.$posid.'.txt');
   if($articleids) $condition .= " AND articleid IN($articleids)";
  }
  if($specialid) $condition .= " AND specialid=$specialid ";
  if($typeid) $condition .= " AND typeid=$typeid ";
  if($datenum) $condition .= " AND addtime>$PHP_TIME-86400*$datenum ";
  if($username) $condition .= " AND username='$username' ";
  $offset = $page ? ($page-1)*$articlenum : 0;
  if($page && $articlenum)
  {
   $r = $db->get_one("SELECT SQL_CACHE count(*) AS number FROM $tablename WHERE status=3 $condition ","CACHE");
   $pages = $listpages ? listpages($catid, $r['number'], $page, $articlenum) : phppages($r['number'], $page, $articlenum);
  }
  $ordertype = $ordertypes[$ordertype];
  $limit = $articlenum ? " LIMIT $offset, $articlenum " : 'LIMIT 0, 10';
  $articles = array();
  $result = $db->query("SELECT SQL_CACHE articleid,catid,typeid,title,style,islink,showcommentlink,introduce,author,hits,thumb,addtime,listorder,linkurl $FIELD[$tablename] FROM $tablename WHERE status=3 $condition ORDER BY $ordertype $limit ","CACHE");
  while($r = $db->fetch_array($result))
  {
   $r['adddate'] = $datetype ? date($datetypes[$datetype],$r['addtime']) : '';
   $r['linkurl'] = linkurl($r['linkurl']);
   $r['stitle'] = style(str_cut($r['title'], $titlelen , '...'), $r['style']);
   $r['type'] = $r['typeid'] ? show_type($channelid, $r['typeid']) : '';
   $r['introduce'] = $introducelen ? str_cut($r['introduce'], $introducelen , '...') : '';
   if($showcatname)
   {
    $r['catname'] = $CATEGORY[$r['catid']]['catname'];
    $r['catlinkurl'] = linkurl($CATEGORY[$r['catid']]['linkurl']);
   }
   $articles[] = $r;
  }
  $db->free_result($result);
        if($temp_id) $TEMP['tag'][$temp_id] = $articles;
 }
 if($target) $target = ' target="_blank"';
 $width = ceil(100/$cols).'%';
 if(!$templateid) $templateid = 'tag_article_list';
 include template('article', $templateid);
}

作者: fan12   发布时间: 2008-08-01