【问题标题】:Joomla: Call helper function from within a model?Joomla:从模型中调用辅助函数?
【发布时间】:2012-05-12 04:05:45
【问题描述】:

我开始同时进行 php 和 Joomla 开发,发现在 Joomla 中工作很难做一些相当简单的事情。浏览了 Joomla MVC 示例和 Lynda(到目前为止已经构建了一些简单的视图)。

我有一个帮助文件/类/函数,它输出“已完成”表中存在的所有用户 ID,因此我可以显示基于该用户的新记录的链接或编辑现有用户的记录。

我已经在组件的不同部分(Joomla: Write and call a helper function in a component)成功地使用了这个帮助文件中的不同函数。

当我在模型中做同样的事情时,我得到这个:“致命错误:从 C:\wamp\www\ilplocal\libraries\ 中的上下文 'JView' 调用受保护的方法 JModel::_createFileName() joomla\application\component\view.php 在第 773 行”。当我在视图中尝试时,效果很好 - 但我需要模型中的输出。

代码:

lookups.php

abstract class LookupHelper {

    public function other_functions($vars){
        ...
    }

    public function completions_exist() {

        $db =& JFactory::getDBO();            
        $query = $db->getQuery(true);

        $query->SELECT(' #__completed.completed_userid as UserID');
        $query->FROM (' #__completed');
        $query->GROUPBY (' #__completed.completed_userid ');

       $db->setQuery($query);    
       $result = $db->loadResultArray(0); 

       return $result;                        

    }        
}

在模型中:

$completions_exist = Jview::loadHelper('lookups'); 
$completions_exist = LookupHelper::completions_exist();

此行抛出错误:$completions_exist = Jview::loadHelper('lookups');

我发现了一些非常模糊的对名为 JLoader::register 的引用来引入辅助函数,但在 Joomla 中找不到任何好的文档,除了每个人都说只使用它。所以我尝试像这样使用它:

 JLoader::register('LookupHelper', dirname( JPATH_COMPONENT_ADMINISTRATOR).DS.'helpers'.DS.'lookups.php');
 $completions_exist = LookupHelper::completions_exist();

抛出此错误:“致命错误:在 C:\wamp\path\to\model\not\to\lookups.php 中找不到类 'LookupHelper'。尝试操作 JLoader::register(这里的所有内容) 和它不会影响错误消息的路径。

想法?为什么它在视图中起作用而不在模型中起作用?如何在模型中使用辅助函数?

谢谢!

#####编辑

感谢@cppl,看来这是第二段代码的路径问题。我还读到了.DS。表示法将在未来的版本中逐步淘汰 - 所以有效的代码是:

JLoader::register('LookupHelper', JPATH_COMPONENT_ADMINISTRATOR.'/helpers/lookups.php');
$completions_exist = LookupHelper::completions_exist();

【问题讨论】:

    标签: php mysql joomla joomla1.6 joomla2.5


    【解决方案1】:

    让我们分解一下:

    1. 在 Joomla 中!你的组件帮助文件应该在`/mycomponent/helpers/lookup.php'

    2. JLoader:: 是 Joomla!方法来做到这一点,但你可以很容易地使用 PHP 的 require_once 例如。 require_once JPATH_COMPONENT_ADMINISTRATOR.'/helpers/myfunctions.php';

    3. 你的路对吗? - 您提供了dirname(JPATH_COMPONENT_ADMINISTRATOR).DS.'helpers'.DS.'lookups.php',但您已将组件的路径包装在dirname which will the parent element of the path only 中。所以JLoader 正在查看/administrator/helpers/lookups.php

    4. JPATH_COMPONENT_ADMINISTRATOR 被初始化为 Joomla! 的 renderComponent() 调用的一部分,在它的 JComponentHelper 类中,如果您在未设置时将 dirname 应用于它,您将得到一个点(即当前目录),因此在模型中,您可以将 ./helpers/lookups.php 传递给 JLoader 调用。

    【讨论】:

    • 1) 检查。 2)这对我来说是一个部分错误-是的,有效 3)啊啊啊啊-我不知道那是一个 PHP 调用,我回显了路径并进行了调整,直到它正确为止。惊人的! 4)啊,明白了!任何想法为什么Jview::loadHelper('lookups'); 会引发错误?我以为你就是这样做的,现在我不确定何时使用哪个。非常感谢!
    • 很高兴为您提供帮助。该错误可能是因为路径以“。”开头相当于当前目录。
    【解决方案2】:

    您可以通过以下方法在模型中调用助手:

    JLoader::import('helpers.events', JPATH_COMPONENT);

    这将包括组件目录中的文件 helpers/events.php。

    $_helper = new EventsHelper(); echo $_helper->getAnyInsideMethod();exit;

    【讨论】:

      猜你喜欢
      • 2012-04-02
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 2013-04-26
      相关资源
      最近更新 更多