Форум IP.Board

Улучшение ядра системы

В 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();Данный код породит следующий документ:


 
  
   Это не орандж-сода
   Печеньки
   103
  
  
   Куплен в трендовом магазине
   Тедди Бир
   104
  
 
А вот так вы этот документ можете разобрать:

$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 надежным и эффективным инструментом, каким он только может быть.

Back to top button