LINUX.ORG.RU

PHP 5.3.6

 , ,


0

1

17 марта вышел PHP 5.3.6.

В данном релизе устранено 5 уязвимостей:

  • Выход за допустимые границы памяти при обработке изображений со специально оформленным тегом в блоке EXIF-параметров.
  • Ошибка форматирования строки (format-string) в расширении Phar.
  • Целочисленное переполнение в функции shmop_read.
  • Переполнение буфера при указании большого значения в параметре «precision».
  • Нарушение границ памяти при использовании ZipArchive с опцией FL_UNCHANGED при обработке пустого ZIP-архива.

Кроме того, усилена безопасность в коде обработки протокола fastcgi в fpm SAPI.

Другие изменения:

  • Обновлены версии библиотек SQLite3 (3.7.4) и PCRE (8.11).
  • Добавлена возможность соединяться с сайтами по HTTPS через прокси-сервер, поддерживающий basic-метод аутентификации, используя stream_context/http/header/Proxy-Authorization.
  • Изменено значение serialize_precision по умолчанию с 100 на 17.
  • Устранена регрессия при обработке обратных слешей в open_basedir.

Также отмечается, что ветка 5.2 больше не поддерживается.

Полный список изменений

>>> Подробности

★★★★

Проверено: maxcom ()
Последнее исправление: Dendy (всего исправлений: 1)
Ответ на: комментарий от kid_lester

>Только в php так обычно не пишут, потому что тут или дудочка, или кувшинчик, и поэтому выбирают тот способ, который позволяет быстро сделать хелловорлд.

У вас проблемы с ЧСВ. Я сейчас занимаюсь проектом, где работодатель готов платить мне дополнительные неплохие деньги за отточенную проектировку, документирование кода и как можно более качественный и поддерживаемый код.

Он же (работодатель) выставил требование, что писать нужно на PHP. Почему на PHP? Потому что найти PHP разработчика толкового в нашем городе легче, чем толкового Python программиста. Стандартное бла-бла-бла в общем.

Не правда ваша.

А, учитывая, что многие из них есть почти во всех дистрибутивах (django есть даже в slitaz), то использовать фреймворк это вопрос одного апт-гета и одной строки.

Вы когда работали с Django встречались с проблемой деревянности фреймворка? Если не встречали, то значит и не работали с Django (кастую в тред dizza и tia). Почему вы так слепо любите его?

anonymous
()
Ответ на: комментарий от kid_lester

> 2user_id: Кодировка - UTF-8, а что не так, кроме того, что я торопился и поэтому head не закрыл? Iceweasel парсит.

да там всё нормально...

просто вот эти два символа «ÑŠ» (Western ISO-8859-1) хотел понять в какой кодировке надо смотреть :-)

а кодировку щаз конешно модно прописывать как:

<!DOCTYPE html><html><head><meta charset="utf-8" />...

