6. Рекомендую еще раз посмотреть на Boost. Функции по работе с некоторыми типами системных ресурсов (например — файлы или сокеты) представлены в двух экземплярах — одна в случае ошибки кидает исключение, другая — возвращает ошибку через параметр-ссылку. Поскольку в PHP нет перегрузки функций, я решил сделать префикс checked_. Смысл в том, что одной и той же функцией можно воспользоваться с разными ожиданиями. В одном случае логика программы может сразу же предполагать, что файла может и не быть. То есть — это не является ошибкой, а является одним из валидных кейсов. В таком случае пользовател пишет что-то вроде:
if($file = fs::read('...'))
{
# ...
}
Но может быть ситуация, когда файл обязан быть, и его отсутствие означает невалидность каких-либо дальнейших действий. В таком случае пользователь пишет:
$file = fs::checked_read('...');
# ...
и получает гарантию, что «либо все, либо ничего».
checked_children не нужен, т.к. в случая отсутствия детей функция вернет пустой range, из-за которого foreach не сломается, а просто будет выполнено ноль итераций. checked_ функций не так много: это fs::checked_read, nodeset::checked_first и nodeset::checked_last. Кажется — все. Это просто редкие ситуации, когда одна и та же функция в разных ситуациях может вызываться с разными ожиданиями.
5. Easyweb — это не CMS. В ней нет ничего по умолчанию: нет готовых баз, готовых шаблонов, или чего-то еще готового. Голый сайт на Easyweb — это голый сайт впринципе, в котором нет вообще ничего. Считайте так: Easyweb — это XSLT-верстка + специальная шина данных. То есть, вы устанавливаете сторонние хранилища данных (MySQL, PostgreSQL, Apache Solr, GeoIP, и т.д.), конфигурите их как хотите, дизайните их внутренние контейнеры данных (базы, таблицы, индексы, и т.д.) так, как хотите, без каких-либо ограничений, и уже после этого конфигурите Easyweb так, чтобы он умел брать нужные данные из нужных мест. Далее вам остается только верстать на XSL, а Easyweb уже сам разберется, куда пойти, и что откуда взять.
4. Это например по каким событиям? Можете привести пару примеров? Теперь что касается кеширования. Необходимость решения возникла как раз в реальном проекте. Суть такова: на каждой странице сайта есть ссылка «Выбрать город». По нажатию появляется окно со списком городов. Всего городов порядка ~1500, а их XSL-отверстывание выполняется с группировкой по первой букве названия. По ТЗ нужнто было чтобы этот блок был именно в HTML, а не подгружался аяксом, и был на каждой странице сайта. При этом Google Bot ходит на сайт ~50 раз в секунду. Речь именно про страницы сайта, а не про скрипты или там favicon. Такой интенсивности оказалось достаточно, чтобы достаточно сильно напрячь деда на предпоследней линейке Intel Xeon. Введение кеша снизило общую нагрузку в разы. Вот вам и пример из реальной жизни ;-)
3. Пространства имен XML — это не просто способ разрешения коллизии имен. Подразумевается, что за пространством имен стоит какая-то библиотека, или часть очень большой библиотеки (как в случае EXSLT). Функция введена просто для удобства, т.к. отрисовка пагинатора — задача каждого второго сайта. Все XPath-расширения, предоставляемые движком: github.com/nyan-cat/easyweb/wiki/XPath-extensions
Что же касается самого имени пространства имен «www» — предполагается, что XSL- и XPath-расширения Easyweb реализуют всю необходимую сайтостроительную функциональность и должны покрыть 95% всех вебмастеропотребностей, поэтому мне кажется совершенно логичным выбрать имя, претендующее на дефолтность.
2. Вопрос именования сущностей — это тема отдельного курса лекций, обосновать свою позицию в несколько предложений не так просто. Но я все же попробую :) Имена сущностей должны нести минимум информации, которой, в свою очередь, должно быть достаточно для того, чтобы понять, как этой сущностью пользоваться, и не более. Имена не должны сообщать «как это устроено», только — «как этим пользоваться». Например, в Boost-е аналогичная функция назвается native_handle, и у сокетов, и у файлов, и у тредов. Я надеюсь, вы доверяете коммьюнити буста в вопросе имен? native_handle не говорит, что именно вы получите. Об этом можно догадаться по имени агрегирующего класса, и убедиться наверняка из документации. Именно поэтому в C++ шаблоны, конкретизированные параметрами, берут в typedef. Пользователю нужно знать, как этим пользоваться, а не как оно устроено. В 90% ситуаций пользователю достаточно знать про контейнер лишь то, что это контейнер, и его можно проитерировать через range-based for-loop. То есть, сосредоточиться стоит на том, «для чего мне это», а не «как это устроено». Я вижу всего один случай, когда действительно нужно называть функции getDOMNode / getSimpleXML — это когда фасилити умеют выдавать сразу несколько встроенных типов ресурсов.
В качестве учебного пособия есть гостевая книга: github.com/nyan-cat/easybook, ее логика такая: регистрации нет, автор сообщения может редактировать или удалять сообщения. Автор определяется по правилу: если IP тот же, и если сообщение не старше 10 минут (конечно же это просто для примера, в жизни так не делают). Или вы ее и назвали hello world-ом? Реальный сайт будет примерно так и выглядеть, только будет больше файликов в каждой папке. Объемы файликов будут такие же, или чуть больше. Разве что последние фичи, описанные в этом посте, там еще не используются. Easybook должна дать полное понимание того, как делается сайт на Easyweb. В репе лежит easybook.sql — его надо импортнуть в базу, создать MySQL-юзера, прописать его логин-пароль в datasource.xml, и все — сайт заработает. Если же примера Easybook вам недостаточно, то напишите, что именно вы хотели бы увидеть, и я буду дорабатывать этот пример.
P.S. Хабротипограф — фи. Тире нужно отбивать неразрывным пробелом, а не обычным.
Вы вообще понимаете, что происходит? Мне в комментах рассказывают о проблемах подхода, которого нет в моем движке. Нет, и никогда не будет. Я не верстаю на клиенте с помощью XSLT, и не собираюсь это когда-либо делать — в рамках традиционного веба это бредятина, удаление гланд через задний проход. XSLT-верстка на стороне клиента нужна в настолько экзотических ситуациях, что группа разработчиков XSL отбила бы себе все лицо ладонями, если бы узнала, что их технологией верстают на клиенте в традиционном вебе.
Easyweb — это XSLT-верстка на сервере, только на сервере, и нигде кроме сервера! А-а-а-а-а-а-а!
Мой текущий проект жил на нем 10+ лет — это просто кошмар.
А почему вы решили, что проблема в XSLT?
Кросс-браузерность практически невозможна (если говорить о трансформации на клиенте)
О боже, как вам пришло в голову заниматься версткой на клиенте?
скорость и гибкость отвратительные
Странно. Я вот наблюдаю ровно обратную картину по обоим пунктам.
Отсутствие коммьюнити, и поддержки
Чем вам подписчики хабра на XSLT не коммьюнити? А парни из libxslt и libxml достаточно оперативно отвечают в мейл-листах, причем на самые каверзные вопросы.
Да, я уже давно обратил внимание, что популярность XSLT как-то уж совсем незаслуженно низкая. Ну ничего, вот стану большим, и напишу свой PHP-модуль для Saxon-а с блекджеком и for-each-group!
Но может быть ситуация, когда файл обязан быть, и его отсутствие означает невалидность каких-либо дальнейших действий. В таком случае пользователь пишет:
и получает гарантию, что «либо все, либо ничего».
checked_children не нужен, т.к. в случая отсутствия детей функция вернет пустой range, из-за которого foreach не сломается, а просто будет выполнено ноль итераций. checked_ функций не так много: это fs::checked_read, nodeset::checked_first и nodeset::checked_last. Кажется — все. Это просто редкие ситуации, когда одна и та же функция в разных ситуациях может вызываться с разными ожиданиями.
Что же касается самого имени пространства имен «www» — предполагается, что XSL- и XPath-расширения Easyweb реализуют всю необходимую сайтостроительную функциональность и должны покрыть 95% всех вебмастеропотребностей, поэтому мне кажется совершенно логичным выбрать имя, претендующее на дефолтность.
1. В PHP-конфиге сайта указывается константа website_root — все пути внутри сайта (за исключением пары особых ситуаций) считаются относительно этого пути: github.com/nyan-cat/easybook/blob/master/php/config.php
P.S. Хабротипограф — фи. Тире нужно отбивать неразрывным пробелом, а не обычным.
Easyweb — это XSLT-верстка на сервере, только на сервере, и нигде кроме сервера! А-а-а-а-а-а-а!
А как вы это определили?
А почему вы решили, что проблема в XSLT?
О боже, как вам пришло в голову заниматься версткой на клиенте?
Странно. Я вот наблюдаю ровно обратную картину по обоим пунктам.
Чем вам подписчики хабра на XSLT не коммьюнити? А парни из libxslt и libxml достаточно оперативно отвечают в мейл-листах, причем на самые каверзные вопросы.