设想,你希望首页上的文章能够按新旧程度为标准以不同的颜色显示。你可以通过自定义模板覆盖的方式(override)来实现这一需求。有关自定义模板覆盖的相关信息,可以参见Joomla文档中文翻译 - 如何通过模板覆盖的方式修改Joomla的系统输出 .
你需要进行覆盖源文件路径为:
(joomla根路径)/components/com_content/views/frontpage/tmpl/default_item.php
将上述文件复制并粘贴到之前新创建的模板文件夹中,最终文件路径为:
(自定义模板路径根路径)/html/com_content/frontpage/default_item.php
如果该文件已经存在于你的自定义模板中,则无需复制,直接进行下面的修改工作即可。
原理是这样的,在现在的文件中(default_item.php),文章的创建日期是通过$this->item->created
来调用显示的。我们可以通过比较该日期与当前的日期时间,来判断这篇文章的新旧程度,进而为不同时间阶段中的文章添加不同的class,以通过CSS控制
样式。
为了使修改工作变的更容易些,我们另创建一个单独的文件来比较日期并添加class。创建如下文件:
(自定义模板路径根路径)/html/com_content/frontpage/myfrontpagehelper.php
代码为:
<?php
/**
* Gets class based on today's date and article date
* @param $date
* @return string containing CSS class name
*/
class MyFrontpageHelper {
function MyFrontPageHelper() {
parent::_constructor();
}
function getCSSClassFromDate($date) {
$dateClass = ''; // default to blank
// subtract create date from current date. both dates in seconds
$elapsedDays = (time() - strtotime($date)) / 86400; // 86400=number of seconds per day
if ($elapsedDays <= 7) $dateClass = 'dateCurrent';
if (($elapsedDays > 7) && ($elapsedDays <= 14)) $dateClass = 'dateLastWeek';
if ($elapsedDays > 14) $dateClass = "dateOld";
return $dateClass;
}
}
?>
这个新的类包含有构造器和一个方法。在这个方法中,如果文章创建日期距当前日期没有超过7天,我们将新的class设置
为"dateCurrent";如果时间差在7天至14天的范围里,则设置为"dateLastWeek";如果时间差超过14天,则设置
为"dateOld"。
现在我们可以在default_items.php文件中使用这个方法来为我们的首页文章增加样式。首先,我们需要关联之前另创建的新文件。在default_items.php文件头部,找到以"defined..."开头的那行代码,修改为:
defined('_JEXEC') or die('Restricted access'); require_once('myfrontpagehelper.php');
注意,我们使用了require_once声明。我们之所以使用require_once而非include,是因为include会多次执行-对应每篇文章执行一次。而require_once可以保证只调用该文件一次。
现在我们可以通过调用这个方法来为文章添加新的class了。将新的class添加到哪里?这取决于我们希望得到怎样的样式。例如,我们希望改变文
章标题部分的样式。在这种情况下,我们找到default_items.php的第11行代码(以rhuk_milkyway模板为例),将其修改为:
<?php if ($canEdit || $this->item->params->get('show_title') || $this->item->params->get('show_pdf_icon')
|| $this->item->params->get('show_print_icon') || $this->item->params->get('show_email_icon')) : ?>
<table class="contentpaneopen <?php echo MyFrontpageHelper::getCSSClassFromDate($this->item->created); ?>">
我们将原来的Page Class Suffix替换为我们自己的新class.注意在"contentpaneopen"与新class之间需要空格,这很重要。
在我们进行测试之前,我们需要有发布于不同时间段的一些文章。所以我进入文章管理器(Article
Manager)修改一些文章的创建日期,使他们分别处于7天内、7天至14天、以及14天以外的时间范围中。然后刷新首页,检查HTML代码以确认我们
设定的新class已正确添加;如果一切正常,代码看上去应该这样:
<table class="contentpaneopen dateCurrent"> <tr> <td class="contentheading" width="100%"> Joomla! Security Strike Team </td>
可以确定我们的新class"dateCurrent"已经被正确添加。
接下来我们只需要到CSS文件中进行样式设置。我将这行代码加入CSS文件:
.contentpaneopen.dateCurrent { background: #F0FFFF; }
.contentpaneopen.dateLastWeek { background: #FFF8DC; }
.contentpaneopen.dateOld { background: #DCDCDC; }
注意我们在CSS选择器中同时使用了.contentpaneopen与我们的新class。现在首页应该是这样了:
我们也可以将新的class添加到default_items.php的第53行,以设置整个文章的背景色:
<?php echo $this->item->event->beforeDisplayContent; ?>
<table class="contentpaneopen <?php echo MyFrontpageHelper::getCSSClassFromDate($this->item->created); ?>">
现在的首页应该是这样了:
添加新class的具体位置取决于你的模板以及你希望得到怎样的风格样式。