...ну один фиг — вы правельно заметили мне что не закрыт </head> .. Хромиум не парсит :-( :-(

user_id_68054 ★★★★★
()
Ответ на: комментарий от user_id_68054

> ...ну один фиг — вы правельно заметили мне что не закрыт </head> .. Хромиум не парсит :-( :-(

а может быть просто проблема с тэгом <bogy> (не путать с <body> :-))

выходит что Хромиум весь документ воспринимает как
<html>
...все..тэги...
</html>

хм... но title в этом случае он показал правильно, а вот <meta /> уже видимо не смог :-)

user_id_68054 ★★★★★
()
Ответ на: комментарий от anonymous

> Вы когда работали с Django встречались с проблемой деревянности фреймворка? Если не встречали, то значит и не работали с Django (кастую в тред dizza и tia). Почему вы так слепо любите его?

Я не люблю Django. Я люблю bottle.py, за простоту и лаконичность. Django любят те, кто любят системы типа Drupal. Я не люблю код, я не люблю возиться с кодом, ни с герерированным, ни с самописным, я люблю, когда кода меньше, а реализации своей идеи - больше.

У вас проблемы с ЧСВ. Я сейчас занимаюсь проектом, где работодатель готов платить мне дополнительные неплохие деньги за отточенную проектировку, документирование кода и как можно более качественный и поддерживаемый код.


Это не является никаким выбором, вообще, как класс. Если бы работодатель заплатил бы вам в 50 раз больше, чтобы вы написали это на ассемблере для z80, вы бы написали. А я никогда не буду связываться ни с чем, где не играют в мои игрушки, и являясь хозяином положения, буду выбирать из несколько других критериев, чем «кто-то мне велел».

А с ваших слов получается, что вы защищаете php только потому, что вам велят на нём разрабатывать, а не потому, что php является лучшим языком для web-разработки.

Он же (работодатель) выставил требование, что писать нужно на PHP. Почему на PHP? Потому что найти PHP разработчика толкового в нашем городе легче, чем толкового Python программиста. Стандартное бла-бла-бла в общем.


«Перестраховщики, я басню вам прочёл не для того, чтоб вы надеялись на пчёл».

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

Не правда ваша.


Эти фреймворки появились как «аналог рельсов для php» или «аналог имярек для php», то есть они вторичны, они противоречат самой природе php, и опять же - так не пишут, можно брать наугад любой php код и с высокой вероятностью не встретить там ничего подобного.

kid_lester
()
Ответ на: комментарий от user_id_68054

> просто вот эти два символа «ÑŠ» (Western ISO-8859-1) хотел понять в какой кодировке надо смотреть :-)

А, ты вот про что.

Вообще, нужно давно уже сменить lighttpd на nginx и прописать там «UTF-8 всем». Но лень, то php новый выйдет, то Столлман воззвание напишет, за всем этим и не успеешь. :-)

bogy

Хороший тэг, внушительный. пойду исправлю на boby.

Ну всё, вроде вся оптимизация сайта длиной 4 символа - проведена.

kid_lester
()
Ответ на: комментарий от kid_lester

> Ну всё, вроде вся оптимизация сайта длиной 4 символа - проведена.

БЛИИИИИИН! я тормаз.. сразу не заметил! :-)

вот в чём дело было (почему Хромиум не мог отпарсить правильно!)

<meta http-equiv='content-type' content='text/html; charset='utf-8' />

-- лишняя ковычка <'> перед utf-8

user_id_68054 ★★★★★
()
Ответ на: комментарий от user_id_68054

> — лишняя ковычка <'> перед utf-8

илиже лишняя всё эта часть (цитирую):

http-equiv='content-type' content='text/html; 

user_id_68054 ★★★★★
()
Ответ на: комментарий от user_id_68054

> БЛИИИИИИН! я тормаз.. сразу не заметил! :-)

Нет, всё таки я. Что ж я написал-то?

kid_lester
()
Ответ на: комментарий от kid_lester

> Эти фреймворки появились как «аналог рельсов для php» или «аналог имярек для php», то есть они вторичны, они противоречат самой природе php, и опять же - так не пишут, можно брать наугад любой php код и с высокой вероятностью не встретить там ничего подобного.

сразу видно, что ты не в теме. Эти фрейморки заставляют программиста придежриваться модульности и ООП, и ничего более + тулкиты. И ничему это не противоречит, тем более какой-то абстрактной «природе PHP»... кстати что это такое?

anonymous
()
Ответ на: комментарий от anonymous

> сразу видно, что ты не в теме. Эти фрейморки заставляют программиста придежриваться модульности и ООП, и ничего более + тулкиты. И ничему это не противоречит, тем более какой-то абстрактной «природе PHP»... кстати что это такое?

Я и говорю, что я вижу, находясь снаружи темы. А природа php — это естественная среда жизни и развития sql-инъекций и прочих популярных уязвимостей. И если фреймворк не даёт sql-уязвимость сотворить, то кто же им пользоваться-то будет :-)

Вот и выходит, что на php или пишут так, как пишут (большинство), или пытаются изобрести вторые рельсы, или второй python. Только вот непонятно, зачем, и рельсы и python уже существуют.

kid_lester
()
Ответ на: комментарий от kid_lester

А с ваших слов получается, что вы защищаете php только потому, что вам велят на нём разрабатывать, а не потому, что php является лучшим языком для web-разработки.

