繁体   English   中英

CakePHP,带有分页结果的Form Helper标记问题

[英]CakePHP, Form Helper Tag Issue With Pageinated Results

我需要的是看到CakePHP(版本2.2.2)为什么正在做的事情的人? 好的,我的代码细分如下。 DIV PageList是一个JQuery Accordion,具有两个下拉菜单,一个下拉菜单供管理员添加新用途,另一个下拉菜单可查看所有用户并进行一些更改。 添加用户很好,并且可以正常工作。

我的问题是(或者至少我认为是)Form Helper,我确实在foreach循环之前进行过Form Create调用,并且工作正常,没有任何问题,我会找到想要更改某些内容然后保存的用户, 没问题。 当我说要对结果进行分页处理时,我开始遇到问题。 就像Form Create在foreach之外并且恰好在我的表代码开始之前一样,只有最后显示的结果才能保存所做的更改。 我找到了问题的原因,那就是ID字段始终默认为最后显示的结果。 所以我将Form Create移到了我的foreach循环中。

现在可以使用,但是由于某种原因,它可以立即开始结尾,因此我的输入现在位于form标签之外了吗? 我不明白为什么,因为在foreach循环的底部有End Form Helper end()调用。 因此,它应该仅以自己的形式显示每个用户。

我不确定这是否是一个问题,仍然可以像这样使用它。 但是一个问题是我的表单现在在我的表之后开始,它将无法通过W3C进行验证,这不是一个大问题。 旁注,还可以使用表格吗? 我要与他们列出数据吗? 我正在尝试学习HTML 5规范。 但是还没有真正看到关于表的任何信息...

非常感谢。 格伦·柯蒂斯(Glenn Curtis)。

echo '<div id="PageList">';

$OutputHolder = '<h3 class="Background-Titles">Add User</h3>';
$OutputHolder .= '<div class="Background-Content" id="AdminAddUser">';
$OutputHolder .=  $this->Form->create('User', array('url'=>'http://glenns-showcase.net/projects/cake/DrWho/adminadd/', 'inputDefaults' => array('div' => false) ) ); 
$OutputHolder .=  $this->Form->input('username');
$OutputHolder .=  $this->Form->input('password');
$OutputHolder .=  $this->Form->input('firstname');
$OutputHolder .=  $this->Form->input('surname');
$OutputHolder .=  $this->Form->input('email');
$OutputHolder .= 'Select Role For User <br />';
$OutputHolder .=  $this->Form->radio('role_id', $opt_role, $attributes);
$OutputHolder .= '<br />Select Active State For User <br />';
$OutputHolder .=  $this->Form->radio('active', $opt_active, $attributes);
$OutputHolder .=  $this->Form->end('Submit'); 
$OutputHolder .= '</div>'; //End for AddUser
echo $OutputHolder;

$OutputViewUsers = '<h3 class="Background-Titles">View All Users</h3>';
$OutputViewUsers .= '<div class="Background-Content" id="AdminViewUsers">';

$OutputViewUsers .=  '<table border="0">';
$OutputViewUsers .=  '<tr><td>Username</td><td>First Name</td><td>Surname</td><td>E-mail</td><td>Stutus</td><td>Level</td><td>Save</td></tr>';
foreach($users as $key => $value) {
    $OutputViewUsers .= $this->Form->create('UserEdit', array('url'=>'http://glenns-showcase.net/projects/cake/DrWho/adminedit/', 'inputDefaults' => array('div' => false) ) );
    $BaseLink = $users[$key]['User']; 
    $OutputViewUsers .= "<td class=\"AdminViewUsersUN\">" .($BaseLink  ['username']) . "</td>";
    $OutputViewUsers .= "<td>" . $this->Form->input('fname', array('default' => $BaseLink  ['firstname'], 'label' => false,  'class' => 'AdminViewUsersFN') ) . "</td>";
    $OutputViewUsers .= "<td>" . $this->Form->input('sname', array('default' => $BaseLink  ['surname'], 'label' => false,  'class' => 'AdminViewUsersSN') ). "</td>";
    $OutputViewUsers .= "<td>" . $this->Form->input('email', array('default' => $BaseLink  ['email'], 'label' => false,  'class' => 'AdminViewUsersEM') ). "</td>";
    $OutputViewUsers .= "<td>" . $this->Form->select('active', $ActOpts, array('empty' => false, 'default' => $BaseLink  ['active'], 'class' => 'AdminViewUsersAS') ). "</td>";
    $OutputViewUsers .= "<td>" . $this->Form->select('role', $RoleOpts, array('empty' => false, 'default' => $users[$key]['Role']['id'],  'class' => 'AdminViewUsersUL') ). "</td>";
    $OutputViewUsers .= $this->Form->hidden('id', array('default' => $BaseLink  ['id'], ) );
    $OutputViewUsers .= "<td>" . $this->Form->submit('Save', array('div' => false, 'class' => 'AdminViewUsersSB') ). "</td></tr>"; 
    //$test = array('label' => 'Save', 'div' => array('class' => 'AdminViewUsersSB'));
    $OutputViewUsers .=  $this->Form->end(); 

} //End of foreach loop
$OutputViewUsers .= '</table>';

