Как создать свой движок для сайта

Движок сайта

На простых HTML сайтах каждая статься располагается на своей странице. Но для некоторых сайтов, например для социальных сетей, такой способ не подходит. Весьма неудобно для каждого пользователя создавать отдельную страницу. На таких сайтах для всех пользователей создаётся одна страница. Информация о конкретном пользователе берётся из БД и добавляется на эту страницу. Движок сайта — это набор скриптов и база данных, обеспечивающие работу такого сайта. В этой теме рассматривается создание движка простого сайта со статьями. Я намеренно предлагаю самый простой пример, достаточный, чтобы понять, что такое движок сайта и как его делать. В более сложном варианте будет много элементов и в них будет труднее разобраться. На основе этого примера Вы сможете делать реальные сайты.

Принцип создания

Создание движка сайта — достаточно сложная задача, требующая определённых знаий. Нужно уметь делать вёрстку сайта, работать с файлами и базами данных.

Для создания движка нужно выполнить несколько действий:

  1. Сделать вёрстку страницы
  2. Разделить страницу на блоки и поместить их в отдельные файлы
  3. Написать код, вставляющий блоки на страницу
  4. Создать базу данных для контента сайта
  5. Написать код, который получает контент из базы данных и добавляет на страницу

У Вас может возникнуть вопрос: зачем разделять страницу на блоки и потом вставлять их при помощи PHP скрипта? В нашем примере только одна страница, но на реальных сайтах их больше. Вы можете отдельно создать главную страницу, сделать сраницы для разделов сайта, для формы регистрации и другие. И на всех этих страницах будут одинаковые блоки. Поэтому удобно раместить эти блоки в файлах и подлючать их в скрипте.

Вёрстка страницы

Подробно вёрстка рассматривается в учебнике CSS. Здесь я просто покажу код страницы. На этом этапе не обязательно определять дизайн сайта. В дальнейшем Вы сможете изменить блоки так, как угодно. А пока нужно определить общую структуру страницы.

Для данного примера целесообразно создать отдельную папку и размещать в ней все файлы сайта. Назовём страницу page.php. Пока в ней будет только HTML код, но позднее в неё добавится PHP код, поэтому сразу сохраним её в нужном формате. Поместим страницу в созданную папку.

В этом коде всё просто, поясню лишь основные моменты. В строке 10 создаём шапку сайта. Затем идёт таблица из двух колонок. В первой колонке находится главное меню. Пока в нём есть только ссылка на главную страницу. Вторая колонка для статьи. Она будет вставляться из базы данных. Затем следует подвал сайта.

Стиль будет содержаться в отдельном файле. Он уже подключён в 6 строке. Вот код файла:

Файлы шаблона

Созданную страницу нужно разделить на блоки и разместить их в файлах шаблона. Они будут находиться в основной папке сайта, но на реальных сайтах для них создаётся специальная папка. Файлы рекомендуется сохранять в формате tpl, потому что это специальный формат для файлов шаблона. Но можно сделать обычные HTML файлы. Особой разницы нет. HTML файлы не рекомендуют использовать только потому, что это формат для страниц, а файлы шаблона — это не страницы.

Для шапки сайта создадим файл header.tpl. В нашем примере она состоит из одной строки, её и поместим в файл.

Таблицу, составляющую основу вёрстки, мы оставим на странице. В ней находится главное меню и контент сайта. Их мы будем выводить при помощи PHP скриптов

Создадим файл footer.tpl для подвала сайта.

Пока блоки, из которых состоит шаблон, пустые. Но Вы в любой момент можете заполнить их нужными элементами. Также Вы можете добавить в шаблон другие блоки.

Присоединение блоков

Созданные блоки нужно подключить к странице. Так как эти блоки будут всегда одинаковые, мы присоединим их самым простым способом — с помощью подключаемых файлов. Позднее мы рассмотрим более сложный способ. Подключать файлы шаблона будем с использованием конструкции require . Добавим её в те места сраницы, где должен быть код блоков. Страница будет выглядеть следующим образом:

