Joomla:从模型中调用帮助程序函数


Joomla: Call helper function from within a model?

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

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

我已经在这个帮助程序文件中的不同部分成功地使用了不同的函数(Joomla:在组件中编写和调用一个辅助函数(。

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

法典:

查找.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'ot''to''lookups.php 中找不到类'查找助手'。 尝试操作 JLoader::register(此处的所有内容(,它不会影响错误消息的路径。

思潮? 为什么它在视图中工作而不是在模型中工作?如何在模型中使用帮助程序函数?

谢谢!

#####EDIT

多亏了@cppl看起来这是第二段代码的路径问题。 我也读到了.DS。符号将在未来的版本中逐步淘汰 - 因此有效的代码是:

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

让我们分解一下:

  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该路径将仅作为路径的父元素。所以JLoader正在寻找/administrator/helpers/lookups.php.

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

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

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

这将包括组件目录中的文件帮助程序/事件.php。

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