Я не защищаю ничего. Ни PHP, ни Python, ни GNU/Linux, ни Windows. Я просто делаю дело. И я знаком как с PHP, так и с Python. Я просто хочу сказать, что PHP не так ущербен, как думают многие неосведомленные люди (уточню, вы к ним не относитесь, потому что вы уже нашли фреймворк для себя).

Это не является никаким выбором, вообще, как класс. Если бы работодатель заплатил бы вам в 50 раз больше, чтобы вы написали это на ассемблере для z80, вы бы написали. А я никогда не буду связываться ни с чем, где не играют в мои игрушки, и являясь хозяином положения, буду выбирать из несколько других критериев, чем «кто-то мне велел».

Все верно говорите. И я бы сейчас не взялся писать веб-приложение, ну, например на Haskell on a Horse или на Lift, т.к. это не моя специализация (моя, как уже написал выше — это PHP/Python). Это было бы тупо по меньшей мере.

«Перестраховщики, я басню вам прочёл не для того, чтоб вы надеялись на пчёл».

Мое дело сделать работу по обозначенному ТЗ в оговоренные сроки и получить бабки, а не заморачиваться на религии и ориентации заказчика. Я знаю PHP, ему нужен проект на PHP. What's the problem, dude?

и опять же - так не пишут, можно брать наугад любой php код и с высокой вероятностью не встретить там ничего подобного.

И опять же, это проблема этих конкретных проектов. ССЗБ, что не уделили времени на изучение паттернов, на проектирование и обдумывание и прочее. Я лично тоже никогда не берусь за доделку чужих проектов на PHP, потому что оно мне не надо.

anonymous
()
Ответ на: комментарий от kid_lester

>Я и говорю, что я вижу, находясь снаружи темы. А природа php — это естественная среда жизни и развития sql-инъекций и прочих популярных уязвимостей.

Взять и использовать нормальный слой абстракции БД для удобства и безопасности мешает или религия, или, что гораздо чаще, общая тупость разработчика. Doctrine, Propel, PDO уже как сто лет стали стандартном де-факто в мире PHP.

И если фреймворк не даёт sql-уязвимость сотворить, то кто же им пользоваться-то будет :-)

Сарказм ваш теперь понял. :)

Только вот непонятно, зачем, и рельсы и python уже существуют.

Вам чем-то мешают эти люди? :-)

anonymous
()
Ответ на: комментарий от anonymous

тем более какой-то абстрактной «природе PHP»... кстати что это такое?

Попытаюсь пояснить что это. Это сферическая возможность в вакууме вставить «пыхпых код в ХТМЛьчик, ололо». Только эпичность фразы этой чем-то напоминает 12 309, под который уже подписывают совершенно любые тормоза системы.

anonymous
()
Ответ на: комментарий от anonymous

> Мое дело сделать работу по обозначенному ТЗ в оговоренные сроки и получить бабки, а не заморачиваться на религии и ориентации заказчика. Я знаю PHP, ему нужен проект на PHP. What's the problem, dude?

Мне кажется, что в ад дорога выстлана не благими намерениями, а приложениями, в которых обе стороны всё устраивает.

Всё устраивает вас потому, что вы друг другу не договариваете кое-что. Хозяин-барин не договаривает, что во всём этом ровным счётом ничего не понимает, и выбор php происходил не по совокупности качеств, а путём первичного (и даже не вдумчивого анализа) вакансий, где стоит только безликое слово «программист (программист php, программист python)».

А исполнитель не договаривает то, что по перечисленным, в том числе по ссылке на php.html, причинам, это не то решение, которое следовало бы выбрать заказчику, потому что «хорошо сейчас» и «проблемы потом» — это хуже чем «сделать один раз хорошо и качественно, но зато действительно один раз». Ему-то главное, чтобы быстро в оговоренные сроки срубить бабки и свалить.

А что потом заказчик благодаря этому модулю потеряет деньги, вылетит из бизнеса, и потом найдёт исполнителя физически надругается — так об этом он пока думать не хочет. :-)

kid_lester
()
Ответ на: комментарий от kid_lester

Мне кажется, что в ад дорога выстлана не благими намерениями, а приложениями, в которых обе стороны всё устраивает.

