Ігри з датою за допомогою плагіна Datapicker для jQuery

Дуже специфічне завдання :) Суть – є дата в форматі “2009-05-05″ потрібно до неї додати один рік. Робив двома способами

Старий варіант(рік додаю через перевід в Юнікс стемп і додавання мілісекунд):

onchange='var old_date=jQuery.datepicker.parseDate("yy-mm-dd", this.value);
temp=parseInt(jQuery.datepicker.formatDate("@", old_date))+parseInt(31556926000);
new_date=jQuery.datepicker.parseDate("@", temp);
jQuery("#date_end<?echo $v['catalog_firm_id']; ?>").val(jQuery.datepicker.formatDate("yy-mm-dd", new_date));'

Остаточний варіант (рік додається шляхом маніпуляцій з отриманим об’єктом Date):

onchange='var m_date=jQuery.datepicker.parseDate("yy-mm-dd", this.value);
m_date.setFullYear(m_date.getFullYear()+1);
jQuery("#date_end<?echo $v['catalog_firm_id']; ?>").val(jQuery.datepicker.formatDate("yy-mm-dd", m_date));'

В обох випадках для парсингу використовується функція jQuery.datepicker.parseDate, оскільки стандартний метод parse для дати виду “2009-05-05″ НЕ ПРАЦЮЄ

Коментарів немає

Tooltip на CSS

Існують певні бібліотеки на JS для створення красивик підказок, але цей ефект можна реалізуати виключно засобами CSS (матеріал взято звідси)

.tooltip_base a {
position: relative;
text-decoration: none;
}

.tooltip_base img {
border:none;
}

a .tooltip{
display: none;
}

.tooltip_base a:hover .tooltip {
display: block !important;
position: absolute;
top: 5px;
left: 20px;
width: 150px;
border: 1px solid #C0C0C0;
background-color: #F7EDD4;
color: #000;
padding: 5px;
font-size: .8em;
}
<span class="tooltip_base"><a onclick="return false;"><span class="tooltip">This popup is set to 150px wide and is made "absolute"
</span></a></span>

Можна було б обійтись і без тега a, але ІЕ не підтримує подію hover для інших тегів (інші браузери підтримують)

Коментарів немає

“HTML” means How To Make Love?

Власне кажучи, в заголовку статті найкумедніша розшифровка абревіатури HTML, яку я зміг знайти. Хоча треба буде ще пошукати :)

Відключити автозаповнення в елементах форми

Досить потрібна штука. Для цього в атрибутах елемента необхідно прописати
autocomplete=”off”
Цитата:

The autocomplete attribute applies to the text, password, date-related, time-related, numeric, email, and url controls. The attribute takes two values, on and off. The default, when the attribute is not specified, is on.

Редирект сторінки

<head>
<meta HTTP-EQUIV="REFRESH" content="5"; URL=http://www.google.com">
</head>

Через 5 секунд відвідувача автоматично перекине на сайт google.com

Елемент SELECT + IE

Оскільки ІЕ(принаймні до 7 версії) для відмальовки списків використовує можливості ОС, то задати деякі атрибути для нього (наприклад колір бордера) через CSS не вийде.
Також одним з наслідків такої відмальовки списків є те, що в ІЕ списки завжди відображаються ПОВЕРХ елементів DIV, незважаючи на z-index останніх.

Вирівнювання таблиці в середині елемента div

Щоб вирівняти таблицю по ПРАВОМУ краю елемента можна використати такий стиль

#table1 {
float:right;
} 

Правильні лінки

