<?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/  -->
<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:media='http://search.yahoo.com/mrss/' xmlns:atom10='http://www.w3.org/2005/Atom'>
<channel>
  <title>andrvm&apos;s journal</title>
  <link>http://andrvm.livejournal.com/</link>
  <description>andrvm&apos;s journal - LiveJournal.com</description>
  <lastBuildDate>Thu, 08 Oct 2009 18:51:54 GMT</lastBuildDate>
  <generator>LiveJournal / LiveJournal.com</generator>
  <lj:journal>andrvm</lj:journal>
  <lj:journalid>14036255</lj:journalid>
  <lj:journaltype>personal</lj:journaltype>
  <atom10:link rel='hub' href='http://pubsubhubbub.appspot.com/' />
  <image>
    <url>http://l-userpic.livejournal.com/81518936/14036255</url>
    <title>andrvm&apos;s journal</title>
    <link>http://andrvm.livejournal.com/</link>
    <width>100</width>
    <height>100</height>
  </image>

<item>
  <guid isPermaLink='true'>http://andrvm.livejournal.com/4603.html</guid>
  <pubDate>Thu, 08 Oct 2009 18:51:54 GMT</pubDate>
  <title>Tellmeday.com или содневки</title>
  <link>http://andrvm.livejournal.com/4603.html</link>
  <description>Наконец-то проект, которым я был занят все свое свободное время, запущен и потихоньку набирает обороты. Да –то бог…</description>
  <comments>http://andrvm.livejournal.com/4603.html</comments>
  <category>tellmeday</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://andrvm.livejournal.com/3855.html</guid>
  <pubDate>Thu, 18 Jun 2009 18:49:20 GMT</pubDate>
  <title>Интеграция форума phpbb с сайтом</title>
  <link>http://andrvm.livejournal.com/3855.html</link>
  <description>Когда-нибудь у Вас возникнет желание сделать на сайте форум, т.к. трудно себе представить хорошо посещаемый сайт без оного. Для этого форум можно написать с нуля, а можно взять бесплатное готовое решение, например phpbb, и объединить его с сайтом. Вот об это я и хотел рассказать.&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&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=&quot;http://www.openwall.com/phpass/&quot;&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 = &apos;c&apos;){&lt;br /&gt;&lt;br /&gt;	$rand_seed = &apos;8a414598ba18a512b8fe97f1497fa22b&apos;;&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=&apos;/&apos;, $domain = false){&lt;br /&gt;	&lt;br /&gt;            $name_data = rawurlencode($name) . &apos;=&apos; . rawurlencode($cookiedata);&lt;br /&gt;	$expire = date(&apos;D, d-M-Y H:i:s \\G\\M\\T&apos;, $cookietime);&lt;br /&gt;	$domain = !$domain  ? &apos;&apos; : &apos;; domain=&apos; . $domain;&lt;br /&gt;&lt;br /&gt;	header(&apos;Set-Cookie: &apos; . $name_data . (($cookietime) ? &apos;; expires=&apos; . $expire : &apos;&apos;) . &apos;; path=&apos; . $path . $domain . &apos;; HttpOnly&apos;, 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=&quot;gray&quot;&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=&quot;gray&quot;&gt;// если авторизация прошла успешно, то здесь ваш код&lt;br /&gt;         // т.к. у меня авторизация на сессиях, то я пишу свой, например такой:&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;         $_SESSION[&apos;logged&apos;]   = true; &lt;br /&gt;&lt;br /&gt;         &lt;i&gt;&lt;font color=&quot;gray&quot;&gt;// обновляем время последнего посещения юзера&lt;br /&gt;         // здесь и ниже $db – объект для работы с базой данных,&lt;br /&gt;         // методы, которого говорят сами за себя (я думаю что-то&lt;br /&gt;         // подобное есть у каждого)&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;         $db-&amp;gt;query(&quot;update `phpbb_users` set `user_lastvisit` = time() where `user_id` = $user_id&quot;;&lt;br /&gt;&lt;br /&gt;         &lt;i&gt;&lt;font color=&quot;gray&quot;&gt;// определяем время жизни кук&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;         $cookie_expires = time() + ($autologin ? 86400*$config[&apos;session_autologin_life&apos;] : 31536000);&lt;br /&gt;	&lt;br /&gt;		            	&lt;br /&gt;         &lt;i&gt;&lt;font color=&quot;gray&quot;&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[&apos;session_life&apos;] и $config[&apos;session_autologin_life&apos;] соответственно&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;            set_cookie(COOKIE_PREFIX.&apos;_sid&apos; $sessname, session_id(),$cookie_expires);&lt;br /&gt;          &lt;i&gt;&lt;font color=&quot;gray&quot;&gt;// пишем ид юзера в куку&lt;br /&gt;          // $user_id – ид юзера&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;           set_cookie(COOKIE_PREFIX.&apos;_u&apos;, $user_id, $cookie_expires);&lt;br /&gt;      &lt;br /&gt;           set_cookie(COOKIE_PREFIX.&apos;_k&apos;, &apos;&apos;, $cookie_expires); &lt;br /&gt;          &lt;i&gt; &lt;font color=&quot;gray&quot;&gt;// кука признака автологина вашего сайта&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;           set_cookie(COOKIE_PREFIX.&apos;_a&apos;, 1, ($autologin ? 86400*$config[&apos;session_autologin_life&apos;] : (-1)*31536000));&lt;br /&gt;&lt;br /&gt;				   					&lt;br /&gt;	&lt;i&gt;&lt;font color=&quot;gray&quot;&gt;// затем «входим» на форум, где&lt;br /&gt;           // $browser – идентификация браузера пользователя:&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;           &lt;i&gt;&lt;font color=&quot;gray&quot;&gt;// $browser = (!empty($_SERVER[&apos;HTTP_USER_AGENT&apos;])) ? htmlspecialchars((string) $_SERVER[&apos;HTTP_USER_AGENT&apos;]) : &apos;&apos;;&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;	 $db-&amp;gt;query_found_rows(&quot;select SQL_CALC_FOUND_ROWS `session_user_id` from `phpbb_sessions` where `session_id`=&apos;&quot;.$db-&amp;gt;safesql(session_id()).&quot;&apos;&quot;);&lt;br /&gt;	 if($db-&amp;gt;found_rows==0)&lt;br /&gt;		  $db-&amp;gt;query(&apos;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(&apos;&quot;.session_id() .&quot;&apos;,  $user_id,  time(), time(), time(), 1, $browser, &apos;&quot;.$_SERVER[&apos;REMOTE_ADDR&apos;].&quot;&apos;, $autologin));&lt;br /&gt;          else&lt;br /&gt;	         $db-&amp;gt;query(&quot;update `phpbb_sessions` &lt;br /&gt;		                           			set `session_user_id`=$user_id, `session_last_visit`=&quot;.time().&quot;, `session_start`=&quot;.time().&quot;,&lt;br /&gt;			                               			`session_time`=&quot;.time().&quot;,  `session_viewonline`=1, `session_browser`=&apos;&quot;.$db-&amp;gt;safesql($browser).&quot;&apos;,&lt;br /&gt;			                               			`session_ip`=&apos;&quot;.$_SERVER[&apos;REMOTE_ADDR&apos;].&quot;&apos;&lt;br /&gt;			                                    where `session_id`=&apos;&quot;.$db-&amp;gt;safesql(session_id()).&quot;&apos;&quot;); &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=&quot;gray&quot;&gt;время жизни сессии&lt;/font&gt;&lt;br /&gt;$config[&apos;session_life&apos;] = ($autologin ? 86400 * $config[&apos;session_autologin_life&apos;]: $config[&apos;session_life&apos;]);&lt;br /&gt;&lt;br /&gt;if (time()-($user[&apos;user_lastvisit&apos;]+60)) &amp;gt; $config[&apos;cookie_life&apos;]) &lt;br /&gt;    &lt;i&gt;&lt;font color=&quot;gray&quot;&gt;// функция выхода из сайта&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;    logout();&lt;br /&gt;&lt;br /&gt;	if (time() - $user[&apos;user_lastvisit&apos;]&amp;gt;60)&lt;br /&gt;                        &lt;i&gt;&lt;font color=&quot;gray&quot;&gt;// функция обновления времени последнего посещения пользователя, в которой  также обновляем время посещения на форуме:&lt;br /&gt;$db-&amp;gt;query(&quot;update `phpbb_sessions` set `session_last_time`=&quot;.time().&quot;, `session_time`=&quot;.time().&quot; where `session_id` = &apos;&quot;.$db-&amp;gt;safesql($sess_id).&quot;&apos;&quot;); &lt;/font&gt;&lt;/i&gt;&lt;br /&gt;	 	last_time_update($user[&apos;user_id&apos;]);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Тем самым мы проверяем время неактивности пользователя и если оно больше разрешенного, то «выкидываем» его.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4.&lt;/b&gt; Далее замыкаем регистрацию нового пользователя и выход пользователя с сайта на &quot;сайтовую&quot; часть. Для этого в файле форума ucp.php в секции case &apos;register&apos; и &apos;logout&apos; добавляем эти соотвествующие коды:&lt;br /&gt;&lt;br /&gt;	&lt;code&gt;case &apos;register&apos;:&lt;br /&gt;            &lt;i&gt;&lt;font color=&quot;gray&quot;&gt;// здесь ваша ссылка на скрипт регистрации&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;header(&apos;location: http://&apos;.$_SERVER[&apos;HTTP_HOST&apos;].&apos;/register/&apos;);&lt;br /&gt;	exit();&lt;/code&gt;&lt;br /&gt;          &lt;br /&gt;          &lt;code&gt; case &apos;logout&apos;:&lt;br /&gt;            &lt;i&gt;&lt;font color=&quot;gray&quot;&gt;// здесь ваша ссылка на скрипт выхода с сайта&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;	header(&apos;location: http://&apos;.$_SERVER[&apos;HTTP_HOST&apos;].&apos;/logout/&apos;);&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=&quot;gray&quot;&gt;// делаем хэш, полученного пароля ($pass - пароль полученный при регистрации)&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;             $hpass = phpbb_hash($pass);&lt;br /&gt;              &lt;i&gt;&lt;font color=&quot;gray&quot;&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=&quot;gray&quot;&gt; // после всех ваших проверок (если таковые имеются) добавляем юзера&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;           $db-&amp;gt;query(&quot;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 (&apos;&quot;.$username.&quot;&apos;, &apos;&quot;.strtolower($username) .&quot;&apos;, &apos;&quot;. $email .&quot;&apos;, &apos;&quot;.$hemail.&quot;&apos;, &apos;&quot;.$hpass.&quot;&apos;,  time(), &apos;&quot;.unique_id().&quot;&apos;,  2, &apos;&apos;, &apos;&quot;.$_SERVER[&apos;REMOTE_ADDR&apos;]. &quot;&apos;&quot;);&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  	  $db-&amp;gt;query(&quot;insert into`phpbb_user_group`&lt;br /&gt;                           (`user_id`, `user_pending`, `group_id`)&lt;br /&gt;                            values (&quot;.$db-&amp;gt;insert_id().&quot;, 0, 2)&quot;);&lt;br /&gt;&lt;br /&gt;	&lt;i&gt;&lt;font color=&quot;gray&quot;&gt;// обновляем статистику форума&lt;br /&gt;            // где $user_id – идентификатор нового пользователя, а $username – его имя&lt;br /&gt;           // и увеличиваем счетчик юзеров в phpbb&lt;/font&gt;&lt;/i&gt;&lt;br /&gt; 	$db-&amp;gt;query(&quot;update `phpbb_config` set `config_value`=`config_value`+1 where `config_name`=&apos;num_users&apos;&quot;);&lt;br /&gt; 	&lt;i&gt;&lt;font color=&quot;gray&quot;&gt;// добавляем информацию о новом юзере&lt;/font&gt;&lt;/i&gt;&lt;br /&gt; 	$db-&amp;gt;query(&quot;update `phpbb_config` set `config_value`=$user_id where `config_name`=&apos;newest_user_id&apos;&quot;);&lt;br /&gt; 	$db-&amp;gt;query(&quot;update `phpbb_config` set `config_value`=&apos;$username&apos; where `config_name`=&apos;newest_username&apos;&quot;);&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[&apos;user_id&apos;]!=ANONYMOUS){&lt;br /&gt;&lt;br /&gt;	 &lt;i&gt;&lt;font color=&quot;gray&quot;&gt;// этот код запускает сессию с именем сессии&lt;br /&gt;               // как на сайте и пишет в нее данные сессиии ($_SESSION[&apos;logged&apos;])&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;      	session_name($config[&apos;cookie_name&apos;].&apos;_sid&apos;);&lt;br /&gt;	session_id($this-&amp;gt;session_id);&lt;br /&gt;	session_start();&lt;br /&gt;		&lt;br /&gt;	$_SESSION[&apos;logged&apos;]   = true;&lt;br /&gt;            &lt;br /&gt;           &lt;i&gt; &lt;font color=&quot;gray&quot;&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[&apos;cookie_name&apos;].&apos;_a&apos;, 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[&apos;session_id&apos;] = 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[&apos;cookie_name&apos;].&apos;_sid&apos;);&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[&apos;cookie_name&apos;] . &apos;_sid&apos;]) &amp;&amp; isset($_COOKIE[$config[&apos;cookie_name&apos;] . &apos;_u&apos;]))&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[&apos;cookie_name&apos;] . &apos;_&apos; . $name) . &apos;=&apos; . rawurlencode($cookiedata);&lt;br /&gt;	else&lt;br /&gt;	       $name_data = rawurlencode($name) . &apos;=&apos; . rawurlencode($cookiedata);&lt;br /&gt;        &lt;br /&gt;			&lt;br /&gt;	  $expire = date(&apos;D, d-M-Y H:i:s \\G\\M\\T&apos;, $cookietime);&lt;br /&gt;	  $domain = (!$config[&apos;cookie_domain&apos;] || $config[&apos;cookie_domain&apos;] == &apos;localhost&apos; || $config[&apos;cookie_domain&apos;] == &apos;127.0.0.1&apos;) ? &apos;&apos; : &apos;; domain=&apos; . $config[&apos;cookie_domain&apos;];&lt;br /&gt;&lt;br /&gt;	   header(&apos;Set-Cookie: &apos; . $name_data . (($cookietime) ? &apos;; expires=&apos; . $expire : &apos;&apos;) . &apos;; path=&apos; . $config[&apos;cookie_path&apos;] . $domain . ((!$config[&apos;cookie_secure&apos;]) ? &apos;&apos; : &apos;; secure&apos;) . &apos;; HttpOnly&apos;, 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.&apos;_k&apos;) и просто закомментировал у себя в файле /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;</description>
  <comments>http://andrvm.livejournal.com/3855.html</comments>
  <category>phpbb</category>
  <category>php</category>
  <lj:security>public</lj:security>
  <lj:reply-count>12</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://andrvm.livejournal.com/3707.html</guid>
  <pubDate>Mon, 23 Mar 2009 20:10:37 GMT</pubDate>
  <title>Перехват fatal error в php</title>
  <link>http://andrvm.livejournal.com/3707.html</link>
  <description>Помоему эти три ссылки как-то противоречат друг другу?&lt;br /&gt;Вот &lt;a href=&quot;http://dklab.ru/chicken/nablas/45.html&quot;&gt;Котеров&lt;/a&gt; пишет, что &quot;&lt;i&gt;назначенные по register_shutdown_function функции-финализаторы скрипта также не вызываются при наступлении фатальной ошибки&lt;/i&gt;&quot;.&lt;br /&gt;&lt;a href=&quot;http://ru2.php.net/register_shutdown_function&quot;&gt;В официальной документации&lt;/a&gt; говорится, что  &quot;&lt;i&gt;зарегистрированные register_shutdown_function() функции будут вызваны после того, как запрос выполнен окончательно (включая отсылку любых буферов вывода), &lt;b&gt;соответственно вы не сможете из этих функций вывести что-либо в броузер, используя echo() или print(), или возвратить содержимое какого-либо буфера вывода, используя ob_get_contents()&lt;/b&gt;&lt;/i&gt;&quot;.&lt;br /&gt;А вот решение предложеное &lt;a href=&quot;http://takanotsume.wordpress.com/2008/07/08/php-catch-a-fatal-error/&quot;&gt;здесь&lt;/a&gt; использую я (с небольшим изменением), хоть оно и противоречит вышеприведенным ссылкам. Может просто у Котерова статья старовата (2007 год). А в официальной документации может русский перевод не соответствует оригиналу..хз, но тем не менее это работает.&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;pre&gt;&lt;font color=&quot;green&quot;&gt;
