0

私が必要としているのは、CakePHP (Ver 2.2.2) が何をしているのかを理解してくれる人ですか? 私のコードの内訳は次のとおりです。DIV PageList は JQuery アコーディオンであり、2 つのドロップダウンがあります。1 つは管理者が新しい用途を追加するためのもので、もう 1 つはすべてのユーザーを表示して変更を加えるためのものです。ユーザーの追加は正常で、問題なく動作します。

私の問題は、フォーム ヘルパーを使用することです (または、そうではないと思います)。以前に foreach ループの外側でフォーム作成呼び出しを行っていましたが、問題なく動作していました。何かを変更したいユーザーを見つけて保存します。 、 問題なし。結果をページ化すると述べたとき、問題が発生し始めました。Form Create が foreach の外にあり、テーブル コードの開始直前にあったときと同様に、最後に表示された結果のみが変更を保存できます。私は問題の原因を見つけました。それは、ID フィールドが常に最後に表示された結果にデフォルト設定されていたことです。そのため、Form Create を foreach ループ内に移動しました。

これは機能するようになりましたが、何らかの理由ですぐに終了を開始するため、入力がフォーム タグの外側に配置されるようになりました。foreach ループの最後にエンド フォーム ヘルパーの end() 呼び出しがあるため、その理由がわかりません。したがって、各ユーザーを独自の形式で表示する必要があります。

これが問題であるかどうかはわかりませんが、このまま使用できます。しかし、1 つの問題は、フォームがテーブルの後に開始されることです。これは 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

アップデート :::

これが今の姿です!しかし、これは今、私が以前に持っていた方法とほぼ同じです。欠けていたタグを追加しました。しかし、これでは最後の結果しか機能しません! ページごとに 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;

別の更新::

これは機能するようになりました。各結果は独自のフォーム要素とすべての入力、またはフォーム タグ内にあります。ただし、フォーム内にテーブルがありますが、現在は 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
4

2 に答える 2

1

無効な HTML を生成しているだけです。ループ内に開始trタグがありませんが、存在する場合でも、または要素trのみを保持できるtdthため、無効になるため、ブラウザーはテーブルの外側にフォームをレンダリングする可能性があります。

テーブル内のフォームも参照してください

回避策の 1 つは、テーブル全体をフォーム内にラップし、入力フィールドにインデックスを付け、送信要素に関連レコードの適切なインデックスを含む一意の名前を付け、サーバー側でこの名前を使用して保存するレコードを決定することです。または、提出されたデータをデータベースと比較して、何かが変更されたレコードのみを保存します。

ps。はい、テーブルは、表形式のデータを説明する目的で使用される限り問題ありません。

于 2012-11-29T10:01:26.430 に答える
0

正しい軌道に乗ったので、上記を答えとしてマークしました。どうもありがとう!

これで、ループ内にフォームがあり、フォーム内にテーブルがあります。これは、各結果が独自のフォーム タグに含まれることを意味します。

ヘッダーを使用して、CSS とスパン タグを使用して並べました。

どうもありがとうグレン。

これが私の最終的なコードです。

$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; 
于 2012-11-30T14:03:49.203 に答える