CakePHP控制器构建并将Form作为HTML发送到Jquery UI对话框

时间:2012-11-27 19:03:06

标签: jquery-ui cakephp jquery cakephp-2.0

我正在为一个小项目使用cakePHP和Jquery UI。

我在项目的index.ctp上有一个“添加项目”链接。

我想在论坛中显示一个jQuery UI对话框,用于在点击“添加项目”链接时添加项目。

这样我就可以使用cakePHP非常棒的 FormHelper 我希望控制器的add()方法返回html FormHelper 创建if($this->request->is('ajax'))但这是给我内部服务器错误(当我在Chrome中检查元素时)。

我知道这不是MVC,但我的理由是,如果用户启用了Js,我希望我的应用程序正常工作,因此“添加项目”链接会显示add.ctp视图,如果他们没有jQuery但如果他们这样做我在我的jQuery脚本中有preventDefault()

jQuery单击处理程序然后设置对话框的属性(jQueryUI对话框),然后为表单发出一个ajax请求add()。

我复制并粘贴了我在add.ctp上使用的 FormHelper 代码,但不是回显,而是将每一行添加到$ htmlString。然后我调用echo $htmlString; exit();,但在这里我得到 500内部服务器错误

如果我在add()函数中注释掉所有 FormHelper 行,一切正常($ htmlString只是“”),所以这里出了点问题。

正如我所说,我知道这不是MVC-y,但我想不出另一种方法。我可能会返回add.ctp而不是复制和粘贴的代码吗?那将保持MVC模型正确,如果$ this-> layout ='ajax'那么我只能得到确切的add.ctp文件代码吗?

感谢您的时间和帮助。

编辑 - 添加了jQuery ajax请求和cakephp控制器add()函数

Jquery ajax请求:

$('.add_project').click(function(event) {
        //Kill default
        event.preventDefault();

        $.ajax({
            url : $(this).attr('href'),
            type : 'post',
            data : 'ajax=1',
            dataType: 'html',
            success: function(response) {
                alert(response);

                //Check jquery loaded
                if(jQuery.ui) {
                    //Fill dialog with form
                    $("#dialog").html(response).show();

                    //Show dialog
                    $("#dialog").dialog("open");
                }
            }
        });
    });

CakePHP控制器代码:

public function add()
{
    //If this has been requested with ajax then give the form that we create on add.ctp
    if($this->request->is('ajax'))
    {
        App::import('Helper', 'Form');

        $this->loadModel('Project');
        $html = '';

        $html += $this->Form->create('Project');
         $html += $this->Form->input('name');
         $html += $this->Form->input('colour', array(
             'options' => array('blue' => 'Blue', 'green' => 'Green', 'red' => 'Red', 'orange' => 'Orange', 'yellow' => 'Yellow')
         ));
        $html += $this->Form->end('Create Project');
        echo html;
        exit();
    } 

我非常肯定它与ajax请求无关在cakephp中更多的问题是它不喜欢在控制器中使用FormHelper。我知道这是糟糕的MVC实践,但我想不出另一种动态的方法(就像cakephp基于模型构建html标签这样的事实)。

再次感谢。

2 个答案:

答案 0 :(得分:1)

您收到的500内部服务器错误是因为您在控制器中使用了帮助程序。

然而!您可以通过ajax请求传回视图。 在控制器中创建方法。使用表单助手

创建视图

<强> ajaxForm.ctp

$this->Form->create('Project');
$this->Form->input('name');
$this->Form->input('colour', array(
       'options' => array('blue' => 'Blue', 'green' => 'Green', 'red' => 'Red', 'orange' => 'Orange', 'yellow' => 'Yellow')
));
$this->Form->end('Create Project');

<强>控制器

public function ajaxForm(){

if($this->request->is('ajax')){
    $this->layout = 'ajax';   // to avoid returning your full layout
    $this->render('ajaxForm');

}

}

答案 1 :(得分:0)

将你的html和前端代码与php后端代码分开如果你没有将任何数据传递给视图,你的add函数可以为空,如果add函数没有被调用,你将不需要检查ajax非ajax请求。它将在您的视图中专门用于您的ajax请求。

//controller file
App::import('Helper', 'Form');
public function add()
{

} 


//App/Views/Projects/add.ctp file
        echo $this->Form->create('Project');
        echo $this->Form->input('name');
        echo $this->Form->input('colour', array(
             'options' => array('blue' => 'Blue', 'green' => 'Green', 'red' => 'Red', 'orange' => 'Orange', 'yellow' => 'Yellow')
         ));
        echo $this->Form->end('Create Project');