Недвижимость 02.05.2024
Всем привет!
Примерно с 2008 года моя мечта была сделать веб портал по недвижимости. Раньше я делал этот портал на ASP NET 2.0, а потом на ASP NET 3.5. Я попытаюсь сделать веб портал по недвижимости на PHP7. Короче погнали!
В ASP NET уже есть готовые компоненты. Начнём с пагинатора. У меня был уже некий опыт, я в начале 2000х гг. помогал сестре создать один проект в Казахстане. Мне сестра в Алматы подарила книгу по PHP, и я занимался пагинатором. Чтобы получить количество страниц, нужно количество записей в БД разделить на количество записей в странице + остаток. Так-же я буду в именах переменных использовать венгерскую нотацию см. https://ru.wikipedia.org/wiki/Венг�%..., где $str_ - для строк, $int_ - для чисел, $arr_ - для массивов, $obj_ - для объектов (ООП). В 2000х гг. я делал так:
$int_pages = $int_records_count / $int_records_per_page; // Получаем количество страниц // Если в количестве записей поделёно на количество записей на странице есть остаток то + 1 страница if($int_records_count % $int_records_per_page > 0) $int_pages++;
Давайте именно так и сделаем:
// Функция генерирует пагинатор, и отображает в браузере // $str_url - указывается url или имя файла // int_records_count - количество найденых записей из БД // $int_records_per_page - количество записей на одной странице // $int_sel - какая страница выделина function paginator_show($str_url, $int_records_count, $int_records_per_page, $int_sel) { $int_pages = $int_records_count / $int_records_per_page; // Получаем количество страниц // Если в количестве записей поделёно на количество записей на странице есть остаток то + 1 страница if($int_records_count % $int_records_per_page > 0) $int_pages++; // Рисуем количество страниц for($int_i=1; $int_i<$int_pages; $int_i++) { // Если текущая выделеная страница if($int_i == $int_sel) echo '<b>[ ' . $int_i . ' ]</b> '; // То рисуем скобки [ ] else echo '<a href=' . $str_url . '?page=' . $int_i . '>' . $int_i . '</a> '; // Иначе добавляем страницу } }
Для тестирования:
if(isset($_GET['page'])) $int_select_page = $_GET['page']; else $int_select_page = 1; paginator_show('paginator.php', 100, 10, $int_select_page);
Результат работы нашего кода:
Теперь давайте займёмся шаблонизатором. В ASP NET 2.0 есть уже готовый шаблонизатор, а в PHP либо его нужно самому программировать, или брать готовую библиотеку, но мы будем сами писать свой шаблонизатор. Вот код:
.\lib\view.php
<?php // Рендерит // $str_filename - имя файла, расширение должно быть именно PHP!
// $arr_values - массив переменных, в которые будут подставляться значения function view_factory($str_filename, $arr_values = NULL) { ob_start(); if(isset($arr_values)) extract($arr_values); include($str_filename); return ob_get_clean(); } ?>
Я уже тестировал эту библиотеку, работает всё хорошо. Потом позже покажу код.
Теперь давайте создадим код, который будет перемещать загруженые картинки куда нужно:
<?php if(isset($_POST['expose'])) { move_uploaded_file($_FILES["uploadfile"]["tmp_name"], "./expose/" . $_POST['expose'] . '/images/' . $_FILES["uploadfile"]["name"]); } ?> <form method="POST" action="upload.php" enctype="multipart/form-data"> <input name="expose" type="hidden" value="1"><br> <input name="uploadfile" type="file"><br><br> <input type="submit" value="OK"><br> </form>
Я уже протестировал код, код работает как надо.
Теперь давайте обсудим где и что будет находится.
Сам проект будет находится в папке immo2024:
Подпапки:
css - Тут будут храниться CSS файлы
js - Тут будут храниться JavaScript библиотеки
images - Тут будут храниться картинки для проекта
lib - Тут будут храниться библиотеки написаные на PHP
views - Шаблоны, и вьюшки в формате PHP
expose - HTML-файлы с объявлениями и фотографии
В папке expose будут следующие подпапки
номер объявления - тут будут храниться объявления
В папке номер объявления будут храниться файл index.php или index.html, и папка images, в которых будут храниться фотографии недвижимости.
Создадим файл .htaccess, и запишим следующий код, в случае ненайденого файла, будет показывать кастомную 404 ошибку:
RewriteEngine on ErrorDocument 404 "<!DOCTYPE html><html><head><title>404</title></head><body><center><h1>404</h1><br>Not found!</center></body></html>"
Всем привет!
Давайте продолжим делать наш сайт. Сейчас займёмся подборкой цветов, лейаутом, веб дизайном и вёрсткой:
1. Вот код index.html:
<!DOCTYPE html> <html> <head> <title>Портал недвижимости</title> <link type="text/css" rel="stylesheet" href="main.css"> <link type="text/css" rel="stylesheet" href="menu.css"> <link type="text/css" rel="stylesheet" href="componentsui.css"> <link type="text/css" rel="stylesheet" href="panelsui.css"> <link type="text/css" rel="stylesheet" href="image.css"> <script src="image.js"></script> </head> <body> <div id="content"> <div> <br> <br> <br> <br> <nav> <ul id="menu"> <li class="sel"><a href="aa.php">Главная</a></li> <li><a href="aa.php">О нас</a></li> </ul> </nav> <br> <div id="search">aa <input type="text" class="field" disabled value="заблокировано"> <br><br> <input type="text" class="field" placeholder="AAA"> <br><br> <select class="cbo"> <option selected value="1">1</option> <option value="2">2</option> </select> <select class="cbo"> <option selected value="1">Январь</option> <option value="2">Февраль</option> </select> <select class="cbo"> <option selected value="1">1980</option> <option value="2">1981</option> </select> <br><br> <input type="checkbox" class="chkbox" placeholder="AAA"> <br><br> <input type="submit" class="btn" value="OK"> <br><br> <input type="submit" class="btn" disabled value="Нет!"> <br><br><span class="error">Ошибка!</span> </div> <br> <br> <div id="login"> <label for="usrname">Имя пользователя:</label><br> <input class="field" name="usrname" id="usrname" type="text"> <br><br> <label for="pswd">Пароль:</label><br> <input class="field" name="pswd" id="pswd" type="text"> <br><br> <div style="float:right;"><a href="registrate.php" class="lnk">Регистрация</a></div><br> <div style="float:right;"><a href="recovery.php" class="lnk">Забыл пароль</a></div><br> <div style="float:right;"><input type="submit" class="btn" value="Вход"></div> <br> <br> </div> <br> <br> <img id="image" class="img" src="DSCI3748.JPG" width="300px" height="auto"> <br> <img class="thunb thunb_sel" src="DSCI3748_thunb.JPG" onclick="on_click(this, 'image','DSCI3748.JPG', 'thunb', 'thunb thunb_sel');"> <img class="thunb" src="DSCI3749_thunb.JPG" onclick="on_click(this, 'image','DSCI3749.JPG', 'thunb', 'thunb thunb_sel');"> <img class="thunb" src="DSCI3750_thunb.JPG" onclick="on_click(this, 'image','DSCI3750.JPG', 'thunb', 'thunb thunb_sel');"> </div> <br><br> <table border="0" cellpadding="2" cellspacing="2"> <tr> <td>Площадь:</td> <td>120кв.м</td> </tr> <tr> <td>Кол-во комнат:</td> <td>3</td> </tr> </table> </div> </body> </html>
2. Это css:
main.css:
* { padding:0; margin:0; } body { background-color:#EBD234; color:#333; } #content { margin-left:auto; margin-right:auto; margin-top:0px; width:70%; min-height:1024px; background-color:#FFF; box-shadow:0px 0px 7px #999; } .lnk { color:#000; text-decoration:none; } .lnk:hover { color:#000; text-decoration:underline; } .lnk:visited { color:#000; text-decoration:none; }
menu.css:
nav { padding:0; margin:0; background-color:#000; color:#FFF;} #menu { list-style-type:none; margin:0; padding:0; overflow:hidden; } #menu li { float:left; } #menu .sel { background-color:#333; color:#FFF; text-shadow:0px 0px 7px #FFF; font-weight:bold; } #menu li a { font-size:20px; display:block; text-align:center; padding:20px; text-decoration:none; color:#FFF; }
panelsui.css:
#login { box-shadow:0px 0px 7px #999; margin-left:auto; margin-right:auto; width:180px; min-height:120px; border-radius:5px; padding:15px 15px; } #search { box-shadow:0px 0px 7px #999; margin-left:auto; margin-right:auto; width:400px; min-height:150px; border-radius:5px; padding:5px 5px; }
image.css:
.img { box-shadow:0px 0px 3px #EEE; padding:5px 5px; border:1px solid #EEE; } .thunb { width:70px; height:auto; padding:5px 5px; border:1px solid #EEE; } .thunb_sel { border:1px solid #000; opacity:0.3; }
3. Javascript image.js:
function on_click(parent, id, src, cls, cls_sel) { document.getElementById(id).src = src; var el = document.getElementsByClassName(cls); for(var i=0; i<el.length; i++) el<i>.setAttribute('class', cls); parent.setAttribute('class', cls + ' ' + cls_sel); }
4. А вот и результат, это я лишь тестирую:
Забыл сделать пагинатор, про который я писал выше, подправим код:
componentsui.css:
.paginator { color:#000; padding:5px 5px; } .paginator a { color:#000; text-decoration:none; } .paginator a:hover { color:#000; text-decoration:underline; } .paginator a:visited { color:#000; text-decoration:none; } .paginator .paginator_selected { color:#00F; text-decoration:none; font-weight:bold; }
Протестируем index.html:
<div class="paginator"> <a href="#"><<</a> <span class="paginator_selected">[ 1 ]</span> <a href="#">2</a> <a href="#">3</a> <a href="#">4</a> <a href="#">5</a> <a href="#">6</a> <a href="#">7</a> <a href="#">>></a> </div>
Вуаля! А вот и результат:
Теперь давайте нарисуем лого, я буду делать лого в Adobe Photoshop Elements 5.0.
1. Создадим новый проект, размер картинки должен быть 109x39 пикселей, а фон оставим прозрачным:
2. Добавим 4 слоя, 1й слой назовём LogoBlack там будет чёрный прямоугольник, 2й слой назовём LogoYellow там будет прямоугольник оранжево жёлтого цвета (16-ричный код цвета #EBD234), 3-й слой назовём TextWhite, там будет текст белого цвета, и наконец 4-й слой будет называться TextBlack там будет текст чёрного цвета:
3. Сохраним наше лого в формате JPEG.
4. Подправим наше лого в редакторе Paint:
Лого сделал похожее на Immowelt см. https://de.m.wikipedia.org/wiki/Datei:Immowelt_2021_logo.svg
Теперь займусь созданием иконки т.е. favicon для моего сайта, иконку буду рисовать в Junior Icon Editor:
Если что у меня Adobe Photoshop Elements 5 лицензионный, когда сайт был, веб хостер дарил в подарок набор программ:
Я нарисовал вчера 2 новой иконки
Эта иконка т.е. favicon мне не нравится:
Всем доброе утро! Продолжим заниматься разработкой сайта недвижимости. Вот тут написано про связи в таблицах, я совсем про эти связи забыл. Но ничего вспомнил, вроде бы правильно. Вот примерная диаграмма, эту диаграмму я делал в программе Dia: