|
|
|
|
|
для: Лена
(02.02.2010 в 11:46)
| | теперь с учетом (31.01.2010 в 22:33)
:)
подсказка.
Потребуется одно поле Hidden | |
|
|
|
|
|
|
|
для: sim5
(02.02.2010 в 11:40)
| | Увидела. array_diff_key() думаю, подойдет :) Спасибо. | |
|
|
|
|
|
|
|
для: Лена
(02.02.2010 в 11:31)
| | Чем же они не подошли бы? Их меджу прочим не 1 и не 2 ;-) | |
|
|
|
|
|
|
|
для: sim5
(02.02.2010 в 11:01)
| | Функции пересечения массивов, мне кажется, здесь не подошли бы...
Потому как мне надо пересечение ключей, а не значений массивов. | |
|
|
|
|
|
|
|
для: Лена
(02.02.2010 в 10:52)
| | Есть функции пересечения массивов. | |
|
|
|
|
|
|
|
для: Trianon
(31.01.2010 в 22:33)
| | Обещала посмотреть - посмотрела. И попробовала :)
Взяла для примера список модулей сайта. Напротив каждого названия модуля - чекбокс, который показывает статус модуля. Список расположен на нескольких страницах, я поставила по 5 названий на страницу. Получается, отмечаешь чекбоксы на одной странице - на других страницах все обнуляется. А нам это не нужно.
Значит, нужно обнулять чекбоксы только на той странице, где мы находимся.
Мы запоминаем в массив все id`ы модулей, которые выводятся на данной странице.
Далее получаем массив $_POST['modules'] c отмеченными чекбоксами и исключаем из массива id`ов модулей совпавшие значения $_POST. Все, что осталось - обнуляем. Если ничего не осталось - ничего не обнуляем, для чего делаем соответствующую проверку.
Код - ниже. Писала исходя из экономии времени, поэтому логику и представление не разделяла, а линейку навигатора честно содрала у софттайма, потому как в моей линейке больше кода.
Обработчик: mod.php
<?php
include("configs/dbopen.php");
if(isset($_POST['Mod'])){
$itemsOnPage = 5;
$page = isset($_GET['one_page']) ? (int)$_GET['one_page'] : 1;
$result1 = mysql_query("SELECT COUNT(*) FROM modules");
$posts = mysql_result($result1,0);
$total = intval(($posts - 1)/$itemsOnPage) + 1;
$from = $page * $itemsOnPage - $itemsOnPage;
if($page > $total) $page = $total;
$qu = "SELECT * FROM modules LIMIT " . $from . "," . $itemsOnPage;
$result = mysql_query($qu);
if(!$result) exit("Error in" . $qu . mysql_error());
while ($row = mysql_fetch_assoc($result)){
$ids[] = $row['mod_id']; //все id`ы, которые выводятся на данной странице
}
$str = '';
$arr = array_flip($ids); //переворачиваем массив, нам нужны ключи
foreach($arr as $k=>$v){//сравниваем ключи $_POST['modules'](массив отмеч. чекбоксов) и ключи $ids
if(!array_key_exists($k,$_POST['modules']))
$str .= $k . ",";
}
//проверяем, отмечены ли все чекбоксы
if(preg_match("/[0-9]+/su",$str)){
$q = "UPDATE modules SET visib = 0
WHERE mod_id IN (" . mb_substr($str,0,-1) . ")";
$r = mysql_query($q);
if(!$r) exit("Error in" . $q . mysql_error());
}
foreach ($_POST['modules'] as $item=>$value) {
$sql = "UPDATE modules SET visib = " . $value . " WHERE mod_id =" . $item;
$res = mysql_query($sql);
if(!$res) exit("Error in " . $sql . mysql_error());
}
include('mod_pager.php');
include('page_nav.php');
}else{
include('mod_pager.php');
include('page_nav.php');
}
?>
|
mod_pager.php
<?php
$itemsOnPage = 5;
$page = isset($_GET['one_page']) ? (int)$_GET['one_page'] : 1;
$result1 = mysql_query("SELECT COUNT(*) FROM modules");
$posts = mysql_result($result1,0);
$total = intval(($posts - 1)/$itemsOnPage) + 1;
$from = $page * $itemsOnPage - $itemsOnPage;
if($page > $total) $page = $total;
$q = "SELECT * FROM modules LIMIT " . $from . "," . $itemsOnPage;
$result = mysql_query($q);
if(!$result) exit("Error in $q: ". mysql_error());
echo "<table width=100% border='1px' class = 'admin_table'>
<tr>
<td>Название модуля</td>
<td>Статус</td>
</tr>";
while ($row = mysql_fetch_assoc($result)){
//отмеченные чекбоксы
if($row['visib'] == 1) $check = 'checked';
else $check = '';
//форма должна обрабатываться на разных страницах
if($page>0) $query = "?one_page=" . $page;
else $query = '';
//форма
echo "<form action='mod.php" . $query . "' method='post'>";
echo "<tr>
<td>". $row['mod_name'] . "</td>
<td><input type='checkbox' name='modules[" . $row['mod_id'] . "]' value='1'" . $check . ">
</td>";
echo "</tr>";
}
echo "<tr>
<td colspan=3><input type='submit' value='Подключить/отключить модуль' name = 'Mod'></td>
</tr>
</form></table>";
?>
|
page_nav.php
<?php
if ($page != 1) $pervpage = "<a href='?one_page=1'><<</a>
<a href='?one_page=" . ($page - 1) ."'><</a>";
if ($page != $total) $nextpage = "<a href='?one_page=" . ($page + 1) . "'>></a>
<a href='?one_page=" .$total. "'>>></a>";
if($page - 2 > 0) $page2left = "<a href='?one_page=". ($page - 2) ."'>". ($page - 2) ."</a> | ";
if($page - 1 > 0) $page1left = "<a href='?one_page=" . ($page - 1) ."'>". ($page - 1) ."</a> | ";
if($page + 2 <= $total) $page2right = " | <a href='?one_page=" . ($page + 2) ."'>". ($page + 2) ."</a>";
if($page + 1 <= $total) $page1right = " | <a href='?one_page=" . ($page + 1) ."'>". ($page + 1) ."</a>";
echo $pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage;
?>
|
| |
|
|
|
|
|
|
|
для: Ванек2010
(01.02.2010 в 00:19)
| | Ну работает и слава богу. Но возможно, что записи, значения которых определяют чекбоксы, это постоянно упорядоченный набор, и в таком случе, можно работать с битовым набором (одним для всех) определящим состояние чекбоксов, установку/сброс битов которого производить логической операцией XOR. | |
|
|
|
|
|
|
|
для: Лена
(31.01.2010 в 21:25)
| | Да это сделал, еще вначале, сперва все обнуляю, и заношу только те которые были выбраны, вроде все норм пашет =) | |
|
|
|
|
|
|
|
для: Лена
(31.01.2010 в 22:24)
| | Еще веселее, когда размер страницы каждый пользователь вправе указывать в настройках профиля индивидуально. | |
|
|
|
|
|
|
|
для: Trianon
(31.01.2010 в 22:12)
| | Я не могу понять, какая разница, на какой я буду странице, если в базу я все равно передаю только отмеченные чекбоксы. База не знает, сколько у меня страниц и как на них расположены элементы с чекбоксами, постраничка - это уже работа другого сервера, база "видит" только массив отмеченных чекбоксов.
Постараюсь завтра найти время и попробовать - сделаю две страницы и на них - элементы с чекбоксами и сама посмотрю. Доверяй, но проверяй :) Тем более, когда не верится. | |
|
|
|
|