查看 XOOPS 栏目文章
三月
28

Xoops中获取模块配置参数的方法。

Author Dominic    Category XOOPS     Tags ,

Xoops群(53219504,17380705)中有人询问在开发的时候,怎样获取在xoops_version.php中添加的参数值。其实Xoops中统一管理模块的参数是非常好的一种做法(将在下一个平台性项目中借鉴这个做法),获取的方法也非常简单,针对不同的情况可以分别实现如下:

1、更改现有模块代码,且现有模块代码中包含了全局性变量$xoopsModuleConfig的情况

这种情况比较简单:

global $xoopsModuleConfig;
$configvalue=$xoopsModuleConfig["xxxx"];
//xxxx为xoops_vesion.php中定义的参数对应名称

2、现有模块代码中不包含$xoopsModuleConfig或者自行开发简单模块且不使用Framework

$module_handler = &_gethandler('module');//获取module句柄$module_handler
$module = $module_handler->getByDirname("xxx");//xxx为模块目录名称,获取特定module操作句柄$module
$config_handler = &xoops_gethandler('config');//获取config的句柄$config_handler
$criteria = new CriteriaCompo(new Criteria('conf_modid', $module->getVar('mid')));// 根据上述module的id构建查询参数$criteria
$configs =& $config_handler->getConfigs($criteria);//用config句柄获得特定module的参数配置结果集

foreach(array_keys($configs) as $i)
{
$moduleConfig[$configs[$i]->getVar('conf_name')] = $configs[$i]->getConfValueForOutput();//转化成数组
}
unset($configs);

之后直接使用$moduleConfig['xxxx']就可以访问了,也可以把$moduleConfig设置为全局变量。

3、使用Framework的模块

load_functions("config");
$moduleConfig = mod_loadConfg("moduledirname");

使用Framework的情况可以参考article中代码。

十二月
27

[Hack]Xoops中article模块分类显示页面同时显示子分类文章的方法

Author Dominic    Category XOOPS     Tags , ,

D.J.老大的article模组确实好用,但是在分类文章列表显示页面view.category.php这个文件中却只显示给定栏目ID的文章和子分类列表及子分类文章数。虽然个人比较喜欢这种方式,但这种方式并不适合目前国内流行文章管理系统在显示栏目的文章方式,一般的网站在现实栏目时需要将分类的子分类文章也同时显示出来。

针对目前大多数都是采用两级分类的方式,我对view.category.php做了一些Hack:

1、在view.category. 97行附近修改如下:

$counts_category =& $category_handler->getCategoryCounts(array_keys($categories), "access");
    //Add By XuYong 获取子栏目下给定篇数文章

    $articles_perpage = (empty($start) && empty($list)) ? $xoopsModuleConfig["articles_category"] : $xoopsModuleConfig["articles_perpage"];
    //End Add

foreach( $categories as $id=>$cat){
    //Add By XuYong 获取子栏目下给定篇数文章
    $subcriteria = new CriteriaCompo(new Criteria("ac.ac_publish", 0, ">"));
    $subarticle_id =& $_handler->getIdsByCategory($cat, $articles_perpage, 0, $subcriteria);
    if(count($subarticle_id)>0){
        $criteria = new Criteria("art_id", "(".implode(",",$subarticle_id).")", "IN");
        $tags = array("uid", "writer_id", "art_title", "art_summary", "art_image", "art_pages", "art_categories", "art_time_publish", "art_counter", "art_comments", "art_trackbacks");
        $subarticles_obj =& $article_handler->getAll($criteria, $tags);
    }else{
        $subarticles_obj = array();
    }

    $subcatarticles = array();
    foreach ($subarticle_id as $id) {
        $_article = array(
            "id"        => $id,
            "title"        => $subarticles_obj[$id]->getVar("art_title"),
            "time"        => $subarticles_obj[$id]->getTime($xoopsModuleConfig["timeformat"]),
            "image"        => $subarticles_obj[$id]->getImage(),
            "counter"    => $subarticles_obj[$id]->getVar("art_counter"),
            "comments"    => $subarticles_obj[$id]->getVar("art_comments"),
            "trackbacks"=> $subarticles_obj[$id]->getVar("art_trackbacks")
            );
        if(!empty($xoopsModuleConfig["display_summary"])){
            $_article["summary"] = $subarticles_obj[$id]->getSummary(true);
        }
        $subcatarticles[$id] = $_article;
        unset($_article);
    }

    //End Add
    $subcategories[] = array(
        "id"            => $cat->getVar("cat_id"),
        "title"            => $cat->getVar("cat_title"),
        "articles"        => @intval($counts_article[$cat->getVar("cat_id")]),
        "categories"    => @intval($counts_category[$cat->getVar("cat_id")]),
        "subcatart"  => $subcatarticles
        );
        //Add By XuYong 获取子栏目下给定篇数文章
        unset($subcatarticles);
        //End Add
}
unset($criteria);
$criteria = new CriteriaCompo(new Criteria("ac.ac_feature", 0, ">"));
$criteria->setSort("ac.ac_feature");

