|
|
|
|
|
для: Trianon
(27.09.2009 в 19:13)
| | Пробовала вчера делать, чтобы ввести еще одно поле, которое покажет выбранный чекбокс, что-то с ним не получается, где-то я ошибку пропускаю, поэтому отказалась.
Решила пойти путем более простым.
Цикл в обработчике немного поменяла, чтобы использовать многострочный INSERT
<?php
foreach($_POST['act'] as $k=>$v){
$chunk = explode("-",$k);
$id_group[]= "(" . $chunk[1] . ',' . $chunk[0] . ")";
}
$id = implode(",", $id_group);
//присвоить значения выбранных чекбоксов
$q = "INSERT INTO permission(id_group,mod_id) VALUES" . $id;
$res2 = mysql_query($q);
if(!$res2) exit("Error in $q: ". mysql_error());
?>
|
А вот от TRUNCATE я уже никак избавиться не могу, потому как у меня два поля с id'ами - составной уникальный ключ, обновить до нуля я их не могу, вот и приходится все вырезать. | |
|
|
|
|
|
|
|
для: Лена
(27.09.2009 в 18:25)
| | да , как-то так.
Запрос , формирующий чекбоксы , тоже несколько упрощается при этом. Поскольку отсутствие записей ловить не нужно.
пропустил момент, когда число связываемых факторов сократилось с трех до двух, но не суть важно. | |
|
|
|
|
|
|
|
для: Trianon
(27.09.2009 в 16:21)
| | То есть, вы предлагаете такую структуру?
CREATE TABLE `permission` (
`id_group` int(11) NOT NULL default '0',
`mod_id` int(11) NOT NULL default '0',
`my_check` int(11) NOT NULL,
`choos` int(11) NOT NULL auto_increment,
PRIMARY KEY (`choos`),
UNIQUE KEY `id_group` (`id_group`,`mod_id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
|
суррогатный ключ здесь choos, поле для отмеченного чекбокса - my_check. Тогда в названии чекбокса надо передавать значение суррогатного ключа. | |
|
|
|
|
|
|
|
для: Лена
(27.09.2009 в 14:04)
| | Дорого и сердито.
сердито стирать всю таблицу... а если кто-то обратится между запросами?
дорого заносить элементы по одной строке на запрос.
Может есть смысл переделать таблицу, добавив поле активен/неактивен? Ну и суррогатный ключ докучи... | |
|
|
|
|
|
|
|
для: Trianon
(26.09.2009 в 12:40)
| | Cделала две страницы - на одной модули+доступ к ним разных групп. На другой - операции с модулями, предполагается, что доступ к этой странице только у админов и т.д.
Изменила массив, в результате получился такой -
$arr[$mod][$id_mod][$gt][$id_gt] = $c[$i];
модуль-id модуля-группа-id группы = столбец, который показывает, выбран ли чекбокс.
В шаблоне чекбоксы выглядят так:
<td><input type="checkbox" name="act[{$kgr}-{$kgrmr}]" value="1" {if $grmr == 1}checked{/if}></td>
в названии - id модуля+id группы и здесь $grmr это $c[$i]
Все в одном массиве, все раскладывается, только циклов много.
В обрабочике, когда приходят post-параметры(после защиты от иньекции):
<?php
//очистить таблицу
$sql2 = "TRUNCATE TABLE permission";
$result2 = mysql_query($sql2);
if(!$result2) exit("Error in $sql2: ". mysql_error());
foreach($_POST['act'] as $k=>$v){
$chunk = explode("-",$k);
//присвоить значения выбранных чекбоксов
$q = "INSERT INTO permission(id_group,mod_id) VALUES('$chunk[1]','$chunk[0]')";
$res2 = mysql_query($q);
if(!$res2) exit("Error in $q: ". mysql_error());
}
?>
|
Спасибо. | |
|
|
|
|
|
|
|
для: Лена
(25.09.2009 в 22:22)
| | >осталось обработчик формы сделать.
... который обходился бы возможно меньшим числом запросов...
Тоже задачка не самая примитивная. | |
|
|
|
|
|
|
|
для: Trianon
(25.09.2009 в 16:36)
| | Сделала, ошибки поняла, осталось обработчик формы сделать.
Я так понимаю, если чекбокс отмечен - в таблицу связки permission вставляем строку, если убрали чекбокс - удалили строку.
Вот что получилось:
<?php
//запрос к базе уже был выше
//вывод результата запроса
while($row = mysql_fetch_assoc($result)){
$mod = $row['mn'];
$gt = $row['gt'];
$opn = $row['opn'];
$arr[$mod][$gt][$opn] = $row['chk'];
}
$nbsp = str_repeat(" ", 20);
$smarty->assign('nbsp',$nbsp);
$smarty->assign('arr',$arr);
$smarty->display('permission.tpl');
?>
|
шаблон:
<table width=100% border='1px'>
{foreach from = $arr item = ar key = keys first = true name = mod}
{* шапка таблицы - только для первого цикла*}
{if $smarty.foreach.mod.first}
<tr>
<td>№</td>
<td>Название модуля</td>
{* названия групп пользователей *}
{foreach from = $ar item = gr key = kgr}
<td>{$kgr}</td>
{/foreach}
</tr>
{/if}
<form action='permission.php' method='post'>
{* названия модулей *}
<tr>
<td>{$number}</td>
<td colspan = 4>{$keys}</td>
</tr>
{* название операций *}
{foreach from= $gr item=op key = opk}
<tr>
<td></td>
<td>{$nbsp}{$opk}</td>
{* название группы *}
{foreach from = $ar item = gr key = kgr}
{*чекбокс*}
<td><input type="checkbox" name="act[{$keys}-{$kgr}-{$opk}]" value="1" {if $op == 1}checked{/if}></td>
{/foreach}
</tr>
{/foreach}
{/foreach}
<tr>
<td colspan=5><input type='submit' value='Установить разрешения' name = 'Perm'></td>
</tr>
</form>
</table>
|
| |
|
|
|
|
|
|
|
для: Лена
(25.09.2009 в 13:29)
| | если Вы хотите структурировать элементы в порядок
модули(операции(группы(элементы)))
то нужно соответствующим образом
а) задать сортировку в запросе, которая бы сгруппировала (не в смысле gropup by , а в смысле - разместила бы рядом) строки согласно структуре.
б) определить php-код, который результат этого запрос расхлебает.
Первый, очевидно, будет ORDER BY модуль, группа, операция
Что до второго, то тут надо определиться, в массиве какого вида смарти ожидает данные. | |
|
|
|
|
|
|
|
для: Trianon
(24.09.2009 в 22:24)
| | Не выходит.
обработчик(кусок, что поменяла):
<?php
$sql = "SELECT g.type_group gt, g.id_group gi, m.mod_name mn, m.mod_id mi, o.op_name opn, o.op_id oi, (l.op_id IS
NOT NULL) chk
FROM (
modules m
JOIN groups g
JOIN operations o)
LEFT JOIN permission l ON l.mod_id = m.mod_id
AND l.id_group = g.id_group
AND l.op_id = o.op_id
LIMIT 0 , 30";
$result = mysql_query($sql);
if(!$result) exit("Error in $sql: ". mysql_error());
for($i=0;$row = mysql_fetch_assoc($result);$i++){
if($i!=$row['mi']){
$i =$row['mi'];
$mod[$i] = $row['mn'];
}
if($i!=$row['gi']){
$i =$row['gi'];
$groups[$i] = $row['gt'];
}
if($i!=$row['oi']){
$i =$row['oi'];
$op[$i] = $row['opn'];
}
foreach($_POST['cat'] as $cat){
if($cat == 1 && $cat == $row['chk'][$i]) $checked = 'cheked';
else $checked = '';
}
}
?>
|
Шаблон:
<table width=100% border='1px'>
<tr>
<td>№</td>
<td>Название модуля</td>
{* названия групп пользователей *}
{foreach from = $groups item = gr}
<td>{$gr}</td>
{/foreach}
</tr>
<form action='permission.php' method='post'>
{* названия модулей *}
{foreach from=$mod item=one key=keys}
<tr>
<td>{$keys}</td>
<td colspan = 4>{$one}</td>
</tr>
{* название операций *}
{foreach from=$op item=p key = opk}
<tr>
<td></td>
<td>{$nbsp}{$p}</td>
{* группы *}
{foreach from = $groups item = gr key = grkey}
{*название чекбокса - группа+модуль+операция *}
<td><input type="checkbox" name="act[{$grkey}-{$keys}-{$opk}]" value="1" {$checked}></td>
{/foreach}
</tr>
{/foreach}
{/foreach}
<tr>
<td colspan=5><input type='submit' value='Установить разрешения' name = 'Perm'></td>
</tr>
</form>
</table>
|
var_dump($checked); дает NULL | |
|
|
|
|
|
|
|
для: Лена
(24.09.2009 в 22:19)
| | //отправляем переменные в шаблон
Вот на этом месте можно сделать var_dump($check); и всё станет ясно. | |
|
|
|
|