<?xml version="1.0" encoding="utf-8"?>
<!-- If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/ -->
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:lj="http://www.livejournal.com">
  <id>urn:lj:livejournal.com:atom1:andrvm</id>
  <title>andrvm's journal</title>
  <subtitle>andrvm</subtitle>
  <author>
    <name>andrvm</name>
  </author>
  <link rel="alternate" type="text/html" href="http://andrvm.livejournal.com/"/>
  <link rel="self" type="text/xml" href="http://andrvm.livejournal.com/data/atom"/>
  <updated>2009-10-08T18:51:54Z</updated>
  <lj:journal userid="14036255" username="andrvm" type="personal"/>
  <link rel="service.feed" type="application/x.atom+xml" href="http://andrvm.livejournal.com/data/atom" title="andrvm's journal"/>
  <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
  <entry>
    <id>urn:lj:livejournal.com:atom1:andrvm:4603</id>
    <link rel="alternate" type="text/html" href="http://andrvm.livejournal.com/4603.html"/>
    <link rel="self" type="text/xml" href="http://andrvm.livejournal.com/data/atom/?itemid=4603"/>
    <title>Tellmeday.com или содневки</title>
    <published>2009-10-08T18:51:54Z</published>
    <updated>2009-10-08T18:51:54Z</updated>
    <category term="tellmeday"/>
    <content type="html">Наконец-то проект, которым я был занят все свое свободное время, запущен и потихоньку набирает обороты. Да –то бог…</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:andrvm:3855</id>
    <link rel="alternate" type="text/html" href="http://andrvm.livejournal.com/3855.html"/>
    <link rel="self" type="text/xml" href="http://andrvm.livejournal.com/data/atom/?itemid=3855"/>
    <title>Интеграция форума phpbb с сайтом</title>
    <published>2009-06-18T18:49:20Z</published>
    <updated>2009-09-14T17:07:21Z</updated>
    <category term="phpbb"/>
    <category term="php"/>
    <content type="html">Когда-нибудь у Вас возникнет желание сделать на сайте форум, т.к. трудно себе представить хорошо посещаемый сайт без оного. Для этого форум можно написать с нуля, а можно взять бесплатное готовое решение, например phpbb, и объединить его с сайтом. Вот об это я и хотел рассказать.&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;Процесс интеграции разделим на 2 части: «форумную» и «сайтовую». Под «форумной» будем понимать модификацию файлов форума, а «сайтовой» - сайта. Для объединения форума и сайта необходимо определиться с местом хранения пользователей: либо это будет таблица пользователей сайта, либо форума. Лучше всего сделать это все в одной таблице – форумной (по умолчанию phpbb_users), добавив в нее необходимые вам поля. По большому счету, необходимо привести механизм сессий на вашем сайте в соответствии с «форумным», т.е. завязать его на базу данных, но мы это делать не будем, т.к. это выходит за рамки данной статьи. Итак, начнем.&lt;br /&gt;&lt;habracut&gt;&lt;br /&gt;&lt;h4&gt;Модификация «сайтовой» части&lt;/h4&gt;&lt;br /&gt;&lt;b&gt;1.&lt;/b&gt; Открываем файл, где у нас хранятся функции (у меня function.php) и добавляем в него следующие функции из phpbb (forum/includes/function.php): phpbb_hash, phpbb_check_hash, _hash_gensalt_private, _hash_encode64, _hash_crypt_private, unique_id. Эти функции &lt;a href="http://www.openwall.com/phpass/"&gt;Portable PHP password hashing фрэймворка&lt;/a&gt; (за исключением unique_id) и их нам придется использовать на нашем сайте. Функция unique_id генерирует уникальный идентификатор, для совместимости мне пришлось в нее запихнуть заглушку:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;function unique_id($extra = 'c'){&lt;br /&gt;&lt;br /&gt;	$rand_seed = '8a414598ba18a512b8fe97f1497fa22b';&lt;br /&gt;&lt;br /&gt;	$val = $rand_seed . microtime();&lt;br /&gt;	$val = md5($val);&lt;br /&gt;&lt;br /&gt;	return substr($val, 4, 16);&lt;br /&gt;&lt;br /&gt;} &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;	&lt;br /&gt;Также, для совместимости в свой файл function.php я добавил функцию set_cookie из файла includes/session.php. Убрав из нее лишнее, она стала выглядеть так:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;function set_cookie($name, $cookiedata, $cookietime, $path='/', $domain = false){&lt;br /&gt;	&lt;br /&gt;            $name_data = rawurlencode($name) . '=' . rawurlencode($cookiedata);&lt;br /&gt;	$expire = date('D, d-M-Y H:i:s \\G\\M\\T', $cookietime);&lt;br /&gt;	$domain = !$domain  ? '' : '; domain=' . $domain;&lt;br /&gt;&lt;br /&gt;	header('Set-Cookie: ' . $name_data . (($cookietime) ? '; expires=' . $expire : '') . '; path=' . $path . $domain . '; HttpOnly', false);&lt;br /&gt;&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;2. Далее открываем файл, где у нас происходит авторизация пользователей и модифицируем его следующим образом:&lt;br /&gt;     &lt;br /&gt;&lt;br /&gt;     &lt;code&gt;&lt;br /&gt;      &lt;i&gt;&lt;font color="gray"&gt;// это добавляем в место проверки пароля&lt;br /&gt;     // где $pass пароль из массива $_POST, а&lt;br /&gt;     // $user_password пароль из базы данных&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;     if(phpbb_check_hash($pass, $user_password)){&lt;br /&gt;&lt;br /&gt;     &lt;i&gt;&lt;font color="gray"&gt;// если авторизация прошла успешно, то здесь ваш код&lt;br /&gt;         // т.к. у меня авторизация на сессиях, то я пишу свой, например такой:&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;         $_SESSION['logged']   = true; &lt;br /&gt;&lt;br /&gt;         &lt;i&gt;&lt;font color="gray"&gt;// обновляем время последнего посещения юзера&lt;br /&gt;         // здесь и ниже $db – объект для работы с базой данных,&lt;br /&gt;         // методы, которого говорят сами за себя (я думаю что-то&lt;br /&gt;         // подобное есть у каждого)&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;         $db-&amp;gt;query("update `phpbb_users` set `user_lastvisit` = time() where `user_id` = $user_id";&lt;br /&gt;&lt;br /&gt;         &lt;i&gt;&lt;font color="gray"&gt;// определяем время жизни кук&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;         $cookie_expires = time() + ($autologin ? 86400*$config['session_autologin_life'] : 31536000);&lt;br /&gt;	&lt;br /&gt;		            	&lt;br /&gt;         &lt;i&gt;&lt;font color="gray"&gt;// далее ставим соответствующие куки (&lt;b&gt;процесс обязательный&lt;/b&gt;)&lt;br /&gt;         // здесь и ниже COOKIE_PREFIX – префикс кук,&lt;br /&gt;         // $autologin – переменная-признак автологина,&lt;br /&gt;         // $config – массив с &lt;b&gt;вашими&lt;/b&gt; настройками сайта (или что то его заменяющее),&lt;br /&gt;         // в которых необходимо обязательно предусмотреть&lt;br /&gt;         // время жизни сессии и время жизни куки автологина&lt;br /&gt;         // $config['session_life'] и $config['session_autologin_life'] соответственно&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;            set_cookie(COOKIE_PREFIX.'_sid' $sessname, session_id(),$cookie_expires);&lt;br /&gt;          &lt;i&gt;&lt;font color="gray"&gt;// пишем ид юзера в куку&lt;br /&gt;          // $user_id – ид юзера&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;           set_cookie(COOKIE_PREFIX.'_u', $user_id, $cookie_expires);&lt;br /&gt;      &lt;br /&gt;           set_cookie(COOKIE_PREFIX.'_k', '', $cookie_expires); &lt;br /&gt;          &lt;i&gt; &lt;font color="gray"&gt;// кука признака автологина вашего сайта&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;           set_cookie(COOKIE_PREFIX.'_a', 1, ($autologin ? 86400*$config['session_autologin_life'] : (-1)*31536000));&lt;br /&gt;&lt;br /&gt;				   					&lt;br /&gt;	&lt;i&gt;&lt;font color="gray"&gt;// затем «входим» на форум, где&lt;br /&gt;           // $browser – идентификация браузера пользователя:&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;           &lt;i&gt;&lt;font color="gray"&gt;// $browser = (!empty($_SERVER['HTTP_USER_AGENT'])) ? htmlspecialchars((string) $_SERVER['HTTP_USER_AGENT']) : '';&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;	 $db-&amp;gt;query_found_rows("select SQL_CALC_FOUND_ROWS `session_user_id` from `phpbb_sessions` where `session_id`='".$db-&amp;gt;safesql(session_id())."'");&lt;br /&gt;	 if($db-&amp;gt;found_rows==0)&lt;br /&gt;		  $db-&amp;gt;query('insert into `phpbb_sessions` &lt;br /&gt;			                           (`session_id`, `session_user_id`, `session_last_visit`, `session_start`, `session_time`, &lt;br /&gt;			                            `session_viewonline`, `session_browser`, `session_ip`, `session_autologin`)&lt;br /&gt;			                            values('".session_id() ."',  $user_id,  time(), time(), time(), 1, $browser, '".$_SERVER['REMOTE_ADDR']."', $autologin));&lt;br /&gt;          else&lt;br /&gt;	         $db-&amp;gt;query("update `phpbb_sessions` &lt;br /&gt;		                           			set `session_user_id`=$user_id, `session_last_visit`=".time().", `session_start`=".time().",&lt;br /&gt;			                               			`session_time`=".time().",  `session_viewonline`=1, `session_browser`='".$db-&amp;gt;safesql($browser)."',&lt;br /&gt;			                               			`session_ip`='".$_SERVER['REMOTE_ADDR']."'&lt;br /&gt;			                                    where `session_id`='".$db-&amp;gt;safesql(session_id())."'"); &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3.&lt;/b&gt; Теперь нужно найти место, куда мы вставим код проверки времени последнего посещения пользователя и код обновления времени последнего посещения, вроде этого:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;// &lt;font color="gray"&gt;время жизни сессии&lt;/font&gt;&lt;br /&gt;$config['session_life'] = ($autologin ? 86400 * $config['session_autologin_life']: $config['session_life']);&lt;br /&gt;&lt;br /&gt;if (time()-($user['user_lastvisit']+60)) &amp;gt; $config['cookie_life']) &lt;br /&gt;    &lt;i&gt;&lt;font color="gray"&gt;// функция выхода из сайта&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;    logout();&lt;br /&gt;&lt;br /&gt;	if (time() - $user['user_lastvisit']&amp;gt;60)&lt;br /&gt;                        &lt;i&gt;&lt;font color="gray"&gt;// функция обновления времени последнего посещения пользователя, в которой  также обновляем время посещения на форуме:&lt;br /&gt;$db-&amp;gt;query("update `phpbb_sessions` set `session_last_time`=".time().", `session_time`=".time()." where `session_id` = '".$db-&amp;gt;safesql($sess_id)."'"); &lt;/font&gt;&lt;/i&gt;&lt;br /&gt;	 	last_time_update($user['user_id']);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Тем самым мы проверяем время неактивности пользователя и если оно больше разрешенного, то «выкидываем» его.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4.&lt;/b&gt; Далее замыкаем регистрацию нового пользователя и выход пользователя с сайта на "сайтовую" часть. Для этого в файле форума ucp.php в секции case 'register' и 'logout' добавляем эти соотвествующие коды:&lt;br /&gt;&lt;br /&gt;	&lt;code&gt;case 'register':&lt;br /&gt;            &lt;i&gt;&lt;font color="gray"&gt;// здесь ваша ссылка на скрипт регистрации&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;header('location: http://'.$_SERVER['HTTP_HOST'].'/register/');&lt;br /&gt;	exit();&lt;/code&gt;&lt;br /&gt;          &lt;br /&gt;          &lt;code&gt; case 'logout':&lt;br /&gt;            &lt;i&gt;&lt;font color="gray"&gt;// здесь ваша ссылка на скрипт выхода с сайта&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;	header('location: http://'.$_SERVER['HTTP_HOST'].'/logout/');&lt;br /&gt;	exit();&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;т.е. перенаправлен пользователя на наши скрипты.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5.&lt;/b&gt; После чего модифицируем скрипт регистрации, добавив в него эти строчки :&lt;br /&gt;               &lt;br /&gt;&lt;br /&gt;             &lt;code&gt;&lt;i&gt;&lt;font color="gray"&gt;// делаем хэш, полученного пароля ($pass - пароль полученный при регистрации)&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;             $hpass = phpbb_hash($pass);&lt;br /&gt;              &lt;i&gt;&lt;font color="gray"&gt;// хэш почтового ящика ($email - адрес электронной почты полученный при регистрации)&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;              $hemail = crc32(strtolower($email) . strlen($email));&lt;br /&gt;             ...&lt;br /&gt;           &lt;i&gt;&lt;font color="gray"&gt; // после всех ваших проверок (если таковые имеются) добавляем юзера&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;           $db-&amp;gt;query("insert into `phpbb_users` &lt;br /&gt;                            (`username`, `username_clean`, `user_email`, `user_email_hash`, `user_password`, `user_regdate`, `user_form_salt`, group_id`, `user_permissions`, `user_ip`) values ('".$username."', '".strtolower($username) ."', '". $email ."', '".$hemail."', '".$hpass."',  time(), '".unique_id()."',  2, '', '".$_SERVER['REMOTE_ADDR']. "'");&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  	  $db-&amp;gt;query("insert into`phpbb_user_group`&lt;br /&gt;                           (`user_id`, `user_pending`, `group_id`)&lt;br /&gt;                            values (".$db-&amp;gt;insert_id().", 0, 2)");&lt;br /&gt;&lt;br /&gt;	&lt;i&gt;&lt;font color="gray"&gt;// обновляем статистику форума&lt;br /&gt;            // где $user_id – идентификатор нового пользователя, а $username – его имя&lt;br /&gt;           // и увеличиваем счетчик юзеров в phpbb&lt;/font&gt;&lt;/i&gt;&lt;br /&gt; 	$db-&amp;gt;query("update `phpbb_config` set `config_value`=`config_value`+1 where `config_name`='num_users'");&lt;br /&gt; 	&lt;i&gt;&lt;font color="gray"&gt;// добавляем информацию о новом юзере&lt;/font&gt;&lt;/i&gt;&lt;br /&gt; 	$db-&amp;gt;query("update `phpbb_config` set `config_value`=$user_id where `config_name`='newest_user_id'");&lt;br /&gt; 	$db-&amp;gt;query("update `phpbb_config` set `config_value`='$username' where `config_name`='newest_username'");&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;В скрипте (функции) выхода с сайта необходимо удалять все куки.&lt;br /&gt;&lt;br /&gt;На этом модификацию «сайтовой» части заканчиваем и приступаем к форумной.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Модификация «форумной» части&lt;/h4&gt;&lt;br /&gt;Здесь нам нужен всего лишь один файл – forum/includes/session.php, находим в нем функцию session_create, в ней ищем строчку if($bot), перед кодом установки форумных кук добавляем:&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;code&gt;if($this-&amp;gt;data['user_id']!=ANONYMOUS){&lt;br /&gt;&lt;br /&gt;	 &lt;i&gt;&lt;font color="gray"&gt;// этот код запускает сессию с именем сессии&lt;br /&gt;               // как на сайте и пишет в нее данные сессиии ($_SESSION['logged'])&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;      	session_name($config['cookie_name'].'_sid');&lt;br /&gt;	session_id($this-&amp;gt;session_id);&lt;br /&gt;	session_start();&lt;br /&gt;		&lt;br /&gt;	$_SESSION['logged']   = true;&lt;br /&gt;            &lt;br /&gt;           &lt;i&gt; &lt;font color="gray"&gt;// кука – признак автологина &lt;b&gt;сайта&lt;/b&gt;&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;	if($session_autologin) {&lt;br /&gt;	    	$this-&amp;gt;set_cookie($config['cookie_name'].'_a', 1,  $cookie_expire, false);&lt;br /&gt;&lt;br /&gt;	}&lt;br /&gt;       }&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;	Потом, чуть выше по коду, перед строчкой $this-&amp;gt;session_id = $this-&amp;gt;data['session_id'] = md5(unique_id()); вставляем этот код удаления сессии:&lt;br /&gt;&lt;br /&gt;        &lt;code&gt;if(!empty($this-&amp;gt;session_id)) {&lt;br /&gt;			&lt;br /&gt;        	       session_name($config['cookie_name'].'_sid');&lt;br /&gt;	       session_id($this-&amp;gt;session_id);&lt;br /&gt;	       session_start();&lt;br /&gt;		&lt;br /&gt;	       $_SESSION=array();&lt;br /&gt;		&lt;br /&gt;	       session_destroy();&lt;br /&gt;		&lt;br /&gt;	    }&lt;/code&gt;	&lt;br /&gt;&lt;br /&gt;Напомню, что я привожу пример, где авторизация на сайте сделана через сессии, поэтому этот код необходим для удаления данных сессии, т.к. в противном случае, если форум «выкинет» пользователя, то его сессионные данные сохранятся.&lt;br /&gt;&lt;br /&gt;Затем,   идем в функцию session_begin. В ней  изменим условие проверки кук с || на &amp;&amp;  (в самом начале функции), т.е.:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;if (isset($_COOKIE[$config['cookie_name'] . '_sid']) &amp;&amp; isset($_COOKIE[$config['cookie_name'] . '_u']))&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;тем самым заставим авторизироваться на форуме только при наличии сессионной куки и куки с идентификатором пользователя.&lt;br /&gt;	&lt;br /&gt;&lt;br /&gt;Напоследок, немного изменим функцию set_cookie, чтобы она могла ставить и наши куки:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;function set_cookie($name, $cookiedata, $cookietime, $phpbb=true){&lt;br /&gt;            &lt;br /&gt;            global $config;&lt;br /&gt;&lt;br /&gt;	if($phpbb)&lt;br /&gt;	       $name_data = rawurlencode($config['cookie_name'] . '_' . $name) . '=' . rawurlencode($cookiedata);&lt;br /&gt;	else&lt;br /&gt;	       $name_data = rawurlencode($name) . '=' . rawurlencode($cookiedata);&lt;br /&gt;        &lt;br /&gt;			&lt;br /&gt;	  $expire = date('D, d-M-Y H:i:s \\G\\M\\T', $cookietime);&lt;br /&gt;	  $domain = (!$config['cookie_domain'] || $config['cookie_domain'] == 'localhost' || $config['cookie_domain'] == '127.0.0.1') ? '' : '; domain=' . $config['cookie_domain'];&lt;br /&gt;&lt;br /&gt;	   header('Set-Cookie: ' . $name_data . (($cookietime) ? '; expires=' . $expire : '') . '; path=' . $config['cookie_path'] . $domain . ((!$config['cookie_secure']) ? '' : '; secure') . '; HttpOnly', false);&lt;br /&gt;&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Здесь кроме, переменной $phpbb я намерено изменил gmdate на date. Забегая вперед, хочу отметить, что полная интеграция возможна лишь при правильном определении часового пояса пользователя и установки кук с учетом этого часового пояса. Все вышеприведенное работать будет, но возникнут небольшие неточности во времени работы сессии с автологином, т.е. при установки времени жизни куки автологина равной 1 дню, мы можем получить, что кука будет жить немного больше(или меньше) 1 дня. Это обусловлено тем, что сервер посылает заголовок Data со времени равным UTC-0, а expires куки ставится в местном времени. Но об этом речь в следующей статье :). &lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Последние штрихи&lt;/h4&gt;&lt;br /&gt;После того как мы модифицировали «форумную» и «серверные» части, необходимо подкорректировать некоторые настройки сайта и форума.&lt;br /&gt;&lt;br /&gt;Во-первых, выше упоминалась константа COOKIE_PREFIX, как уже видно из названия это префикс кук и он должен быть равен префиксу кук форума.&lt;br /&gt;&lt;br /&gt;Во-вторых, время жизни сессии и время действия куки автологина на форуме должны полностью соответствовать время жизни сессии и время действия куки автологина на сайте (что необходимо выставить в настройках форума и сайта). Внимание! Время жизни куки автологина на форуме выставляется в днях, а не в секундах!&lt;br /&gt;&lt;br /&gt;В-третьих, если вы не используете автологин на форуме, то на сайте его также не нужно использовать и наоборот :).&lt;br /&gt;&lt;br /&gt;В-четвертых, я намеренно (для упрощения) не использовал постоянный ключ сессии при автологине, который используется для повышения безопасности при авторизации на форуме (кука с названием COOKIE_PREFIX.'_k') и просто закомментировал у себя в файле /forum/includes/session.php строчку &lt;i&gt;$this-&amp;gt;set_login_key();&lt;/i&gt;. Если вы надумайте использовать его, то необходимо будет еще при авторизации пользователя устанавливать (обновлять) этот ключ.&lt;br /&gt;&lt;br /&gt;(c) andrvm&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:andrvm:3707</id>
    <link rel="alternate" type="text/html" href="http://andrvm.livejournal.com/3707.html"/>
    <link rel="self" type="text/xml" href="http://andrvm.livejournal.com/data/atom/?itemid=3707"/>
    <title>Перехват fatal error в php</title>
    <published>2009-03-23T20:10:37Z</published>
    <updated>2009-04-06T18:53:04Z</updated>
    <category term="php"/>
    <content type="html">Помоему эти три ссылки как-то противоречат друг другу?&lt;br /&gt;Вот &lt;a href="http://dklab.ru/chicken/nablas/45.html"&gt;Котеров&lt;/a&gt; пишет, что "&lt;i&gt;назначенные по register_shutdown_function функции-финализаторы скрипта также не вызываются при наступлении фатальной ошибки&lt;/i&gt;".&lt;br /&gt;&lt;a href="http://ru2.php.net/register_shutdown_function"&gt;В официальной документации&lt;/a&gt; говорится, что  "&lt;i&gt;зарегистрированные register_shutdown_function() функции будут вызваны после того, как запрос выполнен окончательно (включая отсылку любых буферов вывода), &lt;b&gt;соответственно вы не сможете из этих функций вывести что-либо в броузер, используя echo() или print(), или возвратить содержимое какого-либо буфера вывода, используя ob_get_contents()&lt;/b&gt;&lt;/i&gt;".&lt;br /&gt;А вот решение предложеное &lt;a href="http://takanotsume.wordpress.com/2008/07/08/php-catch-a-fatal-error/"&gt;здесь&lt;/a&gt; использую я (с небольшим изменением), хоть оно и противоречит вышеприведенным ссылкам. Может просто у Котерова статья старовата (2007 год). А в официальной документации может русский перевод не соответствует оригиналу..хз, но тем не менее это работает.&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;pre&gt;&lt;font color="green"&gt;
function fatal_error_handler()
{
   global $fatal_error;
    
   if ($fatal_error) {
   	    // показываем шаблон
   	    ob_start();
   		include('fatal_error.tpl');
   		$content = ob_get_contents();
   	    ob_end_clean();
   	    echo $content;
     		
   }		
   else
        return false;		
}
&lt;/font&gt;&lt;/pre&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:andrvm:3421</id>
    <link rel="alternate" type="text/html" href="http://andrvm.livejournal.com/3421.html"/>
    <link rel="self" type="text/xml" href="http://andrvm.livejournal.com/data/atom/?itemid=3421"/>
    <title>Автоподбор блоков по высоте с помощью js</title>
    <published>2009-03-02T14:23:59Z</published>
    <updated>2009-03-04T20:25:46Z</updated>
    <category term="js"/>
    <category term="prototype"/>
    <content type="html">Столкнулся с задачей выравнивания блоков на странице по высоте. Решил не искать решений на стороне, а использовать собственное (с использованием  Prototype), благо он использовался в проекте. &lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;font color="green"&gt;Object.extend(Array.prototype, {
  		autoHeight: function(){
  			var tmpH=0;
  			this.each(function(item){
      			$(item).setStyle({height:tmpH+'px'});}.bind(
      			    this.each(function(item){
  					var h_= parseInt($(item).getStyle('height'),  10);	
    					tmpH  = h_ &amp;gt; tmpH ?  h_ : tmpH;
      			    })));
  		}
 });

// пример использования
$$('#male-female div.outer').autoHeight();
$('good', 'bad').autoHeight();
&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;strong&gt;Минус:&lt;/strong&gt;&lt;br /&gt; 1. нельзя переопределить высоту блока, если в таблице стилей определено свойство &lt;font color="blue"&gt;height&lt;/font&gt; с использованием &lt;font color="blue"&gt;!important&lt;/font&gt;.&lt;br /&gt;&lt;br /&gt;P.S. Внес коррективы с учетом &lt;a href="http://community.livejournal.com/ru_webdev/2694726.html#cutid1"&gt;этого&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;(с) andrvm&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:andrvm:3133</id>
    <link rel="alternate" type="text/html" href="http://andrvm.livejournal.com/3133.html"/>
    <link rel="self" type="text/xml" href="http://andrvm.livejournal.com/data/atom/?itemid=3133"/>
    <title>3-х пиксельный баг IE6. Еще раз.</title>
    <published>2008-03-07T20:43:27Z</published>
    <updated>2008-03-07T20:48:46Z</updated>
    <category term="html css"/>
    <content type="html">Казалось бы все просто: решение все знают, да и в инете полно об этом написано. НО! Голову чуть не сломал, пока не сверстал, а оказалось как всегда все просто.&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;Итак, для классической ситуации - 2-х колоночного макета (привожу часть кода):&lt;br /&gt;&lt;font color="green"&gt;&lt;pre&gt;
   &amp;lt;div id="content"&amp;gt;
       &amp;lt;!-- левая колонка --&amp;gt;
       &amp;lt;div id="left_column"&amp;gt;
       &amp;lt;/div&amp;gt;
       &amp;lt;!-- правая колонка --&amp;gt;
       &amp;lt;div id="right_column"&amp;gt;
       &lt;font color="blue"&gt;&amp;lt;p&amp;gt;некий абзац&amp;lt;/p&amp;gt;&lt;/font&gt;
       &amp;lt;/div&amp;gt;
   &amp;lt;/div&amp;gt;
&lt;/pre&gt;&lt;/font&gt;&lt;br /&gt;где&lt;br /&gt;&lt;font color="orange"&gt;&lt;pre&gt;
#content #left_column
                {float:left; width:420px;}
#content #right_column
                {margin-left:420px;}
&lt;/pre&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;когда абзац &amp;lt;p&amp;gt; находился напротив плавающего блока, появлялся 3 пиксельный отступ (классическая ситуация). Так вот, никакие "танцы с бубном" с height:1%, а также с отрицательными маргинами не помогали.&lt;br /&gt;Решение пришло неожиданно (глаз "замылился" наверное) и очевидное - попробывать для ие сверстать&lt;br /&gt;2 колонки иначе:&lt;br /&gt;&lt;font color="orange"&gt;&lt;pre&gt;
#content #left_column
                {float:left; width:420px;}
#content #right_column
                {float:right; margin-left:0;}
&lt;/pre&gt;&lt;/font&gt;&lt;br /&gt;и сразу все стало на свои места и без всяких извратов с height :).&lt;br /&gt;&lt;br /&gt;(с) andrvm&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:andrvm:2875</id>
    <link rel="alternate" type="text/html" href="http://andrvm.livejournal.com/2875.html"/>
    <link rel="self" type="text/xml" href="http://andrvm.livejournal.com/data/atom/?itemid=2875"/>
    <title>Часовые пояса MySQL</title>
    <published>2008-01-21T09:36:06Z</published>
    <updated>2008-01-21T17:58:29Z</updated>
    <category term="mysql"/>
    <content type="html">Чорт возьми все оказывается так просто:&lt;br /&gt;&lt;font color="green"&gt;set time_zone='+03:00'; (например, для Москвы)&lt;/font&gt;&lt;br /&gt;и все - пользователь работает в своем часовом поясе.&lt;br /&gt;&lt;br /&gt;Для реализации необходимо, например при регистрации, попросить указать пользователя его часовой пояс, сохранить его в формате '+00:00' (со знаком). Далее  после авторизации пользователя и соединения с базой послать запрос (к примеру):&lt;br /&gt;&lt;font color="green"&gt;&lt;br /&gt;mysql_connect("localhost","root","");&lt;br /&gt;mysql_select_db("test");&lt;br /&gt;mysql_query("set time_zone=' ". $user['time_zone']. " ' ");&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;При этом те поля временных данных, что мы собираемся отдавать пользователю с учетом его часового пояса, дожны иметь тип &lt;b&gt;TIMESTAMP&lt;/b&gt;. Только этот тип в MySQL уметь работать с часовым поясом.&lt;br /&gt;&lt;br /&gt;P.S.:&lt;br /&gt;1. ссылка по теме &lt;a href="http://sqlinfo.ru/forum/viewtopic.php?id=86"&gt;http://sqlinfo.ru/forum/viewtopic.php?id=86&lt;/a&gt;&lt;br /&gt;2. доступно с 4.1.3</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:andrvm:2590</id>
    <link rel="alternate" type="text/html" href="http://andrvm.livejournal.com/2590.html"/>
    <link rel="self" type="text/xml" href="http://andrvm.livejournal.com/data/atom/?itemid=2590"/>
    <title>Работа c SimpleXml с помощью Xpath</title>
    <published>2008-01-08T10:06:55Z</published>
    <updated>2009-10-08T17:07:38Z</updated>
    <category term="php"/>
    <content type="html">&lt;h3&gt;&lt;font color="purple"&gt;Устройство&lt;/font&gt;&lt;/h3&gt;&lt;br /&gt;SimpleXml – встроенное в php5 расширение для работы с XML (доступно по умолчанию). Суть работы, которого заключается в преобразовании XML документа в некий объект (типа SimpleXMLElement).&lt;br /&gt;После преобразования любой узел XML документа может быть представлен объектом SimpleXMLElement, который по сути является массивом.&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;Например, пусть имеется XML документ, представленный ниже: &lt;br /&gt;&lt;pre&gt;&lt;font color="blue"&gt;&amp;lt;?xml version="1.0" encoding="utf-8" standalone="yes"?&amp;gt;