2、修改模板文件article_category.html文件,134行附近修改如下:

<{if count($categories) gt 0}>
<div id="category" class="article-category">

    <{foreachq item=cat name=cat from=$categories}>
    <div class="category-header tdbg4" stype="width:80%">
<span class="sizscolor"><b><a href="<{$_url}>/modules/<{$_dirname}>/view.category.php<{$smarty.const.URL_DELIMITER}>c<{$cat.id}>/list"><{$cat.title}></a></b></span>
    </div>

        <{if count($cat.subcatart) gt 0}>
        <div id="article_<{$cat.id}>" class="article-article">
                    <table width="95%" border="0" align="center" cellspacing="0">
                        <{foreachq item=article from=$cat.subcatart}>
                      <tr class="tdlist">
                        <td  width="86%" height="24" class="tdlist">·<a href="<{$xoops_url}>/modules/<{$xoops_dirname}>/view.article.php<{$smarty.const.URL_DELIMITER}><{$article.id}>"><{$article.title}></a>
                                        <{if $article.image}><img src="<{$xoops_url}>/modules/<{$xoops_dirname}>/images/image.gif" width="12px" alt="" /><{/if}>
                        </td>
                        <td width="14%" height="2" class="tdlist"><{$article.time|date_format:"%y-%d-%m"}></td>
                      </tr>
                      <{/foreach}>
                                </table>
        </div>
        <{/if}>
            <div class="article-section-title">
            <span class="subject"> </span>
            <span class="navigation"><a href="<{$xoops_url}>/modules/<{$xoops_dirname}>/view.category.php<{$smarty.const.URL_DELIMITER}>c<{$cat.id}>/list"><{$smarty.const._MORE}></a>
            </span>
            </div>
            <div class="clear"></div>
    <{/foreach}>

</div>
<{/if}>

其中有些样式和一些修改是根据当前需要改的,需要根据自身情况调整。

效果demo;

view_category_hack_demo

 

Hack后的iview.category.php和模板文件下载:

十二月
26

Xoops中weblinks模组1.13版简体中文UTF8字符集乱码解决及语言包

Author Dominic    Category XOOPS     Tags , ,

今天xoops.org.cn上有人说道weblinksV1.13版本在用UTF8字符集的时候碰到乱码和RSS、ATOM输出乱码的问题,发现手上的一个小东西也存在这样的问题,虽然weblinks模组现在http://ohwada.net推出了1.82.1版本的weblinks模组,但需要装他们的happy_linux模组,而且目前还没有一个简体中文语言包,也就不想升级到新的weblinks模组了。在培训的间隙,花了点时间分析了以下问题,然来是从简体中文gb2312字符集语言包转换成UTF8语言包时候,虽然可以使用了,但是缺少了关键的UTF8转换处理函数(UTF8是不需要再转换的),导致本身就是utf8的字符串被二次编码,就导致乱码了。

解决办法是在weblinks_language_convert.php文件中加入utf8转换函数。需要清除cache目录中对应的缓存文件。

 

//Add By Xuyong
// 字符集不需要转化
//End Add
function convert_from_utf8($text)
{
    return ($text);
}
function convert_to_utf8($text)
{
    return ($text);
}

完整utf8语言包:

八月
27

用XOOPS构建专题门户社区网站——安徽车市网

Author Dominic    Category XOOPS, 网站管理     Tags