Флаг вам в руки менять миропонимание заказчиков. Можете еще весь мир агитировать свалить с семерочки на Убунту или, что еще лучше, на Генту. :-)

PS: Ветрянные мельницы и прочее.

anonymous
()
Ответ на: комментарий от anonymous

>Все верно говорите. И я бы сейчас не взялся писать веб-приложение, ну, например на Haskell on a Horse или на Lift, т.к. это не моя специализация (моя, как уже написал выше — это PHP/Python). Это было бы тупо по меньшей мере.

Тоже самое, если бы врач сказал «я специализируюсь на указательном пальце на левой руке, а вот на правой - нет, не моя специализация», вы - говно, а не программист. Повторя: ВЫ - ГОВНО, А НЕ ПРОГРАММИСТ.

anonymous
()
Ответ на: комментарий от anonymous

Тоже самое, если бы врач сказал «я специализируюсь на указательном пальце на левой руке, а вот на правой - нет, не моя специализация», вы - говно, а не программист. Повторя: ВЫ - ГОВНО, А НЕ ПРОГРАММИСТ.

Не льстите себе, вы сказали тупость и не задели меня. Я лучше буду писать PHP/Python-приложения на более менее нормальном уровне, чем говнокодить на том, чего не знаю.

anonymous
()
Ответ на: комментарий от anonymous

> Флаг вам в руки менять миропонимание заказчиков. Можете еще весь мир агитировать свалить с семерочки на Убунту или, что еще лучше, на Генту. :-)

Это не имеет никакого значения. Если нужно «продать код», то продать его можно на любом языке. Если захочется сделать красиво на любом языке, то это реально.

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

kid_lester
()
Ответ на: комментарий от kid_lester

>Если захочется сделать красиво

Вопрос только в том, на каком языке это легко, просто и естественно


Без AOP/MP эти ваши питоны хаскели пыхи и плюсики можно смело объявлять УГ. ибо не DRY, так что лисп/немерл - чье-то все с Вашей т.з.

Мой идеал ЯП, с Вашей же т.з., это HQ9+, например ;)

yaws
()
Ответ на: комментарий от anonymous

> @route('/:page')

def page(page): return template('page', page=page)


Ехал page через реку
Видит page — в реке page
Сунул page page в page
Page page page page!

anonymous
()
Ответ на: комментарий от kid_lester

> Вопрос только в том, на каком языке это легко, просто и естественно

Дебаты плавно дошли до того уровня, когда уже нет смысла сотрясать воздух, ибо оба противника сидят в танках, и всё равно ничего не чувствуют, а зрители при этом скучают ;) Не проще ли вам набросать «эталонное» приложение каждому на своём «эталонном» ЯП? И кинуть код на суд общественности... Гораздо продуктивнее будет, однако. А то заснуть с вами можно! Из пустого в порожнее.

annonymous ★★
()
Ответ на: комментарий от anonymous

> Это все-таки программирование, а не лепка пельменей — тут есть некоторый порог вхождения, в любом ЯП.

Так называемый «порог вхождения» — миф, придуманный низкоквалифицированными monkey-кодерами для оправдания перед начальством. Низкоквалифицированный monkey-кодер, действительно, не сможет за разумное время въехать в принципиально новую технологию, в силу убогости содержимого черепной коробки. Тут-то ему и приходит на помощь миф, позволяющий выиграть время, чтобы кое-как с горем пополам въехать в новое.

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

Всё дело тут только в опыте, мозгах и активной интеллектуальной позиции.

anonymous
()
Ответ на: комментарий от anonymous

Ещё про образование забыл. Причём фундаментальное, желательно — математическое. Такое, чтобы после 5 лет человек умел ДУМАТЬ, анализировать и синтезировать.

А после двух с половиной курсов заборостроительного техникума, понятное дело, будет «порог вхождения». Причём не только в ЯП, но и в абсолютно любую жизненную нетривиальщину.

anonymous
()
Ответ на: комментарий от anonymous

> Молодец, а теперь иди покорми единорога и помой радугу.

Если для тебя мыслящие люди с фундаментальным образованием суть такие же мифические герои, как и единороги, то мне тебя искренне жаль.

anonymous
()
Ответ на: комментарий от annonymous

