Скрипт сервиса линеек для форума.

Статус
В этой теме нельзя размещать новые ответы.
Вот еще статейку нашел.Может тоже будет полезна кому то.

Делаем эксклюзивную линейку в подписи
Предисловие

Итак, в последнее время в интернете, особенно на форумах, получили распространение так называемые "линейки" — динамические картинки, изменяющиеся в зависимости от текущего времени и показывающие, скажем, количество лет, месяцев и дней от какой-либо даты... В основном это: "Я на форуме уже ....", "Живу в стране уже ...", "Женат уже ..." и т. д. Поставить себе такую линейку в подпись может каждый — благо, таких сервисов развелось немало. Посмотреть, что они нам предлагают, можно, например, здесь.

НО! Хочется эксклюзива... =) Даже беглого взгляда на сайт хватит, чтобы понять, насколько местные линейки жлобские. А если учесть, что каждую из них уже юзает огромное количество людей, становится и вовсе стрёмно... Впрочем, за бесплатно вам ничего лучше не предложат. Поэтому единственный выход — действовать самому. Собственно, этому и посвящено следующее руководство.

Что нам надо?

Ко всему нужно подходить с пониманием, к творческой работе — тем более =) Перечислим то, что стоит приготовить, прежде чем приступать к работе.

Графический редактор. В зависимости от сложности поставленной перед вами задачи, это может быть как MS Paint, так и Adobe Photoshop. Я все же склоняюсь к последнему... Текстовый редактор. Подойдет и "Блокнот", но при наличии навороченного кода ГОРАЗДО удобней писать и редактировать его в специализированных программах. Один из самых удобных продуктов для этой цели — прога ListEdit. Хостинг. Картинку надо будет где-то поместить, поэтому позаботьтесь о наличии хоста с поддержкой PHP. Подойдет, например, hut.ru. Знания, умения и креативность. Основной пункт! Мы будем использовать язык PHP, следовательно, если вы никогда не писали сценариев на PHP, ознакомьтесь хотя бы с его синтаксисом — это может весьма облегчить вашу работу. Если же вы обладаете достаточным знанием языка, просто откройте какой-нибудь справочник по его функциям или же используйте официальный сайт php.net. Умению рисовать, хорошему вкусу, а также элементарной сообразительности, к сожалению, научиться тяжелее, поэтому придется довольствоваться тем, чем "наградил" Бог =)

Подготовились? Читайте дальше.

Поехали!

Начнем с того, что определимся с идеей. Зачастую, оригинальный задум компенсирует не самое лучшее исполнение. Я, в свою очередь, не буду сверхоригинальным и буду описывать процесс на примере весьма заезженной темы "Я <там-то> уже <столько-то>", но с Веб-Хаковсксим дизайном =)

Далее заготовим картинку, которая будет служить нам фоном. Размер — не более 400х80 пикселей. Назовем ее "bg.jpg". Оформление картинки — на ваше усмотрение. В моем примере (для простоты) это всего лишь кусок логотипа web-hack'a с главной страницы: фон . Как вы уже догадались, наша надпись разместится внизу картинки =)

Теперь выберем шрифт, которым мы будем "писать". Где взять шрифты — не мне вам рассказывать =) Прощего всего заглянуть в папку "WINDOWS\Fonts" (если вы под Виндой) и скопировать оттуда в папку с картинкой нужный ttf-файл. Не хотите стандартных шрифтов? Гугл к вашим услугам!

Создайте теперь файл index.php (потом поймете, почему именно "индекс") и откройте его в вашем любимом текстовом редакторе. Отсюда и начинается основная работа...

Работа с датами и временем.

В любом учебнике по PHP есть раздел с таким названием. Просмотрите его еще раз, так как мы будем активно использовать функции по работе с датами.

Наша основная цель — правильно сформировать строку, выводимую на картинку. Допустим, мы хотим написать "Тусуюсь на Веб-Хаке уже X лет Y дней". Мы должны позаботиться не только о правильном подсчете количества дней, прошедших со дня регистрации, но и о правильном отображении слов: "год/года/лет", "день/дня/дней". Согласитесь, надпись "5 года и 103 дней" выглядит некрасиво... Начнем с первого, а дальше — дело техники ;-)