$OutputViewUsers .= $this->Paginator->numbers(array('first' => 2));
$OutputViewUsers .= '</div>'; //End for AllUsers 
echo $OutputViewUsers;

echo '</div>'; //End for PageList

更新:::

这就是现在的样子! 但是现在,这或多或少是我以前的经历。 我添加了丢失的标签。 但这现在只能让最后的结果起作用! 我分页显示每页5个结果,该页面上的前4个结果将不起作用,因为它们具有错误的ID号,每次按“保存”时,仅提供最后一个结果的ID。

我不确定“对输入字段进行索引”是什么意思,但据我所知,“给提交元素包含关联记录的适当索引的唯一名称”是什么意思,该字段具有隐藏字段提供ID。

我的样子是,我必须将整个表单放入循环中,以便每个返回的结果都具有自己的形式,这样就不会有错误! 但是我不能将表的开头放入循环中,或者每个结果都有一个标题! 我认为我应该能够解决此问题!

非常感谢您的帮助!

$OutputViewUsers = '<h3 class="Background-Titles">View All Users</h3>';
$OutputViewUsers .= '<div class="Background-Content" id="AdminViewUsers">';
$OutputViewUsers .= $this->Form->create('UserEdit', array('url'=>'http://glenns-showcase.net/projects/cake/DrWho/adminedit/', 'inputDefaults' => array('div' => false) ) );
$OutputViewUsers .=  '<table border="0">';
$OutputViewUsers .=  '<tr><td>Username</td><td>First Name</td><td>Surname</td><td>E-mail</td><td>Stutus</td><td>Level</td><td>Save</td></tr>';
foreach($users as $key => $value) {
    $BaseLink = $users[$key]['User']; 
    $OutputViewUsers .= "<tr><td class=\"AdminViewUsersUN\">" .($BaseLink  ['username']) . "</td>";
    $OutputViewUsers .= "<td>" . $this->Form->input('fname', array('default' => $BaseLink  ['firstname'], 'label' => false,  'class' => 'AdminViewUsersFN') ) . "</td>";
    $OutputViewUsers .= "<td>" . $this->Form->input('sname', array('default' => $BaseLink  ['surname'], 'label' => false,  'class' => 'AdminViewUsersSN') ). "</td>";
    $OutputViewUsers .= "<td>" . $this->Form->input('email', array('default' => $BaseLink  ['email'], 'label' => false,  'class' => 'AdminViewUsersEM') ). "</td>";
    $OutputViewUsers .= "<td>" . $this->Form->select('active', $ActOpts, array('empty' => false, 'default' => $BaseLink  ['active'], 'class' => 'AdminViewUsersAS') ). "</td>";
    $OutputViewUsers .= "<td>" . $this->Form->select('role', $RoleOpts, array('empty' => false, 'default' => $users[$key]['Role']['id'],  'class' => 'AdminViewUsersUL') ). "</td>";
    $OutputViewUsers .= $this->Form->hidden('id', array('default' => $BaseLink  ['id'], ) );
    $OutputViewUsers .= "<td>" . $this->Form->submit('Save', array('div' => false, 'class' => 'AdminViewUsersSB') ). "</td></tr>"; 
} //End of foreach loop
$OutputViewUsers .= '</table>';
$OutputViewUsers .=  $this->Form->end(); 
$OutputViewUsers .= $this->Paginator->numbers(array('first' => 2));
$OutputViewUsers .= '</div>'; //End for AllUsers 
echo $OutputViewUsers;

另一个更新::

现在这似乎可行,每个结果都位于其自己的表单元素和所有输入中,或者现在位于form标记内。 但是,每个结果现在都有自己的标头,因为我现在在表格内有表格,但是该表现在在我的foreach循环中,因此,每次循环时,它都会在结果顶部回显/打印标头。 我正在为此。 仍然欢迎任何帮助!!

foreach($users as $key => $value) {
    $OutputViewUsers .= $this->Form->create('UserEdit', array('url'=>'http://glenns-showcase.net/projects/cake/DrWho/adminedit/', 'inputDefaults' => array('div' => false) ) );
    $OutputViewUsers .=  '<table border="0">';
    $OutputViewUsers .=  '<tr><td>Username</td><td>First Name</td><td>Surname</td><td>E-mail</td><td>Stutus</td><td>Level</td><td>Save</td></tr>';
    $BaseLink = $users[$key]['User']; 
    $OutputViewUsers .= "<tr><td class=\"AdminViewUsersUN\">" .($BaseLink  ['username']) . "</td>";
    $OutputViewUsers .= "<td>" . $this->Form->input('fname', array('default' => $BaseLink  ['firstname'], 'label' => false,  'class' => 'AdminViewUsersFN') ) . "</td>";
    $OutputViewUsers .= "<td>" . $this->Form->input('sname', array('default' => $BaseLink  ['surname'], 'label' => false,  'class' => 'AdminViewUsersSN') ). "</td>";
    $OutputViewUsers .= "<td>" . $this->Form->input('email', array('default' => $BaseLink  ['email'], 'label' => false,  'class' => 'AdminViewUsersEM') ). "</td>";
    $OutputViewUsers .= "<td>" . $this->Form->select('active', $ActOpts, array('empty' => false, 'default' => $BaseLink  ['active'], 'class' => 'AdminViewUsersAS') ). "</td>";
    $OutputViewUsers .= "<td>" . $this->Form->select('role', $RoleOpts, array('empty' => false, 'default' => $users[$key]['Role']['id'],  'class' => 'AdminViewUsersUL') ). "</td>";
    $OutputViewUsers .= $this->Form->hidden('id', array('default' => $BaseLink  ['id'], ) );
    $OutputViewUsers .= "<td>" . $this->Form->submit('Save', array('div' => false, 'class' => 'AdminViewUsersSB') ). "</td></tr>"; 
    //$test = array('label' => 'Save', 'div' => array('class' => 'AdminViewUsersSB'));
    $OutputViewUsers .= '</table>';
    $OutputViewUsers .=  $this->Form->end(); 

} //End of foreach loop

