![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#21 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,692
|
![]()
Продолжаю развивать идею тотальной автоматизации. Но чем дальше тем сложнее проектировать модули и связи между ними.
На днях попробовал задумку связанную с обработчиком url'ов. Использовал регулярки и контролы, получилось круто, примерно так есть в прототипе: PHP код:
Попробовал один из способов для перевода интерфейса. Самый простой, создать пару каталогов для ru и en, где размещены переводы. Удобно, что если перевода для одного из полей нет, то php ругнется на отсутствующий ключ, но по мне, это не айс. Впоследствии реализовал так, что есть язык по умолчанию(en) который подгружается в любом случае, но если требуется другой, то погружается второй язык, заменяя собой часть(или полностью) язык по умолчанию. Загвоздки появились с ajax, приходилось отсылать часть перевода вместе с данными из модели, пока думаю над этим. Также еще не пробовал реализовать разделения контента по языкам, потому что бывает куча разных случаев. Во первых сайты на разных языках могут иметь различные сигнатуры, во вторых наоборот, страницы одни, а вот информация на них меняется в зависимости от языка(например справка по php). Правда можно все это реализовать такими ссылками: Код:
Первую ru разруливаю так: Код:
Этот "гениальный" стыд движок опубликовал на github https://github.com/kostia256/JustCMF |
![]() |
![]() |
![]() |
#22 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,692
|
![]()
По прежнему ищу помощников!
На сегодня я все переписываю уже на ![]() ![]() Начну с роутинга. Суть заключается в 2 классах реализующих интерфейсы: Код:
Код:
Код:
Код:
Код:
/blog/php/1 в параметрах Route будет массив ["tag" => "php", "id" => "1"] но /blog/php/article уже не пройдет, т.к. article не число Предвижу баги с Код:
|
![]() |
![]() |
![]() |
#23 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,692
|
![]()
Следующий элемент. Также очень интересный, но еще не завершенный. Это класс Action. Его главная роль в валидации и преобразовании данных с помощью отображений.
Код:
Код:
/hunter@hunter.com то на экране напечатается: hunter@hunter.com Но если параметр не является валидным email, то будет исключение от action, что отображение email прошло с ошибкой. Практически того же эффекта можно было добиться специфическим типом Email, при поппытк установить ему значение было бы сгенерировано исключение. Например: Код:
Важно что можно реализовать сколь угодно сложные преобразования типов. Например можно реализовать отображение file, которое будет сохранять загруженный файл в указанную директорию и возвращать имя файла в виде строки которая будет записана в модель. Тоже для картинок с возможностью создавать preview. С типами есть еще одна интересная возможность. Можно подписаться на изменение значения. Например: Код:
15 13 10 Суть в том, что при добавлении, удалении или изменении элемента массив будет вызвано событие update у всех подписавшихся. Таким образом можно реализовать сложную логику в моделях, когда поля являются результатом функции от других полей. |
![]() |
![]() |
![]() |
#24 | |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,692
|
![]()
Доброго времени суток.
Из предыдущего поста: Цитата:
Я предпочитаю писать общие решения, частным. Если какое либо поведение может встречаться чаще одного раза, то его лучше вынести в класс расширение. А теперь о моделях =) Любая модель это экземпляр класса AbstractEntity или его наследники или любой другой реализующий интерфейс IAbstractEntity. Код:
Код:
Код:
Типы полей таблицы отображаются в типы движка автоматически, но можно задать свои типы для моделей. Соответственно модель с неправильными данными не будет создана. Ошибки можно перехватить и обработать. Правда контроль качества данных полученных из БД планируется убрать из-за ненадобности. Соответственно можно легко наплодить множество одинаковых экземпляров моделей и заполнить ими базу: Код:
Код:
Код:
Код:
На пятый раз я хотел бы дойти до конца и хотя бы повторить возможности первой версии, но уже организованной значительно грамотнее. Начал понемногу намечать админку. |
|
![]() |
![]() |
![]() |
#25 | |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,692
|
![]()
Я очень счастлив, что наконец знаю где должна лежать загрузка и обработка файлов =)
Нахожусь несколько в бредовом состоянии после работы, но хочу поделиться наработками. Начну с того что я неадекватный раз принялся за реализацию подобного конструктора. Реализовал ~60% от MySQL\Select, чуть-чуть MySQL\WhereExpr и остальные мелочи. Вот это: PHP код:
Цитата:
Прелесть 2: Контекст построения запроса может гулять по коду до полного своего формирования и только после этого выполниться. Очень удобно для расширений, DataMapper'ов, фабрик и т.д. Прелесть 3: Прелесть 1 и Прелесть 2 _________________ Мне очень полюбился REST и я начал им злоупотреблять. Благо можно сделать заглушку и получать самые разные методы отправки запросов GET, POST, PATCH, CLONE, PUT, DELETE, HEAD, OPTIONS ... Например удаление ресурса: PHP код:
Код:
Код:
Код:
Суть имея ссылку на ресурс: httр://domain/DataManager/Pages/pages/485, то посредством разных методов запросов можно либо удалить данный ресурс(DELETE), клонировать(CLONE), получить список доступных операций(OPTIONS), обновить(POST), применить частичное обновление(PATCH) и т.д. Имея: httр://domain/DataManager/Pages/pages/, то можно создать ресурс(PUT), получить список всех ресурсов(GET) и т.д. Через дополнительные параметры запроса можно определить поведение, например фильтр, порядок и количество. Конечно следовать fullREST невозможно, но оно и не нужно. _________________ Также я почти всюду преследую идею агрегирования и группировки. Например структуры, я всегда любил объединять связанные объекты в группы, именно для этого и есть структура: Код:
уф |
|
![]() |
![]() |
![]() |
#26 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,692
|
![]()
Задачи на выходные:
1. Сделать PUT(insert), POST(update) ресурсов. 1.1 Сделать OPTIONS для получения информации о возможных действиях и описании самих действий для автоматизации построения форм и валидации на стороне клиента. 1.1.1 Придумать куда пихать mapping'и(require, email, is_integer ...) для автоматизации построения действий над ресурсами. Точенее это уже автоматизировано, но без отображений. 2. Начать работу над расширениями таблиц 3. Пилить конструктор запросов Другие задачи: 1. Реализовать сервис для работы с сессиями. Долой session_start() и даёшь $this->response->cookies["sid"] = ["value" => bin2hex(openssl_random_pseudo_bytes (16)), "expires" => time() + 3600]; 2. Прикрутить lessphp 3. Реализовать сервис для ведения статистики 4. Реализовать сервис для бекапов 5. Добавить пользователей и систему управления правами доступа 6. Доделать Route, не допускать роутов перекрывающих другие и наоборот не допускать роутов которые будут перекрыты. 7. Реализовать сервис логирования и обработки ошибок |
![]() |
![]() |
![]() |
#27 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,878
|
![]()
Неплохо для тренировки.
E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#28 | |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,692
|
![]() Цитата:
![]() Еще по поводу REST и разницы между POST и PATCH хочу высказаться, их разница в следующем: POST: Код:
Код:
Имея Код:
Код:
Код:
Последний раз редактировалось Kostia; 12.07.2014 в 01:45. |
|
![]() |
![]() |
![]() |
#29 | ||
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,692
|
![]()
Вникая все глубже и глубже в дебри проектирования, немного перестроил движок. Изначально было выбран неплохой подход, раз смог безболезненно кардинально перестроить большую часть системы.
Приложение располагается в %document root%/Application/ Я всё никак не мог формализовать понятие страницы, пока не пришло самое простое и очевидное определение. Страница - это совокупность компонентов. Т.е. это не какая-то особая сущность, а обыкновенный контейнер для компонентов. Наконец можно определять отношения между таблицами. Определил отношение один к одному и частично один ко многим. Над многие ко многим еще думаю. + Нужно кучу оптимизаций провести, иначе 500+ запросов к базе для одной страницы гарантированны =) Для тестов было создано 2 страницы. На одной из которых расположены компоненты, а вторая для тестов по разрешению таких ситуаций когда возникает рекурсия в отношениях. Например если эти страницы являются друг другу родителями, то получаем рекурсию и т.д. Также был создан простой контроллер: Код:
Код:
Код:
У компонентов определен метод render() и __toString(). Они эквивалентны и это очен удобно. Благодаря определенным связям между таблицами можно выполнить автоматическое построение моделей таким образом, что они тащат за собой всё дере зависимых элементов. Например выбрав страницу также выберутся все компоненты на ней.(Тут нужна оптимизация в виде отложенных запросов, т.е. получать данные из базы и выполнять построение сущностей только после первого обращения к ним). В общем если будет некая корневая страница root, а все остальные являются ее потомками, то при выборе root будет выбрана вся база целиком. Это очень удобно, особенно если хорошо оптимизировать. Вся бизнес логика(магия) скрыта в моделях, фабриках и мапперах как и положено. Компоненты делятся на 3 основные сущности: Цитата:
На скрине сгенерированная страница. Здесь Цитата:
Начинаю клепать редактор страниц. Вдохновился вот этой штукой: http://www.layoutit.com/ Последний раз редактировалось Kostia; 27.07.2014 в 23:02. |
||
![]() |
![]() |
![]() |
#30 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,692
|
![]()
Кто-нибудь, откликнитесь на зов! =)
Вся система превратилась в хитрозакрученную спагетти. Здравомыслие меня уже давно покинуло и я долгими часа думаю над казалось бы простыми задачами. 1. Страницы как совокупность компонентов. Чуть меньше месяца я занимаюсь версткой одного сайта, и в целях прокачки делаю дизайн адаптивным под мобилки, хотя изначально он нарисован ни разу не адаптивным, приходится импровизировать и согласовывать различные решения. Сегодня прочел статью на хабре, про то что google будет помечать адаптированные под мобильные устройства сайты и повышать их в выдаче в поиске на мобильных устройствах, а также состряпали утилиту для проверки сайта. Когда после проверки моей верстки я получил зеленый свет, то был на седьмом небе от счастья. Усилия не прошли даром =) У любой страницы есть макет(сетка) на которую ложатся компоненты. Но существуют компоненты, которые присутствуют на каждой странице, например меню и футер. Эти компоненты можно заранее зафиксировать на макете. Но также бывает необходимо чтобы скажем на страницах новостей также были некоторые зафиксированы компоненты и на странице товаров и в статьях. Отсюда следует что необходимо наследование макетов. В таком случае почему бы просто не сделать наследование страниц. Для удобство я завел компонент html и одну системную страницу от которой будут наследоваться все остальные. Таким образом можно реализовать последовательность наследующихся скелетов. Например так: html -> mash -> pageWithMenuAndFooter -> concretPage У компонентов есть слоты в которые можно вставлять другие компоненты. Благодаря слотам можно реализовать компоненты для построения сетки. Код:
Про спагетти. Совсем недавно я битый час пытался понять что делает этот код, и как оно вообще работает: Код:
$this->{$this->component}->render() Подгружает конкретную модель компонента и вызывает у нее render. Это было сделано потому, что у каждого компонента могут быть свой набор параметров. Но это не главное, т.к. конкретные компоненты также являются моделями, то можно задать отношения между компонентами и другими моделями. Таким образом я получаю разделение между логикой работы конкретной модели и сбором данных для рендеринга. Например для модели News я могу создать 3 компонента NewsShow, NewsAnnonce и NewsArchive и описать получение данных в каждом из компонентов в зависимости от параметров самих компонентов, например в анонсе нужно показывать 6 последних новостей с тегами "Железо" и "Софт". |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Что сейчас актуально, движки, CMF и так далее. | dertsb | WordPress и другие CMS | 1 | 12.12.2013 07:25 |
«Сайт под ключ» на cmf Drupal | manachud | Фриланс | 0 | 14.09.2011 21:00 |
Буду делать Аркаду 2D, ищу помощников | CyberOrcX | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 46 | 17.06.2009 09:48 |
Набираем помощников. Игра SanCIty | microran | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 1 | 11.09.2007 19:42 |
Набираем помощников. Игра SanCIty | microran | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 0 | 31.08.2007 17:45 |