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">
//<![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;});
//]]>
</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?
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.