如何在Joomla组件中使用Jquery AJAX?

时间:2010-07-01 11:56:59

标签: php jquery ajax joomla

我正在Joomla开发网站,同时我遇到了问题,请帮我解决下面的问题

这是我的组件

的文件夹结构
htdocs/Joomla/administrator/component/com_test/test.php,controller.php
                                              models/test.php
                                              controllers/test.php
                                              views/test/view.html.php
                                              view/test/tmpl/default.php

现在在view.html.php我创建了一个表单,我使用 jquery ajax代码进行usernmae可用性检查

但是我没有得到如何将所有内容组合起来得到usename可用的结果

这是我在 test / view.html.php

上编写的代码
<script type="text/javascript">
 jQuery(document).ready(function(){
 jQuery("#username").change(function () {
    var usr = jQuery("#username").val();
    if (usr.length >= 2) {
     jQuery("#status").html('<img src="loader.gif" align="absmiddle">&nbsp;Checking availability...');
     jQuery.ajax({
         type: "POST",
         url: "index.php?option=com_test&view=check_user",
         data: "username=" + usr,
         success: function (msg) {
         jQuery("#status").ajaxComplete(function (event, request, settings) {
         if (msg == 'OK') {
            jQuery("#username").removeClass('object_error'); // if necessary
                jQuery("#username").addClass("object_ok");
         }
         else {
               jQuery("#username").removeClass('object_ok'); // if necessary
               jQuery("#username").addClass("object_error");
               jQuery(this).html(msg);
         }
       });
      }
    });
  }    
});

<script>

<form action="" method="post" name="addUserForm" id="addUserForm" > 
   <table width="100%" border="0" cellpadding="4" cellspacing="2">
     <tr>
    <th >User Name :</th>
        <td ><input type="text" name="username" id="username" size="50">
             <span id="status"></span>  
        </td>
     </tr>      
   </table>
</form>

我已经为上面的动作创建了以下文件夹结构,请告诉我在哪里弄错

view/check_user/view.html.php
views/check_user/tmpl/default.php
check_user / view.html.php

中的

代码

<?php

// no direct access
defined('_JEXEC') or die('Restricted access');

jimport( 'joomla.application.component.view');

/**
 * HTML View class for the advertising component
 */
class TestViewCheck_user extends JView 
{
   /**
    * Default display function
    */  
    function display($tpl = null) 
    {
        $testController = new TestController();
        // Make an object of Main Model class contains Main functions
        $testModel = $testController->getModel('test');
        $userName  = JRequest::getVar('username');
        parent::display($tpl);
        }
 }
?>

但是当我运行此代码时...为什么 http://localhost/Joomla/includes/js/joomla.javascript.js文件无限次运行..最后给出4个错误

现在我要修改/添加更多???请指导我......

引用任何有用的链接教导一步一步创建组件......这对我很有帮助

非常感谢

8 个答案:

答案 0 :(得分:4)

我找到了解决方案。 您必须阻止joomla将模板和模块以及...附加到输出ajax数据。 为此,您必须在显示数据后添加此代码

//after $this->display($tpl);

global $mainframe;

$mainframe->close();

答案 1 :(得分:3)

所有前端代码都应该在你的tmpl中,所以你的Ajax内容也应该在那里。查看本教程,了解如何为Joomla http://www.joomladevuser.com/tutorials/components (deadlink)制作MVC组件。

答案 2 :(得分:2)

在joomla 1.7及以上版本中你可以像这样关闭它

$app = &JFactory::getApplication();
$app->close();

答案 3 :(得分:1)

这是正确的,Joomla将加载模块,组件,whatewer您的默认模板和Joomla核心需要...通过使用“&amp; format = raw”改变此行为(这将迫使Joomla包含Joomla的“没有” )或“&amp; template = your_own_template_for_ajax”(这将迫使Joomla包含你自己的“没有”)。

我不知道“&amp; format = raw”所以我使用自己的空模板进行ajax。 空模板对我来说很有意义 - 我可以按照我想要的方式自定义它(例如默认包含一些东西)。 “&amp; format = raw”是不错的选择,但不是唯一的选择。决定取决于你默认做什么/得到什么。

如何在前端制作这样的ajax模板?

您必须在前端\ templates \目录中创建一个新目录(例如“ajax”)。然后把3个文件放在里面:

<强>的index.php

<jdoc:include type="component" />

<强> templateDetails.xml

...XML content.. 

有关如何正确创建templateDetails.xml的说明,请访问:
http://docs.joomla.org/Creating_a_basic_templateDetails.xml_file

<强>的index.php

<!DOCTYPE html><title></title>

这就是前端解决方案所需的一切。

通过这样调用来测试它: http://www.example.com/index.php?template=ajax

这是前端的100%工作解决方案。 后端未经我测试。我相信你还必须为后端创建一个单独的模板。或以某种方式到达前端模板(目前对如何没有任何想法)......

答案 4 :(得分:0)

1 - 复制joomla的主index.phpjoomlaRoot/index.php)并将其重命名为任何名称(例如:joomlaRoot/ajax.php)。

2 - 禁用渲染方法($mainframe->render();

3 - 在渲染方法行下复制此代码:

/***/
$document =& JFactory::getDocument();
$content=$document->getBuffer();
foreach($content as $var){
    foreach($var as $var2){
        echo $var2;
    }
}

/**/

答案 5 :(得分:0)

在ajax网址中使用format=raw,因为这只会显示没有任何模板的输出。

答案 6 :(得分:0)

您可以使用:

url: "index.php?option=com_test&view=check_user&format=raw",

这将阻止整个模板的加载,但只会加载组件的输出,这是您调用ajax函数时实际需要的。

此外,您可以检查以类似方式设计的index2.php(而不是index.php),以提供简单的输出,而无需渲染整个模板。

答案 7 :(得分:0)

上述所有解决方案(Joomla 3.1)对我没有任何作用。所以我用这个解决方案。在url中添加tmpl = component。

index.php?option=com_photos&view=intphoto&id=1&tmpl=component