2

所以,我有这个壮观的 Joomla 组件,完成后,它将带来世界和平,解决世界饥饿问题。我所要做的就是合并通过 jquery .ajax 调用调用的代码。我目前将它们放在外部位置,以便 AJAX 调用可以访问它们,但不清楚如何正确地将它们放置在 Joomla 组件结构中。

我已经完成了研究,相信我,但只发现了很多关于“你可以试试这个或那个”的讨论。大概是因为 Joomla 依赖于 mootools,所以 Jquery 通常不在讨论范围内,但是我们内部有这个很棒的 jQuery 例程库,我想以正确的方式利用它。

在我看来,必须为每个调用创建一个视图,这似乎需要很多不必要的工作/开销来完成它。(比如要求飞行员与乘客一起办理登机手续)。在我看来,这不应该这么困难,所以我对我错过了什么感到困惑,或者为什么似乎没有一个直接的答案。

UPDATE WITH SOLUTION 接受 Soren 的回答,因为它直接回答了问题,虽然我没有指定 Joomla 1.5,但我能够快速调整他的回答以适应工作。

不过值得一提的是 Greg P - 他的回答开辟了一个我没有考虑过的其他可能性的世界,这些可能性是我对其他项目/挑战的快速解决方案。

这是我能够使用 AJAX从我的组件成功调用到我的组件的 url 以及我为使其工作而添加的内容。

index.php?option=com_mycomponent&format=raw&controller=ajax.raw&task=myfunction

组件\com_mycomponent\controllers\ajaxraw.php

<?php
    defined('_JEXEC') or die( 'Restricted access' );
    jimport('joomla.application.component.controller');
    class MycomponentControllerAjaxraw extends JController
    {
        function myfunction()
        {
            echo json_encode("SomethingOrOther");
        }
    }
?>
4

2 回答 2

6

您应该进行 Ajax 调用

index.php?option=com_yourcomponent&task=ajax.function_name&format=raw

然后,您需要创建一个名为 ajax.raw.php 的新控制器,并在其中编写名称与 URL 中的“function_name”匹配的函数,它们将在调用 URL 时执行。

在那些你可以使用模型 $this->getModel(); 和视图等在需要时,甚至懒惰并将您的逻辑直接放在控制器中。

如果您没有组件,请尝试使用Joomla 组件创建器

于 2012-05-31T12:26:05.097 回答
1

我不知道这是否是“官方”的做法,但它对我来说肯定是干净和快速的。我只是将核心 Joomla 文件包含在组件文件夹中的单个文件中,然后将该核心用于我的 jQuery 调用 - 无需模板、MVC 或 CMS 开销。对于 Joomla 1.5,只需要 2 个文件:joomla_platform.php 用于加载基于 Joomla 的 index.php 的 Joomla 的内容,另一个用于使用它并将某些内容返回给 jQuery。请参阅http://api.joomla.org上的文档。

From index.php
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );

编辑:这是我如何做到这一点的淡化版本:

不过,我想警告一下是有必要的。我在内部使用它,所以不用担心,但我返回配置的示例只是向您展示如何获取配置,我不会将此示例输出用于一般用途。此处的检查确保管理员用户已登录,但您可以随意调整它。

我还应该提到,这不需要组件或 jQuery 来工作。我使用相同的 2 个文件来编写快速的独立页面,这样我就不必为了利用 Joomla 平台而编写整个组件。显示的 index.php 可以很容易地输出标准 HTML 而不是 json 编码输出来显示普通网页。它绕过了我认为的框架和 CMS 的大部分用处,但有时您不需要所有特定的开销。

组件\com_mycomponent\平台\joomla_platform.php:

<?php
    /* If not already done, initialize Joomla framework */
    if (!defined('_JEXEC')) {
        define( '_JEXEC', 1 );
        //        define('JPATH_BASE', dirname(__FILE__) );
        define ('JPATH_BASE', "c:\\wamp\\www\\");
        define( 'DS', DIRECTORY_SEPARATOR );
        /* Required Files */
        require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
        require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
        /* To use Joomla's Database Class */
        require_once ( JPATH_BASE .DS.'libraries'.DS.'joomla'.DS.'factory.php' );
        require_once ( JPATH_LIBRARIES.DS.'joomla'.DS.'import.php'); // Joomla library imports.
        /* Create the Application */
        global $mainframe;
        $mainframe =& JFactory::getApplication('site');
    }
?>

组件\com_mycomponent\平台\index.php:

<?php
    require_once('joomla_platform.php');
    $config = new JConfig();
    $db = &JFactory::getDBO();
    $user =& JFactory::getUser();
    //Make sure a logged in user is doing the request (not mandatory, but safer)
    //if(!$user->id) {
    //  die("Not logged in");
    if($user->gid < 23) {
        die('Administrators only!');
    } else {
        $query = "SELECT * FROM jos_users ORDER BY id DESC LIMIT 1 /* Get the last registered user */";
        $db->setQuery($query);
        $row = $db->loadAssoc();
        //echo json_encode($row);                       // Return only the SQL result
        //echo json_encode(get_object_vars($user));     // Return only the user object
        //echo json_encode(get_object_vars($config));   // Return only the config object
        echo json_encode(
        array_merge(                                    // Merge the arrays, and return them all
            $row,
            get_object_vars($user),
            get_object_vars($config)
            )
        );
    }
?>

在 php 文件中使用 jQuery 示例:

$.ajax({
    type: "GET",
    url: "components/com_mycomponent/platform/index.php",
    dataType: "json",
    success: function(joomla) {
        alert('Joomla Platform info appended to myDiv for '+joomla.sitename);
        $.each(joomla, function(key, value) {
            $('#myDiv').append(key + ' : ' + value + '<br/>')
        });
    },
    error:function (xhr, ajaxOptions, thrownError){
        alert("Joomla Platform Error Status: " + xhr.status + " Thrown Errors: "+thrownError);
    }
});
于 2012-05-30T16:15:20.407 回答