Показать полную графическую версию : Делимся опытом
Prisoner
30-07-2005, 15:19
Полезность №18.
Часто необходимо вычислить дату через "сколько-то там чего-то". Ну к примеру не терпится узнать, что за дата будет через 13 дней или 13 недель. Чаще необходимо решение задача вывода дня недели через Х дней. В любом случае поможет связка date и strtotime. Примеры из официальной доки по strtotime:
int strtotime (string time [, int now])
Функция ожидает строку, содержащую английский формат даты, и пытается разобрать этот формат в UNIX timestamp относительно timestamp, заданного в параметре now, или относительно текущего времени, если ничего не задано. При неудаче возвращает -1.
Пример 1. strtotime()
echo strtotime ("now"), "\n";
echo strtotime ("10 September 2000"), "\n";
echo strtotime ("+1 day"), "\n";
echo strtotime ("+1 week"), "\n";
echo strtotime ("+1 week 2 days 4 hours 2 seconds"), "\n";
echo strtotime ("next Thursday"), "\n";
echo strtotime ("last Monday"), "\n";
На основе такой функциональности можно легко писать следующее:
echo 'Завтра: '.date('D, j M Y', strtotime("+1 day")).'<br>';
echo 'Послезавтра: '.date('D, j M Y', strtotime("+2 day")).'<br>';
echo 'Через неделю: '.date('D, j M Y', strtotime("+1 week")).'<br>';
Prisoner
30-07-2005, 19:08
Фенька №19
Порой необходимо сортировать многомерные массивы.
array(8) {
[0]=>
array(7) {
["UID"]=>
string(2) "92"
["owner"]=>
string(9) "Петров П."
["post"]=>
string(6) "Стажер"
}
[1]=>
array(7) {
["UID"]=>
string(2) "62"
["owner"]=>
string(9) "Иванов И."
["post"]=>
string(6) "Мастер"
}
[2]=>
array(7) {
["UID"]=>
string(2) "61"
["owner"]=>
string(10) "Сидоров С."
["post"]=>
string(6) "Стажер"
}
Причем по какому полю - не известно, в перспективе необходима возможность сортировки по всем полям. Тут поможет create_function.
string create_function (string args, string code)
Создаёт анонимную функцию из передаваемых параметров и возвращает уникальное имя для неё. Обычно аргументы args будут передаваться в единой закавыченной строке, это же рекомендуется и для code. Смысл использования отдельных закавыченных строк в том, чтобы защитить имена переменных от разбора, иначе, если вы используете двойные кавычки, появится необходимость мнемонизировать имена переменных, например, \$avar.
Вы можете использовать эту функцию для (например) создания функции из информации, получаемой на этапе прогона:Пример 1. Создание анонимной функции с помощью create_function()
$newfunc = create_function('$a,$b','return "ln($a) + ln($b) = ".log($a * $b);');
echo "New anonymous function: $newfunc\n";
echo $newfunc(2,M_E)."\n";
// выводит:
// New anonymous function: lambda_1
// ln(2) + ln(2.718281828459) = 1.6931471805599
Пусть имеется список допустимых полей по которому мы должны обеспечить сортировку - как бы ограничитель полей по которым вообще можно сортировать (так или иначе он у нас будет, либо из головы, либо из БД (см. fetch_fields (http://ru.php.net/manual/ru/function.mysqli-fetch-field.php))):
$arFields = array('field1', 'field2', 'field3');
тогда сортировка вышеприведенного массива выглядит примерно так:
if ($up === true)
usort($array, create_function('$a,$b','if ($a[\''.$arFields[$FID].'\'] == $b[\''.$arFields[$FID].'\']) return 0; else return ($a[\''.$arFields[$FID].'\'] < $b[\''.$arFields[$FID].'\']) ? -1 : 1;'));
else
usort($fResult, create_function('$a,$b','if ($a[\''.$arFields[$FID].'\'] == $b[\''.$arFields[$FID].'\']) return 0; else return ($a[\''.$arFields[$FID].'\'] > $b[\''.$arFields[$FID].'\']) ? -1 : 1;'));
Где $FID номер поля.
Prisoner
03-08-2005, 13:55
Плюшка №20.
Интересная картинка - шпоргалка по css (http://www.ilovejackdaniels.com/css_cheat_sheet.png) (97 kb).
Prisoner
17-08-2005, 18:41
Полезность №21 (очко!)
Вернусь к вопросу о дебажном выводе. Со временем мне стало не хватать "мощности" функции и я решил ее расширить:
1) Блок с выводом можно свернуть/развернуть
2) Блок можно закрыть
3) Можно управлять выводом заголовка с помощью параметра функции (ниже) для вывода сообщений
Подробнее:
Пп. (1) и (2) реализуется путем разового вывода куска JS-кода двух функций: сворачивания/разворачивания блока и его скрытия. Т.о. вызовов функции может быть несколько, но вывод JS будет произведен только однажды.
П. (3) полезен в ситуации когда хочется узнать что возвращает функция с разными параметрами: к примеру есть некий параметр $param который однозначно определяет работу функции (де юре), передаем его в функцию дебажного вывода вместе с самим результатом функции (тот, который return'им) и видим результат работы проверяемой функции (де факто).
Синтаксис:
void var_dumpf (mixed $var [, array $options])
Выводит содержимое переменной $var переданной по значению с заданными опциями $options.
$options - массив со следующими допустимыми ключами:
width - string, ставится в width таблицы обрамляющей блок вывода, по сути ширина блока вывода
collapsed - boolean, будет ли свернут блок или нет
message - string, добавочная строка выводящаяся в заголовке блока
Примеры:
//вывод №1
$options = array('message' => $dbFields, 'collapsed' => true);
var_dumpf($fResult, $options);
//вывод №2
var_dumpf($fResult);
("Выводы" в прикрепленных файлах, там же функция)
Prisoner
25-08-2005, 16:13
Предлагаю вашему вниманию самописный класс-компонент селектора.
Все наверное хоть раз в жизни сталкивались с таким элементом управления как два мультиселекта с рядом кнопок между ними для перемещения элементов из одного в другой. Лично мне понадобилась такая приблуда при кодинге админчасти одного из проектов для выбора вариантов из некоторого множества существующих.
Всегдашнее желание сделать все «по уму» оформилось в конечном счете в класс работа с которым чрезвычайна проста: создать экземпляр класса, выбрать подходящий метод генерации «компонента» и передать ему нужные данные.
Итак, класс selector:
методы:
selector – конструктор, означивает свойства класса (шаблоны под составные части компонента)
createSelector – основной метод генерации «компонента» из шаблонов и переданных данных, не следует вызывать его напрямую, метод сугубо внутренний, рабочий.
getSelector – метод, возвращающий код составных частей «компонента» в ассоциативном массиве array('sLeft' => 'html код левого селекта', 'sRight' => ' html код правого селекта ', 'buttons' => 'html код кнопок между селектами', 'JS' => 'JS код выполняющий перемещения опций селектов', 'full' => 'полный код компонента').
newSelector – метод, работающий аналогично getSelector, но возвращающий код «компонента» в свойство html класса с такими же именами ключей.
convertToItems – ввиду того, что данные необходимо подавать сборщику «компонента» в особом формате, сделан метод-конвертер на вход которому передаются два ассоциативных массива с данными для левого и правого селектов соответственно и три строковых параметра которые хранят значения ключей которые нужно преобразовать в необходимые для подачи массива данных сборщику.
свойства:
$html – метод newSelector будет класть код именно в это свойство
$tmpl – массив шаблонов элементов «компонента»
константы:
SELECTOR_IMG_DIR – т.к. кнопки сделаны картинками, то константа должна указывать на директорию с оными.
Логика: Необходимо дать посетителю возможность выбора опций из имеющихся, а после отправки формы обработать выбор. Пусть мы сделали выборку из БД, чаще всего это массив (большие объемы данных обычно разбивают на страницы). Пусть он будет следующего вида $left = array('id' => string, 'nick' => string). Смысл данных этого массива следующий – есть из чего выбирать: эти-то данные и будут помещены в левый селектор. Данные выборки необходимо преобразовать к виду array(array('caption' => string, 'value' => string,[ 'class' => string]), …), для чего вызываем метод convertToItems($left, array(),'nick', 'id') который вернет массив готовый для передачи сборщику компонента передав ему кроме данных еще и имя переменной name по которой будут доступны результаты выбора. После того как форма будет отправлена, в нашем распоряжении будут массивы nameAvailable и nameSelected которые в сумме (оператор + над массивами) дадут все возможные варианты для выбора при необходимости.
Почему код по частям: дизайн всегда разный, кто-то захочет сделать «компонент» не горизонтальным, а вертикальным, кто-то вообще разбросать по всей странице. Создаем новый селектор и по частям выводим куда надо. JavaScript-код будет выводиться один раз на страницу, но если необходимо получить его еще раз, для этого есть в методах сборки параметр bool $forceJS. Когда нет необходимости в изощренном виде «компонента» просто выводим содержимое по ключу 'full' (вид близкий к обычному виду windows контрола).
В архиве класс + файл примера в котором после отправки формы выводится содержимое массивов выбранных элементов и остаток доступных для выбора (внимание: после отправки формы данные в «компоненте» неактуальные из-за отсутствия перезаписи данных относительно массива $_POST)
vadimiron
08-10-2005, 18:39
Фишка номер 23:
Когда в php.ini стоит register_globals off, но всё же есть желание использовать переменные по прямому их имени,а не по например $_GET["var_name"], то можно воспользоваться функцией import_request_variables("x"); , причём х здесь это любое сочетание из g,p,c. Как нисложно догадаться каждая из букв-это начальная буква трёх методов передачи данных в скрипт: GET, POST, COOKIE
нумбер 24
проверка на корректность ввода даты ($our_data):
/* Вид вводимой даты на ближайшее тысячелетие: 29.10.05, или 10, если 29.10.2005
вместо разделителя - точки можно использовать в explode нечто глобальное, определенное в конфигурационном файле приложения */
if (!isset($our_data) || strlen(trim($our_data))!= 8)
функция_корректного_отлупа();
$data_pieces = explode(".", $our_data);
if (!(
( 3 == count( $data_pieces ) )
&& is_numeric( $data_pieces[0] ) && is_numeric( $data_pieces[1] ) && is_numeric( $data_pieces[2] )
&& checkdate( $valide_date[1], $valide_date[0], $valide_date[2] )
))
функция_корректного_отлупа();
Используется стандартная функция
bool checkdate (int month, int day, int year)
Возвращает TRUE, если предоставленные данные верны; иначе возвращает FALSE. Проверяет правильность даты, сформированной аргументами.
Дата считается правильной, если:
year (год) имеет значение от 1 до 32767 включительно.
month (месяц) имеет значение от 1 до 12 включительно.
day (день месяца) находится в пределах допустимого количества дней для данного month. Високосные годы также учитываются.
N25 (юбилей :))
на самом деле, скорей напоминание - дебажное измерение скорости работы скрипта:
<?php
define("start",microtime(true));
/* дальше идет сам код */
printf("time %.5f c",microtime(true)-start);
?>
vadimiron
12-02-2006, 13:36
N26
Графический редактор конфиг файла сервера Apache: здесь (http://www.apache-gui.com/apacheconf/)
Prisoner
14-02-2006, 10:13
Там же, кстати, еще такая тулза как Apache Commander. Тоже гарный инструмент.
27
Простая идея, но очень хорошо работает для фотогаллереи (откуда и взята)
Фото лебедя (http://www.photosight.ru/viewpicwindow.php?photoid=1278386) можно просмотреть на разном фоне:
<head>
<!-- http://www.photosight.ru/viewpicwindow.php?photoid=1278386 -->
<script language="JavaScript" type="text/javascript">
<!--
function SetBG(color)
{
document.bgColor = color;
}
//-->
</script>
</head>
<body bgcolor="#999999">
<table width="100%" height="96%" border=0 cellpadding=0 cellspacing=0>
<tr><td align=center><a href="#" onClick="window.close()"><img alt="Valesia, "в лучах заходящего солнца"" border=0 src="http://img-2006-02.photosight.ru/15/1278386.jpg" GALLERYIMG="no"></a></td></tr>
<tr><td>
<table align=center cellpadding=0 cellspacing=2 border=0>
<tr>
<td bgcolor="#FFFFFF" onmouseover="SetBG('#FFFFFF')"><img src="/pics/dot.gif" width=18 height=18 border=0></td>
<td bgcolor="#E5E5E5" onmouseover="SetBG('#E5E5E5')"><img src="/pics/dot.gif" width=18 height=18 border=0></td>
<td bgcolor="#CCCCCC" onmouseover="SetBG('#CCCCCC')"><img src="/pics/dot.gif" width=18 height=18 border=0></td>
<td bgcolor="#B3B3B3" onmouseover="SetBG('#B3B3B3')"><img src="/pics/dot.gif" width=18 height=18 border=0></td>
<td bgcolor="#999999" onmouseover="SetBG('#999999')"><img src="/pics/dot.gif" width=18 height=18 border=0></td>
<td bgcolor="#808080" onmouseover="SetBG('#808080')"><img src="/pics/dot.gif" width=18 height=18 border=0></td>
<td bgcolor="#666666" onmouseover="SetBG('#666666')"><img src="/pics/dot.gif" width=18 height=18 border=0></td>
<td bgcolor="#4D4D4D" onmouseover="SetBG('#4D4D4D')"><img src="/pics/dot.gif" width=18 height=18 border=0></td>
<td bgcolor="#333333" onmouseover="SetBG('#333333')"><img src="/pics/dot.gif" width=18 height=18 border=0></td>
<td bgcolor="#1A1A1A" onmouseover="SetBG('#1A1A1A')"><img src="/pics/dot.gif" width=18 height=18 border=0></td>
<td bgcolor="#000000" onmouseover="SetBG('#000000')"><img src="/pics/dot.gif" width=18 height=18 border=0></td>
<td><img src="/pics/dot.gif" width=18 height=18 border=0></td>
<td><a href="#" onClick=window.close()><img src="/pics/b_close.gif" width=18 height=18 border=0></a></td>
</tr>
</table>
</td></tr>
</table>
</body></html>
Все просто, но мне понравился результат :)
28
Простая идея, пунктирная линия!
А, то стиль не вовсех браузерах правильно показывает.
<html>
<title></title>
<head>
</head>
<body bgColor=#ffffff>
<script language = javascript>
a = new Array(10);
a[0] = 10;
a[1] = 20;
a[2] = 30;
a[3] = 40;
a[4] = 50;
a[5] = 60;
a[6] = 70;
a[7] = 80;
a[8] = 90;
a[9] = 100;
count = a.length;
for(i = 0; i < count; i ++){
document.write("<div style='position: absolute; background-color: #000000; clip: rect(0px 5px 1px 0px); width: 5; height: 1; top: 100px; left: "+a[i]+"px'></div>");
}
</script>
</body>
</html>
Vlad Drakula
03-06-2006, 23:23
slaine
интересно, но очень будет уж тормознуто наверное...
1) есть более эффективные способы!
2) такой пунктир не будет печататься на принтере...
1) есть более эффективные способы!
давай их сюда :)
Vlad Drakula
04-06-2006, 09:56
mar
вот была такая тема: http://forum.oszone.net/thread-31833.html
там были ссылки на примеры того как можно хранить графику в JS...
PS
ох и долго же я ее искал...
Vlad Drakula
все здорово, но там обе ссылки не работают :[
Vlad Drakula
04-06-2006, 12:59
фишка 29)
общий смысл такой:
<div style="width:*;height:1px;overflow:hidden"><img ****/></div>
а вот как задавать картинки прямо в JavaScript я не помню, но знаю что такое можно делать!
strejiok
08-07-2006, 13:04
Вот читал читал всю эту тему.. и не понял :) идея конечно хорошая. Но ведь большая половина просто куски манов. брр.. да простят меня модераторы за оффтоп.
Фишка 30
Простой генератор sitemap для бесплатных хостингов (статичных сайтов)
Конечно, простой sitemap можно и руками сделать. А если файлов около двухсот? На бесплатных хостингах и скрипты не запустишь. А поскольку у меня на домашнем компьютере структура сайта совпадает с сайтом на сервере, то с помощью очень простого генератора на Perl легко создаю sitemap.
Предусмотрел настройки для приоритетов и вероятной частоты изменения для групп файлов и папок.
Несколько раз отправлял sitemap – ошибок нет.
Подумал, может пригодится кому-то еще?
http://blankinew.narod.ru/sitemap-generator.html
31
smarty - грабли и их обход
* Грабли нумбер раз - обнаружена некорректная работа при сравнении со строковой переменной. Лечится сравнением и по типу === (спасибо ману Руководство по Smarty. Глава 7. Встроенные функции {if},{elseif},{else} (http://smarty.php.net/manual/ru/language.function.if.php) - я и не знала, что smarty так криво отрабатывает переменные, но зато так лихо знает === :) )
* Грабли нумбер 2 - обнаружена некорректная работа при вложенном цикле с section (может тут я что-то не то сделала, но в сети на офф-сайте были обнаружены жалобы на то же самое). Лечится:
- вложением foreach внутри section. (т.е. наружный цикл идет section, внутренние - foreach)
- "разворачиванием" и уходом от вложенных циклов (что не всегда возможно).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.