(вичитано на сайті студії А. Лебедева)
Лінк завжди повинен вести на якийсь ресурс – чи то веб-сторінка, чи то файл. Іншими словами, атрибут href завжди повинен містити адресу ресурсу(а не, скажімо, решітку, “javascript://” чи ще щось).
Не варто використовувати лінк, якщо його немає на що поставити. В цьому випадку можна використовувати інші теги, для оформлення вигляду яких треба використовувати стилі, а реакції – подію onclick=”some_function(); return false;”

Уникнення кешування браузером деяких об’єктів

Яких об’єктів? Ну, наприклад, файлів *.js, *.css, звичайних малюнків.
Для цього потрібно в шлях їхнього виклику додати змінну величину. Наприклад:

<link type="text/css" rel="Stylesheet" href="/css/main.css?1258804188" />

Як цього досягти? Якщо файл, що викликає ресурс має розширення php, то так:

<link type="text/css" rel="Stylesheet" href="/css/main.css?<? echo time(); ?>" />

якщо html, то так:

LoadScript( ‘../fckconfig.js?’+( new Date() * 1 ) ) ;

Коментарів немає

PHP-кодеру на пам’ять. Випуск 2

Можливі проблеми з UTF-8

Якщо в проекті використовуються файли з кодировкою Юнікод, то можлива наступна проблема:
Warning: Cannot modify header information – headers already sent by (output started at…
Якщо все перевірено, ніде немає зайвих пробілів і т.д., а проблема збереглась, то це може означати, що файл був збережений не в “чистому” UTF-8, а в UTF-8 з сигнатурою(BOM). Деякі текстові редактори уміють зберігати файли в обох варіантах – наприклад Scite або Notepad2. Потрібно просто відкрити і зберегти файл в потрібній кодировці.
Через UTF-8 з сигнатурою(BOM) можлива також поява порожнього рядку “нізвідки” при виводі HTML через PHP.

foreach – деякі особливості

Щоб вивести певні результати за допомогою цього циклу можливі кілька варіантів. А от щоб ЗМІНИТИ САМ МАСИВ допустимий лише один шлях:
Працює:

foreach($rows as $k=&gt;$v){
$rows[$k]['news_date'] = date('r', strtotime($rows[$k]['news_date']));
}

Не працює (оскільки ми змінюємо змінну зі значенням, а не сам масив):

foreach($rows as $k=&gt;$v){
$v['news_date'] = date('r', strtotime($v['news_date']));
}

Змінні в PHP

Наштовхнувся в одному блозі на цікавий пост присвячений двом змінним в РНР:
DIRECTORY_SEPARATOR і PATH_SEPARATOR.

DIRECTORY_SEPARATOR – як випливає з назви, зберігає розділювач між папками, який різниться в залежності від ОС (’/'- Unix, ‘\’ – Windows).
Незважаючи на те, що Windows зрозуміє вас навіть, якщо розділяти папки символом ‘/’, всеодно коректніше використовувати DIRECTORY_SEPARATOR

PATH_SEPARATOR - зберігає розділювач для параметру РНР include_path (всі шляхи, по яким ваші скрипти шукають бібліотеки для підключкення)
Так ось, під Windows цей розділювач виглядає як ‘;’ під Unix – ‘:’
Коли потрібно підключити якусь бібліотеку (то й же Зенд) і працювати зі скриптом під різними ОС, виникають складнощі.
Донедавна я вирішував ці складнощі “геніальним” скриптиком:

if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
ini_set('include_path', ini_get('include_path') . ';' . getcwd() . DS . '..' . DS. 'lib'  .';');//WIN
} else {
ini_set('include_path', ini_get('include_path') . ':' . getcwd() . DS . '..' . DS. 'lib'  . ':');//another OS
}

Зрозуміло, що в “цивілізованому світі” (а тепер і я) роблять по-іншому:

ini_set('include_path', ini_get('include_path') . PATH_SEPARATOR. getcwd() . DS . '..' . DS. 'lib'  . PATH_SEPARATOR);

Правильний стиль написання коду від Zend

For files that contain only PHP code, the closing tag (”?>”) is never permitted. It is not required by PHP, and omitting it´ prevents the accidental injection of trailing white space into the response
Ось як воно… А взагалі, почитати рекомендації від Zend ніколи зайвим не буде.

Економія пам’яті в PHP

При операціях з картинками на сервері варто слідкувати за витратами пам’яті на сервері і не забувати про функцію imagedestroy. Наприклад:

$src = imagecreatefromjpeg($file_temp);
.... якийсь код
imagedestroy($src);

До речі, для тестування і моніторингу скільки саме пам’яті використовує РНР на певний момент, застосовується функція memory_get_usage() (без параметрів)

Коментарів немає

А як ви запускаєте Ruby-додатки?

Ruby… Знайомо звучить, чи не так? “Модно!”- кричать одні. “Гальмує!”- кричать другі. А треті не заморочуються і продовжують використовувати PHP. Як нескладно здогадатись, я відношусь саме до третьої категорії і з Ruby практично не знайомий. Проте використання системи баг-трекінгу Redmine все-таки змусило мене дещо прояснити для себе в цій області. Основне питання було не “як щось написати під Рубі”, а “як це щось запустити?”.
Запустити не просто так, а запустити під Windows – на даний момент я використовую саме цю операційну систему. Отже, певні факти…

На сьогоднійшній день найбільш ефективним способом використання Ruby на сервері є Phusion Passenger (також відомий як mod_rack і mod_rails) Це модуль для веб-серверів Apache та Nginx. Його принцип дії схожий на принцип дії mod_wsgi для python та mod_php для PHP. Тобто ресурси сервера виділяються динамічно. Версії під Віндовс НЕ ІСНУЄ. І автори відмовляються її створювати, оскільки рішення вийде занадто повільним. Тому цей спосіб лише для Unix-систем. (раніше пробували розробляти mod_ruby, але так і не довели до стабільності і закинули, найбільш глючний)

До цього використовували зв’язку Apache/Nginx плюс ОДНОПОТОЧНИЙ сервер Mongrel. Через однопоточність доводилось запускати кілька копій Mongrel. Що було дуже неефективно з точки зору використання ресурсів. Ось цитата:

Балансировщик + Mongrel-ы
Рельса — не может работать в несколько потоков (а MRI не умеет системные потоки, т.е. не более 100% CPU), поэтому для масштабирования запускается N-ое количество монгрелов на каждой машине. Запросы к ним приходят от балансировщика.Проверенные балансировщики: nginx, apache, lighttpd. Рекомендуется nginx как наиболее стабильный, легкий и удобный в настройке.Количество монгрелов не должно быть слишком большим, чтобы зазря не сжирать память и не тратить время процессора на планировщик задач, но и не должно быть слишком малым чтобы обеспечить необходимую пропускную способность. Как правило, количество бекендов (backend, в данном случае — монгрел) наращивают по мере необходимости и до тех пор, пока производительность не перестанет расти. Когда это случится, нужно думать об оптимизации приложения и/или устанавливать дополнительный физический сервер.

Третій спосіб полягав у інтерпретації Ruby через cgi. Тобто до Apache підключались спеціальні модулі як-то FastCGI. Теж неефективно. Цей спосіб частенько зустрічається на shared-хостингах.
В поставці Ruby є власний сервер WEBrick, але його використання є недоцільним. Він тільки для “відладочних” цілей.

Підсумки. Під Windows певний час я використовував спеціальну збірку Redmine скачану з сайту Bitnami. Це такий собі флакон з веб-сервером Апач, Mongrel, Ruby i Redmine. Глючило просто неймовірно. В кінці-кінців я відмовився від таких експериментів і встановив Redmine на лінукс-платформі з використанням Phusion Passenger…
До речі, більш детально про цю установку можна почитати в попередньому пості.

Коментарів немає