如何将Joomla管理员组件复制为站点组件?

时间:2015-12-24 01:36:23

标签: php joomla components administrator

我已经安装了Joomla v3.4.7来测试和准备我的项目。我创建了一个组件' HelloWorld'按照官方教程[https://docs.joomla.org/J3.x:Developing_an_MVC_Component/Using_the_database][1]一步一步 ,我成功地显示了数据列表,然后编辑页面添加或编辑现有数据,来自管理员部分,就像

localhost/joomla-test/administrator/index.php?option=com_helloworld

完成这些操作后,我只需将/Administrator/components/com_helloworld中的文件复制到/components/com_helloworld并覆盖以前的文件,然后访问网站组件:

localhost/joomla-test/index.php?option=com_helloworld

它没有用!我使用firebug进行调试,我得到了一个

  

NetworkError:500内部服务器错误 -   http://localhost/joomla-test/index.php?option=com_helloworld

错误......发生了什么?

我的代码:

站点/ helloworld.php:

<?php
 // import joomla controller library
 jimport('joomla.application.component.controller');

 // Get an instance of the controller prefixed by HelloWorld
 $controller = JControllerLegacy::getInstance('HelloWorld');

 // Perform the Request task
 $controller->execute(JFactory::getApplication()->input->getCmd('task'));

 // Redirect if set by the controller
 $controller->redirect();

网站/ Controller.php这样

<?php
// No direct access to this file
defined('_JEXEC') or die;

// import Joomla controller library
jimport('joomla.application.component.controller');

/**
 * General Controller of HelloWorld component
*/
class HelloWorldController extends JControllerLegacy
{
    /**
     * display task
     *
     * @return void
     */
    protected $default_view = 'helloworlds';

    public function display($cachable = false)
    {              
        parent::display($cachable);
        echo "controller";
        return $this;
    }
}

站点/视图/ helloworlds / view.html.php:

<?php
   // No direct access to this file
   defined('_JEXEC') or die;

   // import Joomla view library
   jimport('joomla.application.component.view');

   /**
    * HelloWorlds View
    */
   class HelloWorldViewHelloWorlds extends JViewLegacy
   {
    /**
     * HelloWorlds view display method
     * @return void
     */
    function display($tpl = null) 
    {
        // Get data from the model
        $items = $this->get('Items');
        $pagination = $this->get('Pagination');

        // Check for errors.
        if (count($errors = $this->get('Errors'))) 
        {
            JError::raiseError(500, implode('<br />', $errors));
            return false;
        }
        // Assign data to the view
        $this->items = $items;
        $this->pagination = $pagination;

        // Set the toolbar
        $this->addToolBar();

        // Display the template
        parent::display($tpl);
    }

    /**
     * Setting the toolbar
     */
    protected function addToolBar() 
    {
            JToolBarHelper::title(JText::_('COM_HELLOWORLD_MANAGER_HELLOWORLDS'));
        JToolBarHelper::deleteList('', 'helloworlds.delete');
        JToolBarHelper::editList('helloworld.edit');
        JToolBarHelper::addNew('helloworld.add');
    }
}

请帮助,谢谢大家。

3 个答案:

答案 0 :(得分:0)

它不会以这种方式工作(只需复制文件夹)。您必须通过打包然后将其安装在服务器上来安装组件。您需要在服务器上安装压缩组件(具有XML清单文件)。

尝试以下操作:从Joomla下载基本的HelloWorld组件,然后将其安装在您的网站上,然后使用localhost中的文件覆盖它。

答案 1 :(得分:0)

网站和管理员略有不同;最相关的是与模板相关的,因为在Admin中你可以指望一个标准的布局;这就是为什么在管理员view.html中设置工具栏和侧面菜单;在前端,您创建指向配置视图的菜单。

您最好的选择是为控制器和视图创建新文件,然后您可以创建继承自管理员模块的模型,这是避免代码重复的最佳方式,它仍然会为您提供最大的灵活性来自定义视图。

答案 2 :(得分:0)

工具栏无法在前端工作。这很奇怪,是的,但如果你看它在管理员文件夹中是一个单独的东西。它实际上会检查您是否也在管理员中。我曾经做过一个补丁来取消检查,但事实证明它会破坏大量已解决这个问题的组件 其次,对于依赖于相对定位或甚至可能明确要求管理员访问的事物的调用很多。 第三,确实有些东西略有不同,因为在后端你基本上不会渲染普通视图,只有列表视图和编辑视图。

如果你想在前端做管理功能,最好的一般方法是看看com_config,Com_templates和com_modules是如何做到的。