2012-11-28 60 views
0

我需要的是有人看到爲什麼CakePHP(Ver 2.2.2)正在做它正在做的事情?好的我的代碼細目如下。 DIV PageList是一個JQuery Accordion,帶有兩個下拉菜單,一個用於管理員添加新用途,另一個用於查看所有用戶並進行一些更改。添加用戶很好,工作沒有任何問題。CakePHP,帶頁面結果的表單助手標籤問題

我的問題是(或者至少我認爲它是)與表格助手,我確實有我的foreach循環之前的表單創建調用,並沒有任何問題,我會找到用戶我想改變的東西然後保存,沒問題。當我說明對結果進行分頁時,我開始出現問題。當表單創建不在foreach中並且在我的表代碼開始之前,只有最後顯示的結果才能保存所做的更改。我發現問題的原因,那就是ID字段總是默認爲最後顯示的結果。所以我將Form Create移到了我的foreach循環中。

這現在可以工作,但由於某種原因,它馬上開始結束,因此我的輸入現在在表單標籤之外?我不明白爲什麼,因爲我在foreach循環的底部有Form Helper end()調用。因此它應該以自己的形式顯示每個用戶。

我不確定這是否是一個問題,仍然可以像這樣使用它。但是一個問題是我的表格現在開始在我的表格之後,這不會通過W3C驗證,這不是一個大問題。注意,還可以使用表格嗎?我正在與他們列出數據?我正在學習HTML 5規範。但並沒有真正看到任何關於表讓...

非常感謝。格倫柯蒂斯。

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 

UPDATE :::

這是現在的樣子!但現在,這更多或者更少是我以前的方式。我已添加缺少的標記。但是現在只能讓最後的結果工作!我爲每頁的5個結果進行分頁,並且頁面上的前四個結果將不起作用,因爲它們具有錯誤的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; 

另一個更新::

這筆現在看來工作,每個結果是在自己的表單元素,並全部投入還是現在的表單標籤內。但是,每個結果現在都有自己的頭文件,因爲我現在在表格中有表格,但現在在我的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 

回答

1

您只是生成無效的HTML。您在循環中缺少tr標記,但即使它存在,它仍然無效,因爲tr is only allowed to hold td or th elements,因此瀏覽器可能會將表格呈現在表格之外。

又見Form inside a table

一個解決方法是將整個包住表的形式,指數輸入的輸入域裏面,給提交元素包含的相關記錄相應的索引的唯一名字,用這個名字在服務器端確定要保存哪個記錄。或者將提交的數據與數據庫進行比較,並僅保存更改內容的記錄。

ps。是的,只要表格用於描述表格數據,表格就可以用於他們的目標。

0

我已經標記了上面的答案,因爲它使我在正確的軌道上,非常感謝!

我現在有我的循環內的窗體和表格內的表格。現在這意味着每個結果都在它自己的表單標籤中。

使用標題我剛剛使用CSS和span標籤排列它們!

非常感謝格倫。

這是我的最終代碼,以防萬一任何其他人發現它有任何用處。

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