Invision Power Board 3
Содержание раздела
- Введение в разработку
- Каркас приложения на PHP 5
- Делая шаблоны проще
- Расширяя механизмы авторизации
- Дизайн
- Каркас для пользовательских приложений
- Ревизия системы BBCode
- Управление заблокированными пользователями
- Приоткрывая завесу над ipsRegistry
- Теги шаблонов, перезагрузка
- Управление языками в IP.Board 3
- Глобальный поиск в IP.Board 3
- Глобальные права доступа
- Делая интеграцию проще
- Система жалоб на сообщения
- Дополнения и хуки
- Система репутации
- Такой новый модуль вывода
- Обновление стиля
- Обзор механизма пометки прочитанности тем
- Улучшения системы обработки ошибок
- Наконец-то, дружественные URL'ы!
- Личные беседы
- Взаимосвязь с внешними приложениями
- Оптимизация для поисковых систем
- Улучшение ядра системы
- Упрощение администрирования
- IP.Blog, IP.Gallery и IP.Downloads
- Прочие возможности
Улучшение ядра системы
В IP.Board 2, мы создали "ядро" классов, которые IP.Board использует, но которые сами по себе не завязаны на использование IP.Board. Набор классов ядра включает в себя классы работы с базой данных, загрузки файлов, работы с почтой, обработки и чтения RSS, разбора XML и поддержки нашего собственного формата XMLArchive.
Например, вы можете использовать "classUpload.php" и "classImage.php" в ваших модификациях или расширениях для обработки загрузок файлов и генерации уменьшенных изображений через GD. И вам не нужно будет инициализировать реестр или делать что-то еще чтобы использовать данные классы, нужно просто подключить файл и начать использовать его.
Но, совершив прыжок и сделав PHP 5 необходимым требованием для работы системы, мы получили возможность реализовать несколько долгожданных улучшений. Перейдем к самым ярким моментам.
Пользовательские поля
Josh полностью переписал управление пользовательскими полями в IP.Board и данный класс связывает всю эту работу воедино. Josh воспользовался фактически всеми новшествами PHP 5, включая абстрактные классы, интерфейсы и ArrayAccess для предоставления простого и ясного интерфейса, который может быть использован почти в любом проекте, так как класс не ограничен использованием только для пользовательских полей IP.Board.
Диаграммы
Remco расширил класс, теперь в нем есть поддержка новых диаграмм, таких как "funnel", "bubble" и "radar" что позволит отображать данные более подходящим способом. Как разработчики IP.Board 3.0.0, мы найдем хорошее применение данному классу в отчетах админцентра.
GD и ImageMagick
Brandon переписал наш класс для обработки изображений с помощью GD. А также создал класс для работы с imagemagick, что позволит использовать данную библиотеку тем клиентам, у которых она установлена. Обратите внимание на сколько просто стало изменять размеры изображений и добавлять watermark'и на них.
$image = new classImageGd(); $image->init( array( 'image_path' => "/path/to/images/", 'image_file' => "image_filename.jpg" ) ); // Устанавливаем максимальную ширину и высоту $image->resizeImage( 600, 480 ); // Добавляем watermark $image->addWatermark( "/path/to/watermark/trans.png" ); $image->displayImage();
Создание и разбор XML
Во второй версии Invision Power Board у нас был класс разбирающий и создающий XML, но это был набор разрозненного PHP кода, реализующий примитивный обработчик XML и класс с ручным разбором для тех у кого XML обработчики отсутствовали. Надо признать что данный класс работал хорошо, но был очень требователен к памяти. К счастью, PHP 5 обладает намного лучшей родной поддержкой обработки XML, всю прелесть которой я почувствовал переписав данный класс.
В начале я обратил внимание на simpleXML, но он оказался действительно простым для наших нужд, так что я пошел дальше и воспользовался DOM методами. Это дало нам полный контроль над созданием и разбором XML документов.
Ну и конечно же код, на котором вы видете на сколько легко стало создавать XML документы:
$xml = new classXML( 'utf-8' ); $xml->newXMLDocument(); /* Создаем новый корневой элемент */ $xml->addElement( 'productlist', '', array( 'name' => 'myname', 'version' => '1.0' ) ); /* Добавляем потомка.... */ $xml->addElement( 'productgroup', 'productlist', array( 'name' => 'thisgroup' ) ); $xml->addElementAsRecord( 'productgroup', array( 'product', array( 'id' => '1.0' ) ), array( 'description' => array( 'Это не орандж-сода' ), 'title' => array( 'Печеньки' ), 'room' => array( '103', array( 'store' => 1 ) ) ) ); $xml->addElementAsRecord( 'productgroup', array( 'product', array( 'id' => '2.0' ) ), array( 'description' => array( 'Куплен в трендовом магазине' ), 'title' => array( 'Тедди Бир' ), 'room' => array( '104', array( 'store' => 2 ) ) ) ); $xmlData = $xml->fetchDocument();
Данный код породит следующий документ:
<productlist name="myname" version="1.0"> <productgroup name="thisgroup"> <product id="1.0"> <description>Это не орандж-сода</description> <title>Печеньки</title> <room store="1">103</room> </product> <product id="2.0"> <description>Куплен в трендовом магазине</description> <title>Тедди Бир</title> <room store="2">104</room> </product> </productgroup> </productlist>
А вот так вы этот документ можете разобрать:
$xml->loadXML( $xmlData ); /* Получаем необходимые данные из 'products'... */ foreach( $xml->fetchElements('product') as $products ) { print $xml->fetchItem( $products, 'title' ) . "\"; } /* Выводит: */ Печеньки Тедди Бир
Я уверен вы оценили насколько легко использовать новые XML возможности!
XMLArchive
Я создал XMLArchive формат для IP.Board, как способ объединять несколько файлов в один без использования tar или zip, использование которых может быть проблематично на некоторых серверах. XMLArchive это простой файл с данными в обычном XML формате. Я переписал данный класс для более легкого использования и конечно же добавил новых возможностей.
Ниже пример того как прочитать архив:
$archive = new classXMLArchive(); $archive->read( "/path/to/archive.xml" ); print $archive['someDir/file.html'];
Как вы уже могли заметить, мы воспользовались итератором ArrayAccess для более прозрачного доступа к содержимому архива.
А вот пример создания архива:
$archive = new classXMLArchive(); $archive->add( "someDir" ); $archive->add( "anotherDir/anotherFile.html" ); $archive->add( "Создаем новый файл налету!", "anotherDir/brandNewFile.html" ); # Сохраняем gzipped $archive->saveGZIP( "/path/to/archive.xml.gzip" ); # Сохраняем без сжатия $archive->save( "/path/to/archive.xml" ); # Просто возвращаем данные $archive->getArchiveContents();
В угоду простоте теперь есть только один интерфейс добавления файлов: "add()". Чем меньше имен функций надо помнить тем лучше!
Естественно, данная запись не охватывает всех тех изменений и улучшений, которые были внесены в ядро системы, но вы должны почувствовать сколько энергии и сил мы затрачиваем, чтобы сделать IP.Board надежным и эффективным инструментом, каким он только может быть.
← Предыдущая · Следующая →