Не проще ли вам набросать «эталонное» приложение каждому на своём «эталонном» ЯП? И кинуть код на суд общественности...

Поддерживаю! Вот вполне тривиальная, но на мой взгляд неплохо характеризующая ЯП, задача:

Составить «облако тегов».

Входные данные:

  • ассоциативный массив, где индекс - имя тега, а значение - количество уникальных записей для тега;
  • пределы размеров шрифта (по умолчению от 50% до 150%);
  • предел количества тегов (по умолчанию 30)

Выходные данные ссылки на теги с различным font-size - нечто вроде

<div>
   <a href="#" style="font-size: %РАЗМЕР%">%ИМЯ_ТЕГА%</a>
   ...
   <a href="#" style="font-size: %РАЗМЕР%">%ИМЯ_ТЕГА%</a>
</div>

anonymous
()
Ответ на: комментарий от anonymous

> Вот вполне тривиальная, но на мой взгляд неплохо характеризующая ЯП, задача

Как платить удобнее?

anonymous
()
Ответ на: комментарий от annonymous

> Дебаты плавно дошли до того уровня, когда уже нет смысла сотрясать воздух, ибо оба противника сидят в танках, и всё равно ничего не чувствуют, а зрители при этом скучают ;)

Два умных человека всегда поймут друг друга.

А если вам захотелось посмотреть на клоунов — почему бы вам не сходить в цирк? :-)

Не проще ли вам набросать «эталонное» приложение каждому на своём «эталонном» ЯП?

Зачем? Кого и чему это научит? Армию PHP разработчиков делать что-нибудь правильно это всё равно не научит.

kid_lester
()
Ответ на: комментарий от anonymous

> А Вы случаем не на жабе пишите?

Я пишу на том языке(-ах), который(-ые) подходит(-ят) под конкретную задачу. Их в моём арсенале десятки, и я не собираюсь их здесь перечислять.

И давайте не будем увиливать от вопроса: как платить удобнее? Какова сумма вознаграждения? Или это так, праздный интерес и ничего серьёзного? Тогда так и скажите. Время профессионалов не бесплатно.

anonymous
()
Ответ на: комментарий от anonymous

Побойтесь Бога, мил человек. Какие деньги? В этой стране весь софт бесплатен ;)

А если серьезно, то за 5 минут работы и 15 строк кода могу в качестве оплаты предложить схолдть по ссылке.

anonymous
()
Ответ на: комментарий от anonymous

Причём тут пять минут? Для специалиста моего уровня минимальная такса начинается от 1500€. То есть это тот минимум, за который можно начинать думать о том, чтобы пошевелить задницей.

А если считать по времени, то пять минут моей работы стоят 500 рублей. За такие копейки я не стану даже условие задачи читать.

anonymous
()
Ответ на: комментарий от anonymous

- Вань, а сидеть на лоре это задача умственная или физическая?
- Нууу, думаю, что умственная.
- А почему?
- Была бы физическая, мы бы специалиста его уровня наняли.

kid_lester
()
Ответ на: комментарий от kid_lester

Два умных человека всегда поймут друг друга.

А если вам захотелось посмотреть на клоунов — почему бы вам не сходить в цирк? :-)


А, ну всё-таки вы держите оппонента за умного. Уже неплохо. Цирк, значит, уехал...

Не проще ли вам набросать «эталонное» приложение каждому на своём «эталонном» ЯП?

Зачем? Кого и чему это научит? Армию PHP разработчиков делать что-нибудь правильно это всё равно не научит.


Поучениями вы тут занимаетесь в любом случае. А согласие написать короткий код-иллюстрацию сильно сократит количество слов, за которые не надо отвечать ;-)

annonymous ★★
()
Ответ на: комментарий от anonymous

> А если считать по времени, то пять минут моей работы стоят 500 рублей.

Задача-то эталонная! Для определения кто прав в споре! Раз тратите свои драгоценные минуты на чтение форума, значит имеете личный интерес. Или ЛОР вам платит поминутно за посещение?

annonymous ★★
()
Ответ на: комментарий от annonymous

Так я же уже написал его. Ему нужен только php-cli для работы.

from bottle import route,run
import os

