【问题标题】:Cakephp master/details addCakephp 大师/细节添加
【发布时间】:2012-09-24 09:41:56
【问题描述】:

我有两张表,有很多关系, 在master add.ctp中,允许用户上传0~5个文件(文件路径信息存放在明细表中)

我想在master/add.ctp中动态显示附件(detail)表单

1,用户从下拉列表中选择要上传的文件数,

echo $this->Form->input('attachments', array( 'options' => array(1, 2, 3, 4, 5),'empty' => '(choose one)', 'onchange' => 'showNumber(this.value)'));

然后for循环

{
        echo $this->Form->input('attachment_path', array('type'=>'file','label' =>'Attachment, Maximum size: 10M'));    
} 

//但我不知道如何捕获this.value,我知道Javascript无法将值传递给php。

或用户单击“添加另一个附件”链接,然后显示详细信息表单。

如何实现此功能,任何帮助将不胜感激。

我读过这篇文章: Assign Javascript variable to PHP with AJAX 并得到同样的错误:变量未定义

编辑: http://cakephp.1045679.n5.nabble.com/Adding-fields-to-a-form-dynamically-a-complex-case-td3386365.html

'为每个字段使用一个默认名称,末尾带有 [] (这将使 它像数组一样堆叠)示例:字段后的 data[][book_id] 已提交”

我应该把 [] 放在哪里?

【问题讨论】:

    标签: javascript cakephp


    【解决方案1】:

    我认为您应该为此使用 Ajax。

    只需在 select.change() 上创建一个 ajax 调用,然后在控制器中创建一个返回必要信息的方法。

    您可以直接在控制器上使用 echo json_encode(array('key' => 'value')) 返回一组数据(或者在自定义视图中更好)并使用 Javascript 访问它:

    success: function(data) {
         alert(data.key);
    }
    

    编辑...

    在你的 javascript 中使用类似...

    $('select').change(function(e) {
        var select = $(this);
        $.ajax({
            type: "POST",
            dataType: "json",
            url: "/attachments/youraction",
            data: { data: { id: select.find(":selected").val() } },
            success: function(data) {
                for (i in data) {
                    var input = $('<input>', {type: "file", label: data[i].Attachment.label})
                    $('form.your-form').append(input);
                }
            }
        })
    });
    

    然后在“Yourcontroller”中创建“youraction”方法:

    <?php
    class AttachmentsController extends AppController
    {
        public function youraction()
        {
            if (!$this->RequestHandler->isAjax() || !$this->RequestHandler->isPost() || empty($this->data['id']))
            {
                $this->cakeError('404');
            }
    
            // Do your logic with $this->data['id'] as the select value...
            $data = $this->Attachment->find('all', array('conditions' => array('id' => $this->data['id'])));
            // ....
    
    
            // then output it...
            echo json_encode($data);
    
            // This should be done creating a view, for example one named "json" where you can have there the above echo json_encode($data);
            // Then..
            // $this->set(compact('data'));
            // $this->render('json');
        }
    }
    

    现在更清楚了??如果你对 ajax + cakephp 有疑问,你应该在网上搜索一下,你会找到很多教程。

    【讨论】:

    • 我对 ajax 知之甚少...你能详细解释一下吗?我尝试这样做,但没有成功。
    • 好的,让我用一个更好的例子扩展我的回答
    • Elboletaire,感谢您的详细回复 :) 我明天稍后再试......再次感谢......
    • 如果您开始接受自您在 stackoverflow 上注册以来创建的任何问题的一些答案,那将是一个好点
    • 没有成功,因为没有master_id(FK)附件无法保存
    【解决方案2】:

    我用这种方式来实现这个功能。 (终于明白了:))

    http://ask.cakephp.org/questions/view/foreach_loop_with_save_only_saving_last_member_of_array

    是的,AJAX 可以做很多事情,对我来说,一天之内很难理解其中的逻辑..

    无论如何,再次感谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 2017-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多