因合作原因,已经于2007年8月份退出了安徽车市网团队,其团队新开发人员可能是更喜欢phpcms,抛弃了XOOPS,于2008年1月15日完成用phpcms替换XOOPS。至此,安徽车市网和XOOPS无关,和dominic无关。 

此文发表于CSDN:http://news.csdn.net/n/20070827/107973.html

2007年初“车行江淮网”决定改版,目标是“将原来小型网站转换成一个综合性汽车专题门户网站和本地汽车社区网站”。我们在进行技术分析时认为,要实现这个目标就需要一个包含内容管理可自由扩展的系统,一个拥有强大的用户管理、页面风格布局管理的系统,一个有基本的文章管理、百科(Wiki)、社区、论坛、图片管理的系统。在综合评估了ASP.Net、JSP、PHP等语言平台下十多种系统之后,我们被XOOPS的面向对象的可扩展智能建站思想吸引,在阅读了几个系统核心源代码之后,发现XOOPS的核心在面向对象方面实现的最彻底,于是XOOPS成为改版“车行江淮网”的不二选择。改版之后的网站命名为“安徽车市网”(http://www.ahcarmarket.com)

“安徽车市网”以符合中文习惯的Article文章管理模块为基础,利用Article模块向外提供了富有Web 2.0元素的汽车资讯服务,最大程度地面向搜索引擎优化,并通过MediaWiki模块提供专门的汽车百科服务。充分利用XOOPS中强大的主题、风格、区块(局部)概念和功能,辅以Page模块自由布局功能和区块皮肤概念,完美实现各个页面的局部自定义显示而不需要太多额外工作量,XOOPS中优良的缓存设计又很好的提供了页面显示速度。

利用XOOPS优秀的可扩展性,“安徽车市网”被打造成一个集资讯、报价、汽车资料、汽车百科、论坛、博客、汽车图库、相册、广告服务、展览服务等多项服务为一身的汽车专题门户社区网站;利用XOOPS优良的架构,“安徽车市网”将通过利用反向代理等技术实现廉价的快速网站访问。XOOPS在不断完善、不断发展壮大,是构建多功能、多服务的门户网站或者社区网站的最佳选择!

八月
7

PHPMailer类发送中文邮件兼谈解决XOOPS中文发送邮件乱码

Author Dominic    Category PHP, XOOPS     Tags ,

.org.cn论坛上又有人问xoops发送中文邮件乱码的问题。domecc给出了一个临时办法,还提供一个网址http://www.thedevlog.com/dev/log-29.html来对utf8编码系统做修正。

其实PHPMailer已经是非常成熟的PHP类了(当然需要打上前一段时间出现的bug的补丁),对于邮件头和邮件体的编码处理已经非常好了,http://www.thedevlog.com/dev/log-29.html中提到修改EncodeHeader并编码,实际上EncodeHeader后面的代码就是完成将头部编码的功能,所以不需要修改该函数。

要成功实现发送中文邮件,设置phpmailer类两个值即可。

$mail = new PHPMailer();
$mail->CharSet = “UTF-8″; // 设置字符集编码,GB2312 GBK
$mail->Encoding = “base64″;//设置文本编码方式
……

这样保证了邮件标题和正文内容全部不会乱码,当然邮件内容的字符集需要和给定的CharSet内容一致。

回过头来看看xoops中为什么邮件乱码,在xoops中发送邮件首先我们使用了具体语言的xoopsmailerlocal.php文件中XoopsMailerLocal类,而XoopsMailerLocal类继承自class\xoopsmailer.php中的XoopsMailer类,而XoopsMailer类的multimailer成员指向自class\mail\xoopsmultimailer.php中的XoopsMultiMailer类的实体,XoopsMultiMailer类是从PHPMailer派生的。

问题就出在XoopsMailer的构造函数上。在XoopsMultiMailer类的构造函数中(xoopsmultimailer.php中177行)指定了CharSet值为strtolower( _CHARSET ),这样做本来在绝大多数邮件系统中均不会出现乱码,但在XoopsMailer类的sendMail方法(xoopsmailer.php中378行)却重新指定了字符集和文本编码方式:

$this->multimailer->CharSet = $this->charSet;
        $this->multimailer->Encoding = $this->encoding;

这样导致前面在构造multimailer的时候指定了字符集为XOOPS系统字符集strtolower( _CHARSET )(utf-8或者gb2312),到sendMail方法中却换成了XoopsMailer的成员charSet的值,而XoopsMailer的构造函数并没有让charSet随系统变化,而是取默认值:iso-8859-1。邮件客户端收到邮件按照iso-8859-1来显示邮件内容当然会乱码。所以我们只要正确的给XoopsMailer类实体赋给正确字符集(_CHARSET)即可。

解决办法是:

打开htdocs\class\xoopsmailer. ,137行附近
$this->multimailer = new XoopsMultiMailer();
$this->reset();
后面添加一行:
$this->charSet = strtolower( _CHARSET );
$this->encoding = ‘base64′;

更完美的解决办法是:

打开htdocs\language\schinese\xoopsmailerlocal.php和htdocs\language\schinese_\xoopsmailerlocal.php 修改为:
<?php
class XoopsMailerLocal extends XoopsMailer {

    function XoopsMailerLocal(){
        $this->XoopsMailer();
        $this->charSet = strtolower( _CHARSET );
        $this->encoding = ‘base64′;
    }
}
?>

实则是xoops 中文版bug。

另外,为什么要指定encoding呢,这里涉及到email的原理,email产生的年代用7bit就足够表示所有ASCII字符可打印字符了,email发展到全世界之后,多字节语种的需要,需要使用8bit或者16bit或者更多bit来表示一个完整的字,但老式的网络设备和一些邮件系统并不能很好的处理不是7bit的内容或者并不能很好处理多字节的文本内容,这样就需要将文本做一个编码,base64和quoted-printable便是email中用来解决这个问题的最流行方法。email中附件都是用base64来编码具体内容的,用base64编码之后的邮件除非文本内容和指定字符集不一致或者本身就是乱码,否则不会出现乱码的。

当时给ceiea做Windows下邮件系统时候对email做了全面的分析,还是有些用处的。

[tags]PHPMailer,中文,邮件,XOOPS[/tags]

八月
1

[Hack]将artile模组中的文章的关键词加入到HTML的Meta头中

Author Dominic    Category XOOPS     Tags , , ,

HTML页面的keywords Meta是非常重要的一个Meta,它提供给搜索引擎以指引,告诉当前页面的主要内容,虽然目前很多搜索引擎均不在把把keywords作为唯一标示,但其重要性还是显著的。XOOPS中可以在后台设置Meta Keywords,通过Smarty变量xoops_meta_keywords写入HTML页面,但这种方式导致所有页面的这个Meta头都一样,影响了keywords Meta的效果,修改article模组的view..php文件和主题模板文件即可达到即兼顾系统设置和页面个性化keywords Meta的目的,我们将发布文章的录入的tag显示在HTML Meta头中。

首先修改htdocs\modules\article\view.article.php文件289行附近,

将原来的

if(@include_once _ROOT_PATH.”/modules/tag/include/tagbar.”){
    $xoopsTpl->assign(‘tagbar’, tagBar($article_obj->getVar(“art_keywords”, “n”)));
}

修改成:

$extra_meta_keywords = $article_obj->getVar(“art_keywords”, “n”);//Modifyed By XuYong 添加tag到html的meta标签
if(@include_once XOOPS_ROOT_PATH.”/modules/tag/include/tagbar.php”){
    $xoopsTpl->assign(‘tagbar’, tagBar($article_obj->getVar(“art_keywords”, “n”)));
    if(!empty($extra_meta_keywords))$extra_meta_keywords = str_replace(tag_get_delimiter(), “,”, $extra_meta_keywords);//Modifyed By XuYong 添加tag到html的meta标签
}
$xoopsTpl -> assign(“extra_meta_keywords”,$extra_meta_keywords);//Modifyed By XuYong 添加tag到html的meta标签

 即通过增加extra_meta_keywords Smarty变量达到个性化keywords Meta 的目的。

再修改站点所用到的主题模板文件theme.html,将原来的

<meta name=”keywords” content=”<{$xoops_meta_keywords}>” />

 修改成

<meta name=”keywords” content=”<{$extra_meta_keywords}>,<{$xoops_meta_keywords}>” />

八月
1

[Hack]让article模组显示的文章打印功能和RSS输出功能使用站点Logo

Author Dominic    Category XOOPS     Tags , ,

article模组中显示的文章的时候下面的工具箱中的打印功能输出页面头部会打印个图片,而这个图片却是article模组xoops_version.php中配置的模块图片,打印出来实在是有些刺眼,RSS输出的地方也是这样。还是改成站点的Logo图片比较好

首先修改htdocs\modules\\print.php文件90行处,

将原来的

$print_data["image"] = _URL . “/modules/” . $xoopsModule->getVar(“dirname”) . “/” . $xoopsModule->getInfo( ‘image’ );

 修改成:

$print_data["image"] = XOOPS_URL . “/images/logo.jpg”;//Modified By XuYong 采用站点Logo

再修改htdocs\modules\article\xml. 284行附近,

将原来的

“url”            => XOOPS_URL.”/modules/”.$GLOBALS["artdirname"].”/”.$xoopsModule->getInfo(“image”),

修改成:

“url”            => XOOPS_URL.”/images/logo.jpg”,

其中Logo的具体路径要根据实际情况调整。

八月
1

[Hack]解决article模组中添加文章时使用html标签导致段落换行不正确的问题

Author Dominic    Category XOOPS     Tags , ,

article模组发布文章是在编辑器下面有几个选项:“使用HTML标签”、“使用表情图”、“启用Xoops内置码”、“启用换行符(如果启用HTML标签,建议关闭) ”,一般都是选中状态(可能有配置项,但是好像默认是都选中),不明白的是为什么里面都提示“如果启用HTML标签,建议关闭”了就是不把第一个和第四个做成反选(加个Javascript控制一下就可以了),直接导致发布文章之后文章显示会换行2次,在HTML源代码中可以看到在行跟行之间出现了<BR><BR>2次,导致行与行之间多出一个br。

解决办法:编辑htdocs\modules\\edit..php文件111行,

将原来的

$dobr = $article_obj->isNew() || $newpage;

改成:

//Modified By XuYong 根据 $dohtml 调整$dobr默认值
if($dohtml==0)
{
    $dobr = $article_obj->isNew() || $newpage;
}
else
{
    $dobr = 0;
}

 这样设置了“使用HTML标签”就会自动关闭“启用换行符”了。

七月
26

[Hack]让Article模组子分类的文章可以加入到上级分类的专题中

Author Dominic    Category XOOPS     Tags , ,

当在article的某个分类添加了一个专题之后,目前的限制了将该分类下级分类的文章添加到这个专题中,这点限制在我看来不是很合理,作为拥有下级分类的分类,从隶属关系上讲下级分类的文章也应当属于该分类的,而且作为拥有下级分类的文章,这个分类所直接隶属的文章应当非常少,只有放到其下所有分类都不合适的时候,才放入该分类中。

修改htdocs\modules\\cp..php文件212行附近,

原来为:

    unset($subCategories_obj);
    if(!empty($category_id)){
        $criteria = new CriteriaCompo(new Criteria("top_expire", time(), ">"));
        $topics_obj =& $topic_handler->getByCategory($category_id, $xoopsModuleConfig["topics_max"], 0, $criteria, array("top_title"));
        if(count($topics_obj)>0) foreach($topics_obj as $id=>$topic){
            $topics[] = array(

修改为:

    unset($subCategories_obj);
    if(!empty($category_id)){
        $criteria = new CriteriaCompo(new Criteria("top_expire", time(), ">"));
        // by XuYong 子分类的文章可以加入到上级分类的专题中
        $category_pid= 0;
        if(!empty($category_id))$category_pid = $category_obj->getVar("cat_pid");
        //        $topics_obj =& $topic_handler->getByCategory($category_id, $xoopsModuleConfig["topics_max"], 0, $criteria, array("top_title"));
                $topics_obj =& $topic_handler->getByCategory($category_pid, $xoopsModuleConfig["topics_max"], 0, $criteria, array("top_title"));
        //End Hack
        if(count($topics_obj)>0) foreach($topics_obj as $id=>$topic){
            $topics[] = array(
七月
26

[Hack]更改article模组输出feed时时间不对的缺陷

Author Dominic    Category XOOPS     Tags , , , ,

服务时区设置为+8,在命令行行下显示正常,XOOPS中设置服务器所在时区为+0800,可article输出的feed时时间却怎么也不对,导致outlookRSS订阅中显示的文章时间也不对均为GMT+1600,哪有这样的时区哦,时区范围GMT-1200~GMT+1200。

修改方法如下:

1、修改htdocs\modules\\class\feedcreator.class.php文件中739行附近FeedDate类的构造函数FeedDate如下:

   1: function FeedDate($dateString="") {
   2:     $tzOffset = 0;
   3:     if ($dateString=="") $dateString = date("r");
   4:  
   5:     //if (is_integer($dateString)) {
   6:     if (is_numeric($dateString)) {
   7:         $this->unix = $dateString;
   8:         return;
   9:     }
  10:    // By XuYong 调整日期格式
  11:     if (preg_match("~(?:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),\\s+)?(\\d{1,2})\\s+([a-zA-Z]{3})\\s+(\\d{4})\\s+(\\d{2}):(\\d{2}):(\\d{2})\\s+(.*)~",$dateString,$matches)) {
  12:         $months = Array("Jan"=>1,"Feb"=>2,"Mar"=>3,"Apr"=>4,"May"=>5,"Jun"=>6,"Jul"=>7,"Aug"=>8,"Sep"=>9,"Oct"=>10,"Nov"=>11,"Dec"=>12);
  13:         $this->unix = gmmktime($matches[4],$matches[5],$matches[6],$months[$matches[2]],$matches[1],$matches[3]);
  14:         if (substr($matches[7],0,1)=='+' OR substr($matches[7],0,1)=='-') {
  15:             $tzOffset = (substr($matches[7],0,3) * 60 + substr($matches[7],-2)) * 60;
  16:         } else {
  17:             if (strlen($matches[7])==1) {
  18:                 $oneHour = 3600;
  19:                 $ord = ord($matches[7]);
  20:                 if ($ord < ord("M")) {
  21:                     $tzOffset = (ord("A") - $ord - 1) * $oneHour;
  22:                 } elseif ($ord >= ord("M") AND $matches[7]!="Z") {
  23:                     $tzOffset = ($ord - ord("M")) * $oneHour;
  24:                 } elseif ($matches[7]=="Z") {
  25:                     $tzOffset = 0;
  26:                 }
  27:             }
  28:             switch ($matches[7]) {
  29:                 case "UT":
  30:                 case "GMT":    $tzOffset = 0;
  31:             }
  32:         }
  33:
  34:         $tzOffset += date("Z",0);
  35:         $this->unix += $tzOffset;
  36:  
  37:         if (TIME_ZONE!="")
  38:         {
  39:             $server_TZ = abs(intval($GLOBALS['xoopsConfig']['server_TZ'] * 3600.0));
  40:             $this->unix += ($server_TZ - date("Z", 0)) % 43200;
  41:         }
  42:  
  43:         return;
  44:     }
  45:     if (preg_match("~(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(.*)~",$dateString,$matches)) {
  46:         $this->unix = gmmktime($matches[4],$matches[5],$matches[6],$matches[2],$matches[3],$matches[1]);
  47:         if (substr($matches[7],0,1)=='+' OR substr($matches[7],0,1)=='-') {
  48:             $tzOffset = (substr($matches[7],0,3) * 60 + substr($matches[7],-2)) * 60;
  49:         } else {
  50:             if ($matches[7]=="Z") {
  51:                 $tzOffset = 0;
  52:             }
  53:         }
  54:         $tzOffset += date("Z",0);
  55:         $this->unix += $tzOffset;
  56:  
  57:         if (TIME_ZONE!="")
  58:         {
  59:             $server_TZ = abs(intval($GLOBALS['xoopsConfig']['server_TZ'] * 3600.0));
  60:             $this->unix += ($server_TZ - date("Z", 0)) % 43200;
  61:         }
  62:         return;
  63:     }
  64:     $this->unix = 0;
  65: }

2、修改htdocs\modules\article\class\xml.php文件58行,

原来为:

$TIME_ZONE = $prefix.date(“H:i”, $server_TZ);

修改为:

$TIME_ZONE = $prefix.date(“H:i”, ($server_TZ – date(“Z”, 0)) % 43200); //Hack By XuYong 调整时区显示,防止出现+1600时区

专题推荐

标签

分类目录

新浪微博

存档

近期文章

近期评论

友情链接

分享按钮