如何正确编写Joomla MVC组件来执行jQuery AJAX GETS / POSTS?

时间:2012-05-30 16:06:59

标签: jquery joomla

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

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

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

更新解决方案 Soren接受的答案是因为它直接回答了问题,虽然我没有指定Joomla 1.5,但我能够快速调整他的答案。

荣幸地提到Greg P--他的回答揭开了其他可能性的世界,我没有考虑过快速解决其他项目/挑战。

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

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

部件\ com_mycomponent \控制器\ ajaxraw.php

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

2 个答案:

答案 0 :(得分:6)

您应该对

进行Ajax调用
index.php?option=com_yourcomponent&task=ajax.function_name&format=raw

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

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

如果您没有组件,请尝试Joomla Component Creator

答案 1 :(得分: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);
    }
});