function fatal_error_handler()
{
   global $fatal_error;
    
   if ($fatal_error) {
   	    // показываем шаблон
   	    ob_start();
   		include(&apos;fatal_error.tpl&apos;);
   		$content = ob_get_contents();
   	    ob_end_clean();
   	    echo $content;
     		
   }		
   else
        return false;		
}
&lt;/font&gt;&lt;/pre&gt;</description>
  <comments>http://andrvm.livejournal.com/3707.html</comments>
  <category>php</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://andrvm.livejournal.com/3421.html</guid>
  <pubDate>Mon, 02 Mar 2009 14:23:59 GMT</pubDate>
  <title>Автоподбор блоков по высоте с помощью js</title>
  <link>http://andrvm.livejournal.com/3421.html</link>
  <description>Столкнулся с задачей выравнивания блоков на странице по высоте. Решил не искать решений на стороне, а использовать собственное (с использованием  Prototype), благо он использовался в проекте. &lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;font color=&quot;green&quot;&gt;Object.extend(Array.prototype, {
  		autoHeight: function(){
  			var tmpH=0;
  			this.each(function(item){
      			$(item).setStyle({height:tmpH+&apos;px&apos;});}.bind(
      			    this.each(function(item){
  					var h_= parseInt($(item).getStyle(&apos;height&apos;),  10);	
    					tmpH  = h_ &amp;gt; tmpH ?  h_ : tmpH;
      			    })));
  		}
 });

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