Вот две основные функции, необходимые нам для построения правильной даты:

string date(string $format [, int $timestamp])
int strtotime(string $time [, int $timestamp])

За подробным их описанием обратитесь в мануал =)

Идея такая: в переменную $days пишем количество выводимых дней, в $years — лет, а в $out — уже полностью сформированную строку, готовую для вывода на экран. Алгоритмов получения этих значений — множество. Главное, чтобы считало правильно, а о простоте кода пока не беспокойтесь =)

Полагаясь на вышенаписанное, может иметь место следующий код, написанный мной "на коленке":

PHP:
$stamp=strtotime("30 September 2004"); //$timestamp даты, от который ведем отсчет (большое целое число)
$start_day=date("z",$stamp);  //Номер "стартового" дня в году начиная с 01.01 (1-365)
$start_year=date("Y",$stamp);  //"Стартовый" год

$now_year=date("Y");   //Текущий год
$now_day=date("z");   //Номер текущего дня в году

$years=$now_year-$start_year;  //Количество неполных лет, прошедших с точки отсчета
if($now_day<$start_day)   //Если годовщины в этом году еще не было, ...
{
if($years>0) $years--;  //...отнимаем один год
$days=365-$start_day+$now_day; //А тут попробуйте догадаться сами =)
}
else $days=$now_day-$start_day;  //В противном случае считаем разность между текущим и "стартовым" днями
Как видите, все просто... "Цифры" у нас уже есть в соответствующих переменных, поэтому перейдем к корректному выводу их на экран.

Грамматика — наше всё =)

Заведем еще две строковые переменные:
$y — может принимать значения {"год", "года", "лет"}
$d — может принимать значения {"день", "дня", "дней"}

Пораскинув мозгами, мы понимаем, что $y должно принять значение: "год" — только тогда, когда в переменной $years записано любое (кроме 11) число, заканчивающееся на "1": "1 год", "31 год", "991 год" и т. д. "года" — только тогда, когда в переменной $years записано любое (кроме 12, 13, 14) число, заканчивающееся на "2", "3", "4": "2 года", "3 года", "104 года" и т. д.
"лет" — в остальных случаях...

Абсолютно так же обстоят дела с падежами слова "день". Алгоритм можете придумать сами, я использовал следующий:

PHP:
//годы
$buf1=$years%10; $buf2=$years%100;
if($buf1==2 || $buf1==3 || $buf1==4 && $buf2!=12 && $buf2!=13 && $buf2!=14) $y="года";
elseif($buf1==1 && $buf2!=11) $y="год";
else $y="лет";

//дни
$buf1=$days%10; $buf2=$days%100;
if($buf1==2 || $buf1==3 || $buf1==4 && $buf2!=12 && $buf2!=13 && $buf2!=14) $d="дня";
elseif($buf1==1 && $buf2!=11) $d="день";
else $d="дней";
Не буду объяснять каждую строку — он не настолько сложен, чтобы не понять его...

Итак, мы имеем ВСЁ для того, чтобы сформировать корректную выходную строку
PHP:
$out!
$out="Тусуюсь на Веб-Хаке уже ";
if($years) $out.=$years." ".$y." ";
$out.=$days." ".$d;
Осталось вывести это на картинку нужным шрифтом, нужного цвета и размера! Но есть еще одна проблема...

Отображение кириллицы

Чтобы вывести русский текст таким, какой он есть, надо перекодировать его в Unicode-представление. Для этого, не мудрствуя лукаво, заюзаем функцию toUnicodeEntities($string cyr), написанную кем-то (не мной:(

PHP:
function toUnicodeEntities($text, $from="w")
{
$text = convert_cyr_string($text, $from, "i");
$uni = "";
for ($i=0, $len=strlen($text); $i<$len; $i++)
{
 $char = $text{$i};
 $code = ord($char);
 $uni .= ($code>175)? "&#" . (1040+($code-176)) . ";" : $char;
}
return $uni;
}
Теперь вместо написать($что-то) мы будем использовать написать(toUnicodeEntities($что-то)) и будем уверены, что текст отобразится правильно =) Впрочем, если текст набран только цифрами и латинскими буквами — конвертировать ничего не нужно...

Работа с изображениями.

Теперь мы точно на финишной прямой — осталось только сделать штамп печатью с заготовленным текстом в нужном месте =) Поскольку мы используем шрифты True Type, должны существовать специальные функции для работы с ними. Нам пригодится только одна из них:

