【问题标题】:joomla: use API inside an articlejoomla:在文章中使用 API
【发布时间】:2011-08-11 18:58:12
【问题描述】:

我正在使用Sourcerer plugin 在我的文章中使用 PHP 代码。我想在我的文章中使用 Joomla API/框架来动态设置 HTML 元标记和其他东西。 I found setHeadData 方法应该允许我这样做,但我根本不知道如何调用它。

[Q] 谁能给我 1 个示例或指向我的教程,以帮助我开始使用该 joomla API/框架?

回答

基于大量指向同一个方向的反馈,使用内容插件修改头部数据比通过文章进行修改要好得多。如果你像我一样想在一篇文章中这样做,我就是这样做的:

(1)我使用ezpresso提供的sn-p来设置文章里面的head数据。
(2) 我修改了 libraries/joomla/document/html/renderer/head.php 文件来改变头部数据的设置方式。

例如,您可以在步骤 (1) 设置标题元标记,然后在步骤 (2) 替换以下行:

$strHtml .= $tab.'<title>'.htmlspecialchars($document->getTitle()).'</title>'.$lnEnd;

用这个:

$strHtml .= $tab.'<title>'.htmlspecialchars($document['metaTags']['standard']['title']).'</title>'.$lnEnd;

您可能还想查看 libraries/joomla/document/html/renderer/head.php 以在头部进行更多清理,例如摆脱 generator 元标记Joomla 插入。

【问题讨论】:

    标签: api frameworks joomla joomla1.5


    【解决方案1】:

    这里是你所指的方法的源代码:

    /**
     * Set the html document head data
     *
     * @access  public
     * @param   array   $data   The document head data in array form
     */
    function setHeadData($data)
    {
        $this->title        = (isset($data['title'])) ? $data['title'] : $this->title;
        $this->description  = (isset($data['description'])) ? $data['description'] : $this->description;
        $this->link         = (isset($data['link'])) ? $data['link'] : $this->link;
        $this->_metaTags    = (isset($data['metaTags'])) ? $data['metaTags'] : $this->_metaTags;
        $this->_links       = (isset($data['links'])) ? $data['links'] : $this->_links;
        $this->_styleSheets = (isset($data['styleSheets'])) ? $data['styleSheets'] : $this->_styleSheets;
        $this->_style       = (isset($data['style'])) ? $data['style'] : $this->_style;
        $this->_scripts     = (isset($data['scripts'])) ? $data['scripts'] : $this->_scripts;
        $this->_script      = (isset($data['script'])) ? $data['script'] : $this->_script;
        $this->_custom      = (isset($data['custom'])) ? $data['custom'] : $this->_custom;
    }
    

    它在一个JDocumentHtml 类中实现,该类位于libraries/joomla/document/html/html.php 目录中。

    以下是一些如何使用它的示例的链接:

    我猜你可能会这样调用setHeadData 方法:

    $doc =& JFactory::getDocument();
    $options = $doc->getHeadData();
    $options['metaTags'] = array("tag1", "tag2", "tag3"); // you may change the meta tags here
    $doc->setHeadData($options); 
    

    【讨论】:

    • 谢谢。当我插入您的代码 sn-p 时,它会破坏 joomla(我得到一个白页)。我试图通过之前声明error_reporting(E_ALL); 和ini_set('display_errors', '1') 来获取一些调试信息,但我什么也没得到。 我之前还有什么需要补充的吗? (我需要实例化 JFactory 吗?)
    • 实际上我确实通过 apache error.log 得到了 PHP 错误输出。这是我得到的:Call to undefined method plgSystemSourcererHelper::getHeadData()
    • 您的 sn-p 中似乎有一个错字(忘记了 getHeadData() 之后的 ;)。我能够添加描述 html 元标记,但问题是 joomla 也插入了它自己的。我无法取消设置 joomla,因为它是在我调用 setHeadData 之后设置的。关于如何锁定头部数据以使 joomla 无法在我之后添加自己的东西的任何想法?
    • 我纠正了错字。我认为不可能锁定头部数据,但无论如何也可以有其他解决方案。您可以实现一个系统插件或钩子,它可以在页面发送渲染之前触发。
    【解决方案2】:

    将 PHP 放在文章中并不是完成您想要做的事情的好方法。 Joomla 框架具有确定各种功能和插件何时运行的操作顺序。由于操作的顺序,在呈现文章后会发生许多功能,可能会否定您在文章中所做的任何更改。您最好使用扩展来处理标题和元标记,而不是尝试在文章内部进行。

    【讨论】:

    • 完全正确 - 如果 OP 从头开始​​编写它比查找更容易,我建议编写一个内容插件。以任何现有的为例
    猜你喜欢
    • 2013-07-19
    • 1970-01-01
    • 2014-09-07
    • 2014-09-28
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    相关资源
    最近更新 更多