2

.tpl と .inc.php の 2 つのファイルがあります。

私の .inc.php では、2 つのクエリを使用してデータを取得しています。smarty を使用して、クエリの応答を .tpl ファイルに渡し、それらのデータをテーブルと選択リストに表示しています。

ここで、ユーザーが選択リストで新しい項目を選択したときに、リストが自動的に更新されるようにしたいと考えています。

選択リストの変更を実際に検出できます。

問題は、どのように関数を呼び出すことができるかです

updateToolPrivilegesTableForSelectedTool($Object)

.tpl ファイルから。関数は .inc.php ファイルにあります。これはjqueryで可能なはずですが、方法がわかりません。

これが私のコードです:

PHP:

<?php


updateToolPrivilegesTable();

$tool =$_DB->queryRaw("SELECT objects FROM backend_menu WHERE parent != 0");
while ($row_tool = $tool->next_assoc())
{
    $resultstool[] = $row_tool;
}

$smarty->assign("tool_name",$resultstool);
$smarty->assign("privileges",$resultsprivlieges);
$smarty->TDisplay("users/backend_tools_user_privileges.tpl", "Backend Tools Privileges", "general-content.tpl");



function updateToolPrivilegesTable()
{
global $_DB;
global $resultsprivlieges;
$resultsprivlieges = array();
$privlieges = $_DB->queryRaw("SELECT `group_id`, `user_id`, `Object`, `Read`, `Update`, `Insert`, `Delete` FROM `backend_privileges`");

while ($row = $privlieges->next_assoc())
{
    $resultsprivlieges[] = $row;
}
}

function updateToolPrivilegesTableForSelectedTool($Object)
{
global $_DB;
global $resultsprivlieges;
$resultsprivlieges = array();
$privlieges = $_DB->queryRaw("SELECT `group_id`, `user_id`, `Object`, `Read`, `Update`, `Insert`, `Delete` FROM `backend_privileges` WHERE `Object`=$Object");

while ($row = $privlieges->next_assoc())
{
    $resultsprivlieges[] = $row;
}
}

?>

HTML (.tpl)

<h1> Backend Tools Privileges</h1>

<table>
<tr>
<td>Tool</td>
<td>
<SELECT name="object" id="selectTool">
        {foreach from=$tool_name item=toolItem name=foo}    
                <OPTION name="object" VALUE="{$toolItem['objects']}">{$toolItem['objects']}</OPTION>
        {/foreach}
</SELECT>
</td>
</tr>
</table>

<table width='700px' id="employeetable" class="tablesorter" style='table-layout:fixed;'>
<thead>
    <tr>
        <th>Group Id</th>
        <th>User Id</th>
        <th>Object</th>
        <th>Read</th>
        <th>Update</th>
        <th>Insert</th>
        <th>Delete</th>
    </tr>
</thead>
<tbody>
    {foreach from=$privileges item=privilegesItem name=foo}
    <tr>
        <td>{$privilegesItem['group_id']}</td>
        <td>{$privilegesItem['user_id']}</td>
        <td>{$privilegesItem['Object']}</td>
        <td>{$privilegesItem['Read']}</td>
        <td>{$privilegesItem['Update']}</td>
        <td>{$privilegesItem['Insert']}</td>
        <td>{$privilegesItem['Delete']}</td>
    </tr>
    {/foreach}
</tbody>
</table>
</form>


{literal}
<script type="text/javascript">

$(selectTool).change(function() 
{
!!!!!!! Here I shuld call the function updateToolPrivilegesTableForSelectedTool($Object) from .php file.
}
</script>
{/literal}
4

1 に答える 1

2

フォーム投稿を使用して、ドロップダウンで選択したオブジェクトを投稿変数としてページをリロードし、選択ボックスに onchange フォーム送信を使用できます。

ドロップダウンを次のように変更します。

<form action="mypage.php" method="post">
   <select name="object" id="selectTool" onChange="form.submit()">
        <option>Please pick an object to filter...</option>
        {foreach from=$tool_name item=toolItem name=foo}    
                <option name="object" VALUE="{$toolItem['objects']}">{$toolItem['objects']}</option>
        {/foreach}
   </select>
</form>

次に、PHPに次のものがあります。

if(isset($_POST['object']{0})){
    updateToolPrivilegesTableForSelectedTool($_POST['object']);
}else{
    updateToolPrivilegesTable();
}

気をつけて!updateToolPrivilegesTableForSelectedTool のクエリを変更して、データベース インジェクションを回避します。

$privlieges = $_DB->queryRaw("SELECT `group_id`, `user_id`, `Object`, `Read`, `Update`, `Insert`, `Delete` FROM `backend_privileges` WHERE `Object`='".mysql_real_escape_string($Object)."'");

より優れた Ajax ソリューションでは、tbody 全体をオンザフライで置き換え、updateToolPrivilegesTableForSelectedTool を別のファイルに移動する必要があるため、さらにコードが必要になります。なんらかの jQuery テーブルソーター プラグインを使用している場合は、おそらくテーブルソーターも再度呼び出す必要があります。これをすべて正しく機能させるのはさらに難しくなり、最初にフォーム投稿の基本を理解する必要があると思います。

于 2012-06-12T14:37:10.183 に答える