2009年4月19日星期日

Joomla 热门新闻的有效期

     热门文章上的内容,是完全按照新闻点击次数排的。虽然原来发布的时候有个失效时间,但是大部分人懒得写,导致很旧的但是点击量大的新闻会长时间排在顶上,违背了新闻和热门的意思。
     因为这个原因,我想说不定能够设置一下,比如只显示两个月的新闻。但是看了一下那个热门新闻模块(mod_mostread),设置很简单,没这方面内容。
     于是只好改代码了么…… 打开/joomla/modules/mod_mostread.php,看见如下代码:
  • case 1:
  • default:
  • //Content Items only
  • $query = "SELECT a.id, a.title, a.sectionid, a.catid"
  • . "\n FROM #__content AS a"
  • . "\n LEFT JOIN #__content_frontpage AS f ON f.content_id = a.id"
  • . "\n INNER JOIN #__categories AS cc ON cc.id = a.catid"
  • . "\n INNER JOIN #__sections AS s ON s.id = a.sectionid"
  • . "\n WHERE ( a.state = 1 AND a.sectionid > 0 )"
  • . "\n AND ( a.publish_up = '$nullDate' OR a.publish_up <= '$now' )"
  • . "\n AND ( a.publish_down = '$nullDate' OR a.publish_down >= '$now' )"
  • . ( $access ? "\n AND a.access <= $my->gid AND cc.access <= $my->gid AND s.access <= $my->gid" : '' )
  • . ( $catid ? "\n AND ( a.catid IN ( $catid ) )" : '' )
  • . ( $secid ? "\n AND ( a.sectionid IN ( $secid ) )" : '' )
  • . ( $show_front == "0" ? "\n AND f.content_id IS NULL" : '' )
  • . "\n AND s.published = 1"
  • . "\n AND cc.published = 1"
  • . "\n ORDER BY a.hits DESC"
  • ;

  • 那个case 1对应选项里的“只显示内容项目”,下面明显在构造SQL查询语句。<br />搜了一下,MySQL有个函数,DATEDIFF(),返回两个日期差的天数,这不是正好么。<br />在其中插入一句判断:
  • . "\n AND ( DATEDIFF('$now', a.created) <= 60 )"
  • 于是问题解决~ 这种脚本语言还真是容易学容易用……

    2009年4月1日星期三

    FireBoard的登录跳转

    最近在一个Joomla上架论坛,用着FireBoard。这个东西有个毛病,就是登录之后跳转到主页,而不是到论坛,看着很不行。
    为了解决这个问题,回去看代码。FireBoard那个登录链接在template/default/plugin/profilebox/profilebox.php里面生成的,原来是这样:

    $loginlink = sefRelToAbs('index.php?option=com_login&amp;Itemid=' . $Itemid));

    我想先把返回地址传过去。于是改成:

    $loginlink = sefRelToAbs('index.php?option=com_login&amp;Itemid=' . $Itemid . "&return=" . sefRelToAbs('index.php?option=com_fireboard'));

    接下来看看/joomla/components/com_login/login.html.php:

    $return = $params->get('login');

    以及:

    <form action="<?php echo sefRelToAbs( 'index.php?option=login' ); ?>" method="post" name="login" id="login">

    看来是转到index.php进行登录工作。再看看index.php:
  • // frontend login & logout controls
  • $return = strval( mosGetParam( $_POST, 'return'));
  • $message = intval( mosGetParam( $_POST, 'message', 0 ) );
  • if ($option == 'login') {
  • $a = $return;
  • $mainframe->login();
  • $return = $a;
  • // JS Popup message
  • ......
  •  
  • if ( $return && !( strpos( $return, 'com_registration' ) || strpos( $return, 'com_login' ) ) ) {
  • // checks for the presence of a return url
  • // and ensures that this url is not the registration or login pages
  • mosRedirect( $return );
  • } else {
  • mosRedirect( $mosConfig_live_site .'/index.php' );
  • }
  •  
  • 看来原来就有跳转的代码。这样就好办了。
    我原来尝试在那个login链接后面加&return=xxx,但是试了一个晚上,一点用都没有。
    后来才发现,貌似是那个$return的变量在起作用。
    最后,修改com_login/login.html.php:
    把原来的$return=xxx改成:

    $return_old = $params->get('login');
  • $return = strval(mosGetParam($_REQUEST, 'return', $return_old));

  • 终于,问题解决,FireBoard登录之后,又跳转回FireBoard了~
    其实看原来那个$return=$param->get啥的,应该是有更好的办法的,但是这样也挺通用的,就行了吧……