@route('/:p.php)
def go(p): return os.system(«php-cli %s» % p)

run(server='0.0.0.0', port=80)

kid_lester
()

Пошла ты нахуй, касатка!

anonymous
()
Ответ на: комментарий от anonymous

Если я правильно помню, то как-то так:

function TagsCloud($in_data, $min_size = 50, $max_size = 150, $limit = 30) {
	$in_data = array_slice($in_data, 0, $limit);
	$max_data = 0;
	$min_data = PHP_INT_MAX;
	foreach ($in_data as $val) {
		$max_data = max($max_data,$val);
		$min_data = min($min_data,$val);
	}
	$coeff = abs($max_size-$min_size)/($max_data==$min_data?0.1:$max_data-$min_data);
	$out = '<div>';
	foreach ($in_data as $key => $val)
		$out.='<a href="#" style="font-size: '.floor($val*$coeff+$min_size).'%">'.$key.'</a>';
	return $out.'</div>';
}

anonymous
()
Ответ на: комментарий от anonymous

Составить «облако тегов».

Сейчас пришлю свой вариант решения задачи. На новом ПК только доставлю последние пакеты для разработки.

anonymous
()
Ответ на: комментарий от anonymous

Используется Yii Framework 1.1.6 (на днях кстати будет релиз 1.1.7). PHP 5.3.5. Все стандартное.

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

Вся логика и весь код приложения находятся вне DOCROOT (тоже один из аргументов против PHP). Хотя на деле решается эта проблема совершенно просто (конечно, если не страдать синдромом NIH и использовать правильные инструменты).

По-хорошему ко всему этому еще надо было написать функциональные и юнит-тесты, но Selenium и PHPUnit чуть позже поставлю. Не критично.

Стиль кода используется тот, который рекомендуется в документации и авторами самого Yii Framework. Но и стиль опять-таки вторичен. На работе я соблюдаю общепринятый стиль кода.

Вроде все, ничего не забыл.

Основной layout верстки. Файл DOCROOT/../protected/layouts/main.php:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">

<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
	<meta http-equiv="Content-Language" content="ru"/>
	
	<title>Tag cloud test application</title>
</head>

<body>
	<?php echo $content; ?>
</body>

</html>

Контроллер и метод главной страницы приложения. Файл DOCROOT/../protected/controllers/SiteController.php:

<?php 

class SiteController extends Controller
{
  public function actionIndex()
  {
    $this->render('index');
  }
}

Свой базовый класс контроллера. Файл DOCROOT/../protected/components/Controller.php:

<?php

class Controller extends CController
{
  public $layout='main';
}

anonymous
()
Ответ на: комментарий от anonymous

Продолжение (ЛОР не пропускает очень длинные комментарии):

Шаблон (view) главной страницы приложения. Файл DOCROOT/../protected/views/site/index.php:

<h1>Главная страница</h1>

<p>
	Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis lacinia placerat velit non
	pellentesque. Suspendisse malesuada sem sit amet urna placerat faucibus. Aliquam aliquet
	faucibus dui. Phasellus eu ullamcorper enim. Fusce quis magna in purus scelerisque tempor.
	Nam condimentum commodo massa ac condimentum. Nunc urna enim, iaculis accumsan bibendum at,
	pharetra non ante. Nullam quis leo ac massa tincidunt condimentum a a massa. Cras non lacus
	sed dui tempus rhoncus. Etiam tristique posuere metus eget vehicula. Nam rutrum risus purus,
	vel aliquet neque.
</p>

<!-- Insert tag cloud widget. -->
<?php $this->widget('TagCloud', array(
  'tags'=>array(
    'linux'=>23,
    'gentoo'=>12,
    'debian'=>13,
    'python'=>14,
    'php'=>8,
    'freebsd'=>1,
    'kde'=>23,
    'gnome'=>2,
    'alsa'=>5,
    'pulseaudio'=>15,
  ),
	'fontSize'=>array(50, 150),
	'maxTags'=>5,
)); ?>

<p>
	Suspendisse quam lacus, mollis at porttitor at, imperdiet sit amet neque. Etiam pharetra
	fringilla mauris in varius. Proin risus elit, consequat sit amet lacinia ut, ullamcorper
	eget neque. Mauris faucibus neque vitae arcu mollis venenatis. Vestibulum ante ipsum primis
	in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam tempus vestibulum facilisis.
	Quisque ullamcorper nisl eget urna ultrices vestibulum ultricies adipiscing augue. Nullam a
	ligula sit amet velit egestas tempus. Quisque ut dolor leo. Morbi sodales, nibh a commodo
	ultricies, magna sem ultricies enim, a commodo nunc nisl eget velit. Maecenas nec libero ut
	orci molestie cursus. Donec ornare, orci et vulputate vulputate, purus quam sodales dolor,
	eget iaculis leo neque at eros. Ut iaculis, enim a rutrum ultricies, neque elit rhoncus tellus,
	a dictum lectus sem ac est.
</p>

anonymous
()
Ответ на: комментарий от anonymous

Продолжение 2:

Контроллер виджета облака тегов. Файл DOCROOT/../protected/components/TagCloud.php:

<?php

class TagCloud extends CWidget
{
  public $tags=array();
  public $fontSize=array(50, 150);
  public $maxTags=30; 
  
  public function run() {
    // Sort, slice and random shuffle given tags.
    uasort($this->tags, function($a, $b) {
      if ($a==$b)
        return 0;
      return $a>$b ? -1 : 1;
    });
    $this->tags=array_slice($this->tags, 0, $this->maxTags);
    self::shuffleHashArray($this->tags);
    
    // Find max and min elements.
    $max=0;
    $min=PHP_INT_MAX;
    foreach($this->tags as $value)
    {
      $max=max($max, $value);
      $min=min($min, $value);
    }
    
    // Preserve from division by zero. If max equals to zero don't display tags.
    if($max==0)
      $this->tags=array();
    
    // Change values of the hash array.
    // Difference between max font size and min font size.
    $this->fontSize[]=$this->fontSize[1]-$this->fontSize[0];
    foreach($this->tags as $key=>$value)
    {
      // Font size in [0..1].
      $this->tags[$key]=($value-$min)/($max-$min);
      // Font size in given interval.
      $this->tags[$key]=intval($this->tags[$key]*$this->fontSize[2]+$this->fontSize[0]);
    }
    
    // Now render template.
    $this->render('tagCloud', array(
      'tags'=>$this->tags,
    ));
  }
  
  /**
   * Version of shuffle function, but preserves keys.
   * @param array $array Array to shuffle.
   */
  private static function shuffleHashArray(&$array)
  {
    if(!is_array($array) || empty($array))
      return false;
    
    $tmp=array();
    foreach($array as $key=>$value)
      $tmp[]=array('k'=>$key, 'v'=>$value);
    
    shuffle($tmp);
    
    $array=array();
    foreach($tmp as $entry)
      $array[$entry['k']]=$entry['v'];
    
    return true;
  }
}

Шаблон (view) виджета облака тегов. Файл DOCROOT/../protected/components/views/tagCloud.php:

<div>
	<?php foreach($tags as $tagName=>$fontSize): ?>
		<a href="#" style="font-size: <?php echo $fontSize; ?>%"><?php echo $tagName; ?></a>
	<?php endforeach; ?>
</div>

Отдает клиенту:

<!-- ... -->

<!-- Insert tag cloud widget. -->
<div>
	<a href="#" style="font-size: 70%">pulseaudio</a>
	<a href="#" style="font-size: 150%">linux</a>
	<a href="#" style="font-size: 50%">debian</a>
	<a href="#" style="font-size: 150%">kde</a>
	<a href="#" style="font-size: 60%">python</a>
</div>

<!-- ... -->

anonymous
()
Ответ на: комментарий от anonymous

> Вся логика и весь код приложения находятся вне DOCROOT (тоже один из аргументов против PHP). Хотя на деле решается эта проблема совершенно просто (конечно, если не страдать синдромом NIH и использовать правильные инструменты).

Поэтому проект на bottle.py при получении из тарбола или меркуриала достаточно только запустить как python bottle.py, а чтобы только посмотреть на php-творение, нужно подготовить сервер, сделать все нужные настройки, и только потом запускать его.

kid_lester
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.