Если Вы всё сделали правильно, то страница должна отображаться точно так же, как до разделения на блоки. Вы можете создавать новые страницы и подключать к ним эти блоки.

Содержание сайта

Контент будет содержаться в базе данных. Я использую базу данных mybase, которая создавалать при рассмотрении предыдущих тем учебника. Если у Вас нет базы данных, то нужно её создать. В ней создадим таблицу для статей, назовём её art . В таблице должны быть такие поля:

id — номер статьи

name — название статьи

text — текст статьи

menu — текст для пункта меню

Добавьте в созданную таблицу несколько статей. Задайте им любые названия и напишите какой-нибудь текст. Чтобы отделять абзацы статей, тэги <p> могут находиться прямо в базе данных вместе с текстом. В ней могут быть и другие теги, например ссылки и картинки.

Если Вы создаёте отдельные страницы для разделов сайта, то можно для них сделать записи в таблице как для обычных статей.

Вывод меню на страницу

Чтобы пользователь мог увидеть статьи, в главном меню должны быть ссылки на них. Все ссылки будут вести на одну страницу и в них будет GET-запрос, содержащий номер статьи. Например ссылка на первую статью должна быть такой:

Чтобы вывести ссылки на все статьи сайта, добавим PHP скрипт в блок с главным меню. Этот скрипт будет получать id статей и тексты ссылок из базы данных. Используя эти данные скрипт будет формировать ссылки. Блок главного меню должен выглядеть так:

Вывод контента

Для вывода статьи нужно добавить к коду страницы скрипт, который получает статью из базы данных и размещает на странице. Этот скрипт будет находится в блоке для контента. Вот его код:

Поясню, как работает этот скрипт. Номер статьи берётся из массива $_GET и записывается в переменную $art . Если номера статьи нет, значит это главная страница, и выводится текст, который должен располагаться на ней. Если номер статьи есть, то из БД берётся статья с этим номером и выводится на страницу. В этом скрипте нет подключения к MySQL, потому что это было сделано ранее. Название статьи помещается в тэг <h1> . К тексту никакие тэги не добавляются, потому что текст содержится в базе данных уже с тэгами.

Чтобы сайт был сделан более грамотно, рекомендуется разделять HTML и PHP код. Рассмотренный скрипт можно поместить в файл и подключить к странице.

Создание собственного движка на PHP для начинающих

Я достаточно много времени занимаюсь переносом и созданием сайтов на популярных CMS. И у меня иногда мои знакомые спрашивают, где я всему этому научился. Я решил, что эта информация может быть кому-нибудь полезна и среди моих читателей.

Хочу сказать , что где-то 90% своих знаний я почерпнул из курсов Михаила Русакова. И вот не так давно , у него вышел еще один очень интересный бесплатный курс по теме создания собственных движков для сайтов.

Эта тема на данный момент очень актуальна, если Вы хотите создавать по-настоящему профессиональные сайты.

У некоторых готовых движков есть огромное количество минусов. Я не буду сейчас подробно останавливаться на них — просто перечислю некоторые из них:во первых низкая безопасность (стандартные движки»как и многие» взламываются стандартно и никакие из расширений не помогут, сразу говорю).

Замедленная работа (любой движок — универсальность, отсюда и появляются тормоза), плохая оптимизация (сайтов на той же Joomla миллионы, и большинство из них принадлежит школьникам, отсюда и нелюбовь поисковых систем к подобным сайтам), зависимость от сторонних расширений.

Я уже этот курс прошёл. Мне он очень понравился, но отмечу, что курс рассчитан, в первую очередь, на тех, кто уже знаком с HTML+CSS+PHP. Хотя, в целом, курс очень простой (если знать базу). Всё разбирается на примере создания готового движка с чистого листа.

