[英]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
容纳td
或th
元素 ,因此浏览器可能会在表格外呈现表单。
另请参阅表格内的表格
一种解决方法是将整个表包装在表单中,为输入的输入字段建立索引,为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.