在 Joomla 中添加命中计数器

Posted

技术标签:

【中文标题】在 Joomla 中添加命中计数器【英文标题】:Adding in a hit counter to Joomla 【发布时间】:2013-02-16 10:23:12 【问题描述】:

我正在为 Joomla 2.5 创建一个自定义组件。我想为详细视图添加命中计数器(如 Joomla 内容等)

所以我做了一些研究,发现JTable::hit 函数我假设是我需要的(Joomla 文档页面here)。但是,我非常不清楚我需要在哪里实现这一点。当我从数据库中检索行时,它是在模型中的某个地方 - 还是在视图中的某个地方?建议将不胜感激!

【问题讨论】:

【参考方案1】:

您可以使用表格类。在 Joomla 3 和 Joomla 4 中工作。

你的模型

use Joomla\CMS\Table\Table;

public function hit($id = 0)

    Table::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_mycomp_name/tables');
    $table = Table::getInstance('my_table_name', 'Table', array());
    $table->hit($id);
    return true;

你的 view.html.php

$model = $this->getModel('model_name');
$model->hit($id);

您可以使用它来增加任何列。为此,您需要覆盖该列。

$table->setColumnAlias('hits', 'new_column_name');
$table->hit($id);

【讨论】:

【参考方案2】:

如果你看看他们在 Joomla 中是如何做到的,你会发现他们在模型中实现了功能,并从视图中调用了方法。

例如,article.php 模型有

public function hit($pk = 0)

        $hitcount = JRequest::getInt('hitcount', 1);

        if ($hitcount)
        
            // Initialise variables.
            $pk = (!empty($pk)) ? $pk : (int) $this->getState('article.id');
            $db = $this->getDbo();

            $db->setQuery(
                    'UPDATE #__content' .
                    ' SET hits = hits + 1' .
                    ' WHERE id = '.(int) $pk
            );

            if (!$db->query()) 
                    $this->setError($db->getErrorMsg());
                    return false;
            
        

        return true;

view.html.php

$model = $this->getModel();
$model->hit();

【讨论】:

美丽。我实际上使用了 weblinks 组件中的代码,因为它使用了 JTable::hit,这意味着模型函数实际上只有 4 行长。但这最终让我走上了正轨。天知道我在第一次围绕 Joomla 模型/组件等进行搜索时是如何错过这个功能的。谢谢 :) 但请注意缓存:每次缓存刷新时您可能只会命中一次,而不是每次访问都会命中一次。要每次访问获得一次命中,您需要从客户端上的 javascript 调用一个计数器,或者通过在模块主函数中的 getData() /getList() 之前插入 hit() 来解决模块的缓存问题。

以上是关于在 Joomla 中添加命中计数器的主要内容,如果未能解决你的问题,请参考以下文章

如何限制JSP命中计数器?

joomla上标签计数的SQL查询

Django页面命中计数器并发

如何使用 Visual 2013 分析缓存未命中

Django中的垃圾邮件证明命中计数器

shared_ptrs 是不是由于引用计数器原子递增/递减而遇到缓存未命中?