Joomla - 在分类博客布局中仅显示主文章的完整文本

4
如何在分类博客布局中显示主题文章的全部内容(即使它包含“阅读更多”)?
是否有后端设置可以更改或需要覆盖哪个PHP文件?我只想显示主题文章的全文,引言文章应仍然显示“阅读更多”,仅带有引言文字。
提前致谢。
3个回答

8

您没有说明使用的Joomla!版本,因此本回复基于2.5.x版本。

您需要为com_content创建一个布局覆盖,特别是针对category视图模板文件blog.phpblog_item.php

如果您的模板已经安装了com_content的覆盖,则可以在此位置找到它:

/templates/your-template/html/com_content/category/

如果没有的话,您可以从Joomla!2.5的component目录中复制原始文件,该目录位于/components/com_content/views/category/tmpl/ 在该目录下,您会发现一系列以blog开头、以.php结尾的文件-您可以通过将它们复制到上面列出的第一个路径来覆盖其中1个或所有文件。注意:只复制需要更改的文件,因为Joomla聪明地在默认目录中查找,如果在覆盖位置没有找到版本。 默认的Joomla! 2.5安装包含这些博客文件:
blog_children.php
blog_item.php
blog_links.php
blog.php

基本上,blog.php是主文件,它根据需要包含子布局,如blog_item.php
如果您正在使用默认的Joomla!2.5文件,则要实现您的目标,您可能需要覆盖blog.phpblog_item.php,并找到一种方法来检查是否处于前导项中。一旦您知道您在前导项中,您将想要回显项目的全部文本。 blog_item.php通常只输出简介文本,类似于以下行: <?php echo $this->item->introtext; ?> 您将想要完整的文本回显,因此,在您将上述行包装在一个if中以检查是否正在执行前导项之后,您的输出行将看起来像这样: <?php echo $this->item->introtext.$this->item->fulltext; ?> 注意:我还没有检查这是否有效,这只是猜测,并依赖于$item具有来自#__content表的完整行。
因此,在标准安装中,文章的完整文本未添加到文章项中,即您可以简单地echo$this->item->fulltext
有两种方法可以获取完整文本。
最简单和最先进的方法是在/components/com_content/models/articles.php的核心文件中进行修改,从function getListQuery()中的第一个$query->select()开始,该行位于/附近的 line 153 。在a.introtext之后,单引号之前添加'a.fulltext',因此该行看起来像这样:
function getListQuery()
{
    // Create a new query object.
    $db = $this->getDbo();
    $query = $db->getQuery(true);

    // Select the required fields from the table.
    $query->select(
        $this->getState(
            'list.select',
            'a.id, a.title, a.alias, a.title_alias, a.introtext, a.fulltext, ' .
            'a.checked_out, a.checked_out_time, ' .

第二种方式,也是Joomla!升级证明的方式(因此可能更好的方式)是在覆盖中加载整个文章(丑陋但不是黑客行为),并将fulltext连接到第一篇文章的introtext中。
要执行此操作,您只需使用getTable在第一项领先项目的blog.php中使用$this->item->id加载文章,因此在大约54行之间,在<?php$this->item = &$item;之间加入:
if($leadingcount == 0) {
    $contentTable = JTable::getInstance('Content');
    if($contentTable->load($item->id)) {
        $item->introtext .= $contentTable->fulltext;
    }
}

注意:这个if语句只限制了第一个主导文章,如果你删除if语句,它将会把所有主导文章的完整文本都附加上去。
在我的Joomla! 2.5.6开发安装中运行良好,所以你也应该能够做到。

谢谢,我会尝试这个,没错,它确实是为J!2.5设计的。 - Anriëtte Myburgh
我已经尝试过这个,但似乎 $this->item->fulltext 在分类博客布局中不可用。而且我不知道如何强制从数据库加载它。 - Anriëtte Myburgh
非常感谢,我将您的第二个解决方案添加到了我的 blog.php 覆盖文件中,并在 echo $this->loadTemplate('item'); 之前添加了 $this->item->leading = true; 进行测试,在 blog_item.php 中进行了 $this->item->leading 是否为 true 的测试,然后将“阅读更多”文本更改为“LINK”,如下所示:echo ($this->item->leading ? "LINK" : JText::sprintf('COM_CONTENT_READ_MORE_TITLE'));。这是正确的 Joomla 术语吗? - Anriëtte Myburgh
我不确定你的意思,但是你可以直接使用 JText::_() 而不是 sprintf 版本。只有在将变量插入字符串时才需要使用 sprintf 版本。 - Craig
这就是我所做的,sprintf 是 Joomla 的核心函数,我只是在其中添加了 "LINK" - Anriëtte Myburgh

2
考虑到上述两个答案,需要对blog.php和blog_item.php进行三处更改。此方法适用于Joomla 3.1版本。最好的方法是将这些文件复制到模板覆盖中。
复制blog.phpblog_item.phpcomponents/com_content/views/category/tmpl/[我的模板]/html/com_content/category/blog.php中,在前导项循环中添加一行代码:
  <?php foreach ($this->lead_items as &$item) : ?>
   <div class="leading-<?php echo ...?>">
                <?php
                    $this->item = &$item;
                    $this->item->leadingItem = true; //ADD THIS LINE !!!
                    echo $this->loadTemplate('item');
                ?>
            </div>
            <div class="clearfix"></div>
            <?php
               $leadingcount++;
            ?>
        <?php endforeach; ?>

blog_item.php 中,将 "echo $this->item->introtext;" 替换为
if ($this->item->leadingItem){
//this is a leading article - show full text and remove "Read more..." button
        $itemID =  $this->item->id;
        $db =& JFactory::getDBO();
        $query = "SELECT `fulltext` FROM `#__content` WHERE `id` =" . $itemID;
        $db->setQuery($query);
        $fulltext = $db->loadResult();
        echo $this->item->introtext . $fulltext; 

    }else{

        echo $this->item->introtext; 
}

最后在 blog_item.php 中,不要显示每篇文章底部的"阅读更多..."按钮。

请编辑以下行:

if ($params->get('show_readmore') && $this->item->readmore)

改为:

if ($params->get('show_readmore') && $this->item->readmore && !$this->item->leadingItem)


1

在Joomla 2.5.x中,您的模板blog_item.php文件:

$itemID =  $this->item->id;
$db =& JFactory::getDBO();
$query = "
SELECT `fulltext` 
FROM `#__content` 
WHERE `id` = $itemID;
";
$db->setQuery($query);
$fulltext = $db->loadResult();

你可以使用$fulltext字符串变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接