0

我有一个带有标题的默认布局(default.ctp)。在这个标题中是一个搜索表单,它显示在每个页面上,代码如下:

echo $this->Form->create('null', array('url' => '/search/result'),array(
                        'inputDefaults' => array(
                            'label' => false,
                            'div' => false
                        )
                    ));

                    echo $this->Form->input('search_query', array('label' => false, 'div' => false, 'type' => 'tel','class' => 'input-small', 'id' => 'appendedInputButton', 'placeholder' => 'Input search'));

                    echo $this->Form->button('Search', array('class' => 'btn'));
                    echo $this->Form->end()

在这个 default.ctp 文件中,我使用以下行调用 twitterbootstrap 输入模式覆盖。此元素用于每个页面。

<!-- Add order modal -->
        <?php echo $this->element('add_customer_order');?>

在此元素中,我对我的 bestelling/modal_ext 执行请求操作,以便使用表单验证并以正确的方式设置表单字段,以便使用 bestelling 控制器进行保存。以下代码在元素中:

<?php    
$this->requestAction('Bestelling/modal_ext');//Include BestellingController modal_ext               
?>
<!-- Add order modal -->
        <div id="Bestellingtoevoegen" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
            <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
            <h3 id="myModalLabel">Add customer order</h3>
            </div>
            <div class="modal-body">

                    <div class="row-fluid">
                        <div class="span8"> 
                            <?php
                            echo $this->Form->create('Bestelling');
                            //echo $this->Form->create('null', array('url' => '/bestelling/modal_ext'));
                            echo $this->Form->input('bestelnummer', array('type' => 'tel','class' => 'input-small'));
                            echo $this->Form->input('klantnummer', array('type' => 'tel','class' => 'input-small')); ?>
                        </div>
                        <div class="span4">
                            <br/>
                            <?php echo $this->Form->checkbox('serial'); echo' <span class="label label-info">Serialcode</span> '; ?>
                            <br/>
                            <?php echo $this->Form->checkbox('insured'); echo' <span class="label label-info">Insured</span>'; ?>
                            <br/>
                            <?php echo $this->Form->checkbox('giftpaper'); echo' <span class="label label-info">Giftpaper</span>'; ?>
                        </div>
                    </div>

                    <div class="row-fluid">
                        <div class="span5"> 

                            <?php 
                            echo $this->Form->input('titel', array('type' => 'tel', 'id' => 'discription', 'onkeyup' => 'lookupproductnamenew(this.value);', 'onblur' => 'fill();', 'after' => '<div class="suggestionsBox" id="suggestions" style="display: none;">
                                    <img src="images/upArrow.png" style="position: relative; top: -20px; left: 30px;" alt="upArrow" />
                                    <div class="suggestionList" id="autoSuggestionsList">
                                    </div>
                            </div>'));
                            ?>
                        </div>

                        <div class="span7">
                            <?php
                            echo $this->Form->input('aantal', array(
                                'options' => array(
                                '1' => '1',
                                '2' => '2',
                                '3' => '3',
                                '4' => '4',
                                '5' => '5',
                                '6' => '6',
                                '7' => '7',
                                '8' => '8',
                                '9' => '9',
                                '10' => '10',
                                '11' => '11',
                                '12' => '12'),

                                'div' => 'input-prepend',
                                'label' => '&nbsp;',
                                'between' => '<span class="add-on">X</span>',
                                'class' => 'span8',
                                'id' => 'prependedInput',

                            ));
                            ?>
                       </div>
                   </div>

                   <div class="row-fluid">  
                        <div class="span12">
                        <?php
                        echo $this->Form->input('opmerking', array('type' => 'textarea', 'class' => 'span10','rows' => '4', 'cols' => '90'));
                        ?>
                        </div>
                   </div>     
            </div>
                        <?php 
                        echo $this->Form->hidden('levertijd', array('type' => 'tel', 'id' => 'levertijd', 'onblur' => 'fill();'));
                        echo $this->Form->hidden('prijs', array('type' => 'tel', 'id' => 'prijs', 'onblur' => 'fill();'));
                        echo $this->Form->hidden('artikelnummer', array('type' => 'tel', 'id' => 'artikelnummer', 'onblur' => 'fill();'));
                        echo $this->Form->hidden('ean', array('type' => 'tel', 'id' => 'ean', 'onblur' => 'fill();'));
                        echo $this->Form->hidden('overtime', array('type' => 'tel', 'id' => 'overtime', 'onblur' => 'fill();'));
                        echo $this->Form->hidden('productgroep', array('type' => 'tel', 'id' => 'productgroep', 'onblur' => 'fill();'));
                        ?>

            <div class="modal-footer">
            <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
            <?php
            echo $this->Form->button('Save', array('class' => 'btn btn-primary'));echo'<br/>';
            echo $this->Form->end();
             ?>
            </div>
        </div>                


<!-- End Add order modal -->

当在我的标题中提交表单时,表单将我发送到 /search/result ,在那里我可以看到数据已提交,但我也看到我的 bestellingcontroller 被调用的错误。因此,当我在标题中提交表单时,我的其他表单也被提交。

如果我删除元素中的请求操作并将 Form => create 替换为:

echo $this->Form->create('null', array('url' => '/bestelling/modal_ext'));

它工作正常,但随后我失去了此表单中的验证,并且 $request->data 更改,因为该值不是像 [Bestelling] [fieldname] 这样的数组。数组结构的改变不是什么大问题,但我想尝试以正确的方式去做。有人可以帮助我朝着正确的方向解决这个问题。我对 cakephp 很陌生,但我认为调用动作的方式不是由我的程序以正确的方式完成的。

4

2 回答 2

0

您的两个表单都在提交,因为您本质上是给它们提供了相同的“名称”。他们确实有不同的动作集,但 Cake 的 FormHelper:

echo $this->Form->create('null', ...

在你写的这个东西中,字符串'null'不是NULL 语言值

FormHelper 的书解释说:

表单元素也返回一个 DOM ID。ID 是使用模型的名称和控制器操作的名称 CamelCased 生成的。因此,在您的情况下,我认为这类似于“ NullAddForm”(如果它是控制器的添加操作)。

在您的情况下,您可以像这样为模型变量传递 FALSE:

echo $this->Form->create(false, $otherStuff);

这将:

您也可以为 $model 传递 false。这会将您的表单数据放入数组中:$this->request->data(而不是在子数组中:$this->request->data['Model'])。这对于可能不代表数据库中任何内容的简短表单非常方便。

因此,如果您希望两种表单都直接 POST 到您的控制器,请使用此方案,并将false值作为FormHelper::create()函数的第一个参数的模型变量,并且要小心,因为这会改变$this->request->data控制器中的结构。

至少对于搜索,您的另一个选择是通过 AJAX 进行。如果你问我这对于这样的功能更好,因为你不会请求完全重新渲染页面。如果您通过 AJAX 完成这两种形式,那就更好了。

@Jelmer 对与英语不同的语言的变量非常正确,因为这对于任何其他非母语(例如荷兰语)的人来说都是地狱。我亲自处理过很多这样的项目(是的,完全是荷兰语),但并不漂亮。

于 2013-05-13T08:31:15.620 回答
0

荷兰语命名已被替换为英语以便更好地阅读

我发现了问题,实际上是一个非常小的错误导致了这个错误(我认为)。该错误是由数据库表顺序的命名引起的。Cakephp 假设数据库表被称为带有额外 S 的订单,但事实并非如此,所以我将数据库设置为

 $this->Order->setSource('order');

我现在将名称更改为订单并删除了 add_customer_order 中的以下行

$this->requestAction('Order/modal_ext');//Include OrderController modal_ext

我仍然在 default.ctp 中使用以下行

echo $this->Form->create('null', array('url' => '/search/result'),array(

但这现在没有任何问题。该控制器在由控制器中的 setSource 设置的表中搜索。如果我将 null 更改为 Search,则会出现错误,因为数据库表搜索不存在。如果我按照我认为的正确方式执行此操作,则此表单应指向控制器命令,以便可以替换 null。两种表格现在都按预期分别提交。所以我认为整个问题是我没有遵循 cakephp 的命名约定。可能我会再次遇到这个命名约定并且遵循它会更容易(更改表的名称)。

于 2013-05-13T22:02:05.457 回答