Deutsch

Недвижимость 02.05.2024

597  
uscheswoi_82 коренной житель02.05.24 12:34
uscheswoi_82
NEW 02.05.24 12:34 
Последний раз изменено 02.05.24 16:06 (uscheswoi_82)

Всем привет!

Примерно с 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);


Результат работы нашего кода:



Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#1 
uscheswoi_82 коренной житель02.05.24 12:43
uscheswoi_82
02.05.24 12:43 
в ответ uscheswoi_82 02.05.24 12:34

Теперь давайте займёмся шаблонизатором. В 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(); } ?>

Я уже тестировал эту библиотеку, работает всё хорошо. Потом позже покажу код.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#2 
uscheswoi_82 коренной житель02.05.24 12:48
uscheswoi_82
NEW 02.05.24 12:48 
в ответ uscheswoi_82 02.05.24 12:43

Теперь давайте создадим код, который будет перемещать загруженые картинки куда нужно:

<?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>

Я уже протестировал код, код работает как надо.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#3 
uscheswoi_82 коренной житель02.05.24 12:57
uscheswoi_82
NEW 02.05.24 12:57 
в ответ uscheswoi_82 02.05.24 12:48

Теперь давайте обсудим где и что будет находится.

Сам проект будет находится в папке 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>"
Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#4 
uscheswoi_82 коренной житель05.05.24 18:30
uscheswoi_82
NEW 05.05.24 18:30 
в ответ uscheswoi_82 02.05.24 12:57, Последний раз изменено 05.05.24 18:36 (uscheswoi_82)

Всем привет!

Давайте продолжим делать наш сайт. Сейчас займёмся подборкой цветов, лейаутом, веб дизайном и вёрсткой:

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. А вот и результат, это я лишь тестирую:






Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#5 
uscheswoi_82 коренной житель05.05.24 19:41
uscheswoi_82
NEW 05.05.24 19:41 
в ответ uscheswoi_82 05.05.24 18:30

Забыл сделать пагинатор, про который я писал выше, подправим код:

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>

Вуаля! А вот и результат:



Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#6 
uscheswoi_82 коренной житель05.05.24 20:01
uscheswoi_82
NEW 05.05.24 20:01 
в ответ uscheswoi_82 05.05.24 19:41, Последний раз изменено 05.05.24 20:03 (uscheswoi_82)

Теперь давайте нарисуем лого, я буду делать лого в Adobe Photoshop Elements 5.0.

1. Создадим новый проект, размер картинки должен быть 109x39 пикселей, а фон оставим прозрачным:




2. Добавим 4 слоя, 1й слой назовём LogoBlack там будет чёрный прямоугольник, 2й слой назовём LogoYellow там будет прямоугольник оранжево жёлтого цвета (16-ричный код цвета #EBD234), 3-й слой назовём TextWhite, там будет текст белого цвета, и наконец 4-й слой будет называться TextBlack там будет текст чёрного цвета:



3. Сохраним наше лого в формате JPEG.

4. Подправим наше лого в редакторе Paint:



Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#7 
uscheswoi_82 коренной житель05.05.24 20:10
uscheswoi_82
NEW 05.05.24 20:10 
в ответ uscheswoi_82 05.05.24 20:01

Лого сделал похожее на Immowelt см. https://de.m.wikipedia.org/wiki/Datei:Immowelt_2021_logo.svg

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#8 
uscheswoi_82 коренной житель05.05.24 23:13
uscheswoi_82
NEW 05.05.24 23:13 
в ответ uscheswoi_82 05.05.24 20:10

Теперь займусь созданием иконки т.е. favicon для моего сайта, иконку буду рисовать в Junior Icon Editor:



Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#9 
uscheswoi_82 коренной житель07.05.24 14:52
uscheswoi_82
NEW 07.05.24 14:52 
в ответ uscheswoi_82 05.05.24 23:13

Если что у меня Adobe Photoshop Elements 5 лицензионный, когда сайт был, веб хостер дарил в подарок набор программ:



Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#10 
uscheswoi_82 коренной житель07.05.24 15:06
uscheswoi_82
NEW 07.05.24 15:06 
в ответ uscheswoi_82 07.05.24 14:52

Я нарисовал вчера 2 новой иконки


Эта иконка т.е. favicon мне не нравится:



Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#11 
uscheswoi_82 коренной житель27.05.24 05:04
uscheswoi_82
NEW 27.05.24 05:04 
в ответ uscheswoi_82 07.05.24 15:06

Всем доброе утро! Продолжим заниматься разработкой сайта недвижимости. Вот тут написано про связи в таблицах, я совсем про эти связи забыл. Но ничего вспомнил, вроде бы правильно. Вот примерная диаграмма, эту диаграмму я делал в программе Dia:



Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#12