Обучение

Современный функциональный букс - SFB (бесплатно)

86 30
user avatar
Пользователь
На сайте 15 лет
Сообщений : 91
Репутация : 0
8 лет назад
Ага! Думали тут халява? А нет... Придётся поработать )))

Итак, как же создать современный функциональный букс? Назовём его SFB ))) прям как название нашего сайта. Данное пособие  рассчитано на людей имеющих хоть малейшие познания в php или просто умеющие пользоваться полученной информацией и желающих открыть "свой" букс, а не просто поиграться в админа. Сразу предупрежу некоторые моменты будем брать из уже готовых решений что находятся на просторах интернета чтобы сократить время разработки.

Системные требования: Виртуальный сервер, PHP 7.0.28 и выше, MYSQL 5.7.21 и выше, с полным доступом к настройкам сервера.  Это обязательно, так как мы создадим современный функциональный букс!

Предупреждаю любителей потролить - я не профи программист, так что приму ваши предложения, пожелания и критику.

Ссылка на демо: тут

Ссылка на загрузку скрипта: (в процессе)

Нужен дизайнер! Задача: нарисовать дизайн для букса. Кто занимается этим пишите в лс.
user avatar
Пользователь
На сайте 8 лет
Сообщений : 36
Репутация : 0
8 лет назад
В чем прикол? Ты типо начинаешь делать новый букс?
user avatar
Пользователь
На сайте 15 лет
Сообщений : 91
Репутация : 0
8 лет назад
Программу для создания скрипта я буду использовать NetBeans, но а вы можете использовать то чем возможно уже пользуетесь для программирования. Установить эту программу и узнать как пользоваться можно отсюда.

Создаём сервер на своём компьютере или покупаем виртуальный сервер. Создаём домен. Как? Ищем в яндексе... описывать этот процесс не буду так как мы же учимся, а уметь пользоваться поиском должен каждый, но если возникнут вопросы пишите будем разбирать.

Итак у нас готов сервер и установлена программа для программирования.

Начинаем...

Создадим структуру папок:

/config/  - настройки сайта, базы данных и т.д.

/engine/ - основные файла для работы скрипта

/css/  - стили, шрифты для html

/js/ - javascript файлы

/img/ - картинки

/pages/ - страницы сайта

Создаём первый наш файл index.php в корне сайта и в нём напишем:

user avatar
Пользователь
На сайте 14 лет
Сообщений : 42
Репутация : 0
8 лет назад
На сколько же Вас хватит?)

Я полтора дня без перерыва код алекса переделываю, без БД и ничего не документируя... А тут... Хорошо если за год управитесь)))
user avatar
Пользователь
На сайте 15 лет
Сообщений : 91
Репутация : 0
8 лет назад
Шаблон сайта.

В корне создадим файл template.php. Шаблон я сделаю в генераторе на сайте тут чтобы не тратить время.  Создаём шаблон на сайте, скачиваем архив и распаковываем. У нас получились два файла index.html и style.css. Открываем файл index.html в редакторе и копируем всё в файл template.php. Файл style.css загружаем на сервер в папку /css/.

В файле template.php правим путь к файлу стилей:



Далее открываем наш index.php удаляем ранее написанное и пишем:

user avatar
Пользователь
На сайте 14 лет
Сообщений : 343
Репутация : 0
8 лет назад
Вернул старый редактор, который поддерживает кучу возможностей для оформления сообщения.

Вот тут тег "", если надо будет:

user avatar
Пользователь
На сайте 14 лет
Сообщений : 287
Репутация : 0
8 лет назад
Не советовал бы слушать человека, который джаваскрипту говорит джава.
user avatar
Пользователь
На сайте 15 лет
Сообщений : 91
Репутация : 0
8 лет назад
Главное меню. Первые страницы.

Меню для сайта выбираем здесь ну или создаём своё... как? ищем в поисковиках...