&amp;lt;html&amp;gt;
 &amp;lt;body&amp;gt;
   &amp;lt;div id="head"&amp;gt;text&amp;lt;/div&amp;gt;
   &amp;lt;div id="content"&amp;gt;
      &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
      &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
      &amp;lt;p&amp;gt;
	  &amp;lt;label&amp;gt;text&amp;lt;/label&amp;gt;
      &amp;lt;/p&amp;gt;
      &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
   &amp;lt;/div&amp;gt;
   &amp;lt;div id="footer"&amp;gt;
     text
     &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
     &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
   &amp;lt;/div&amp;gt;
 &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/font&gt;&lt;/pre&gt;после преобразования SimpleXml:&lt;br /&gt;&lt;font color="green"&gt;$xml = simplexml_load_file($xmlfile);&lt;/font&gt;&lt;br /&gt;или&lt;br /&gt;&lt;font color="green"&gt;$xml = simplexml_load_string($xmlstring);&lt;/font&gt;&lt;br /&gt;смотря, где у нас расположен XML документ (в файле или строке)&lt;br /&gt;&lt;br /&gt;мы получим объект &lt;font color="green"&gt;$xml&lt;/font&gt; типа SimpleXMLElement, который содержит другие такие же SimpleXMLElement объекты (соответствующие преобразованные узлы исходного XML документа).&lt;br /&gt;&lt;br /&gt;Т.е. узел (в данном случае корень)  &lt;font color="blue"&gt;&amp;lt;html&amp;gt;&amp;lt;/html&amp;gt;&lt;/font&gt; это сам &lt;font color="green"&gt;$xml&lt;/font&gt; или &lt;font color="green"&gt;$xml[0]&lt;/font&gt; (помните про массивы?), а узел &lt;font color="blue"&gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&lt;/font&gt; это &lt;font color="green"&gt;$xml-&amp;gt;body&lt;/font&gt; (&lt;font color="green"&gt;$xml[0]-&amp;gt;body[0]&lt;/font&gt; или &lt;font color="green"&gt;$xml-&amp;gt;body[0]&lt;/font&gt;), а узел &lt;font color="blue"&gt;&amp;lt;div id="footer"&amp;gt;&amp;lt;/div&amp;gt;&lt;/font&gt; это &lt;font color="green"&gt;$xml-&amp;gt;body-&amp;gt;div[2]&lt;/font&gt; или &lt;font color="green"&gt;$xml[0]-&amp;gt;body[0]-&amp;gt;div[2]&lt;/font&gt;.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Далее необходимо сделать некоторые пояснения (для наглядности, на примере узла &lt;font color="blue"&gt;&amp;lt;div&amp;gt;&lt;/font&gt;):&lt;/u&gt;&lt;br /&gt;&lt;b&gt;1.&lt;/b&gt; Объект SimpleXMLElement всегда указывает на &lt;b&gt;текстовое содержимое&lt;/b&gt; одноименного узла, т.е. текст, который содержится между &lt;font color="blue"&gt;&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;/font&gt;, при этом (для случая чтения) записи div и div[0] эквивалентны, т.е. они обе всегда указывают на 1-й элемент массива.&lt;br /&gt;(т.е. &lt;font color="green"&gt;echo $xml-&amp;gt;body-&amp;gt;div&lt;/font&gt; выведет &lt;font color="blue"&gt;'text'&lt;/font&gt;, и &lt;font color="green"&gt;echo $xml-&amp;gt;body-&amp;gt;div[0]&lt;/font&gt; тоже выведет &lt;font color="blue"&gt;'text'&lt;/font&gt;. А вот &lt;font color="green"&gt;echo $xml-&amp;gt;body-&amp;gt;div[1]&lt;/font&gt; уже не выведет ничего, т.к. в &lt;font color="blue"&gt; &amp;lt;div id="content"&amp;gt;&amp;lt;/div&amp;gt;&lt;/font&gt;	нет текстового содержимого).&lt;br /&gt;&lt;b&gt;2.&lt;/b&gt; Исходя из вышесказанного для изменения текстового содержимого узла документа XML достаточно выполнить:&lt;br /&gt;	а) &lt;font color="green"&gt;$xml-&amp;gt;body-&amp;gt;div='test1'&lt;/font&gt; (этот вариант будет работать только если div единственный потомок своего родителя, в противном случае выскочит Warning.&lt;br /&gt;	б) &lt;font color="green"&gt;$xml-&amp;gt;body-&amp;gt;div[0]='test1'&lt;/font&gt; (этот вариант будет работать всегда, но при этом &lt;b&gt;потомки не учитываются!, &lt;/b&gt;т.е. &lt;font color="green"&gt;$xml-&amp;gt;body-&amp;gt;div[1]='test1'&lt;/font&gt; уничтожит всех потомков &lt;font color="blue"&gt;&amp;lt;div id="content"&amp;gt;&lt;/font&gt; оставив &lt;font color="blue"&gt;&amp;lt;div="content"&amp;gt;text1&amp;lt;/div&amp;gt;&lt;/font&gt;).&lt;br /&gt;&lt;b&gt;3.&lt;/b&gt; Помните про то, что каждый узел в представлении SimpleXML это массив? Так вот (как можно было заметить из приведенных выше примеров), если одноименный потомок у родителя один, то это массив из одного элемента, а если их несколько, то соотвестственно массив из нескольких элементов.&lt;br /&gt;(т.е. как видим из исходного XML документа, &lt;font color="green"&gt;$xml-&amp;gt;body[0]&lt;/font&gt; - массив из 1 элемента, а &lt;font color="green"&gt;$xml-&amp;gt;body-&amp;gt;div&lt;/font&gt; - массив из нескольких элементов.)&lt;br /&gt;&lt;b&gt;4.&lt;/b&gt; Если у узла в исходном XML документе имеются свойства или при добавлении оных средствами SimpleXML, то к объекту SimpleXMLElement можно обращаться как двухмерному массиву, где 2-ой массив - массив свойств.&lt;br /&gt;(т.е. &lt;font color="green"&gt;echo $xml-&amp;gt;body-&amp;gt;div[0]['id']&lt;/font&gt; выведет &lt;font color="blue"&gt;head&lt;/font&gt;, а &lt;font color="green"&gt;$xml-&amp;gt;body-&amp;gt;div[0]['id']='new_id'&lt;/font&gt; установит новое свойство id).&lt;br /&gt;И соответсвенно, если у узла нет свойств, то их можно добавить так: &lt;font color="green"&gt;$xml-&amp;gt;body[0]['id']='body_id'&lt;/font&gt;.&lt;br /&gt;&lt;b&gt;5.&lt;/b&gt; Помимо всего объект SimpleXMLElement имеет свои методы, о которых можно узнать из &lt;a href="http://ru2.php.net/manual/en/ref.simplexml.php"&gt;официальной документации&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Таким образом мы можем обратиться к любому узлу. Но стоит заметить, что чем больше вложенность узлов, тем неудобней к ним обращаться: например, чтобы обратиться к узлу &lt;font color="blue"&gt;&amp;lt;label&amp;gt;&amp;lt;/label&amp;gt;&lt;/font&gt; нам потребуется написать следующее:&lt;br /&gt;&lt;font color="green"&gt;$xml-&amp;gt;body-&amp;gt;div[1]-&amp;gt;p[2]-&amp;gt;label&lt;/font&gt;.&lt;br /&gt;А если вложенность будет еще больше? То вышеприведенная строчка может удлиниться. К счастью есть такая штука как &lt;a href="http://www.w3.org/TR/xpath20/"&gt;Xpath&lt;/a&gt; и SimpleXML может с ней работать.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;font color="purple"&gt;Xpath&lt;/font&gt;&lt;/h3&gt;&lt;br /&gt;Для работы с Xpath достаточно обратиться c нужным запросом к методу xpath(), который выполнит поиск и вернет нам массив найденных объектов SimpleXMLElement, которые будут соответствовать узлам преобразованного XML документа. Например:&lt;br /&gt;&lt;font color="green"&gt;$result = $xml-&amp;gt;Xpath("//*");&lt;/font&gt; - найдет вообще все объекты;&lt;br /&gt;&lt;font color="green"&gt;$result = $xml-&amp;gt;Xpath("//div");&lt;/font&gt; - найдет все объекты div;&lt;br /&gt;&lt;font color="green"&gt;$result = $xml-&amp;gt;Xpath("//div[@id='head']");&lt;/font&gt; - найдет 1 объект div c id = head;&lt;br /&gt;&lt;font color="green"&gt;$result = $xml-&amp;gt;Xpath("//*[text()='text']");&lt;/font&gt; - найдет все объекты, текстовое содержание которых = 'text'.&lt;br /&gt;&lt;br /&gt;И так далее, подробнее о функциях и предикатах Xpath можно узнать из официальной документации по Xpath, стоит заметить, что не все они подходят для использования в методе xpath().&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;font color="purple"&gt;Обобщение&lt;/font&gt;&lt;/h3&gt;&lt;br /&gt;С учетом вышесказанного можно создать так называемые "обертки" (&lt;a href="http://andrvm.ru/various/smplxmlfunc.txt"&gt;например&lt;/a&gt;) вокруг метода xpath(), с помощью которых можно делать такие вещи:&lt;br /&gt;&amp;lt;?php&lt;br /&gt;&lt;font color="blue"&gt;// подключаем "обертку"&lt;/font&gt;&lt;br /&gt;&lt;font color="green"&gt;require_once('smplxmlfunc.php');&lt;/font&gt;&lt;br /&gt;&lt;font color="blue"&gt;// преобразуем XML документ&lt;/font&gt;&lt;br /&gt;&lt;font color="green"&gt;$xml = simplexml_load_file($xmlfile);&lt;/font&gt;&lt;br /&gt;		&lt;br /&gt;&lt;font color="blue"&gt;/**&lt;br /&gt;                    * работаем с "обертками"&lt;br /&gt;                    */&lt;br /&gt;                   // устанавливаем всем div уникальные ID&lt;/font&gt;&lt;br /&gt;&lt;font color="green"&gt;setId($xml, '//div');&lt;/font&gt;&lt;br /&gt;&lt;font color="blue"&gt;// добавляем в div картинки&lt;/font&gt;&lt;br /&gt;&lt;font color="green"&gt;addNode($xml, '//div', 'img');&lt;/font&gt;&lt;br /&gt;&lt;font color="blue"&gt;// задаем картинкам атрибут alt&lt;/font&gt;&lt;br /&gt;&lt;font color="green"&gt;addAtrribute($xml, '//div/img', 'alt');&lt;/font&gt;&lt;br /&gt;&lt;font color="blue"&gt;// удаляем div с id=3 со всеми потомками&lt;/font&gt;&lt;br /&gt;&lt;font color="green"&gt;removeNode($xml, "//div[@id='3']", 'all');&lt;/font&gt;&lt;br /&gt;		&lt;br /&gt;&lt;font color="blue"&gt;// сохраняем&lt;/font&gt;&lt;br /&gt;&lt;font color="green"&gt;$xml-&amp;gt;asXML($xmlfile);&lt;/font&gt;&lt;br /&gt;&lt;font color="blue"&gt;// при необходимости форматируем (убираем лишние пробелы, расставляем табуляцию для читабельности)&lt;/font&gt;&lt;br /&gt;&lt;font color="green"&gt;trimXml($xmlfile);&lt;/font&gt;&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;br /&gt;(c) andrvm&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:andrvm:2468</id>
    <link rel="alternate" type="text/html" href="http://andrvm.livejournal.com/2468.html"/>
    <link rel="self" type="text/xml" href="http://andrvm.livejournal.com/data/atom/?itemid=2468"/>
    <title>Абсолютный минимум от Джоэла Сполски</title>
    <published>2008-01-08T09:29:23Z</published>
    <updated>2008-01-08T09:30:58Z</updated>
    <category term="php"/>
    <content type="html">Вывод из той статьи таков:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Нет Такой Вещи Как Простой Текст.&lt;/b&gt; Если у вас есть строка, в памяти, в файле, или в сообщении электронной почты, вы должны знать, в какой она кодировке, иначе вы не сможете ее правильно интерпретировать или показать пользователю. Почти все глупые проблемы типа "мой вебсайт похож на тарабарщину" или "она не может читать мои электронные письма, если я использую символы с ударениями" сводятся к одному наивному программисту, который не понимает того простого факта, что если вы не говорите мне, находится ли специфическая строка в кодировке UTF-8 или ASCII или ISO 8859-1 (Латинский-1) или Windows 1252 (Западноевропейский), вы просто не сможете показать ее правильно или даже выяснить, где она заканчивается...&lt;br /&gt;&lt;br /&gt;Доступна &lt;a href="http://local.joelonsoftware.com/mediawiki/index.php/Абсолютный_Минимум%2C_который_Каждый_Разработчик_Программного_Обеспечения_Обязательно_Должен_Знать_о_Unicode_и_Наборах_Символов"&gt;здесь&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Имхо, знать как отче наш.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:andrvm:2238</id>
    <link rel="alternate" type="text/html" href="http://andrvm.livejournal.com/2238.html"/>
    <link rel="self" type="text/xml" href="http://andrvm.livejournal.com/data/atom/?itemid=2238"/>
    <title>Верстка в 3 колонки. Макет.</title>
    <published>2007-12-20T06:36:11Z</published>
    <updated>2007-12-24T22:03:09Z</updated>
    <category term="html css"/>
    <content type="html">Как вариант - &lt;a href="http://andrvm.ru/various/3_column_template.zip"&gt;Образец&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(с) andrvm.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:andrvm:2043</id>
    <link rel="alternate" type="text/html" href="http://andrvm.livejournal.com/2043.html"/>
    <link rel="self" type="text/xml" href="http://andrvm.livejournal.com/data/atom/?itemid=2043"/>
    <title>Верстка с разными background-ми</title>
    <published>2007-12-17T20:30:40Z</published>
    <updated>2007-12-20T06:40:24Z</updated>
    <category term="html css"/>
    <content type="html">Всем известно, что существует несколько способов создания background для колонок: это и метод ложных колонок, и отрицательные маргины и паддинги, и дублирующий слой с z-index=-1, лежащий под body (например: &lt;a href="http://softwaremaniacs.org/blog/2006/06/14/css-layout-flex/#comment-25290"&gt;1&lt;a&gt;, &lt;a href="http://www.pmob.co.uk/temp/3colfixedtest_4.htm"&gt;2&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Но иногда для решения определенных задач эти способы могут оказаться неприемлемыми, например для верстки 3 колоночного макета с резиновым центром: ложные колонки с бесконечной длиной картинки хороши лишь для фиксированных макетов; отрицательные маргины и паддинги может и хороши, но мне так и не удалось заставить их работать кроссбраузерно; дублирующий слой нарушает семантику.&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt; &lt;br /&gt;На ум приходит еще один вариант с использованием 2 background без нарушений семантики и для резинового макета: с использованием html как контейнера, общая идея выглядит так:&lt;br /&gt;&lt;font color="green"&gt;&lt;br /&gt;html    {height:100%; background:#e4e4e4 url(background_1.gif) repeat-y right top;}&lt;br /&gt;&lt;br /&gt;body    {background: url(background_2.gif) repeat-y left top; position:relative; margin:0 auto;&lt;br /&gt;         min-height:100%; height:auto !important; height:100%; z-index:0;}&lt;br /&gt;&lt;br /&gt;html, body&lt;br /&gt;        {width:100%; min-width:790px; max-width:1280px;}&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://community.livejournal.com/ru_webdev/2280729.html"&gt;Обсуждение&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(c) andrvm&lt;br /&gt;&lt;/a&gt;&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:andrvm:1788</id>
    <link rel="alternate" type="text/html" href="http://andrvm.livejournal.com/1788.html"/>
    <link rel="self" type="text/xml" href="http://andrvm.livejournal.com/data/atom/?itemid=1788"/>
    <title>Автоочистка тэмпов</title>
    <published>2007-12-04T06:27:50Z</published>
    <updated>2007-12-04T09:25:25Z</updated>
    <category term="vbs"/>
    <content type="html">Завалялась штука у меня одна интересная - скрипт очистки временных папок от всякого мусора. Удобная штука, написал еще давно - тренировался в vbs, вообщем надо выложить.&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;Исходник:&lt;br /&gt;&lt;font color="red"&gt;============ файл clear.vbs (добавить в автозагрузку) ====================================&lt;/font&gt;&lt;br /&gt;&lt;font color="green"&gt;'Очищаем временные папки&lt;/font&gt;&lt;br /&gt;Dim fso, fso1, sfso, i, s, file, files&lt;br /&gt;Dim folder_count, file_count&lt;br /&gt;Dim d_temp,c_temp, local_temp,Cookie,internet_temp, log&lt;br /&gt;Dim s_, folder_count_, file_count_ ,folder_&lt;br /&gt;&lt;br /&gt;set fso = CreateObject("Scripting.FileSystemObject")&lt;br /&gt;&lt;font color="green"&gt;' папочки можно и дополнить&lt;/font&gt;&lt;br /&gt;d_temp = "c:\windows\temp"&lt;br /&gt;c_temp = "c:\temp"&lt;br /&gt;local_temp = "c:\Documents and Settings\** - здесь подправить - **\Local Settings\Temp"&lt;br /&gt;Cookie = "c:\Documents and Settings\** - здесь подправить - **\Cookies"&lt;br /&gt;internet_temp = "c:\Documents and Settings\** - здесь подправить - **\Local Settings\Temporary Internet Files\Content.IE5"&lt;br /&gt;&lt;font color="green"&gt;'файл лога, необходимо создать пердварительно&lt;/font&gt;&lt;br /&gt;log = "d:\clear.log"&lt;br /&gt;doc = "c:\Documents and Settings\** - здесь подправить - **\Recent"&lt;br /&gt;opera_cache = "C:\Documents and Settings\** - здесь подправить - **\Application Data\Opera\Opera\profile\cache4\"&lt;br /&gt;&lt;br /&gt;&lt;font color="green"&gt;'процедура инициализации&lt;/font&gt;&lt;br /&gt;sub init&lt;br /&gt;	on error resume next&lt;br /&gt;	set file = fso.GetFile (log)&lt;br /&gt;	if fso.FileExists(log) then &lt;br /&gt;	   if file.size &amp;gt; 1024000 then WScript.Echo "Внимание!"  &amp; CHR (13) &amp; CHR (10) &amp; "Размер лога больше 1 Мб"&lt;br /&gt;	end if&lt;br /&gt;	&lt;br /&gt;	set file = fso.OpenTextFile(log, 8, true)&lt;br /&gt;	&lt;br /&gt;	s= "Очистка временных файлов от : " &amp; Date &amp; " " &amp; Time &amp; CHR (13) &amp; CHR (10)&lt;br /&gt;	s=s+"CopyRight @ andrvm"  + CHR (13) + CHR (10)&lt;br /&gt;	&lt;br /&gt;	file.Write s&lt;br /&gt;	&lt;br /&gt;	set file=nothing&lt;br /&gt;end sub&lt;br /&gt;&lt;br /&gt;&lt;font color="green"&gt;'процедура финализации&lt;/font&gt;&lt;br /&gt;sub final&lt;br /&gt;	set file = fso.OpenTextFile(log, 8, true)&lt;br /&gt;	s = CHR (13) &amp; CHR (10) &amp; "Всего папок - " &amp; Folder_Count &amp; CHR (13) &amp; CHR (10) &amp; "Всего файлов - " &amp; File_count &amp; CHR (13) &amp; CHR (10)&lt;br /&gt;	file.Write s&lt;br /&gt;	s = "Не удалось удалить папок - " &amp; Folder_Count_ &amp; CHR (13) &amp; CHR (10) &amp; "файлов - " &amp; file_count_ &amp; CHR (13) &amp; CHR (10)&lt;br /&gt;	file.Write s&lt;br /&gt;	s = "Вот они: " &amp; folder_ &amp; CHR (13) &amp; CHR (10) &amp; s_ &amp; CHR (13) &amp; CHR (10)&lt;br /&gt;	file.Write s&lt;br /&gt;	s = "Завершено в " &amp; Time  &amp; CHR (13) &amp; CHR (10)  &amp; CHR (13) &amp; CHR (10)&lt;br /&gt;	file.Write s&lt;br /&gt;	set file = nothing&lt;br /&gt;end sub&lt;br /&gt;&lt;br /&gt;&lt;font color="green"&gt;'процедура удаления файлов в каталоге&lt;/font&gt;&lt;br /&gt;sub dir_clear (dir_name)&lt;br /&gt;if fso.FolderExists(dir_name) then&lt;br /&gt;&lt;font color="green"&gt;'1. сформируем для лога список папок, которые будем удалять (заодно установим нужные аттрибуты)&lt;/font&gt;&lt;br /&gt;    set fso1 = fso.GetFolder (dir_name)&lt;br /&gt;    set sfso=fso1.SubFolders&lt;br /&gt;    Set file = fso.OpenTextFile(log, 8, true)&lt;br /&gt;    &lt;br /&gt;    for each i in sfso&lt;br /&gt;        i.attributes=0&lt;br /&gt;		s= dir_name + "\"&lt;br /&gt;		s = s + i.name + CHR (13) + CHR (10)&lt;br /&gt;		file.Write s&lt;br /&gt;	next&lt;br /&gt;	&lt;br /&gt;	Folder_count = Folder_count + sfso.Count&lt;br /&gt;	&lt;br /&gt;&lt;font color="green"&gt;'2. сформируем для лога список файлов, которые будем удалять (заодно установим нужные аттрибуты)&lt;/font&gt;&lt;br /&gt;    set files = fso1.Files&lt;br /&gt;    for each i in files&lt;br /&gt;        i.attributes=0&lt;br /&gt;		s= dir_name + "\"&lt;br /&gt;		s = s + i.name + CHR (13) + CHR (10)&lt;br /&gt;		file.Write s&lt;br /&gt;	next&lt;br /&gt;	&lt;br /&gt;	File_count = File_count + files.count&lt;br /&gt;	&lt;br /&gt;&lt;font color="green"&gt;'3. Удаляем теперь все&lt;/font&gt;&lt;br /&gt;      &lt;br /&gt;     for each i in files&lt;br /&gt;         on error resume next&lt;br /&gt;         i.Delete&lt;br /&gt;         'если файл не может быть удален&lt;br /&gt;         if err then&lt;br /&gt;            s_= s_ &amp; dir_name &amp; "\" &amp; i.name &amp;  CHR (13) &amp; CHR (10)&lt;br /&gt;            file_count_=file_count_ + 1&lt;br /&gt;         end if&lt;br /&gt;	 next&lt;br /&gt;	 &lt;br /&gt;	 for each i in sfso&lt;br /&gt;        on error resume next&lt;br /&gt;        i.Delete&lt;br /&gt;        &lt;font color="green"&gt;'если папка не может быть удалена&lt;/font&gt;&lt;br /&gt;         if err then&lt;br /&gt;            folder_= folder_ &amp; dir_name &amp; "\" &amp; i.name &amp;  CHR (13) &amp; CHR (10)&lt;br /&gt;            folder_count_=folder_count_ + 1&lt;br /&gt;         end if&lt;br /&gt;	 next&lt;br /&gt;&lt;br /&gt;set file = nothing&lt;br /&gt;set fso1 = nothing&lt;br /&gt;set sfso =	nothing&lt;br /&gt;set files = nothing&lt;br /&gt;&lt;br /&gt;end if&lt;br /&gt;end sub&lt;br /&gt;&lt;br /&gt;&lt;font color="green"&gt;'инициалимзация&lt;/font&gt;&lt;br /&gt;init&lt;br /&gt;&lt;font color="green"&gt;'очищаем&lt;/font&gt;&lt;br /&gt;dir_clear (d_temp)&lt;br /&gt;dir_clear (c_temp)&lt;br /&gt;dir_clear (local_temp)&lt;br /&gt;dir_clear (internet_temp)&lt;br /&gt;dir_clear (Cookie)&lt;br /&gt;dir_clear (doc)&lt;br /&gt;dir_clear (opera_cache)&lt;br /&gt;&lt;font color="green"&gt;'финализация&lt;/font&gt;&lt;br /&gt;final&lt;br /&gt;set fso = nothing&lt;br /&gt;&lt;font color="red"&gt;======================= конец файла clear.vbs ==========================&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;(c) andrvm&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:andrvm:1447</id>
    <link rel="alternate" type="text/html" href="http://andrvm.livejournal.com/1447.html"/>
    <link rel="self" type="text/xml" href="http://andrvm.livejournal.com/data/atom/?itemid=1447"/>
    <title>О блочной верстке (шпаргалка)</title>
    <published>2007-11-29T14:51:00Z</published>
    <updated>2009-02-08T14:24:25Z</updated>
    <category term="html css"/>
    <content type="html">&lt;strong&gt;Преамбула&lt;/strong&gt;&lt;br /&gt;Для тех, кто все таки решился заняться блочной версткой  и незнает с чего начать, посвящается моя скромная подборочка.&lt;br /&gt;Да и может кто еще найдет для себя что-то полезное, аль подскажет что еще =).&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;Для начала, хотелось заметить, что в природе есть табличная верстка (верстка с помощью тэгов &lt;font color="green"&gt;&amp;lt;table&amp;gt;&amp;lt;/table&amp;gt;&lt;/font&gt;,) и семантическая (бестабличная, она же блочная (в моем разговорном =)). Подробнее, например &lt;a href="http://softwaremaniacs.org/blog/2005/06/08/juice-and-flies/"&gt;Сагалаев&lt;/a&gt;, &lt;a href="http://www.html-css.ru/"&gt;О семантической верстке&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Соответственно есть и сторонники/противники этих видов верстки, мнения которых можно почитать здесь:&lt;br /&gt;&lt;a href="http://weblancer.net/articles/3.html"&gt;DIV vs TABLE. Мифы сторонников тега TABLE&lt;/a&gt;&lt;br /&gt;&lt;a href="http://weblancer.net/articles/4.html"&gt;Табличная верстка и бестабличная&lt;/a&gt;&lt;br /&gt;&lt;a href="http://phpclub.ru/talk/showthread.php?s=&amp;amp;threadid=103754&amp;amp;rand=54"&gt;Верстаете ли вы "на DIV-ах"?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Амбула&lt;/strong&gt;&lt;br /&gt;A. Необходимая документация:&lt;br /&gt;Спецификации-&lt;br /&gt;&lt;a href="http://www.w3.org/TR/html401/"&gt;HTML 4.01&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.w3.org/TR/xhtml1/"&gt;XHTML 1.0&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.w3.org/TR/CSS21/"&gt;CSS 2.1&lt;/a&gt;&lt;br /&gt;соотвествующие русские переводы (неофициальные)-&lt;br /&gt;&lt;a href="http://pyramidin.narod.ru/html401/"&gt;HTML 4.01&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www2.stack.ru/~julia/XHTML/xhtml11-20010531/Overview.phtml"&gt;XHTML 1.0&lt;/a&gt;&lt;br /&gt;&lt;a href="http://loc.stack.ru/projects/CSS2/cover.html"&gt;CSS 2&lt;/a&gt;&lt;br /&gt;Также не забудем про доктайп и режимы работы браузеров-&lt;br /&gt;&lt;a href="http://www.webmascon.com/topics/coding/25a.asp"&gt;Почему так важен DOCTYPE&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.opera.com/docs/specs/doctype/index.dml"&gt;The Opera 9 DOCTYPE Switches&lt;/a&gt;&lt;br /&gt;&lt;a href="http://developer.mozilla.org/en/docs/Mozilla&amp;#39;s_DOCTYPE_sniffing"&gt;Mozilla's DOCTYPE sniffing&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/bb250395.aspx#cssenhancements_topic2"&gt;The !DOCTYPE "Switch" (IE)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.igood.ru/view/veb_tehnologii/22.03.2008/sovmestimost_so_starymi_brauzerami_rezhim_quirks_mode/"&gt;Совместимость со старыми браузерами - режим Quirks Mode&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;B. Понимание блочной верстки:&lt;br /&gt;1. &lt;a href="http://www.w3.org/TR/CSS21/visuren.html"&gt;блочные(block) и строковые элементы (inline)&lt;/a&gt;&lt;br /&gt;2. &lt;a href="http://www.w3.org/TR/CSS21/box.html"&gt;Блочная модель&lt;/a&gt;&lt;br /&gt;3. &lt;a href="http://softwaremaniacs.org/blog/2005/08/27/css-layout-flow/"&gt;Раскладка в CSS: поток&lt;/a&gt;&lt;br /&gt;4. &lt;a href="http://softwaremaniacs.org/blog/2005/12/01/css-layout-float/"&gt;Раскладка в CSS: float&lt;/a&gt;&lt;br /&gt;5. &lt;a href="http://softwaremaniacs.org/blog/2005/09/05/css-layout-flow-margins/"&gt;Границы и отступы в потоке&lt;/a&gt;&lt;br /&gt;6. &lt;a href="http://designformasters.info/posts/css-float-theory-and-practice"&gt;CSS Float в теории и на практике (о глюках float)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;C. Полезные ссылки:&lt;br /&gt;1. &lt;a href="http://softwaremaniacs.org"&gt;Сагалаев&lt;/a&gt;&lt;br /&gt;2. &lt;a href="http://htmlbook.ru"&gt;htmlbook.ru&lt;/a&gt;&lt;br /&gt;3. &lt;a href="http://tigir.com/index.htm"&gt;tigir.com (не только css)&lt;/a&gt;&lt;br /&gt;4. &lt;a href="http://softwaremaniacs.org/blog/2005/12/19/xhtml-you-say/"&gt;Сагалаев о XHTML&lt;/a&gt;&lt;br /&gt;5. &lt;a href="http://www.css3.info/category/css3/"&gt;CSS 3.0 (новая спецификация CSS)&lt;/a&gt;&lt;br /&gt;6. &lt;a href="http://globalstats.hotlog.ru/"&gt;Полезная статистика (под что верстать)&lt;/a&gt;&lt;br /&gt;7. &lt;a href="http://xhtml.ru/2005/12/12/body_height_research/"&gt;Исследование высоты BODY&lt;/a&gt;&lt;br /&gt;8. &lt;a href="http://www.pcmag.ru/solutions/sub_detail.php?ID=11032&amp;amp;SUB_PAGE=3"&gt;Семантическая верстка: рецепты&lt;/a&gt;&lt;br /&gt;9. &lt;a href="http://designformasters.info/posts/70-expert-ideas-for-better-css-coding"&gt;70 идей экспертов для улучшения CSS кода&lt;/a&gt;&lt;br /&gt;10. &lt;a href="http://www.regioninfo.ru/look_article.php?key_p=12"&gt;Десятка лучших CSS трюков Трентона Мосса&lt;/a&gt;&lt;br /&gt;11. &lt;a href="http://neveragainblog.com.ua/archives/56"&gt;Подключение стилей в зависимости от браузера&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;D. Интересные решения:&lt;br /&gt;1. &lt;a href="http://www.pmob.co.uk/"&gt;Различные CSS решения (n-колоночные макеты в т.ч.)&lt;/a&gt;&lt;br /&gt;2. &lt;a href="http://tigir.com/opacity.htm"&gt;CSS прозрачность&lt;/a&gt;&lt;br /&gt;3. &lt;a href="http://tigir.com/alpha_png.htm"&gt;PNG-прозрачность в IE 5.5-6&lt;/a&gt;&lt;br /&gt;4. &lt;a href="http://community.livejournal.com/ru_webdev/2228179.html"&gt;О центрировании float&lt;/a&gt;&lt;br /&gt;5. &lt;a href="http://www.mauzon.com/?p=87"&gt;How to center floating list (navigation)&lt;/a&gt;&lt;br&gt;&lt;br /&gt;6. &lt;a href="http://www.dhtmlgoodies.com/index.html?whichTipsAndTricks=input-with-background"&gt;Text input with background image&lt;/a&gt;&lt;br /&gt;7. &lt;a href="http://www.html.it/articoli/nifty/index.html"&gt;Уголки&lt;/a&gt;&lt;br /&gt;8. &lt;a href="http://beholder-eye.info/2006/03/30/dropdown-menu-css"&gt;Выпадающее меню на CSS&lt;/a&gt;&lt;br /&gt;9. резиновое меню (в проекте)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Послеамбула =)&lt;/strong&gt;&lt;br /&gt;Хаки:&lt;br /&gt;1. &lt;font color="green"&gt;*&amp;gt;#srch 	{}&lt;/font&gt; /* так понимает только opera и mozilla */&lt;br /&gt;2. &lt;font color="green"&gt;html:root #srch	{}&lt;/font&gt; /* так понимает только mozilla */&lt;br /&gt;3. &lt;font color="green"&gt;#srch  {_padding:10px;}&lt;/font&gt; /* так понимает только ie6 */&lt;br /&gt;4. Кроссбраузерный overflow-&lt;br /&gt;&lt;font color="blue"&gt;overflow:auto;overflow-y(x): hidden; overflow-x(y): scroll;&lt;/font&gt;&lt;br /&gt;5. first-child для ие (например: #block p:first-child {font-weight:bold;})&lt;br /&gt;&lt;font color="green"&gt;#block p  {font-weight:expression(previousSibling == null ? 'bold' : 'inherit');} &lt;/font&gt;&lt;br /&gt;6. смежные селекторы в ие p+p (сам не пробывал) &lt;a href="http://community.livejournal.com/ru_webdev/2218053.html"&gt;http://community.livejournal.com/ru_webdev/2218053.html&lt;/a&gt;&lt;br /&gt;7. Conditional comments (&amp;lt;!--[if IE 6]&amp;gt;...&amp;lt;![endif]--&amp;gt;) &lt;a href="http://msdn2.microsoft.com/en-us/library/ms537512.aspx"&gt;подробнее здесь&lt;/a&gt; и&lt;br /&gt;        &lt;a href="http://www.quirksmode.org/css/condcom.html"&gt;здесь&lt;/a&gt;&lt;br /&gt;8. &lt;a href="http://www.positioniseverything.net/explorer/threepxtest.html"&gt;3-х пискельный баг в ие&lt;/a&gt;&lt;br /&gt;9. кроссбраузерный min-height-&lt;br /&gt;&lt;font color="green"&gt;min-height:100%; height:auto !important; height:100%;&lt;/font&gt; или &lt;font color="green"&gt;height:expression(this.scrollHeight &amp;lt; 550 ? "550px" : "auto";&lt;/font&gt;&lt;br /&gt;10. min-width, max-width (одновременно) для ие-&lt;br /&gt;&lt;font color="green"&gt;width:expression(document.documentElement.clientWidth &amp;lt; 790 ? "790px" : document.documentElement.clientWidth &amp;gt; 1280 ? "1280px" : "auto" );&lt;/font&gt;&lt;br /&gt;11. &lt;a href="http://lists.w3.org/Archives/Public/www-style/2004Aug/0135"&gt;per-site user stylesheet rules&lt;/a&gt; (for mozzila) - подключение стилей только для моззилы&lt;br /&gt;&lt;br /&gt;(c) andrvm&lt;br /&gt;&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:andrvm:1267</id>
    <link rel="alternate" type="text/html" href="http://andrvm.livejournal.com/1267.html"/>
    <link rel="self" type="text/xml" href="http://andrvm.livejournal.com/data/atom/?itemid=1267"/>
    <title>"Запомни меня" на куках без базы данных</title>
    <published>2007-10-27T20:39:51Z</published>
    <updated>2008-02-13T19:56:01Z</updated>
    <category term="php"/>
    <content type="html">Навеяно жж и собственными заблуждениями.&lt;br /&gt;Реализовывал как-то целый класс для работы с сессиями, авторизацией, сериализацией и т.п., универсальная штука вообщем получилась...Универсальная, но в том проекте, где я его использовал на фиг не нужная (после переосмысления). Громоздко слишком получалось для одного пользователя-админа целый класс, да еще с подвязкой к бд.... Причем время обработки экземпляра класса и время обработки механизма на куках отличалось примерно в 2раза! (0,02 сек против 0,01 сек, в среднем). &lt;br /&gt;В результате перешел на куку без базы данных =), имхо самое оптимальное решение для маленьких сайтов и не только видимо. Это решение привожу ниже.&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;Далее подразумевается, что &lt;font color="green"&gt;$db&lt;/font&gt; - объект для работы с базой данных; &lt;font color="green"&gt;$_COOKIE['mycookie']&lt;/font&gt; - кука, в которую сериализуем id пользователя и хэш его пароля, а затем извлекаем оттуда; &lt;font color="green"&gt;$inf&lt;/font&gt; - некая переменная для информирования пользователя; &lt;font color="green"&gt;$mytime&lt;/font&gt; - время на которое необходимо запомнить.&lt;br /&gt;&lt;br /&gt;Таким образом, получаем:&lt;br /&gt;1. вариант кода проверки куки&lt;br /&gt;&lt;font color="green"&gt;&lt;br /&gt;&lt;font color="gray"&gt;# проверяем наличие куки &lt;/font&gt;&lt;br /&gt;if (isset($_COOKIE['mycookie']))&lt;br /&gt;{&lt;br /&gt;   &lt;font color="gray"&gt;# извлекаем значение куки в массив &lt;/font&gt;&lt;br /&gt;   $cookie_param = explode(":", unserialize($_COOKIE['mycookie']));&lt;br /&gt;   &lt;font color="gray"&gt;# здесь делаем проверку пользователя&lt;/font&gt;&lt;br /&gt;   $db-&amp;gt;pquery("select * from ".PREFIX."_users where (id=?) and (password=?)", array($cookie_param[0], $cookie_param[1]));&lt;br /&gt;   if ($db-&amp;gt;num_rows()==1)&lt;br /&gt;   {&lt;br /&gt;    &lt;font color="gray"&gt;# здесь получаем инфу о пользователе&lt;/font&gt;&lt;br /&gt;     ...     &lt;br /&gt;     &lt;font color="gray"&gt;# далее обновленяем куку&lt;/font&gt;&lt;br /&gt;     setcookie('mycookie', $_COOKIE['mycookie'], time()+$mytime, "/");&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;     &lt;font color="gray"&gt;# здесь перенаправляем на залогинивание (если $db-&amp;gt;num_rows() не равно 1)&lt;/font&gt;&lt;br /&gt;     header("location:login.php");     &lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;   &lt;font color="gray"&gt;# и здесь перенаправляем на залогинивание (если куки нету)&lt;/font&gt;&lt;br /&gt;   header("location:login.php"); &lt;/font&gt;   &lt;br /&gt;&lt;br /&gt;2. вариант кода залогинивания&lt;br /&gt;&lt;font color="green"&gt;&lt;br /&gt;$user   =  isset($_POST["username"]) ? $_POST["username"] : '';&lt;br /&gt;$pass   =  isset($_POST["pass1"])    ? $_POST["pass1"]    : '';&lt;br /&gt;&lt;font color="gray"&gt;# проверка на корректность имени пользователя&lt;/font&gt;&lt;br /&gt;if ($user &amp;&amp; !preg_match("/^[a-zA-Z0-9_]+$/i", $user)) $inf="Некорректное имя пользователя"; &lt;br /&gt;elseif ($user &amp;&amp; $pass)&lt;br /&gt;{&lt;br /&gt;	$mdpass = md5($pass);&lt;br /&gt;	$db-&amp;gt;pquery("select * from ".PREFIX."_users where (username=?) and (password=?)", array($user, $mdpass));&lt;br /&gt;        &lt;font color="gray"&gt;# если залогинились&lt;/font&gt;&lt;br /&gt;        if ($db-&amp;gt;num_rows()==1)&lt;br /&gt;	{&lt;br /&gt;	  &lt;font color="gray"&gt;# то запишем в куку ид пользователя и хэш пароля&lt;/font&gt; &lt;br /&gt;          while ($row = $db-&amp;gt;get_row()) $cookie_param = serialize($row['id'].":".$row['password']);&lt;br /&gt;	  setcookie('mycookie', $cookie_param, time()+$mytime, "/");&lt;br /&gt;	  &lt;font color="gray"&gt;# заходим&lt;/font&gt; &lt;br /&gt;          header("location:index.php");&lt;br /&gt;	}&lt;br /&gt;	else $inf = "Неправильное имя пользователя или пароль!";&lt;br /&gt;}&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;3. вариант кода для разлогинивания&lt;br /&gt;&lt;font color="green"&gt;&lt;br /&gt;setcookie('mycookie', mycookie, time()-3600, "/");&lt;br /&gt;header("location:login.php");&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;При реализации необходимо учесть:&lt;br /&gt;1. у пользователя могут быть отключены куки вообще. Тогда в этом случае можно предупредить пользователя и не залогиниваться до их включения.&lt;br /&gt;2. так называемая секурность: для повышения оной можно (нужно) использовать другой механизм хэширования и записывать в куку не хэш пароля, а как вариант, хэш некой комбинации пароля пользователя с чем-либо, например с секретным словом.&lt;br /&gt;&lt;br /&gt;(c) andrvm&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:andrvm:1001</id>
    <link rel="alternate" type="text/html" href="http://andrvm.livejournal.com/1001.html"/>
    <link rel="self" type="text/xml" href="http://andrvm.livejournal.com/data/atom/?itemid=1001"/>
    <title>Юмор, который понравился</title>
    <published>2007-10-16T08:58:55Z</published>
    <updated>2007-10-16T09:06:09Z</updated>
    <category term="Юмор"/>
    <lj:music>101.7</lj:music>
    <content type="html">&lt;div align="right"&gt;&lt;i&gt;Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы строили «Титаник».&lt;/i&gt;&lt;br /&gt;---&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;1. Когда Далю были нужны новые слова, он приезжал в деревню, разбивал на глазах мужиков 2-3 бутылки водки, а потом стоял и записывал.&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;2. Утром едешь на дачу, а вечером возвращаешься с этого ебаного огорода.&lt;br /&gt;&lt;br /&gt;3. Люди, которые говорят: "легко, как забрать у младенца леденец" никогда не пробовали забрать леденец у младенца.&lt;br /&gt;&lt;br /&gt;4. Женщинам сложнее чем мужчинам рассказывать о себе - не скажешь "как меня на работе ебут!".&lt;br /&gt;&lt;br /&gt;5. Нет такой чистой и светлой мысли, которую бы русский человек не смог бы выразить в грязной матерной форме.&lt;br /&gt;&lt;br /&gt;6. Мудрость не всегда приходит с возрастом. Бывает, что возраст приходит один.&lt;br /&gt;&lt;br /&gt;7. Просто заумная фраза (дабы сразить) : ...&lt;br /&gt;&lt;i&gt;континуально длящеееся переживание полного удовлетворения базисных потребностей индивида будет иметь стохастический характер..&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;8. Мастерство непропъеш, но оно приходит и уходит.&lt;br /&gt;&lt;br /&gt;9. Напутствие сына перед родительским собранием - "В общем, главное, папа, никому там не верь!".&lt;br /&gt;&lt;br /&gt;10. Эксперт - это человек, который сделал больше ошибок, чем вы.&lt;br /&gt;&lt;br /&gt;11. Некоторым людям неважно чью жопу лизать. Им важно, чтобы жопу подавали вовремя!&lt;br /&gt;&lt;br /&gt;12. Работа, на которой обычно не думают, бывает двух видов: низкооплачиваемая и очень высокооплачиваемая.&lt;br /&gt;&lt;br /&gt;13. Погонишься за двумя зайцами - получиш п#$ды от обоих.&lt;br /&gt;&lt;br /&gt;14. Обезьяны живут в теплых странах, целыми днями ничего не делают, только жрут и трахаются. Труд из обезьяны сделал человека и теперь человек трахается мало, а работает целыми днями. По-моему, обезьяны нас кинули.&lt;br /&gt;&lt;br /&gt;15. А вот против блядских ежей очень даже имею!!!! &lt;br /&gt;Что за дебильная фраза: "Ежу понятно!".???. Мне допустим многое из того что "Ежу понятно" не понятно!!!! Ненавижу ежей!!!! Суки слишком умные.... (с) bash.org.ru&lt;br /&gt;&lt;br /&gt;(с) анекдот.ру (в основном)&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:andrvm:594</id>
    <link rel="alternate" type="text/html" href="http://andrvm.livejournal.com/594.html"/>
    <link rel="self" type="text/xml" href="http://andrvm.livejournal.com/data/atom/?itemid=594"/>
    <title>Пишем собственные модули для Koobi</title>
    <published>2007-10-15T18:58:48Z</published>
    <updated>2007-10-15T19:01:20Z</updated>
    <category term="koobi"/>
    <content type="html">Прежде чем приступить к написанию собственного модуля для CMC Koobi (рассматриваем версию 6), хотелось бы пояснить, для начала, в общих чертах принцип работы механизма модулей этой СМС, что в будущем несомненно нам пригодится.&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;Итак, при первоначальной загрузке кубик инициализирует некую переменную $buffer значением из запроса $_REQUEST['p']. Т.к. при первой загрузке страницы у нас в $_REQUEST['p'] ничего нет, то $buffer принимает значение index.&lt;br /&gt;&lt;br /&gt;Далее происходит включение файла include("system/$buffer.php"), т.е. system/index.php, который назначает переменной content шаблон startpage.tpl (папка /templates/тема/start/). Именно в этом шаблоне у нас выводится контент при первоначальной загрузке кубика. Необходимо отметить, что перед этим создается переменная $tpl (экземпляр класса шаблонов), своего рода массив в котором хранятся все наши переменные, шаблоны и прочая хрень.&lt;br /&gt;&lt;br /&gt;Далее кубик определяет шаблон для вывода страницы (эти шаблоны лежат у нас в папке /templates/тема/page/). Шаблон для вывода страницы – это шаблон в котором кубик выводит вообще весь контент, это конечная страница, которую вы видите на экране. Этот шаблон кубик определяет из анализа $_REQUEST['p'], т.к. у нас там ничего нет (если вы еще не забыли), то по умолчанию получается шаблон main_template. Это значение кубик получает из соответствующего запроса к таблице kpro6_container. Обратите внимание, что тип шаблона в kpro6_container (поле typ) представлен как «out». Потом (если пробежаться по коду) кубик инициализирует другие переменные, подключает различные функции и т.п. – это уже к нам не относится. И далее кубик отображает все это дело на экране:&lt;br /&gt;&lt;br /&gt;&lt;font color="green"&gt;$prepage = $tmpl-&amp;gt;fetch($template); &lt;br /&gt;……&lt;br /&gt;echo $prepage;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Теперь, если у нас в $_REQUEST['p'] что-то есть, например, юзер перешел по ссылке index.php?p=pwlost…. То $buffer, в этом случае инициализируется значением pwlost.php, что приведет к подгрузке файла system/pwlost.php, далее кубик произведет анализ $_REQUEST['p'] (конструкция switch ($_REQUEST['p']) в index.php) и для p=pwlost из таблицы  kpro6_container подберет шаблон для вывода страницы -/templates/тема/page/main_tamplate.tpl).&lt;br /&gt;Но это еще не все.. , если открыть файл pwlost.php, то в конце мы увидим:&lt;br /&gt;&lt;br /&gt;&lt;font color="green"&gt;$tmpl-&amp;gt;assign("content", parsetrue("container/".container("changepw"), $lang['pwlost'], $tmpl-&amp;gt;fetch("user/pwlost.tpl")));&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Что это? Здесь кубик посредством функции parsetrue создает новый экземпляр класса шаблонов с параметрами title=$lang['pwlost'], content= $tmpl-&amp;gt;fetch("user/pwlost.tpl"))) и возвращает этот экземпляр в шаблоне-контейнере - "container/".container("changepw"). Т.е. кубик шаблон user/pwlost.tpl помещает в некий контейнер и затем этот контейнер привязывает к контенту. Для чего это? Хз.. судя по всему для удобства вывода контента, плюс к тому же мы можем и собственный шаблон-контейнер создать.. Короче типа как «гибкость»  кубика ..немцы мать их…Ну да ладно, здесь главное уяснить:&lt;br /&gt;а) что шаблоны - контейнеры лежат в папке /templates/тема/container/;&lt;br /&gt;б) их всего 4 (inner.tpl, empty.tpl, forum.tpl и outer.tpl);&lt;br /&gt;в) для каждого модуля соответствующий шаблон-контейнер кубик берет не с потолка, все с той же таблицы - kpro6_container посредством функции container;&lt;br /&gt;г) эти шаблоны – контейнеры имеют тип (поле typ) в таблице - kpro6_container «in».&lt;br /&gt;&lt;br /&gt;Вот теперь смело пишем новый модуль для кубика!  В качестве примера я возьму свой написанный модуль для парфюмерного магазина, который выводит указатель по каталогу типа : «A B C D E F ..» видели наверное? &lt;a href="http://andrvm.ru/portf/aromatoff.net/index.php?p=disigners&amp;amp;area=1&amp;amp;abc=A&amp;amp;tp=dz"&gt;(посмотреть можно здесь)&lt;/a&gt;&lt;br /&gt;Для написания нам понадобиться следующее:&lt;br /&gt;а) новая запись в таблице kpro6_container (кстати ее можно не делать, НО тогда мы не сможем вручную редактировать в панели управления наш модуль);&lt;br /&gt;б) сам шаблон (наш шаблон), в котором мы определим, что как будет выводиться;&lt;br /&gt;в) скрипт, который будет выводить и инициализировать в наш шаблон;&lt;br /&gt;г) скрипт (я назову его) – первоначальный инициализатор.&lt;br /&gt;Итак, назовем наш модуль «disigners». Напишем скрипт инициализатор, назовем его abc.php и закинем в system/:&lt;br /&gt;&lt;br /&gt;&lt;font color="green"&gt;// Модуль формирования указателя товаров&lt;br /&gt;$abc_arrray= array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');&lt;br /&gt;$abc="";&lt;br /&gt;for ($i=0; $i&amp;lt;25; $i++)&lt;br /&gt;{&lt;br /&gt;  $sql=$db-&amp;gt;Query("SELECT name from " . PREFIX ."_manufacturer where LEFT (name,1) = '".$abc_arrray[$i]."'");&lt;br /&gt;  if ($sql-&amp;gt;numrows()) {$abc=$abc . "&amp;lt;a href=\"index.php?p=disigners&amp;area=1&amp;abc=".$abc_arrray[$i]."\"&amp;gt;" . $abc_arrray[$i] . "&amp;lt;/a&amp;gt;" . "&amp;nbsp;&amp;nbsp;";}&lt;br /&gt;  else {$abc=$abc .  $abc_arrray[$i] . "&amp;nbsp;&amp;nbsp;";}&lt;br /&gt;  if (($i+1)%8 ==0) $abc=$abc . "&amp;lt;br&amp;gt;";&lt;br /&gt;}&lt;br /&gt;$tmpl-&amp;gt;assign('abc',$abc);&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Далее в папке /templates/тема/designers создадим шаблон abc.tpl:&lt;br /&gt;&lt;br /&gt;&lt;font color="blue"&gt;&amp;lt;!-- Шаблон указателя -- &amp;gt;&lt;br /&gt;&amp;lt;table width="100%" border="0" cellspacing="0" cellpadding="0"&amp;gt;&lt;br /&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;    &amp;lt;td class="navigation_box"&amp;gt;Парфюм указатель&amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;    &amp;lt;td class="navigation_box_bg"&amp;gt;&lt;br /&gt;	&amp;lt;div class="abc" align="justify"&amp;gt;{$abc}&amp;lt;/div&amp;gt;&lt;br /&gt;	 &amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Обратили внимание на $abc? Надеюсь понятно откуда она берется.. Теперь в шаблоне /templates/тема/page/mane_template.tpl в любом удобном месте включим конструкцию &lt;b&gt;{include file='disigners/abc.tpl}&lt;/b&gt;, а в файле index.php, например перед $prepage = $tmpl-&amp;gt;fetch($template) напишем:&lt;br /&gt;&lt;b&gt;include( BASEDIR . "/system/abc.php"); // &amp;lt;-- включаем наш шаблон.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Во! Теперь у нас при первоначальной загрузке (и последующих переходах) будет подгружаться наш сриптик и шаблончик.&lt;br /&gt;Но это еще не все…мы хотим, что юзер, щелкая по нашему указателю что-то видел, для этого мы в abc.php формировали ссылку: &lt;b&gt;index.php?p=disigners&amp;area=1&amp;abc&lt;/b&gt;… Еще не забыли про  массив $_REQUEST['p']? Тогда пишем модуль designers.php:&lt;br /&gt;&lt;br /&gt;&lt;font color="green"&gt;if(!defined("BASEDIR")) exit;&lt;br /&gt;$sname = simpletitle($lang['disigners']);&lt;br /&gt;$tmpl-&amp;gt;assign('lang', $lang);&lt;br /&gt;$tmpl-&amp;gt;assign('area', $area);&lt;br /&gt;    &lt;br /&gt;    $abc=trim($_REQUEST['abc']);&lt;br /&gt;    $id=trim($_REQUEST['id']);&lt;br /&gt;&lt;br /&gt;	$sql=$db-&amp;gt;Query("SELECT name from " . PREFIX ."_manufacturer where id=".$id);&lt;br /&gt;	$row_n=$sql-&amp;gt;fetchrow();&lt;br /&gt;	$pname=$row_n-&amp;gt;name;&lt;br /&gt;	$sql=$db-&amp;gt;Query("SELECT id, name from " . PREFIX ."_manufacturer where LEFT (name,1) = '".$abc."'");&lt;br /&gt;    	&lt;br /&gt;	$disign=array();&lt;br /&gt;        while( $row_d=$sql-&amp;gt;fetchrow())&lt;br /&gt;	{&lt;br /&gt;	  array_push($disign, $row_d);&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	$sql = $db-&amp;gt;Query("SELECT id,name FROM ".PREFIX."_manufacturer WHERE area='$area' order by name asc");&lt;br /&gt;	$items = array();&lt;br /&gt;	 while( $row_mf=$sql-&amp;gt;fetchrow())&lt;br /&gt;	{&lt;br /&gt;	  array_push($items,$row_mf);&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	if ($id) {&lt;br /&gt;	$sql = $db-&amp;gt;Query("SELECT * FROM ".PREFIX."_shop_articles WHERE manufacturer='$id' order by title, price asc");&lt;br /&gt;	$products = array();&lt;br /&gt;	while( $row_p=$sql-&amp;gt;fetchrow())&lt;br /&gt;	{&lt;br /&gt;	  array_push($products, $row_p);&lt;br /&gt;	}&lt;br /&gt;	  $tmpl-&amp;gt;assign('products', $products);&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	$tmpl-&amp;gt;assign('id', $id);&lt;br /&gt;	$tmpl-&amp;gt;assign('pname', $pname);&lt;br /&gt;	$tmpl-&amp;gt;assign('abc', $abc);&lt;br /&gt;	$tmpl-&amp;gt;assign('items', $items);&lt;br /&gt;	$tmpl-&amp;gt;assign('disign', $disign);&lt;br /&gt;&lt;br /&gt;	$tmpl-&amp;gt;assign("content", parsetrue("container/outer", $lang['disigners'], $tmpl-&amp;gt;fetch("disigners/main.tpl"))); &lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Но не забываем про таблицу kpro6_container. Если мы хотим редактировать наши шаблоны и контейнеры, то необходимо добавить в нее записи со значениями, например: id=300, name=designers, tpl=2spalten (к примеру), typ=out, area=1. и подправить конструкцию switch ($_REQUEST['p']) в index.php своими значениями: &lt;br /&gt;case "disigners" : $template = fetchmaintemplate("300"); break;&lt;br /&gt;&lt;br /&gt;ИМХО это лишнее, т.к. я вывожу в одном шаблоне..&lt;br /&gt;&lt;br /&gt;Далее в папке /templates/тема/designers создаем еще шаблон main.tpl:&lt;br /&gt;&lt;br /&gt;&lt;font color="blue"&gt;&amp;lt;table width="100%"  border="0" cellspacing="0" cellpadding="0"&amp;gt;&lt;br /&gt;	&amp;lt;tr&amp;gt;&lt;br /&gt;    	&amp;lt;td  class="navigation_box"&amp;gt;{if $id}{$pname} {else} {$abc} {/if}&amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;/tr&amp;gt;&lt;br /&gt;	&amp;lt;tr&amp;gt;&lt;br /&gt;		&amp;lt;td  style="padding-left:15px;" valign="top"&amp;gt;&lt;br /&gt;		{if $id }&amp;lt;div style="padding-top:0px"&amp;gt;{include file='disigners/products.tpl'}&amp;lt;/div&amp;gt;&lt;br /&gt;		{else}&lt;br /&gt;		&amp;lt;div style="padding-top:10px; line-height:1.5 "&amp;gt;{foreach from=$disign item=d}&lt;br /&gt;		&amp;lt;img src="{$img_folder}/1.gif" class="absmiddle" alt="" /&amp;gt;&amp;nbsp;&lt;br /&gt;		&amp;lt;a href="index.php?p=disigners&amp;amp;action=showall&amp;amp;area={$area}&amp;amp;id={$d-&amp;gt;id}"&amp;gt;{$d-&amp;gt;name}&amp;lt;/a&amp;gt;		{/foreach}&amp;lt;/div&amp;gt;{/if}	&lt;br /&gt;		&amp;lt;/td&amp;gt;&lt;br /&gt;	  &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;/font&gt;&lt;br /&gt;Где disigners/products.tpl –какой-то встроенный файл кубика, просто перекинутый в папку disigners/ (приводить не буду - найдете сами).&lt;br /&gt;&lt;br /&gt;Во блин!! Теперь все – смело пишем любой модуль для кубика.&lt;br /&gt;Стоит отметить, что это не единственный способ подключения собственных модулей, можно например и так (в самом index.php):&lt;br /&gt;&lt;br /&gt;$cal = new KoobiCalendar;&lt;br /&gt;$tmpl-&amp;gt;assign('simple_calendar', $cal-&amp;gt;getMonthView($month, $year, 'calendar/calendar_small.tpl','1','small'));&lt;br /&gt;&lt;br /&gt;И так:&lt;br /&gt;&lt;br /&gt;$tmpl-&amp;gt;assign('speedbar', speedbar($area)); (чему предшествовал вызов functions/func.speedbar.php).&lt;br /&gt;&lt;br /&gt;Но с этим я думаю вы теперь и сами разобраться можете.&lt;br /&gt;&lt;br /&gt;P.S. если добавить наш модуль в kpro6_active, то мы можем управлять доступом к данному модулю. И еще забыл отметить, что необходимо подправить переменную $lang для вашего модуля.&lt;br /&gt;&lt;br /&gt;(c) andrvm. 2007&lt;br /&gt;</content>
  </entry>
</feed>