您只是在生成无效的HTML。 您在循环中缺少一个开头的tr标记,但是即使存在该标记也将仍然无效,因为只允许tr容纳tdth元素 ,因此浏览器可能会在表格外呈现表单。

另请参阅表格内的表格

一种解决方法是将整个表包装在表单中,为输入的输入字段建立索引,为Submit元素提供包含相关记录的适当索引的唯一名称,然后在服务器端使用此名称来确定要保存的记录。 或将提交的数据与数据库进行比较,并仅保存更改过的记录。

ps。 是的,只要表格用于描述表格数据的目的,表格就可以了。

我已将以上内容标记为答案,因为它使我处于正确的轨道,非常感谢!

现在,我的循环中有表格,表格中有表格。 现在,这意味着每个结果都有其自己的表单标签。

使用标头,我刚刚使用CSS和span标签将它们对齐!

非常感谢Glenn。

这是我的最终代码,以防万一其他人发现它有任何用处。

$OutputViewUsers = '<h3 class="Background-Titles">View All Users</h3>';
$OutputViewUsers .= '<div class="Background-Content" id="AdminViewUsers">';
$OutputViewUsers .=  '<div class="AdminViewUsersListHeaders">
    <span class="AdminViewUsersUNHeader">Username</span>
    <span class="AdminViewUsersFNHeader">First Name</span>
    <span class="AdminViewUsersSNHeader">Surname</span>
    <span class="AdminViewUsersEMHeader">E-mail</span>
    <span class="AdminViewUsersASHeader">Stutus</span>
    <span class="AdminViewUsersULHeader">Level</span>
    <span class="AdminViewUsersSAHeader">Save</span></div>';


foreach($users as $key => $value) {
    $OutputViewUsers .= $this->Form->create('UserEdit', array('url'=>'http://glenns-showcase.net/projects/cake/DrWho/adminedit/', 'inputDefaults' => array('div' => false) ) );
    $OutputViewUsers .=  '<table border="0">';
    //$OutputViewUsers .=  '<tr><td>Username</td><td>First Name</td><td>Surname</td><td>E-mail</td><td>Stutus</td><td>Level</td><td>Save</td></tr>';
    $BaseLink = $users[$key]['User']; 
    $OutputViewUsers .= "<tr><td class=\"AdminViewUsersUN\">" .($BaseLink  ['username']) . "</td>";
    $OutputViewUsers .= "<td>" . $this->Form->input('fname', array('default' => $BaseLink  ['firstname'], 'label' => false,  'class' => 'AdminViewUsersFN') ) . "</td>";
    $OutputViewUsers .= "<td>" . $this->Form->input('sname', array('default' => $BaseLink  ['surname'], 'label' => false,  'class' => 'AdminViewUsersSN') ). "</td>";
    $OutputViewUsers .= "<td>" . $this->Form->input('email', array('default' => $BaseLink  ['email'], 'label' => false,  'class' => 'AdminViewUsersEM') ). "</td>";
    $OutputViewUsers .= "<td>" . $this->Form->select('active', $ActOpts, array('empty' => false, 'default' => $BaseLink  ['active'], 'class' => 'AdminViewUsersAS') ). "</td>";
    $OutputViewUsers .= "<td>" . $this->Form->select('role', $RoleOpts, array('empty' => false, 'default' => $users[$key]['Role']['id'],  'class' => 'AdminViewUsersUL') ). "</td>";
    $OutputViewUsers .= $this->Form->hidden('id', array('default' => $BaseLink  ['id'], ) );
    $OutputViewUsers .= "<td>" . $this->Form->submit('Save', array('div' => false, 'class' => 'AdminViewUsersSB') ). "</td></tr>"; 
    //$test = array('label' => 'Save', 'div' => array('class' => 'AdminViewUsersSB'));
    $OutputViewUsers .= '</table>';
    $OutputViewUsers .=  $this->Form->end(); 

} //End of foreach loop


$OutputViewUsers .= $this->Paginator->numbers(array('first' => 2));
$OutputViewUsers .= '</div>'; //End for AllUsers 
echo $OutputViewUsers; 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM