Примеры программ

Построение системы управления содержимым.

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

Мы создадим приложение, помогающее уполномоченным пользователям управлять интеллектуальной собствен¬ностью организации в электронном виде.

Требования к проекту.

Необходимо создать систему, которая:

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

Преимущество баз данных перед файлами для хранения содержимого.

На начальном этапе необходимо принять важное решение относительно метода хранения содержимого после его загрузки в систему.

Поскольку совместно с текстом хранятся метаданные, мы решили поместить текстовую часть содержимого в базу данных. Хотя MySQL способен хранить мультимедийные данные, принято решение хранить загружаемые изображения в файловой системе. Использование большого двоичного объекта (BLOB) в базе данных MySQL может снизить быстродействие.

В базе данных будут храниться лишь имена файлов изображений. Дескриптор <IMG SRC> может прямо ссылаться на каталог графических файлов обычным образом.

Когда объем данных велик, важно оптимизировать их хранение. Подобно тому, как эффективность базы данных зависит от правильной индексации, файловая система существенно выигрывает от хорошо продуманной системы каталогов.

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

Структура документов.

В качестве примеров статей будет использоваться краткий текст новостей, включающий один-два абзаца и единственное изображение. Он предназначен для тех, кто спешит. Подобные документы с заголовком, абзацами и иллюстрацией можно считать структурированными. Чем выше степень структурирования документа, тем проще его разбить на составляющие, хранимые в базе данных. Преимущество такого подхода состоит в возможности единообразного структурированного представления документов.

В качестве примера возьмем статью новостей.

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

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

Использование метаданных.

Уже решено, что запись для каждой статьи содержит заголовок, текст и изображение. Однако ничто не мешает хранить в той же записи другие данные. Система автоматически вставляет значения, описывающие авторство статьи и вре¬мя ее последней модификации. Они могут автоматически отображаться в нижней части статьи и служить подписью и меткой времени, избавляя автора от необходимости добавления этой информации. Кроме того, иногда полезно добавлять неотображаемые данные, называемые метаданными. Хорошим примером служит хранение ключевых слов, которые будут использоваться в качестве индексов поискового механизма.

Поисковый механизм будет извлекать ключевое слово для каждой статьи и на его основе определять соответствие критериям поиска. Это устраняет необходимость сканирования всего текста каждой статьи. Администратор сайта сможет управлять соответствием ключевых слов и фраз определенным документам.

В нашем примере допускается связывать со статьей любое количество ключевых слов, а также присваивать каждому ключевому слову "весовое" значение, указывающее степень его значимости в диапазоне от 1 до 10.

Затем можно разработать алгоритм поискового механизма, который располагает со¬ответствия статьям согласно человеческой шкале значимости. Это заменит сложный алгоритм, который интерпретирует английский текст и принимает решения в зависимости от своего ограниченного понимания, а также управляется фиксированными правилами.

Метаданные должны храниться в базе данных.

Можно использовать HTML-дескриптор <МЕТА> либо даже применять XML для создания документов. Однако лучше при любой возможности воспользоваться преимуществами базы данных для управления документами.

Управление изображениями.

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

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

Напишем небольшой сценарий resize_image.php, который на лету изменяет размер изображений, в результате чего они могут отображаться с помощью дескриптор <IMG SRC>. Сценарий приводится в листинге 6.21.

Листинг 6.21. Сценарий resize_image.php изменяет размеры JPEG-изображения "на лету"

<?
if (!$max_width) $max_width = 150; 
if (!$max_height) $max_height = 100;
$size = GetImageSize($image); $width = $size[0]; $height=$size[l];
$x_ratio = $max_width / $width; $y_ratio = $max_height / $height;
if ( ($width <= $max_width) && ($height <= $max_height) ) 
{ $tn_width = $width; $tn_height = $height; }
else if (($x_ratio * $height) < $max_height) 
{ $tn_height = ceil($x_ratio * $height); $tn_width = $max_width; } 
else {$tn_width=ceil($y_ratio * $width); $tn_height=$max_height; }
$src = ImageCreateFromJpeg($image);
$dst = ImageCreate($tn_width,$tn_height);
ImageCopyResized($dst, $src, 0, 0, 0, 0, 
$tn_width,$tn_height,$width,$height); 
header("Content-type: image/jpeg"); ImageJpeg($dst, null, -1); 
ImageDestroy($src); ImageDestroy($dst); 
?>

Этот сценарий принимает три параметра — имя файла изображения, максимальную ширину и высоту в точках. Не стоит полагать, что если указан максимальный размер 200 х 200, изображение будет масштабировано в соответствии с этими значениями. Его масштаб будет уменьшен пропорционально таким образом, чтобы указанные максимальные размеры не превышались. Например, изображение размером 400 х 300 будет уменьшено до размера 200x150. Таким образом достигается сохранение пропорций изображения.

Изменение размера изображения на сервере предпочтительнее, чем простое задание атрибутов HEIGHT и WIDTH в дескрипторе <IMG SRC&gr;. Размер большого изображения с высоким разрешением может составлять несколько мегабайт. Если же картинку уменьшить до приемлемых размеров, ее размер может не превышать 100 Кб. Нет надобности загружать файл большого размера, а затем указывать браузеру изменить размер изображения.

Здесь используется функция ImageCopyResized() для масштабирования изображений на лету. Суть операции изменения размера состоит в вычислении новых параметров ширины и высоты. Определяется соотношение между реальными и максимальными размерами. Параметры $max_width и $max_height могут быть переданы в одной строке запроса. Иначе будут использованы стандартные значения, указанные в верхней части листинга.

$x_ratio = $max_width / $width; $y_ratio = $max_height / $height;

Если изображение уже меньше указанных максимальных размеров, его ширина и высота остаются неизменными. В противном случае будет использован коэффициент X или Y для равного масштабирования обоих размеров, чтобы изображение уменьшенного размера не оказалось растянутым либо сплющенным:

if ( ($width <= $max_width) && ($height <= $max_height) )
{ $tn_width = $width; $tn_height = $height; } 
else if (($x_ratio * $height) < $max_height) 
{$tn_height = ceil($x_ratio * $height); $tn_width = $max_width; }
else {$tn_width=ceil($y_ratio * $width); $tn_height=$max_height; }
Hosted by uCoz