Как спроектировать и построить свой движок для сайта(CMS)

sercxjo's user avatar

Список можно продолжать до бесконечности; но если Вы думаете что Вам сейчас напишут план разработки CMS, то Вы ошибаетесь.

Главное ИМХО — знание ООП , HTML , XML , а подробнее можно узнать, ковыряя уже кем-то написанные CMS

Как создать свой движок для сайта

Вчера я определил, какие у движка должны быть библиотеки. Но то была больше теория. Сегодня я создал проект и применил теорию на практике. Вот что у меня получилось:

Вот так вот я организовал структуру своего движка. Давайте я рассмотрю подробней. Начну с папок. Всего создано шесть папок. Первая — _Doc, будет содержать ссылки на используемую документацию по движку (история, лист задач и т.д.). Фишка: обратили внимание на подчеркивание? Так вот, это сделано специально чтобы папка была в самом вверху и не смешивалась с папками движка (папки сортируются по имени).
Application — это уровень приложения. Как вы видите в ней всего один проект с тем же именем. Данный проект — это динамическая библиотека (подробнее о видах библиотек можете прочитать http://ru.wikipedia.org/wiki/Библиотека_(программирование)). Пользователь в идеале должен будет работать только с этой библиотекой.
Папка Core — это основа из схемы. Она содержит 4 проекта. Каждый проект — это статическая библиотека.
Папка Engine — это ядро из схемы. Все проекты из папки, также являются статическими библиотеками.
Папка Framework пуста, потому что пока нет смысла в ней что-то делать.
И папка Test будет хранить приложения для тестирования частей движка.

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

Я не стану пояснять как я создал такой проект, так как это долго. Да и не расчитанно на новичков.

На этом подготовка завершена. Продолжим.

Любое приложение должно с чего-то начинаться. Это называется точкой старта (или входа) приложения. Обычно это или main() или WinMain(), а также все их производные. Но в движке нет точки старта, потому что движок не запускается сам по себе. Точку старта задает пользователь при создании приложения. Но я начну именно с нее проектировать и писать код. Наша точка старта будет в приложении test.

Пользователь должен при старте, создать наследника от класса Application, полиморфировать нужные методы, инициализировать наследник, запустить его на выполнение и затем очистить ресурсы.
То есть получается так:

Поясню. Start — это условный момент запуска приложения. End — это условный момент завершения приложения. WinMain и MyApplication — это уровень приложения. Данные сущности пишутся пользователем. iApplication — это интерфейс из библиотеки Application. Как вы видите, я выделил их цветом согласно схемы из предыдущей статьи. Я так буду поступать и дальше чтобы вам было легче ориентироваться.

Начнем писать код. Для начала создадим класс приложения. Находим Application и пишем:
Application.h

class ENGINE_DLL Application
public:
Application();
virtual

// Инициализация приложения.
bool Create();

// выполнение одного кадра
bool RunOneFrame();

// Выполнение приложения.
void Run();

// Завершение приложения.
void Shutdown();

protected:
// пользовательская инициализация
virtual bool _init() = 0;
// пользовательский кадр
virtual bool _frame() = 0;
// пользовательская очистка
virtual void _close() = 0;

private:
bool _isinit;
bool _exit;
>;

Application()
// чистим за нерадивым программистом
if (_isinit==true)
Shutdown();
>

bool Application::Create()
/*
Инициализация всех систем движка
*/

// пользовательская инициализация
if (_init() == false)
return false;
// сообщаем что приложение инициализировано
_isinit=true;
// сбрасываем флаг сообщающий о выходе
_exit = false;
return true;
>

bool Application::RunOneFrame()
// следим чтобы не было попытки рисовать при неудачно инициализации
if (_isinit == false)
return false;

void Application::Run()
// Инициализируем
if(_isinit == false)
Create();

// выполняем бесконечный цикл
while ( _exit==false && _isinit==true )
_exit = !(RunOneFrame());
>

void Application::Shutdown()
_isinit = false;
>

Если вам нужен файл export.h, то он такой:

#ifdef WIN32
#ifdef _BUILD_ENGINE
#define ENGINE_DLL __declspec(dllexport)
#else
#define ENGINE_DLL __declspec(dllimport)
#endif
#else
#define ENGINE_DLL
#endif

При этом, где-то в Application должен быть объявлен _BUILD_ENGINE. В проекте на который я дал ссылку выше, все это уже есть.

Теперь вернемся к приложению:
main.cpp

#include <Windows.h>
#include «../Application/Application.h»

class MyApp : public Application
private:
protected:
// пишем пользовательские классы
virtual bool _init()
virtual bool _frame()
virtual void _close()
>;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pScmdline, int iCmdshow)
MyApp app;