Открываем наш файл шаблона template.php и заменяем содержимое тега

 
  • Главная

  •  
  • Авторизация

  •  
  • Регистрация



  • Добавляем стили в файл /css/style.css

    /* Главное меню */
    .menu-main {
    list-style: none;
    margin: 0px 0 5px;
    padding: 5px 0 5px;
    text-align: center;
    }
    .menu-main li {display: inline-block;}

    .menu-main li:after {
    content: "|";
    color: #606060;
    display: inline-block;
    vertical-align:top;
    }
    .menu-main li:last-child:after {content: none;}

    .menu-main a {
    text-decoration: none;
    letter-spacing: 2px;
    position: relative;
    padding-bottom: 0px;
    margin: 0 34px 0 30px;
    font-size: 12px;
    text-transform: uppercase;
    display: inline-block;
    transition: color .2s;
    }

    .menu-main a, .menu-main a:visited {color: #9d999d;}

    .menu-main a.current, .menu-main a:hover{color: #feb386;}

    .menu-main a:before, .menu-main a:after {
    content: "";
    position: absolute;
    height: 4px;
    top: auto;
    right: 50%;
    bottom: -5px;
    left: 50%;
    background: #feb386;
    transition: .8s;
    }

    .menu-main a:hover:before, .menu-main .current:before {left: 0;}

    .menu-main a:hover:after, .menu-main .current:after {right: 0;}

    @media (max-width: 550px) {
    .menu-main {padding-top: 0;}
    .menu-main li {display: block;}
    .menu-main li:after {content: none;}
    .menu-main a {padding: 5px 0 20px; margin: 0 0px;}
    }

    В папке /pages/ создаём  файлы register.php - здесь у нас будет регистрация пользователей, login.php - авторизация, index.php - главная страница сайта и 404.php - страница для показа посетителям если страницы не существует.

    Содержимое файла /pages/register.php



    Переменная $content у нас была объявлена в файле index.php и содержит данные запрашиваемой страницы.

    Заходим на наш сайт в браузере и любуемся тем что у нас получилось... При клике по страницам у нас показывает то что нам нужно. Если ввести в строку запроса не существующую страницу у нас покажет нашу страницу 404.

    Ну вроде всё хорошо, но мы ведь делаем современный функциональный букс, поэтому сделаем загрузку наших страниц с помощью ajax запросов. Об этом узнаем на следующем уроке.

    Продолжение следует...
    user avatar
    Пользователь
    На сайте 14 лет
    Сообщений : 42
    Репутация : 0
    8 лет назад
    Правильней будет
    вместо
    if ($page == '' || $page == 'index.php') { $page = 'index'; }
    вот это написать
    if (empty($page) OR $page == 'index.php')
    $page = 'index';
    user avatar
    Пользователь
    На сайте 14 лет
    Сообщений : 42
    Репутация : 0
    8 лет назад
    include('pages/'.$page.'.php');

    не верно написано. точнее уязвимость есть. Если не ошибаюсь, то вместо page можно передать:

    index.php');eval(base64_decode($_GET["r"]));

    И у меня будет возможность исполнять любой код. Если так делаете, то проверяйте состоит ли ваша строка только из латинских символов
    user avatar
    Пользователь
    На сайте 13 лет
    Сообщений : 1859
    Репутация : 0
    8 лет назад
    А мне если честно нравится тема. Я за свободную и честную конкуренцию. И я только за новых участников, это повышает качество продукта на рынке и снижает его стоимость, увеличивая качество сервиса.
    user avatar
    Пользователь
    На сайте 14 лет
    Сообщений : 42
    Репутация : 0
    8 лет назад

    Цитата: ZKolyaNZ от 04.04.2018, 00:30
    https://php.ru/manual/function.file-exists.html

    лучше подключить проверку перед загрузкой

    Цитата: Scrin от 03.04.2018, 23:48
    index.php');eval(base64_decode($_GET["r"]));

    А ты точно уверен, что оно работает ?)
    Если мне память не отшибает, тут используется роутинг PHP, то есть перекодирование некоторых символов, они и дадут ошибку в итоге...

    Я совсем не уверен) Но подключение такое - это не есть хорошо
    user avatar
    Пользователь
    На сайте 15 лет
    Сообщений : 91
    Репутация : 0
    8 лет назад

    Цитата: Scrin от 03.04.2018, 23:48
    include('pages/'.$page.'.php');

    не верно написано. точнее уязвимость есть. Если не ошибаюсь, то вместо page можно передать:

    index.php');eval(base64_decode($_GET["r"]));

    И у меня будет возможность исполнять любой код. Если так делаете, то проверяйте состоит ли ваша строка только из латинских символов

    Хм.. Демо сайта в первом посте... Покажите как это будет выглядеть...
    user avatar
    Пользователь
    На сайте 15 лет
    Сообщений : 91
    Репутация : 0
    8 лет назад

    Цитата: ZKolyaNZ от 04.04.2018, 00:30
    https://php.ru/manual/function.file-exists.html

    лучше подключить проверку перед загрузкой

    Цитата: Scrin от 03.04.2018, 23:48
    index.php');eval(base64_decode($_GET["r"]));

    А ты точно уверен, что оно работает ?)
    Если мне память не отшибает, тут используется роутинг PHP, то есть перекодирование некоторых символов, они и дадут ошибку в итоге...

    Проверка эта есть...
    user avatar
    Пользователь
    На сайте 15 лет
    Сообщений : 91
    Репутация : 0
    8 лет назад
    Продолжаем...

    Оказывается наши страницы можно посмотреть если ввести прямой путь к файлам в браузере... Избавляемся от этого.

    В файл index.php в самом начале добавим:

    //объявляем константу содержащую серверный путь к файлам скрипта, будем добавлять проверку существования этой константы в наших файлах от прямого доступа из браузера
    define('SFB_DIR', $_SERVER['DOCUMENT_ROOT']);

    Во всех остальных файлах *****.php добавим проверку также в самом начале:

    if (!defined('SFB_DIR')) { exit(header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found', true)); }

    Если константа не объявлена то прекращаем работу скрипта и выдаём заголовок 404 браузеру.

    Теперь при попытке ввести в строку браузера пути к нашим файлам браузер ничего не покажет.

    Переход по страницам и действия пользователей без перезагрузки страницы.

    Начинаем делать переход по страницам и все действия пользователя на сайте через ajax запросы, т.е. без перегрузки всей страницы.

    Скачиваем последнюю версию jquery здесь - для удобной работы с javascript

    Скачиваем последнюю версию jqueryUI здесь - сборка плагинов и виджетов для оформления страницы

    Скачиваем плагин для jquery BlockUI здесь - для блокировки страницы во время ajax запроса

    Скачиваем плагин для jquery Toast здесь - для всплывающих уведомлений

    Распаковываем архивы если необходимо и загружаем файлы js в папку /js/ а файлы css в папку /css/.

    Открываем файл шаблона template.php и добавляем в тег









    В папке /js/ создаём файл jquery.sfb.js - это будет главный наш файл с функциями.

    Открываем файл шаблона template.php и добавляем в тег



    Продолжение следует...
    user avatar
    Пользователь
    На сайте 14 лет
    Сообщений : 42
    Репутация : 0
    8 лет назад

    Цитата: serega393 от 04.04.2018, 12:43

    Цитата: Scrin от 03.04.2018, 23:48
     

    Хм.. Демо сайта в первом посте... Покажите как это будет выглядеть...

    Я программист и я знаю, как защитить сайт, а не как взломать его
    Могу дать статью (аж 2008 года), где об этом много написано
    http://xaker.name/threads/13504/
    Погуглив можно найти свежий материал. Но суть в том, что это элементарная вещь, о которой говорили очень давно
    user avatar
    Пользователь
    На сайте 15 лет
    Сообщений : 91
    Репутация : 0
    8 лет назад
    Посмотрите внимательно логику  моего приложения... И почитайте внимательно ту статью которую вы предоставили в качестве примера.
    user avatar
    Пользователь
    На сайте 14 лет
    Сообщений : 42
    Репутация : 0
    8 лет назад

    Цитата: serega393 от 04.04.2018, 17:19
    Посмотрите внимательно логику  моего приложения... И почитайте внимательно ту статью которую вы предоставили в качестве примера.

    Окей
    Подскажите версию php, тогда возможно получится всё практическим путём доказать
    user avatar
    Пользователь
    На сайте 15 лет
    Сообщений : 91
    Репутация : 0
    8 лет назад
    Продолжаем...

    Создадим скрипт обработки клика по ссылкам и по кнопкам отправки форм. Открываем файл /js/jquery.sfb.js и добавляем следующий код:

    //функция обработки всех запросов со страницы
    //elem = элемент страницы
    function sfbRequest(elem)
    {
    //получаем путь запроса из атрибута href элемента и если атрибут отсутствует путь берем из строки запроса браузера
    if ($(elem).is("[href]")) { path = $(elem).attr("href"); } else { path = location; }

    //проверяем наличие специального атрибута элемента и получаем данные
    var atr = $(elem).data("sfb") ? $(elem).data("sfb") : "";
    //парсим путь и получем путь и get параметры если присутствуют
    var url = parseUrl(path);
    //получаем данные формы если она существует
    var post = $("form[name="+$(elem).attr("id")+"]").serialize();
    //делаем запрос
    $.ajax({type: "POST", dataType: "json", url: "/index.php", data: {page:url["path"], get:url["get"], post:post},
    //функция выпоняемая перед выполнением запроса
    beforeSend: function () { $.blockUI({message: "Подождите идёт загрузка...", overlayCSS: {backgroundColor: "#000", opacity: 0.5}}); },
    //функция выполняемая после удачного выполнения запроса
    success: function (result)
    {
    //если получены данные в результате запроса
    if (result)
    {
    //выполняем javascript полученный в результате запроса (если javascript при выполнении ловит ошибку выводим сообщение)
    if (result["data"]) { try { eval(result["data"]); } catch (err) { showMessage("Ошибка", "Что то пошло не так... Попробуйте обновить страницу...", 10000, "error", false, "top-left"); } }
    //если существует атрибут элемента page
    if (atr.page)
    {
    //пишем страницу в историю браузера
    history.pushState("", "", path);
       //меняем адресную строку браузера
    history.replaceState("", "", path);
    }
    }
    },
    //функция выполняемая в случае неудачного завершения запроса
    error: function () { $.unblockUI(); showMessage("Ошибка", "Что то пошло не так... Попробуйте обновить страницу...", 10000, "error", false, "top-left"); },
    //функция выполняемая после завершения запроса
    complete: function () { $.unblockUI(); }});

    return false;
    }

     

    //вешаем обработчик "клик" на все ссылки имеющие класс sfb-link
    $(document).on("click", ".sfb-link", function() { sfbRequest($(this)); return false; });

    //парсинг url в результате которого получаем путь и get параметры
    function parseUrl(path) { var url = []; var rx = new RegExp("^(([^:/?#]+):)?(//(([^:/?#]*)(?::([^/?#]*))?))?([^?#]*)(?([^#]*))?(#(.*))?$"); var parts = rx.exec(href); url["path"] = parts[7]; url["get"] = parts[9]; return url; }

    //сообщение (заголовок, текст, скрыть после времени, иконка, заменять предыдущее сообщение, позиция в окне браузера)
    function showMessage(title, text, hide, icon, stack, position)
    {
    $.toast({ heading: title, text: text, hideAfter: hide, icon: icon, stack: stack, position: position });
    }

    Открываем файл template.php.

    Добавляем к нашим ссылкам в главном меню class="sfb-link" и атрибут data-sfb='{"page":1}'. Атрибутом data-sfb мы обозначили что это ссылка на страницу и надо поменять адресную строку браузера. При клике у нас срабатывает блокировка страницы с помощью плагина jquery blockUI пока запрос не завершится. Это сделано для того чтобы пользователь дождался ответа прежде чем нажать что нибудь другое. Код имеет комментарии если что не понятно пишите будем разбирать.

    Теперь нужно нам обработать  ajax запросы в нашем файле index.php открываем его и добавим следующий код

    //если ajax запрос
    if (isset($_SERVER['HTTP_X_REQUESTED_WITH']))
    {
    //если реферер не передан завершаем работу
    if (!isset($_SERVER['HTTP_REFERER'])) { exit(header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found', true)); }
    //если реферер не соответствует нашему домену завершаем работу
    if (!mb_strpos($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST'])) { exit(header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found', true)); }
    //запрашиваемая страница
    $page = isset($_POST['page']) ? $_POST['page'] : '';
    //парсим post данные в массив
    if (isset($_POST['get'])) { parse_str($_POST['get'], $get); }
    //парсим get данные в массив
    if (isset($_POST['get'])) { parse_str($_POST['post'], $post); }
    //если пустая строка запроса или запрашивается index.php показываем пользователю главную страницу
    if ($page == '' || $page == '/') { $page = 'index'; }
    //удаляем крайние слеши, получаем страницу которую запрашивает пользователь
    $page = trim($page, '/');
    //проверяем существует ли у нас запрашиваемая пользователем страница в папке /pages/
    if (file_exists(SFB_DIR.'/pages/'.$page.'.php'))
    {
    //включаем буферизацию вывода т.е. весь результат выполнения программы что будет ниже будет помещён в буфер
    ob_start();
    //подключаем запрашиваемую страницу
    include(SFB_DIR.'/pages/'.$page.'.php');
    //в переменную $content помещаем на буфер
    $content = ob_get_clean();
    //завершаем работу и отдаём данные в json формате (javascript который добавляет в элемент c ID sfb-content полученный результат выполнения скрипта)
    exit(json_encode(['data' => '$("#sfb-content").html("'.$content.'");']));
    }
    else
    {
    exit(json_encode(['data' => 'window.location.replace("/404");']));
    }
    }
    else
    {
    //включаем буферизацию вывода т.е. весь результат выполнения программы что будет ниже будет помещён в буфер
    ob_start();
    //проверяем существует ли у нас запрашиваемая пользователем страница в папке /pages/
    if (file_exists(SFB_DIR.'/pages/'.$page.'.php'))
    {
    //подключаем запрашиваемую страницу
    include(SFB_DIR.'/pages/'.$page.'.php');
    }
    else
    {
    //если не существует выдаём заголовок браузеру 404
    header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found', true);
    //подключаем нашу страницу ошибки
    include(SFB_DIR.'/pages/404.php');
    }
    //в переменную $content помещаем на буфер
    $content = ob_get_clean();
    //подключаем шаблон сайта
    include(SFB_DIR.'/template.php');
    }

    заменив этот

    //включаем буферизацию вывода т.е. весь результат выполнения программы что будет ниже будет помещён в буфер
    ob_start();
    //проверяем существует ли у нас запрашиваемая пользователем страница в папке /pages/
    if (file_exists(SFB_DIR.'/pages/'.$page.'.php'))
    {
    //подключаем запрашиваемую страницу
    include(SFB_DIR.'/pages/'.$page.'.php');
    }
    else
    {
    //если не существует выдаём заголовок браузеру 404
    header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found', true);
    //подключаем нашу страницу ошибки
    include(SFB_DIR.'/pages/404.php');
    }
    //в переменную $content помещаем на буфер
    $content = ob_get_clean();
    //подключаем шаблон сайта
    include(SFB_DIR.'/template.php');

    Добавляем в файле template.php к элементу id="sfb-content".

    Открываем в браузере и любуемся нашим сайтом )))

     
    user avatar
    Пользователь
    На сайте 13 лет
    Сообщений : 1859
    Репутация : 0
    8 лет назад
    Прикинем в моем скрипте 293 файла, в 90% файлов от 1000 строчек кода, в нескольких файлах от 5000 строчек кода, в одном файле двигателя свыше 15000 строчек програмного кода.

    В среднем множим 300 * 1500 = 450 000 строчек кода, к этому еще планировка и концепкия дизайна, его отрисовка, и реализация. Вы в день примерно публикуете в среднем до 500 строчек кода. И того 450 000 / 500 = 900... тоесть с такой скоростью вы будете постить тут полноценый скрипт 900 дней, почти три года. Ну что же я желаю Вам удачи)
    Автор темы
    author avatar
    serega393
    Пользователь
    На сайте 15 лет
    Сообщений 91
    Тем 2
    Репутация 0
    Похожие темы
    Теги темы
    Автор не добавил тегов для этой темы
    Ответить
    Написал(а):