PHP:
list imageTtfText(int $im, int $size, int $angle, int $x, int $y, int $col, string $fontfile, string $text)

Мда, 8 параметров... Ну ничего, переживем. Вот что означает каждый из них:
$im — наш рисунок.
$size — размер шрифта.
$angle — угол наклона шрифта (рекомендую юзать 0).
($x, $y) — координаты левого нижнего угла прямоугольника, в который вписывается текст.
$col — цвет текста.
$fontfile — ПОЛНЫЙ путь к ttf-файлу со шрифтом.
$text — собственно, текст.

Ну что ж... Последние штрихи:

PHP:
$im=imageCreateFromJpeg("bg.jpg");
$col=imageColorAllocate($im, 0, 160, 0);
imageTtfText($im, 6, 0, 70, 52, $col, realpath("your_font.ttf"), toUnicodeEntities($out));
Header("Content-type: image/gif");
imageGif($im);
Мы открыли наш фон, написали на нем строку $out зеленым цветом и вывели получившуюся картику на экран, сжав ее в *.gif.

Размещение файлов на удаленном хосте.

Готово! Заливаем это дело на сервер... Создайте папку с названием "ruler.gif" (теперь понятно, почему файл скрипта должен был называться index.php?) и в нее загрузите файлы "bg.jpg", "index.php" и "font.ttf" (font — название КОНКРЕТНОГО шрифта: Arial, Tahoma etc.)

Теперь, написав у себя в подписи [img_]http://your_host/ruler.gif[/img_] вы увидите вашу картинку! Поэкспериментируйте со шрифтами, размерами, цветами — добейтесь наилучшего вида =) Ну и конечно же, никто не запрещает вам редактировать мой скрипт под свои условия, поскольку это только шаблон ;-)

В завершение... br>
Прошу заметить, что я выбрал простейший "Arial Black" — выбрав шрифт попонтовей, вы обеспечите более симпатичную картинку. Ну а если оригинально отфотошопить наш бэкграунд, результат окажется и вовсе на порядок интересней. Также вы можете переделать ЭТО под линейку в чистом виде: с указателем, бегающим по символическому отрезку с делениями, отвечающими за годы, месяцы или дни... Как это сделать? Юзайте другие функции по работе с графикой в PHP (см. мануал) и, что самое главное, ВАШУ ФАНТАЗИЮ! ;-)

Автор: nerezus
 
Спасибо, может пригодится ;) Кстати, я полностью настроила скрипт, теперь у мну есть и обратный отсчет. :p
 
Вот наваял на html себе страницу бегунков и линеек.Все уместилось на одной странице 119 линеек и 287 бегунков.Но хотелось бы постранично их разбить.Понравился бетта тест скрипта линеек от Dali.Здорово сделано,именно то что мне и надо.Ниже увидите картинку что наваял.:)

9f9f937956ff.jpg


Ниже привожу еще один скрин.Думаю такой вид будет посимпатичней.

2d8efb74aa2d.jpg


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

У меня не то чтобы готовый скрипт, но там отсчет и сколько до события времени осталось и сколько после, внешний вид не до конца настроен, но это уже мне сделать нетрудно.
Ну так не совсем же на халяву,была же маза сброситься,и вижу что то заглохло.Или же написали уже и замолчали.Просто лично мне не надо было,а тут коснулось,а знание php 0%.Не такой уж это крутой скрипт чтоб его прижимать,прально за удовольствие надо платить.Так не проще сброситься и получить готовый скрипт.Мороки меньше.
 
я сам просто для своего сына создал такую линейку
Хотелось бы увидеть ваш скрипт и посмотреть что там к чему...
 
поделитесь скриптом с большим хайдом, я почти закончил скрипт, но есть некторые заморочки, хотелось бы руководствоваться неким примером :nezn:
 
Приветствую. Интересует вот какой вопрос: на сколько сильно подобные скрипты грузят сервер. Т.е. требования к железу и трафику? Предполагаемое количество линеек - 10-20К
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху