Pergunta

Então, eu tenho um controlador de usuários com uma ação chamada "Auto -visão" Se parece com isso: (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');
}

Isso renderiza uma página de perfil que possui um formulário. Isto é o primeiro formulário renderizado na página e funciona muito bem como você esperaria.

Exibir o snippet de código: (usuários/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>

a Html que é produzido de forma "usuários/view.ctp":

<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>

Então eu chamo e elemento que também renderizará um formulário. (usuários/view.ctp)

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

E então é aqui que tudo dá errado. Não importa o que eu tente, não consigo obter este segundo formulário para imprimir corretamente. A parte do meio do formulário imprimirá, mas não as tags de abertura e fechamento. Sem eles, o formulário é inútil para mim. Neste ponto e eu realmente não quero escrevê -lo à mão.

Este é o código no meu elemento que estou tentando usar para produzir o formulário (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));?>

isso é o que "Elements/my_apps.ctp"Imprime:

<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>

Isto NÃO VOU Imprima as tags de abertura e fechamento que devem ser algo assim:

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

Alguma ideia? Algo que eu deveria tentar fazer para depurar seria útil.

Atualizar:

Eu apenas tentei escrever o código manualmente e até isso está sendo despojado. Existe algum tipo de pós-processamento? Isso poderia ser responsável por remover minhas tags de formulário?

Foi útil?

Solução

Ainda não vejo nada de errado, mas posso sugerir que, para sua sanidade, você usa um nome diferente para a variável $options Na primeira forma, ou melhor ainda, escreva a matriz em linha. É mais comum ver $options Usado para passar nas opções de seleção, como você fez no segundo formulário. Ou seja, economize $ opções para 'opções'.

Em sua função selfView() Você não parece atribuir valores a applications & formms.

Minha preferência pessoal é escrever isso:

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

assim:

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

Eu acho que torna o código um pouco mais legível.

Outras dicas

Na sua primeira forma, você não está ecoando $ form-> end (), portanto a forma não está fechando corretamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top