PHP . SU
Программирование на PHP, MySQL и другие веб-технологии
Страниц (59): В начало « ... 3 4 5 6 [7] 8 9 10 11 ... » В конец
Найдено сообщений: 881
Vladimir Kheifets
Отправлено: 24 Января, 2022 - 06:06:42 • Тема: Нужна помощь в создании скрипта для создания графиков дежурств • Форум: Напишите за меня, пожалуйста
Ответов: 33 Просмотров: 3071
Ruskat пишет: А вот функция запроса работников через XMLHttpRequest исходя из ID должности может подвести, так как, как я понимаю, счёт идёт по номеру элемента option, а не ссылается на ID самой должности, к которой привязан работник. Сбой произойдёт, когда ID в списке должностей будут не по порядку или в разброс.
Если Вы имеете ввиду value в option, то счёт НЕ идёт по номеру элемента option.
Посмотрите в коде, индекс массива $arr, который затем попадает в value option, это id работника из таблицы, а не порядковый номер.
PHP:
скопировать код в буфер обмена
........
$query = 'SELECT id, pr, im, pb FROM `workers` WHERE `ps`= ' . $ps_id ;
$pip = full_name_to_short( $rows [ "pr" ] . " " . $rows [ "im" ] . " " . $rows [ "pb" ] ) ;
$arr [ $rows [ 'id' ] ] = $pip ;
}
//Возвращаем данные в JS в JSON-формате (XMLHttpResponse)
..........
Посмотрел Ваши доработки, Увидел только full_name_to_short
1. Советую Вам не вставлять функции в коде там где они применяются.
2. м. б. сделать попрощеPHP:
скопировать код в буфер обмена
<?
function full_name_to_short( $rows ) {
$shortName = $rows [ "pr" ] ;
foreach ( [ "im" , "pb" ] as $v )
$shortName .= " " . mb_substr ( $rows [ $v ] , 0 , 1 , 'UTF-8' ) . "." ; return $shortName ;
}
$rows [ "pr" ] = "Пупкин" ;
$rows [ "im" ] = "Василий" ;
$rows [ "pb" ] = "Иванович" ;
echo "<pre>" ;
$pip = full_name_to_short( $rows ) ;
echo $pip ;
/*
Array
(
[pr] => Пупкин
[im] => Василий
[pb] => Иванович
)
Пупкин В. И.
*/
?>
Vladimir Kheifets
Отправлено: 23 Января, 2022 - 16:53:55 • Тема: Нужна помощь в создании скрипта для создания графиков дежурств • Форум: Напишите за меня, пожалуйста
Ответов: 33 Просмотров: 3071
Дополнение
Новая версия с контролем и отправкой данных.Спойлер (Отобразить ) PHP:
скопировать код в буфер обмена
<?PHP
if ( isset ( $_GET [ 'idSelect' ] ) ) {
header ( 'Content-Type: application/json;charset=utf-8' ) ; $query = "SELECT id, pr FROM `workers` WHERE ps='1'" ;
$arr [ $rows [ 'id' ] ] = $rows [ 'pr' ] ;
}
//Возвращаем данные в JS в JSON-формате (XMLHttpResponse)
}
{
echo "<pre>" ;
//здесь должны сохраняться данные.
echo "Данные успешно сохранены!" ;
}
######################################################
//$Position, $Brigade, $Place должны выбираться из БД
$Position = [ 0 => "Должность" , 1 => "Haчальник" , 2 => "Водитель" , 3 => "Рабочий" ] ;
$Brigade = 204 ;
$Place = "Станция" ;
####################################################
$NumberOfWorkerInBrigade = 4 ; //мах. кол-во в бригаде должно вводится или из config
$PositionOpt = "" ;
foreach ( $Position as $val => $text )
$PositionOpt .= "<option value='$val ')>$text </option>" ;
$tr = "" ;
while ( ++ $n <= $NumberOfWorkerInBrigade )
$tr .= <<<HTML
<tr>
<td>$n</td>
<td>$Brigade</td>
<td>$Place</td>
<td>
<select id="Position$n" name="Position$n">$PositionOpt</select>
</td>
<td>
<select id="NamePosition$n" name="NamePosition$n"></select>
</td>
<td></td>
</tr>
HTML ;
echo <<<HTML
<html>
<head>
<title>CreateOption</title>
<style>
body,select{
font-family:arial;
color: #0000FF;
}
select[id^="Name"] {visibility: hidden}
table, td{
border: 2px solid #BBC1C5;
border-collapse:collapse;
background-color:#CAD9EC
}
tr td{}
td{
padding: 5 4 5 4;
text-align:center;}
td + td,select{min-width:200px}
div{margin-top: 20}
</style>
</head>
<body>
<form action="" method="post">
<table>
<tr>
<td>№</td>
<td>Бригада</td>
<td>Базирование</td>
<td>Должность</td>
<td>ФИО</td>
<td>Рабочее время</td>
</tr>
$tr
</table>
<input type="hidden" name="Brigade" id ="Brigade" value="$Brigade">
<input type="hidden" name="Place" id = "Place" value="$Place">
<br>
<input type="button" value="Сохранить"> <div id="report"></div>
</form>
</body>
<script>
NumberOfWorkerInBrigade = '$NumberOfWorkerInBrigade';
sel = document.querySelectorAll("select[id^='Position']");
report = document.getElementById("report");
selChange = function(e){
id = e.target.id;
i=e.target.selectedIndex;
getOptions(id, i);
}
for ( iS = 0; iS<sel.length ; iS++)
{
sel[iS].addEventListener("change", selChange);
}
//------------------------------
setOpt = function(IdSelect, optObj){
select2 = document.getElementById(IdSelect);
select2.innerHTML = "";
opt = document.createElement('option');
opt.innerHTML = "Фамилия";
select2.appendChild(opt);
for(ID in optObj)
{
opt = document.createElement('option');
opt.innerHTML = optObj[ID];
opt.value = ID;
select2.appendChild(opt);
}
select2.style.visibility="visible";
};
//-----------------------------
getOptions = function(idSelect, SelectedInd){
req = new XMLHttpRequest();
req.responseType = "json";
url = "?idSelect="+idSelect+"&SelectedInd="+SelectedInd;
req.open("get", url, true);
req.responseType = "json";
req.onreadystatechange = function()
{
if (this.readyState == 4 && this.status == 200)
{
try
{
rsp = this.response; //получаем JSON Object
setOpt("Name"+idSelect, rsp);
}
catch (e)
{
err={state:this.readyState,err:e.message,url:url};
console.log(err);
}
};
};
req.send();
};
sendForm = function(){
//begin form validation
arrId = ["Position", "NamePosition"];
arrMsg = ["должность ", "Ф.И.О "];
arrMsg2=["Ошибка! Вы не выбрали ", "-ого paботника" ];
msg = "";
for( n=1; n <= NumberOfWorkerInBrigade; n++)
{
for(i in arrId)
{
id = arrId[i] + n;
value = document.getElementById(id).value;
if(value==0)
{
msg += arrMsg2[0] + arrMsg[i] + n + arrMsg2[1]+"<br>";
}
}
}
if(msg)
{
report.innerHTML = msg;
return;
}
// end form validation
// ----------------------------------------
// XMLHttpRequest
data = new FormData(document.forms[0]);
req = new XMLHttpRequest();
req.responseType = "text";
url = "?save=1";
req.open("post", url, true);
req.responseType = "text";
req.onreadystatechange = function()
{
if (this.readyState == 4 && this.status == 200)
{
try
{
rsp = this.response;
report.innerHTML = rsp;
}
catch (e)
{
err={state:this.readyState,err:e.message,url:url};
console.log(err);
}
};
};
req.send(data);
};
document.querySelectorAll("input[type='button']")[0].addEventListener("click", sendForm);
</script>
</html>
HTML ;
?>
Vladimir Kheifets
Отправлено: 23 Января, 2022 - 13:42:32 • Тема: Нужна помощь в создании скрипта для создания графиков дежурств • Форум: Напишите за меня, пожалуйста
Ответов: 33 Просмотров: 3071
Ruskat пишет: Касательно вашей формы есть непонимание:
в цикле
CODE (
javascript ):
скопировать код в буфер обмена
for ( i in optObj)
{
opt = document.createElement ( 'option' ) ;
opt.innerHTML = optObj[ i] ;
--> opt.value = optObj[ i] ;
select2.appendChild ( opt) ;
}
Догадался добавить
option у параметр
value , чтобы что-то отправить, а не просто увидеть. Всё, что я могу отправить, это данные из
optObj[i] - то есть Ф.И.О. А задумал отправлять именно ID работника, который хоть и приходит в список json, но я его так и не нашел ни в какой переменной.
Добрый день!
ID работника было в переменной i . Чтобы было понятнее заменил i на ID :
CODE (
javascript ):
скопировать код в буфер обмена
for ( ID in optObj)
{
opt = document.createElement ( 'option' ) ;
opt.innerHTML = optObj[ ID] ;
opt.value = ID;
select2.appendChild ( opt) ;
}
Из консоли браузера:
optObj:
select id="NamePosition1"
CODE (
html ):
скопировать код в буфер обмена
<select id = "NamePosition1" style = "visibility: visible;" >
<option > Фамилия</ option >
<option value = "1" > Иванов</ option >
<option value = "2" > Петров</ option >
<option value = "3" > Сидоров</ option >
</ select >
Удачи!
Vladimir Kheifets
Отправлено: 21 Января, 2022 - 18:56:23 • Тема: PHP скрипт обработчик • Форум: Напишите за меня, пожалуйста
Ответов: 5 Просмотров: 837
don.bidon пишет: Владимир, Вы же взрослый человек, если сервис не предполагает API + очевидные потуги ТС, не стоит такому помогать.
Божу упаси. Вообще-то, никто и не помогал. Пошутили и на этом закончили.
Vladimir Kheifets
Отправлено: 20 Января, 2022 - 06:34:11 • Тема: Нужна помощь в создании скрипта для создания графиков дежурств • Форум: Напишите за меня, пожалуйста
Ответов: 33 Просмотров: 3071
Ruskat пишет: Спасибо большое. Освоил.
А в чём может быть дело, что применил
такой метод дублирования строк, но фамилии раскрываются только в первой строке? В остальных только должности.
Я показал Вам полностью рабочий код. Вместе с тем, что Вы применяли работать не будет.
Обратите внимание на то, что нельзя изменять id в тэгах селект.
Если очень нужно, то изменяйте также и селекторы в CSS и JS.
Общее правило.
Если в динамическом коде с JS что-то не работает, смотрите сообщения об ошибках в консоле браузера.
Удачи!
p.s. В Вашем коде каждый тэг селект "обёрнут" в три тэга див. Не надо так делать.
Vladimir Kheifets
Отправлено: 19 Января, 2022 - 12:38:57 • Тема: Нужна помощь в создании скрипта для создания графиков дежурств • Форум: Напишите за меня, пожалуйста
Ответов: 33 Просмотров: 3071
Дополнение.
Это код таблицы бригады (как на скриншоте)
Количество работников в таблице может настриваться и соответсвнно м.б. столько же пар связанных тэгов селект.Спойлер (Отобразить ) PHP:
скопировать код в буфер обмена
<?PHP
if ( isset ( $_GET [ 'idSelect' ] ) ) {
header ( 'Content-Type: application/json;charset=utf-8' ) ; $ps = $_GET [ 'idSelect' ] ;
$query = "SELECT id, pr FROM `workers` WHERE ps='$ps '" ;
$arr [ $rows [ 'id' ] ] = $rows [ 'pr' ] ;
}
//Возвращаем данные в JS в JSON-формате (XMLHttpResponse)
}
######################################################
//$Position, $Brigade, $Place должны выбираться из БД
$Position = [ 0 => "Должность" , 1 => "Haчальник" , 2 => "Водитель" , 3 => "Рабочий" ] ;
$Brigade = 204 ;
$Place = "Станция" ;
####################################################
$NumberOfWorkerInBrigade = 4 ; //мах. кол-во в бригаде должно вводится или из config
$PositionOpt = "" ;
foreach ( $Position as $val => $text )
$PositionOpt .= "<option value='$val ')>$text </option>" ;
$tr = "" ;
while ( ++ $n <= $NumberOfWorkerInBrigade )
$tr .= <<<HTML
<tr>
<td>$n</td>
<td>$Brigade</td>
<td>$Place</td>
<td>
<select id="Position$n">$PositionOpt</select>
</td>
<td>
<select id="NamePosition$n"></select>
</td>
<td></td>
</tr>
HTML ;
echo <<<HTML
<html>
<head>
<title>CreateOption</title>
<style>
body,select{
font-family:arial;
color: #0000FF;
}
select[id^="Name"] {visibility: hidden}
table, td{
border: 2px solid #BBC1C5;
border-collapse:collapse;
background-color:#CAD9EC
}
tr td{}
td{
padding: 5 4 5 4;
text-align:center;}
td + td,select{min-width:200px}
</style>
</head>
<body>
<form action="" method="post">
<table>
<tr>
<td>№</td>
<td>Бригада</td>
<td>Базирование</td>
<td>Должность</td>
<td>ФИО</td>
<td>Рабочее время</td>
</tr>
$tr
</table>
</form>
</body>
<script>
sel = document.querySelectorAll("select[id^='Position']");
selChange = function(e){
id = e.target.id;
i=e.target.selectedIndex;
getOptions(id, i);
}
for ( iS = 0; iS<sel.length ; iS++)
{
sel[iS].addEventListener("change", selChange);
}
//------------------------------
setOpt = function(IdSelect, optObj){
select2 = document.getElementById(IdSelect);
select2.innerHTML = "";
opt = document.createElement('option');
opt.innerHTML = "Фамилия";
select2.appendChild(opt);
for(i in optObj)
{
opt = document.createElement('option');
opt.innerHTML = optObj[i];
select2.appendChild(opt);
}
select2.style.visibility="visible";
};
//-----------------------------
getOptions = function(idSelect, SelectedInd){
req = new XMLHttpRequest();
req.responseType = "json";
url = "?idSelect="+idSelect+"&SelectedInd="+SelectedInd;
req.open("get", url, true);
req.responseType = "json";
req.onreadystatechange = function()
{
if (this.readyState == 4 && this.status == 200)
{
try
{
rsp = this.response; //получаем JSON Object
console.log(rsp);
setOpt("Name"+idSelect, rsp);
}
catch (e)
{
err={state:this.readyState,err:e.message,url:url};
console.log(err);
}
};
};
req.send();
};
</script>
</html>
HTML ;
?>
Самостоятельно справитесь с столбцом "Рабочее время"?
Vladimir Kheifets
Отправлено: 19 Января, 2022 - 08:00:39 • Тема: Нужна помощь в создании скрипта для создания графиков дежурств • Форум: Напишите за меня, пожалуйста
Ответов: 33 Просмотров: 3071
Ruskat пишет: По Вашему примеру вывод такой:
CODE (
javascript ):
скопировать код в буфер обмена
{
"1" : "\u 0418\u 0432\u 0430\u 043d\u 043e\u 0432" ,
"2" : "\u 041f\u 0435\u 0442\u 0440\u 043e\u 0432" ,
"3" : "\u 0421\u 0438\u 0434\u 043e\u 0440\u 043e\u 0432"
}
При выводе с базы у меня работники вот так:
CODE (
javascript ):
скопировать код в буфер обмена
[
{
"1" : "\u 0421\u 0438\u 0434\u 043e\u 0440\u 043e\u 0432"
} ,
{
"2" : "\u 0421\u 0438\u 0434\u 043e\u 0440\u 043e\u 0432"
} ,
{
"3" : "\u 0421\u 0438\u 0434\u 043e\u 0440\u 043e\u 0432"
}
]
Возможно, можно как-то jsоm скопитовать и вставить существующий html-блок, вместе с рабочими списками.
Так всё работает:
Спойлер (Отобразить ) PHP:
скопировать код в буфер обмена
<?
/*
--
-- Структура таблицы `workers`
--
CREATE TABLE `workers` (
`id` int(4) NOT NULL,
`pr` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL,
`ps` int(4) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Дамп данных таблицы `workers`
--
INSERT INTO `workers` (`id`, `pr`, `ps`) VALUES
(1, 'Иванов', 1),
(2, 'Петров', 1),
(3, 'Сидоров', 1);
*/
$query = "SELECT id, pr FROM `workers` WHERE ps='1'" ;
$arr [ $rows [ 'id' ] ] = $rows [ 'pr' ] ;
}
/*
{
"1": "\u0418\u0432\u0430\u043d\u043e\u0432",
"2": "\u041f\u0435\u0442\u0440\u043e\u0432",
"3": "\u0421\u0438\u0434\u043e\u0440\u043e\u0432"
}
*/
?>
Vladimir Kheifets
Отправлено: 18 Января, 2022 - 21:45:35 • Тема: Нужна помощь в создании скрипта для создания графиков дежурств • Форум: Напишите за меня, пожалуйста
Ответов: 33 Просмотров: 3071
Ruskat пишет: Vladimir Kheifets пишет: Удачи!
Благодарю, но снова не мгу до конца всё решить.
Должности в список получил, а вот Фио, соответствующие должности не могу никак...
Пытаюсь так:
PHP:
скопировать код в буфер обмена
if ( isset ( $_GET [ 'idSelect' ] ) ) {
header ( 'Content-Type: application/json;charset=utf-8' ) ; $ps_id = $_GET [ "SelectedInd" ] ;
$workers = mysqli_query ( $db , 'SELECT id, pr FROM `workers` WHERE `ps`= ' . $ps_id ) ; // База з посадами / База с должностями //$array[] = $rws;
$arr = array ( $rws [ "id" ] => $rws [ "pr" ] ) ; }
//Возвращаем данные в JS в JSON-формате (XMLHttpResponse)
}
где id - ID, pr - ФАМИЛИЯ, ps - ИДЕНТИФИКАТОР ДОЛЖНОСТИ, по которому я и сортирую работяг.
Дальше, эти зависимые списки надо будет вставить в Js
У Вас здесь ошибка:
Д.б.
Я показал Вам рабочий код, вставлющий оптион в Js и управляющий тэгами селект.
Вам нужно заменить тэги селект в Вашем коде и убрать jQuery.
Vladimir Kheifets
Отправлено: 18 Января, 2022 - 12:05:02 • Тема: PHP скрипт обработчик • Форум: Напишите за меня, пожалуйста
Ответов: 5 Просмотров: 837
sherxan-g пишет: Уважаемые Программисты как сделать так чтобы месте
return $rezultat[0]; бил
return $uname; или
return $rezultat[0]; билл ровна на
return $uname;
вот вес код
PHP:
скопировать код в буфер обмена
function checkValid( $url , $pass ) {
'method' => 'POST' ,
'proxy' => ( defined ( 'PROXY' ) ) ?
( 'tcp://' . PROXY
) : null , 'user_agent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20120427 Firefox/15.0a1' ,
'header' => 'Content-type: application/x-www-form-urlencoded' ,
'pass' => $pass ,
)
) ) ) ;
return $rezultat [ 0] ;
}
Заранее Вам большое спасибо
Простите, непонятно, чем не устраивает $rezultat.
Если очень хочется можно переименовать $rezultat на $uname,
но результат не изменится.
Vladimir Kheifets
Отправлено: 18 Января, 2022 - 11:53:17 • Тема: Нужна помощь в создании скрипта для создания графиков дежурств • Форум: Напишите за меня, пожалуйста
Ответов: 33 Просмотров: 3071
Ruskat пишет: В данный упёрся в то, что не могу в JS-коде средствами РНР вывести дальше список Должность -> Работники, так как РНР в JS не выполняется.
Добрый день!
Верно, РНР выполняется на сервере, а JS в браузере клиента, НО, из JS можно отправить XMLHttpRequest на сервер, там отработать на РНР запрос к БД и вернуть результат назад в JS. Так это работает:CODE (
html ):
скопировать код в буфер обмена
<?php
if( isset( $_GET[ 'idSelect' ] ) )
{
header( 'Content-Type: application/json;charset=utf-8' ) ;
/ *
Здесь должен быть запрос к БД таблица "Personal"
SELECT id , name FROM Personal WHERE id = '{$_GET[' SelectedInd'])}'
нужно создать массив $arr
*/
$arr = array( 1 = > "Иванов", 2 => "Петров", 3 => "Сидоров" );
echo json_encode($arr, JSON_PRETTY_PRINT);
//Возвращаем данные в JS в JSON-формате (XMLHttpResponse)
exit;
}
######################################################
$Position = [0=>"Должность", 1 => "Haчальник", 2 => "Водитель", 3 => "Рабочий"];
$PositionOpt="";
foreach($Position as $val=>$text)
$PositionOpt.="<option value = '$val' ) > $text</ option > ";
echo <<<HTML
<html >
<head >
<title > CreateOption</ title >
<style >
#PositionName{visibility: hidden}
</ style >
</ head >
<body >
<select id = "Position" > $PositionOpt</ select >
<select id = "PositionName" ></ select >
</ body >
<script >
select = document.querySelectorAll("select");
selectPosition = select[0];
selectPositionName = select[1];
select[0].addEventListener("change", function (e){
id = e.target.id;
i=e.target.selectedIndex;
getOptions(id, i);
});
//------------------------------
setOpt = function(IdSelect, optObj){
select2 = document.getElementById(IdSelect);
select2.innerHTML = "";
opt = document.createElement('option');
opt.innerHTML = "Фамилия";
select2.appendChild(opt);
for(i in optObj)
{
opt = document.createElement('option');
opt.innerHTML = optObj[i];
select2.appendChild(opt);
}
select2.style.visibility="visible";
};
//-----------------------------
getOptions = function(idSelect, SelectedInd){
req = new XMLHttpRequest();
req.responseType = "json";
url = "?idSelect="+idSelect+"&SelectedInd="+SelectedInd;
req.open("get", url, true);
req.responseType = "json";
req.onreadystatechange = function()
{
if (this.readyState == 4 && this.status == 200)
{
try
{
rsp = this.response; //получаем JSON Object
console.log(rsp);
setOpt(idSelect+"Name", rsp);
}
catch (e)
{
err={state:this.readyState,err:e.message,url:url};
console.log(err);
}
};
};
req.send();
};
</ script >
</ html >
HTML;
?>
Удачи!
Vladimir Kheifets
Отправлено: 17 Января, 2022 - 19:36:17 • Тема: Нужна помощь в создании скрипта для создания графиков дежурств • Форум: Напишите за меня, пожалуйста
Ответов: 33 Просмотров: 3071
К сожалению, ссылка не открывается.
Цитата: Error 1020 Ray ID: 6cf00e83c9e33b19 • 2022-01-17 13:51:09 UTC
Access denied
Вы можете загрузить картинку на этом сайте.
Что такое блок и статья?
Возможно, что на сайте должна быть страница "Смены" для ввода, редактирования и сохранения в БД графики работы по сменам.
По идее должно быть несколько таблиц в БД:
Вид деятельности персонала
Код1, должность
1 начальник
2 рабочий
3 водитель
Персонал
Идр, ФИО, Код1, Адрес, Телефон, Мэйл, Зарплата ...
Смены
Идс, Дата/время с, Дата/время по, Бригада
В поле Бригада должны записываться Идп персонала(JSON или сериализованный массив)
Отпуска
Идо, Идр, Дата/время с, Дата/время по, Код отпуска
Возможно и еще что-то...
Должна, быть страница "Персонал", для ввода, редактирования этих данных и
страница "Смены", для которой должна выбираться эти данные.
В формуляре на странице "Смены" должны быть поля для ввода даты и времени смены.
Если смена была введена, то ранне введённые данные должны выбираться для редактирования.
Должны быть списки для выбора начальника, водителя и рабочих.
Имена содруников фирмы должны вибираться из БД с учетом отпусков или больничных.
Выбранные имена должны записываться список бригады или по необходимости удаляться из него.
Vladimir Kheifets
Отправлено: 16 Января, 2022 - 11:56:08 • Тема: Call to a member function fetch_assoc() on boolean in • Форум: Вопросы новичков
Ответов: 2 Просмотров: 229
didifogdd пишет: ВЫХОДИТ ОШИБКА:Call to a member function fetch_assoc() on boolean in ГОВОРИТ НА 39 СТРОКЕ, ПОМОГИТЕ ПОЖАЛУЙСТА
Добрый день!
1.Попробуйте добавить в начало кода:
2.У Вас ошибка в запросе. $result=false. Поэтому возникает фотальная ошибка в 39 стр.
Нужно добавить проверку $result
Удачи!
P.S. Лучше было бы показывать коды использую тэги (кнопки), например, PHP
Страниц (59): В начало « ... 3 4 5 6 [7] 8 9 10 11 ... » В конец
Powered by ExBB FM 1.0 RC1. InvisionExBB