【问题标题】:Cakephp FormHelper not outputting "<form>" tagsCakephp FormHelper 不输出“<form>”标签
【发布时间】:2011-01-17 22:29:07
【问题描述】:

所以我有一个用户控制器,其中包含一个名为“selfView”的操作,它看起来像这样: (users_controller.php)

function selfView() {
  $user = $this->User->find('first', array('conditions' => array('User.id' => $this->Auth->user('id'))));
  $formms = $this->Form->find('all', array('fields' => array('Form.id', 'Form.name'), 'recursive' => -1));
  $this->set(compact('user', 'formms'));
  $this->render('view');
}

这会呈现一个个人资料页面,该页面上有一个表单。这是页面上呈现的第一个表单,它可以正常工作。

查看代码sn-p: (users/view.ctp)

<div id="passwordChange">
        <?php echo $form->create('User', array( 'action' =>'updatePass' ));?>
          <fieldset>
            <legend><?php __('Change Password');?></legend>
            <?php
              $options = array('type'=>'password', 'div' => array('class' => 'required'));
              echo $form->input(__('old_password', true), $options);

              $options = array('div' => array('class' => 'required'), 'error' => array('confirmPassword' => __('Passwords do not match please try again',true), 'noempty' => __('Please provide a password',true)));
              echo $form->input(__('password', true), $options);

              $options = array('type'=>'password', 'div' => array('class' => 'required'));
              echo $form->input(__('confirmation_password', true), $options);

              echo $form->hidden('User.id', array('value' => $user['User']['id']));
            ?>
          </fieldset>
        <?php echo $ajax->submit(__('Change Password', true), array('url' => array('controller' => 'users', 'action' => 'updatePass'),
                   'update' => 'storage', 
                   'complete' => '$("#UserUpdatePassForm input[type=password]").val(""); '));
    $form->end();?>  
                    <a href="#">Cancel</a> 
      </div>

由“users/view.ctp”生成的HTML

<form action="/high-school-app/users/updatePass" method="post" id="UserUpdatePassForm">
  <fieldset style="display: none;">
    <input type="hidden" value="POST" name="_method">
  </fieldset>
  <fieldset>
    <legend>Change Password</legend>
    <div class="required">
      <label for="UserOldPassword">Old Password</label>
      <input type="password" id="UserOldPassword" value="" name="data[User][old_password]">
    </div>
    <div class="required required">
      <label for="UserPassword">Password</label>
      <input type="password" id="UserPassword" value="" name="data[User][password]">
    </div><div class="required required">
      <label for="UserConfirmationPassword">Confirmation Password</label>
      <input type="password" id="UserConfirmationPassword" value="" name="data[User][confirmation_password]">
    </div>
    <input type="hidden" id="UserId" value="" name="data[User][id]">
  </fieldset>
  <div class="submit">
    <input type="submit" onclick="return false;" id="submit2026598409" value="Change Password" update="storage">
  </div>
  <script type="text/javascript">
  //&lt;![CDATA[
  jQuery('#submit2026598409').click( function() { jQuery('#submit2026598409').parents('form').ajaxSubmit({beforeSend:function(request) {request.setRequestHeader('X-Update', 'storage');}, complete:function(request, textStatus) {$("#UserUpdatePassForm input[type=password]").val(""); }, success:function(data, textStatus) {jQuery('#storage').html(data);}, async:true, type:'post', url:'/high-school-app/users/updatePass'}); return false;});
  //]]&gt;
  </script> 
  <a href="#">Cancel</a> 
</form>

然后我调用和元素,它也将呈现一个表单。 (users/view.ctp)

echo $this->element('my_apps' , array('applications' => $applications));  

然后这就是一切出错的地方。无论我尝试什么,我都无法正确打印第二张表格。表格的中间部分将打印出来,而不是开始和结束标签。没有它们,表格对我来说毫无用处。在这一点上,我真的不想用手把它写出来。

这是我试图用来输出表单的元素中的代码(elements/my_apps.ctp):

<?php echo $form->create('Applications', array( 'url' => array('controller' => 'applications', 'action' => 'assign',  'id' => null))); ?>
      <fieldset>
        <legend><?php __('Assign Application to User');?></legend>
        <?php
          $options = array('--' => __('Select One',true), 'test' => 'test', 'test2' => 'test2');
          echo $form->label('Application.form_id', __('Form Name',true).":");
          echo $form->select('Application.form_id', $options, $selected = '--');

          echo $form->hidden('Application.user_id', array('value' => $user['User']['id']));
        ?>
      </fieldset>
<?php echo $form->end(__('Assign', true));?>

这是“elements/my_apps.ctp”打印出来的:

<fieldset style="display: none;">
  <input type="hidden" value="POST" name="_method">
</fieldset>
<fieldset>
  <legend>Assign Application to User</legend>
  <label for="ApplicationFormId">Form Name:</label>
  <select id="ApplicationFormId" name="data[Application][form_id]">
    <option value=""></option>
    <option selected="selected" value="--">Select One</option>
    <option value="test">test</option>
    <option value="test2">test2</option>
  </select>
  <input type="hidden" id="ApplicationUserId" value="" name="data[Application][user_id]">
</fieldset>
<div class="submit">
  <input type="submit" value="Assign">
</div>

不会打印应该是这样的开始和结束标签:

<form action="/high-school-app/applications/assign" method="post" id="ApplicationAssignForm">
 .....
 .....
</form>

有什么想法吗?我应该尝试做一些调试的事情会有所帮助。

更新:

我只是尝试手动了解代码,即使它也被剥离了。是否有某种后处理进行?那会负责删除我的表单标签吗?

【问题讨论】:

  • 不应该有任何后期处理,这取决于您所说的“手写”。您只是在 CTP 文件中有 HTML 吗?因为那肯定不应该被剥离。您能在 pastebin 上为我添加您的布局文件和模板文件的链接吗?我以前遇到过这个问题,但不记得我是如何解决的。查看您的布局/视图文件可能会有所帮助。
  • 抱歉,从德国发帖。我尝试在 ctp 文件中编写 html,但它仍然去掉了“表单”标签。这是一个 pastebin 链接:pastebin.com/m5e68275d 如果还有其他可能有助于让我知道的信息。再次抱歉耽搁了。
  • 所以没有答案我对表单做了一个 ajax 请求并将其显示在模式窗口中。效果很好。

标签: php cakephp forms helpers form-helpers


【解决方案1】:

在您的第一个表单中,您没有回显 $form->end(),因此表单没有正确关闭。

【讨论】:

  • 这应该被标记为正确答案。如果你不回显结束 $form->end() 则第二个表单根本不会呈现。
【解决方案2】:

我还看不出有什么问题,但是为了您的理智,我可以建议您在第一种形式中为变量 $options 使用不同的名称,或者更好的是,内联写入数组。更常见的是看到 $options 用于传递选择选项,就像您在第二种形式中所做的那样。 IE。为“选项”保存 $options。

在您的函数selfView() 中,您似乎没有为applicationsformms 赋值。

我个人的偏好是这样写:

<?php echo $form->submit(__('Assign', true));
      echo $form->end();?>

像这样:

<?php echo $form->end(__('Assign', true)) ?>

我认为它使代码更具可读性。

【讨论】:

  • 感谢您提供有关使我的代码更具可读性的提示,我已经进行了一些更改以纳入您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
相关资源
最近更新 更多