Войти

Показать полную графическую версию : Делимся опытом


Страниц : 1 [2] 3 4

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

mar
28-10-2005, 20:39
нумбер 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. Високосные годы также учитываются.

mar
03-12-2005, 18:33
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. Тоже гарный инструмент.

mar
15-02-2006, 20:31
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, &quot;в лучах заходящего солнца&quot;" 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>

Все просто, но мне понравился результат :)

slaine
21-03-2006, 18:53
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) такой пунктир не будет печататься на принтере...

mar
04-06-2006, 01:04
1) есть более эффективные способы!
давай их сюда :)

Vlad Drakula
04-06-2006, 09:56
mar
вот была такая тема: http://forum.oszone.net/thread-31833.html
там были ссылки на примеры того как можно хранить графику в JS...

PS
ох и долго же я ее искал...

mar
04-06-2006, 12:46
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
Вот читал читал всю эту тему.. и не понял :) идея конечно хорошая. Но ведь большая половина просто куски манов. брр.. да простят меня модераторы за оффтоп.

blank
12-07-2006, 04:14
Фишка 30
Простой генератор sitemap для бесплатных хостингов (статичных сайтов)
Конечно, простой sitemap можно и руками сделать. А если файлов около двухсот? На бесплатных хостингах и скрипты не запустишь. А поскольку у меня на домашнем компьютере структура сайта совпадает с сайтом на сервере, то с помощью очень простого генератора на Perl легко создаю sitemap.
Предусмотрел настройки для приоритетов и вероятной частоты изменения для групп файлов и папок.
Несколько раз отправлял sitemap – ошибок нет.
Подумал, может пригодится кому-то еще?
http://blankinew.narod.ru/sitemap-generator.html

mar
29-08-2006, 11:55
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