Собственно вы уже можете собрать (но не забудьте прилинковать Application). Но запускать не советую — уйдет в бесконечность:) Мы ведь еще условий выхода не написали.

Так, теперь двигаемся дальше. Вспомним для чего нам был нужен Application — для обертывания остальных сущностей. Среди которых главной была Engine. Значит теперь ее нужно создать. Далее, по текущей задаче мы должны создать окно и инициализировать рендер. Значит в модуле рендера появляются два класса — Window и Render. Но так как мы решили что сущность рендера абстрактна, то тогда нужен еще один класс RenderDX11 и WindowWin32, которые будут выполнять реализацию использования в рендере DirectX 11 в окне операционной системы Windows.

Схема усложняется:).
Начнем выполнение с конца. Находим библиотеку рендера и пишем код:
Window.h

class Window
public:
Window();
virtual

/// Закрыть окно.
virtual void closeWindow()=0;

/** Показать/Скрыть окно.
@param
value определяет, показывать ли окно (при true) или не показывать.
*/
virtual void showWindow(bool value)=0;

/// Вернуть заголовок окна
virtual const std::wstring& getWindowName() const

/// Изменить заголовок окна.
virtual void setWindowCaption(const std::wstring& _caption)=0;

protected:
std::wstring _caption; ///< заголовок окна
unsigned int _width; ///< ширина клиентской части окна
unsigned int _height; ///< высота клиентской части окна
>;

Window::Window()
_width = 800;
_height= 600;
_caption = L»Engine»;
>

Теперь нам нужен класс Render. Но тут я хочу сказать вот что — наш рендер должен быть единственным. Реализуем мы это через паттерн синглтон (погуглите, кому интересны подробности, прям по запросу «паттерн синглтон»). Так что сначала надо написать сам паттерн. Переходим к библиотеке Common. и пишем:
macros.h

/** Singleton pattern implemented using templates.
@remarks
Using singleton is useful for objects such as engine
or managers which should have no more than a single
instance in the whole application.
@remarks
If you want to make object of some class singleton you
have to derive this class from Singleton class.
@remarks
If something goes wrong during singleton object creation,
deletion or on attempt to access it, assertion arises.
By «something going wrong» I also mean attempts to create
more than single object of class marked singleton.
*/
template <typename T>
class Singleton
public:
/** Creates singleton of type T.
*/
Singleton()
Assert(!s_pSingleton, «Singleton class already instantiated.»);

Singleton()
Assert(s_pSingleton, «Singleton class not instantiated.»);
s_pSingleton=0;
>

/** Returns reference to a singleton.
*/
static T& getSingleton()
Assert(s_pSingleton, «Singleton class not instantiated.»);
return(*s_pSingleton);
>

/** Returns pointer to a singleton.
*/
static T* getSingletonPtr()
return s_pSingleton;
>

/// A static pointer to an object of T type.
/// This is the core member of the singleton.
/// As it is declared as static no more than
/// one object of this type can exist at the time.
static T* s_pSingleton;
>;

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *