所以,我有这个壮观的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");
}
}
?>
答案 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);
}
});