【问题标题】:How to correctly code a Joomla MVC component to perform jQuery AJAX GETS/POSTS?如何正确编码 Joomla MVC 组件以执行 jQuery AJAX GETS/POSTS?
【发布时间】:2012-06-04 21:51:13
【问题描述】:

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

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

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

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

值得一提的是 Greg P - 他的回答开辟了一个世界,其中包含我没有考虑过的其他可能性,可以快速解决我遇到的其他项目/挑战。

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

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

components\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");
        }
    }
?>

【问题讨论】:

    标签: jquery joomla


    【解决方案1】:

    您应该对

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

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

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

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

    【讨论】:

    • 我认为这是我一直在寻找的答案。在常规组件目录结构中,ajax.raw.php 去哪里,代码是否需要考虑 format=raw(似乎控制模板和其他 CMS 输出是 joomla 关注的问题)
    • 魔鬼在细节中。尚未与多个控制器一起使用,那么如何命名它 - 像这样的东西?类 AjaxControllerRaw 扩展了 JController
    • 我应该提到这是我正在修改的 Joomla 1.5,但您的回答给了我所需的起点。我走过它做了什么,任务名称中的点似乎被丢弃了,所以我进行了相应的调整。但是我做到了,让它像我希望的那样工作,所以我会接受你的回答,并添加我自己的答案,说明我是如何在 j1.5 中工作的,谢谢!
    • @Plummer 它会在任何页面视图中剥离通常从模板加载的所有默认 HTML
    【解决方案2】:

    我不知道这是否是“官方”的做法,但它对我来说肯定是干净和快速的。我只是将核心 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' );
    

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

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

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

    组件\com_mycomponent\platform\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');
        }
    ?>
    

    components\com_mycomponent\platform\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);
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2011-03-10
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-09
      • 1970-01-01
      • 2013-10-12
      相关资源
      最近更新 更多