Алгоритм построения линеек предельно прост. Для этого нам понадобятся модули GD/imagemagic, rewrite и стандартный набор работы со строками, страницами, базой данных. Для начала, давайте определимся, хотим ли мы генерировать линейки с использованием базы данных, будут ли они изменять свой размер, будут ли загружаться изображения. Для простоты эксперимента давайте возьмем линейки без базы данных, без различных изображений. У нас есть изображения begunok.png, fon.jpg, длина линейки 365 дней, поступает запрос вида http://site.ru/lines/1234.jpg, где 1234 - количество дней, прошедших со дня 1 января 1970 года (не потому что это именины Григория и Тимофея
, а потому что ОС Unix считает время именно в днях(или секундах) после этой даты). Перенаправляем данный запрос с помощью mod_rewrite на php обработчик (а почему бы сразу нельзя было сделать http://site.ru/getline.php?date=1234 ? А потому что многие форумы не берут динамическое содержимое в подписи)
В .htaccess:
RewriteEngine on
RewriteCond %{REQUEST_URI} ^\/lines\/
RewriteRule ^(.*)$ getline.php?date=%{REQUEST_URI} [L]
В скрипте:
$d=intval($_GET["date"]);
Считаем разницу между сегодняшним днем и тем, который мы выбрали. Затем берем остаток от деления этого числа на 365, поделим его на 365 и умножим на длину линейки, чтобы выяснить, где должен находиться бегунок (расчеты весьма грубые, не учитывают ширину бегунка, различных длин линейки и так далее, но нас ведь интересует принцип, правда?).
$x=($d%365)/365*$TotalSY;
Итак, мы получили координату x, где должен находиться бегунок. Все исходные данные у нас есть. Приступим к формированию и выводу изображения. Для начала, перешлём mime-тип содержимого, выберем JPEG, так как он занимает меньше места и как нельзя лучше подходит нам для кодирования линеек.
Header("Content-type: image/jpeg");
Создадим изображение, которое будет нашей линейкой.
$i=imagecreatetruecolor($SX,$TotalSY);
imagefilledrectangle($i,0,0,$SX,$TotalSY,$white);
Скопируем на него фон.
function ImageFromFile($str)
{
if(!file_exists($str))
return 0;
$arr=explode(".",$str);
$check=strtolower($arr[Count($arr)-1]);
$check=strtolower($arr[Count($arr)-1]);
if($check=="png")
return ImageCreateFromPng($str);
if($check=="jpg"||$check=="jpeg")
return ImageCreateFromJpeg($str);
if($check=="gif")
return ImageCreateFromGif($str);
}
$f = ImageFromFile("fon.jpg");
imagecopyresampled($i,$f,0,0,0,0,$SX,$SY,imagesx($f),imagesy($f));
Скопируем на него бегунок в то место, которое мы нашли до этого.
$b = ImageFromFile("begunok.png");
imagecopyresampled($i,$b,$x,0,0,0,$bsx,$bsy,imagesx($b),imagesy($b));
Вставим текст - сколько дней прошло с той даты (не будем делить дни на месяцы и годы - алгоритм и даже готовые скрипты можно найти в сети или придумать самому, в том числе поручить это дело отчасти PHP или MySQL).
imagettftext($i,8,0,2,$SYC,$textcolor,"arial.ttf",$Text);
Выведем данное изображение клиенту.
$Quality=85;
ImageJpeg($i,"",$Quality);
Вот и все. Чтобы научить эту систему обрабатывать разные изображения, размеры необходимо добавить в строку запроса соответствующий контент, например, http://site.ru/lines/1234_begunok.png_fon.jpg_300x50_dnei|proshlo.jpg . Используем функцию explode для разделения переменных.
Так же, не стоит забывать, что чем больше параметров, тем больше длина строки, тем сложнее становится алгоритм, тем ближе мы подбираемся к ограничению в 255 символов, которые можно использовать в GET-запросе, поэтому можно использовать БД для хранения всех этих данных. Чтобы научить эту систему загружать фотки используйте любой upload скрипт, но ни в коем случае не забывайте про безопасность на нескольких уровнях, так как загруженный и запущенный php скрипт может уничтожить весь ваш сайт. Так же, не стоит пренебрегать производительностью, поэтому можно ввести кэширование, оптимизацию запросов при использовании БД. В остальном - все по-прежнему. Вот упрощенно так выглядит скрипт формирования линеек.
Также, вы можете не заморачиваться и заказать линейки для вашего сайта у нас, оставив свои координаты здесь.
Читайте также:
