<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Rus-16.Do.Am - Скрипты для Ucoz | Web Мастер | Cs 1.6</title>
		<link>http://rus-16.do.am/</link>
		<description>Форум</description>
		<lastBuildDate>Sat, 26 Mar 2011 19:37:42 GMT</lastBuildDate>
		<generator>uCoz Web-Service</generator>
		<atom:link href="https://rus-16.do.am/forum/rss" rel="self" type="application/rss+xml" />
		
		<item>
			<title>Как повысить индекс цитирования. Google</title>
			<link>https://rus-16.do.am/forum/32-27-1</link>
			<pubDate>Sat, 26 Mar 2011 19:37:42 GMT</pubDate>
			<description>Форум: &lt;a href=&quot;https://rus-16.do.am/forum/32&quot;&gt;Статьи Web-мастеру&lt;/a&gt;&lt;br /&gt;Автор темы: stim&lt;br /&gt;Автор последнего сообщения: stim&lt;br /&gt;Количество ответов: 0</description>
			<content:encoded>[table]Стоит вспомнить о том, что индексов цитируемости существует несколько. Основной индекс цитируемости определяется количеством сайтов, которые ссылаются на исследуемый сайт (или страницу, тогда это будет индекс цитируемости страницы). Существует взвешенный индекс цитируемости (вИЦ), для расчета которого принимают во внимание не только количество ссылок, но и их качество, то есть значимость сайта, на котором установлена ссылка на исследуемый сайт. И, наконец, есть еще тематический индекс цитируемости (тИЦ), который учитывает тематику исследуемого сайта и сайтов, которые на него ссылаются. &lt;p&gt; Вот и получается, что хотя все три вида ИЦ нацелены на выполнение одной задачи - дать независимую оценку сайту, - вычисляются они по-разному, и, следовательно, для увеличения каждого из них требуется разный подход. А если учесть тот фактор, что разные поисковые системы, использующие индексы цитирования, реализуют разные алгоритмы для их подсчетов и различные их виды, приходится либо ориентироваться на наиболее любимую вами поисковую систему, либо использовать наиболее общие принципы и стремиться подняться в результатах запросов на нескольких поисковых системах. &lt;p&gt; Возьмем за основу такие известные поисковики, как Google, Rambler, Яndex, Aport. Что требуется, чтобы в этих поисковиках сайт появлялся на первых страницах результатов поиска? Самый простой ответ дает Rambler. Результаты показа сайта на его страницах зависят от посещаемости сайта. Чем она больше - тем выше будет находиться ссылка. На страницах Rambler нет никаких упоминаний об учете какой-либо разновидности индекса цитирования. &lt;p&gt; Остальные поисковики для ранжирования сайтов применяют различные алгоритмы подсчета индекса цитирования. Первым начал использовать такой способ Google. Произошло это несколько лет назад, когда в качестве дополнительного критерия ранжирования был принят метод PageRank (авторы PageRank - Сергей Брин и Ларри Пейдж). При расчете PageRank учитывается не только общее количество ссылок, но и их качество: страница, на которую ведет больше ссылок, дает больший вклад в PageRank страницы, на которую она ссылается. Основные положения этого показателя заключатся в следующем: &lt;br /&gt; PageRank - это число, характеризующее исключительно голосующую способность всех входящих ссылок на страницу и то, как &quot;сильно&quot; они рекомендуют эту страницу. &lt;br /&gt; Каждая уникальная страница сайта, проиндексированная Google, имеет вес PageRank. Вес сайта на самом деле является весом главной страницы этого сайта. &lt;br /&gt; Внутренние ссылки сайта учитываются при расчете веса PageRank для других страниц сайта. &lt;br /&gt; PageRank независим, он не принимает во внимание текст ссылок и другие факторы. &lt;p&gt; Но есть еще один момент, о котором не сказано в вышеприведенном перечне. Для Google одним из основных критерием, учитываемых им при подсчете веса странице, является наличие ее в каталоге Open Directory Project (ODP или DMOZ). Поэтому первой задачей, которую должен реализовать владелец ресурса - добавить свой сайт в этот каталог. Минимальное требование при регистрации - каждая страница, добавляемая в каталог, должна содержать полезный и уникальный материал, который соответствует той категории, в которой вы пытаетесь зарегистрироваться. Если ресурс имеет несколько тематических разделов, можно попробовать добавить в каталог каждый из них, но не следует делать это одновременно, лучше - через некоторый промежуток времени. Хотя, как писал в обзоре об ODP А.Шкондин, этот каталог не пользуется большой популярностью в Рунете, тем не менее его данные используются более чем на двухстах других сайтах, в том числе - на Google. &lt;p&gt; Посмотрим, что нужно вебмастеру, чтобы PageRank его сайта в поисковике Google был выше. Самое простое и, тем не менее, важное - построить качественную систему внутренних ссылок собственного сайта. Вот какие советы дает по этому поводу Крис Райдингс (статья в переводе Александра Садовского): &lt;br /&gt; Там, где группа страниц может содержать внешние ссылки, используйте иерархическую структуру. &lt;br /&gt; Там, где группа страниц не содержит внешних ссылок, используйте структуру с обширными связями, расширив ее добавлением ссылки на главную страницу. &lt;br /&gt; Если конкретная страница особенно важна, помещайте ее выше в иерархической структуре. &lt;p&gt; Теперь разберем следующий момент. При расчете PageRank не проверяется содержимое сайтов и текста ссылок, поэтому будут учитываться все внешние ссылки, ведущие на искомую страницу. Нужно помнить лишь об одном: ссылки из каталогов или иных сайтов должны идти на ваш сайт напрямую, но не через cgi-скрипт. Последние при расчете показателей не учитываются. При решении вопросов о размещении ссылок на ваш сайт или его конкретную страницу нужно руководствоваться еще одним принципом расчета PageRank. &quot;Вес&quot; каждой ссылающейся страницы делится в равной степени по всем ссылкам, которые на этой странице есть. Поэтому, если вы разместите ссылку на свой сайт на каком-либо ресурсе, предназначенном для свободного размещения ссылок (так называемые Free For All), то вес, который это размещение добавит вашему сайту, может оказаться настолько мизерным, что не окупит ваших затрат на эту работу. &lt;p&gt; В данном случае лучше подыскать страницы сайтов, имеющие высокий показатель PageRank, и постараться разместить ссылку на ваш сайт на этих страницах. В преддверии обсуждения следующих вопросов - о тематических индексах цитирования - полезно проработать вопрос о размещении ссылок на сайтах, тематически связанных с вашим. Крейг Сильверстейн из Google как-то сказал: &quot;Если вы облегчаете нашу работу, то вы нам (поисковой машине Google) больше нравитесь&quot;. А нравиться, в представлении этой поисковой системы, значит обмениваться ссылками с &quot;уважаемыми&quot; сайтами, которые, в том числе, используют ключевые слова, связанные с тематикой вашего сайта. &lt;p&gt; Редко встречаются сайты, не имеющие ни одной исходящей ссылки. Простановка таких ссылок приводит к тому, что значение PageRank страницы, на которой они проставлены, снижается. Что нужно делать, для того чтобы максимально уменьшить это влияние, проставив все же ссылки на внешние сайты? Выше говорилось, что поисковиком не засчитываются ссылки, выполненные через cgi-скрипты. Следовательно, если вы проставите ссылки через такие скрипты, то они не снизят вес страницы (но помните, что точно так же могут поступать и те сайты, где вы решите разместить ссылку на свою страницу). Второй вариант, позволяющий снизить влияние внешних ссылок - запретить с помощью файла robots.txt индексацию таких страниц. Оба приема являются дозволенными, но не используйте их в случаях, когда вы договариваетесь о взаимном обмене ссылками с другими сайтами. &lt;p&gt; Проставив ссылки, не следует забывать о том, что они должны работать, в данном случае - приводить посетителей на ваш сайт. Поэтому не забывайте постоянно анализировать статистику посещаемости, оценивайте, по каким ссылкам приходят к вам, а по каким - нет. Не работающие долгое время ссылки можно смело убирать - они лишь занимают место на ваших страницах. Всегда следует помнить о цели, с которой вы занимаетесь этой работой - повышение показателя PageRank и, как следствие, увеличение посетителей вашего сайта.[/table]</content:encoded>
			<category>Статьи Web-мастеру</category>
			<dc:creator>stim</dc:creator>
			<guid>https://rus-16.do.am/forum/32-27-1</guid>
		</item>
		<item>
			<title>В PHP 5.3 появился ActiveRecord аналогичный Ruby on Rails</title>
			<link>https://rus-16.do.am/forum/32-25-1</link>
			<pubDate>Sat, 26 Mar 2011 19:36:28 GMT</pubDate>
			<description>Форум: &lt;a href=&quot;https://rus-16.do.am/forum/32&quot;&gt;Статьи Web-мастеру&lt;/a&gt;&lt;br /&gt;Автор темы: stim&lt;br /&gt;Автор последнего сообщения: stim&lt;br /&gt;Количество ответов: 0</description>
			<content:encoded>[table]В конце концов, PHP получит более надежный способ активной записи аналогичный способу применяемому в RoR. И, к счастью, это время настало! Спасибо PHP 5. 3 и его новым полезным функциям: схлопыванию, позднему статистическому связыванию и пространству имен. &lt;p&gt; Я со своим другом Каеном, внесли улучшения в раннюю версию на базе ORM, которую он написал до появления PHP 5. 3. Мы создали ActiveRecord вдохновленные Ruby on Rails и попытались сохранить его возможности, насколько это было возможно. Нашей основной целью в этом проекте – дать возможность PHP-разработчикам создавать крупные проекты с большей гибкостью. &lt;p&gt; Мы также надеемся что использование данного продукта подтолкнет PHP сообщество к дальнейшему осознанию всех замечательных преимуществ Ruby on Rails. Ладно , хватит крутиться вокруг да около, давайте перейдем к самому интересному! &lt;p&gt; Обзор ActiveRecord &lt;p&gt; Позвольте мне согласиться с тем фактом, что мы пытались сохранить сходство между нашим детящем и ActiveRecord на базе Ruby on rails, чтобы избежать головной боли и повысить работоспособность программиста. Сохраняя это сходство, мы постарались воссоздать многие функции. Вот список этих функций: &lt;p&gt; * Методы поиска &lt;br /&gt; * Методы динамического поиска &lt;br /&gt; * Методы записи &lt;br /&gt; * Отношения &lt;br /&gt; * Верификация &lt;br /&gt; * Обратные вызовы &lt;br /&gt; * Сериализация &lt;br /&gt; * Поддержка различных драйверов &lt;br /&gt; * Другие параметры &lt;p&gt; Также здесь есть и другие возможности, как пространства имен, дополнительные драйверы, транзакции (то чего мы хотели бы пораньше) и многое другое мы добавим в будущем, но для начала я думаю совсем неплохо. Мы надеемся, запустить сайт с документацией и разместить исходники на сервисе исходных кодов в течении 2-3х недель. Не забывайте следить за обновлениями, которые вскоре появятся. &lt;p&gt; Конфигурация &lt;p&gt; Установка проста и линейна. Здесь есть всего 2 типа конфигурации, которые вы можете выбрать: &lt;p&gt; * Установка типовой auto_load директории &lt;br /&gt; * Настройка соединений с вашей базой данных &lt;p&gt; Примеры: &lt;p&gt; ActiveRecord&amp;#92;Config::initialize(function($cfg) &lt;br /&gt; { &lt;br /&gt; $cfg-&gt;set_model_directory(&apos;/path/to/your/model_directory&apos;); &lt;br /&gt; $cfg-&gt;set_connections(array(&apos;development&apos; =&gt; &lt;br /&gt; &apos;mysql://username:password@localhost/database_name&apos;)); &lt;br /&gt; }); &lt;br /&gt; #Альтернативно(w/o ограничение 5.3): &lt;br /&gt; $cfg = ActiveRecord&amp;#92;Config::instance(); &lt;br /&gt; $cfg-&gt;set_model_directory(&apos;/path/to/your/model_directory&apos;); &lt;br /&gt; $cfg-&gt;set_connections(array(&apos;development&apos; =&gt; &apos;mysql://username:password@localhost/database_name&apos;)); &lt;p&gt; Как только вы настроите два этих параметра ваша работа окончена. ActiveRecord заботится о вас и берет остальную часть работы на себя. Она не требует проводить какую либо дополнительную работу со схемами ваших yaml/xml файлов. Также запросы к базу данных для получения информации и кэш-файлов будет проходить без лишних вызовов для одной схемы. &lt;p&gt; Методы поиска &lt;p&gt; ActiveRecord поддерживает несколько методов, с помощью которых, вы можете найти записи либо по первичному ключу, либо сконструировав свой собственный с набором опций, к примеру: сортировка, лимит, выбор, группировка. &lt;p&gt; #поиск по первичному ключу &lt;br /&gt; Author::find(3); &lt;br /&gt; #поиск нескольких записей по первичному ключу &lt;br /&gt; Author::find(1, 2, 3); &lt;br /&gt; #поиск первой записи по лимиту &lt;br /&gt; Author::first(); &lt;br /&gt; #поиск последней записи по сортировке и лимиту &lt;br /&gt; Author::last(); &lt;br /&gt; Author::all(); &lt;br /&gt; #это возможно будет для вас адом, но вы должны выполнить свой sql-запрос для поиска &lt;br /&gt; Author::find_by_sql(); &lt;br /&gt; ## еще вы можете добавить много дополнительных опций к методам поиска &lt;br /&gt; #sql =&gt; ORDER BY name &lt;br /&gt; Author::find(3, array(&apos;order&apos; =&gt; &apos;name&apos;)); &lt;br /&gt; #sql =&gt; WHERE author_id IN (1, 2, 3) &lt;br /&gt; # поиск с условиями как массив &lt;br /&gt; Author::find(&apos;all&apos;, array(&apos;conditions&apos; =&gt; array(&apos;author_id IN(?)&apos;, array(1, 2, 3)))); &lt;br /&gt; #sql =&gt; WHERE author_id = 3 &lt;br /&gt; #поиск с условиями как строка &lt;br /&gt; Author::find(&apos;first&apos;, array(&apos;conditions&apos; =&gt; &apos;author_id=3&apos;)); &lt;br /&gt; #sql =&gt; GROUP BY name &lt;br /&gt; Author::find(3, array(&apos;group&apos; =&gt; &apos;name&apos;)); &lt;br /&gt; #sql =&gt; LIMIT 0, 3 &lt;br /&gt; Author::find(&apos;all&apos;, array(&apos;limit&apos; =&gt; 3)); &lt;br /&gt; #sql =&gt; select * from `author` INNER JOIN etc. . . &lt;br /&gt; Author::find(&apos;all&apos;, array(&apos;joins&apos; =&gt; &lt;br /&gt; &apos;INNER JOIN book on (book. author_id = author. id)&apos;)); &lt;br /&gt; #sql =&gt; SELECT name FROM table &lt;br /&gt; Author::first(array(&apos;select&apos; =&gt; &apos;name&apos;)); &lt;br /&gt; #этод метод не возвращает запись &lt;br /&gt; #возвращает да/нет &lt;br /&gt; Author::exists(1); &lt;br /&gt; #возвращает число &lt;br /&gt; Author::count(array(&apos;conditions&apos; =&gt; array(&apos;name = ?&apos;, &apos;John&apos;))); &lt;p&gt; #доступ очень простой &lt;br /&gt; $book = Book::first(); &lt;br /&gt; echo $book-&gt;title; &lt;br /&gt; echo $book-&gt;author_id; &lt;br /&gt; # возвращает массив &lt;br /&gt; $books = Book::all(); &lt;br /&gt; echo $books[0]-&gt;title; &lt;p&gt; Методы динамического поиска &lt;p&gt; ActiveRecord на основе RoR расширяет функции использования поиска, позволяя динамически создавать методы основанные на атрибутивных именах. Это значит, вы с легкостью можете сделать запрос&quot;find_by_attribute_name&quot; без явного классового определения. Мы сделали это возможным с помощью использования волшебного метода в PHP 5.3: __callStatic(). &lt;p&gt; Author::find_by_name(&apos;George Bush&apos;); &lt;br /&gt; #вы можете это сделать используя и/или &lt;br /&gt; Author::find_by_name_or_author_id(&apos;George Bush&apos;, 2); &lt;br /&gt; Person::find_by_first_name_and_last_name(&apos;Obama&apos;, &apos;Mama&apos;); &lt;br /&gt; #также имеется find_all_by(найти всё по какому-либо параметру) &lt;br /&gt; Author::find_all_by_name(&apos;Tito&apos;); &lt;br /&gt; Author::find_all_by_name(array(&apos;Tito&apos;, &apos;Bill Clinton&apos;)); &lt;p&gt; Методы записи &lt;p&gt; Какой смысл иметь объект, который инкапсулирует запись из БД, если вы не можете ничего сделать с этим? &lt;p&gt; #выполняет SQL insert, такой же какой вы делаете при добавлении записи &lt;br /&gt; $book = new Artist(array(&apos;name&apos; =&gt; &apos;Tito&apos;)); &lt;br /&gt; $book-&gt;save(); &lt;p&gt; ## обновление &lt;br /&gt; # обновление возможно, только после нахождения обновляемой строки &lt;br /&gt; $book = Book::find(1); &lt;br /&gt; $book-&gt;title = &apos;new title!&apos;; &lt;br /&gt; $book-&gt;save(); &lt;p&gt; #это автоматически выполняет сохранение &lt;br /&gt; $book = Book::find(1); &lt;br /&gt; $book-&gt;update_attributes(array(&apos;title&apos; =&gt; &apos;new title!&apos;, &lt;br /&gt; &apos;price&apos; =&gt; 5. 00)); &lt;br /&gt; #еще автоматическое сохранение &lt;br /&gt; $book = Book::find(1); &lt;br /&gt; $book-&gt;update_attribute(&apos;title&apos;, &apos;some new title&apos;); &lt;br /&gt; $book = new Book; &lt;br /&gt; $book-&gt;title = &apos;new title!&apos;; &lt;br /&gt; $book-&gt;author_id = 5; &lt;br /&gt; $book-&gt;save(); &lt;br /&gt; $book-&gt;created_at # мы также поддерживаем временные отметки created_at/updated_at где это нужно &lt;br /&gt; echo $book-&gt;id; #id также получает авто инкрементированное значение &lt;p&gt; #удаление &lt;br /&gt; $author = Author::find(4); &lt;br /&gt; $author-&gt;delete(); &lt;p&gt; #вы получаете запись в режими только чтение без возможности изменить её &lt;br /&gt; $book = Book::first(array(&apos;readonly&apos; =&gt; true)); &lt;br /&gt; $book-&gt;title = &apos;new&apos;; # или вы можете установить этот режим с помощью метода $book-&gt;readonly(true); &lt;br /&gt; #это запустит процессы ActiveRecord&amp;#92;ReadonlyException &lt;br /&gt; $book-&gt;save(); &lt;p&gt; Отношения &lt;p&gt; Объединения - сложная часть ActiveRecord. Они используют те же самые опции, что в RoR. &lt;p&gt; #отношения декларируются в статическом свойстве &lt;br /&gt; class Book extends ActiveRecord&amp;#92;Model { &lt;br /&gt; static $belongs_to = array( &lt;br /&gt; array(&apos;publisher&apos;), &lt;br /&gt; array(&apos;author&apos;, &apos;readonly&apos; =&gt; true, &apos;select&apos; =&gt; &apos;name&apos;, &apos;conditions&apos; =&gt; &quot;name != &apos;jax&apos;&quot;), &lt;br /&gt; array(&apos;another&apos;, &apos;class_name&apos; =&gt; &apos;SomeModel&apos;) &lt;br /&gt; ); &lt;br /&gt; #has_many допускает select/conditions/limit/readonly/group/primary_key &lt;br /&gt; #has_many также применима через опцию которую вы можете использовать с источником(source) &lt;br /&gt; #для уточнения класса &lt;br /&gt; static $has_many = array( &lt;br /&gt; array(&apos;revisions&apos;), &lt;br /&gt; array(&apos;editors&apos;, &apos;through&apos; =&gt; &apos;revisions&apos;) &lt;br /&gt; ); &lt;br /&gt; static $has_one = array( &lt;br /&gt; array(&apos;something&apos;) &lt;br /&gt; ); &lt;br /&gt; } &lt;br /&gt; #индекс декларируемый для каждой ассоциации является &quot;attribute_name&quot; &lt;br /&gt; #которую вы можете использовать для работы с моделью как, например: &lt;br /&gt; $book = Book::first(); &lt;br /&gt; echo $book-&gt;publisher-&gt;name; &lt;br /&gt; echo $book-&gt;author-&gt;name; # у нас есть только имя как атрибут выборки &lt;br /&gt; #ниже будет запускаться опция readonlyException — смотрите методы записи &lt;p&gt; #методы выбора &lt;br /&gt; $book-&gt;author-&gt;save(); &lt;br /&gt; #has_many &lt;br /&gt; echo $book-&gt;revisions[0]-&gt;id; &lt;br /&gt; #has_many &lt;br /&gt; echo $book-&gt;editors[0]-&gt;name; &lt;p&gt; Верификация &lt;p&gt; Название говорит само за себя. До того как сохранить/обновить/извлечь к каждому определению, которое вы создали, будет применена верификация и только после её удачного прохождения модель будет возвращена. В противном случае, вы увидите сообщение об ошибке и сможете вернуться обратно для ее исправления. &lt;p&gt; class Book extends ActiveRecord&amp;#92;Model &lt;br /&gt; { &lt;br /&gt; static $validates_format_of = array( &lt;br /&gt; array(&apos;title&apos;, &apos;with&apos; =&gt; &apos;/^[a-zW]*$/&apos;, &apos;allow_blank&apos; =&gt; true) &lt;br /&gt; ); &lt;br /&gt; static $validates_exclusion_of = array( &lt;br /&gt; array(&apos;title&apos;, &apos;in&apos; =&gt; array(&apos;blah&apos;, &apos;alpha&apos;, &apos;bravo&apos;)) &lt;br /&gt; ); &lt;br /&gt; static $validates_inclusion_of = array( &lt;br /&gt; array(&apos;title&apos;, &apos;within&apos; =&gt; array(&apos;tragedy of dubya&apos;, &apos;sharks wit laserz&apos;)) &lt;br /&gt; ); &lt;br /&gt; static $validates_length_of = array( &lt;br /&gt; array(&apos;title&apos;, &apos;within&apos; =&gt; array(1, 5)), &lt;br /&gt; array(&apos;attribute2&apos;, &apos;in&apos; =&gt; array(1, 2)), &lt;br /&gt; array(&apos;attribute3&apos;, &apos;is&apos; =&gt; 4, &apos;allow_null&apos; =&gt; true) &lt;br /&gt; ); &lt;br /&gt; # same as above since it is just an alias &lt;br /&gt; static $validates_size_of = array(); &lt;br /&gt; static $validates_numericality_of = array( array(&apos;title&apos;) ); &lt;br /&gt; static $validates_presence_of = array( array(&apos;title&apos;) ); &lt;br /&gt; }; &lt;br /&gt; $book = new Book; &lt;br /&gt; $book-&gt;title = &apos;this is not part of the inclusion&apos;; &lt;br /&gt; if (!$book-&gt;save()) &lt;br /&gt; print_r($book-&gt;errors-&gt;on(&apos;title&apos;)); &lt;p&gt; Обратные вызовы &lt;p&gt; Обратные вызовы дают вам возможность управлять вашей моделью до/после какого-то события на протяжении ее существования. Вы можете выбрать методы, которые будут вызваны как callback до или после других методов примененных в модели. К сожалению, даже PHP 5.3 имеет ограничения - вы не можете иcпользовать callback в виде статических методов, они должны быть динамическими. &lt;p&gt; #Ниже приведены команды, которые вы можете использовать &lt;br /&gt; #Если ваш обратный вызов является недействительным для before_*, он отменит &lt;br /&gt; #действие и остальные вызовы &lt;br /&gt; class Book extends ActiveRecordModel{ &lt;br /&gt; static $after_construct; &lt;br /&gt; static $before_save = array(&apos;do_something_before_save&apos;); &lt;br /&gt; static $after_save; &lt;br /&gt; static $before_create; &lt;br /&gt; static $after_create; &lt;br /&gt; static $before_update; &lt;br /&gt; static $after_update; &lt;br /&gt; static $before_validation; &lt;br /&gt; static $after_validation; &lt;br /&gt; static $before_validation_on_create; &lt;br /&gt; static $after_validation_on_create; &lt;br /&gt; static $before_validation_on_update; &lt;br /&gt; static $after_validation_on_update; &lt;br /&gt; static $before_destroy; &lt;br /&gt; static $after_destroy; &lt;br /&gt; #это будет вызвано перед обновлением &lt;br /&gt; public function do_something_before_save() {} &lt;br /&gt; } &lt;p&gt; Сериализация &lt;p&gt; class Book extends ActiveRecord&amp;#92;Model{ &lt;br /&gt; public function upper_title(){ &lt;br /&gt; return strtoupper($this-&gt;title); &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt; #produces: {title: &apos;sharks wit lazers&apos;, author_id: 2} &lt;br /&gt; $book = Book::find(1); &lt;br /&gt; $book-&gt;to_json(); &lt;br /&gt; #produces: {title: &apos;sharks wit lazers&apos;} &lt;br /&gt; $book-&gt;to_json(array(&apos;except&apos; =&gt; &apos;author_id&apos;)); &lt;br /&gt; #produces: {upper_title: &apos;SHARKS WIT LAZERS&apos;} &lt;br /&gt; #создает массив методов, которые затем будут вызваны &lt;br /&gt; $book-&gt;to_json(array(&apos;methods&apos; =&gt; &apos;upper_title&apos;, &apos;only&apos; =&gt; &apos;upper_title&apos;)); &lt;br /&gt; #produces {title: &apos;sharks wit lazers&apos;, author_id: 2} &lt;br /&gt; $book-&gt;to_json(array(&apos;include&apos; =&gt; array(&apos;author&apos;))); &lt;br /&gt; #также поддерживает xml, который имеет теже опиции, но нужны больше для тестирования =) &lt;br /&gt; $book-&gt;to_xml(); &lt;p&gt; Поддержка различных драйверов &lt;p&gt; В настоящее время существует поддержка только для MySQL (через mysqli) и sqlite3. Однако мы надеемся ввести большее число драйверов в проект, что должно помочь в работе с такими БД как PostgresSQL и Oracle. Соедиение/адаптер - сделан так, что не возникнет никаких затруднений при создании большего числа драйверов, когда будет нужно. &lt;p&gt; Другие параметры &lt;p&gt; При декларировании модели вы также можете указать primary_key и table_name. &lt;br /&gt; Защищенные/доступные определения уже доступны, так что вы можете справится со многими распространенными проблемами. Атрибуты могут быть псевдонимами, чтобы вам было легче получить доступ к ним через разные имена. &lt;p&gt; class Book extends ActiveRecord&amp;#92;Model{ &lt;br /&gt; static $primary_key = &apos;book_id&apos;; &lt;br /&gt; static $table_name = &apos;book_table&apos;; &lt;br /&gt; static $attr_accessible = array(&apos;author_id&apos;); &lt;br /&gt; static $attr_protected = array(&apos;book_id&apos;); &lt;br /&gt; static $alias_attribute = array( &lt;br /&gt; &apos;new_alias&apos; =&gt; &apos;actual_attribute&apos;, &lt;br /&gt; &apos;new_alias_two&apos; =&gt; &apos;other_actual_attribute&apos; &lt;br /&gt; ); &lt;br /&gt; } &lt;p&gt; Будущее &lt;p&gt; Как я уже отмечал ранее, в самое ближайшее время данный код будет доступен на сервисах исходного кода. Мы также работаем над созданием сайта с учебными пособиями и документациями к коду. Я буду сообщать о новых успехах. &lt;br /&gt; Спасибо за прочтение! &lt;p&gt; UPD: ActiveRecord доступен по адресу &lt;a class=&quot;link&quot; target=&quot;_blank&quot; href=&quot;http://u.to/fZrZ&quot; title=&quot;http://github.com/kla/php-activerecord/tree/master&quot; rel=&quot;nofollow&quot;&gt;http://github.com/kla/php-activerecord/tree/master&lt;/a&gt; &lt;p&gt; Данная статья является переводом PHP ActiveRecord with PHP 5.3. &lt;br /&gt; Подготовленно командой Internet-Technologies.Ru[/table]</content:encoded>
			<category>Статьи Web-мастеру</category>
			<dc:creator>stim</dc:creator>
			<guid>https://rus-16.do.am/forum/32-25-1</guid>
		</item>
		<item>
			<title>Гостевая книга своими руками на PHP и MySQL</title>
			<link>https://rus-16.do.am/forum/32-24-1</link>
			<pubDate>Sat, 26 Mar 2011 19:35:50 GMT</pubDate>
			<description>Форум: &lt;a href=&quot;https://rus-16.do.am/forum/32&quot;&gt;Статьи Web-мастеру&lt;/a&gt;&lt;br /&gt;Автор темы: stim&lt;br /&gt;Автор последнего сообщения: stim&lt;br /&gt;Количество ответов: 0</description>
			<content:encoded>[table]Наша гостевая книга будет состоять из трех php-файлов, одной базы данных и одной таблицы MySQL. &lt;p&gt; В данной статье приведены только фрагменты кода гостевой книги. &lt;br /&gt; Скачать полные исходные коды гостевой книги можно на сайте автора. &lt;p&gt; 1. Подключаемся к СУБД, создаем базы и таблицы для гостевой книги &lt;p&gt; Файл dbconnect.php, служит для подлючения к серверу БД MySQL и создания базы данных и базы данных и необходимой таблицы для гостевой книги. &lt;p&gt; // название сервера БД &lt;br /&gt; define (&quot;HOST&quot;, &quot;localhost&quot;); &lt;br /&gt; // название базы данных &lt;br /&gt; define (&quot;DATABASE&quot;, &quot;gb&quot;); &lt;br /&gt; // пользователь MySQL &lt;br /&gt; define (&quot;MYSQL_USER&quot;, &quot;root&quot;); &lt;br /&gt; // пароль к MYSQL &lt;br /&gt; define (&quot;MYSQL_PASS&quot;, &quot;&quot;); &lt;p&gt; // создаем базу данных и таблицу gb &lt;br /&gt; $link1=mysql_connect(HOST, MYSQL_USER, MYSQL_PASS) &lt;br /&gt; or die(&quot;Нет соединения с MySQL сервером!&quot;); &lt;br /&gt; mysql_query (&quot;CREATE DATABASE IF NOT EXISTS &quot;.DATABASE) &lt;br /&gt; or die (&quot;Не могу создать базу данных gb.&quot;); &lt;br /&gt; mysql_select_db(DATABASE) &lt;br /&gt; or die(&quot;Нет содениения с требуемой базой данных!&quot;); &lt;br /&gt; mysql_query (&quot;CREATE TABLE IF NOT EXISTS gb &lt;br /&gt; (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, &lt;br /&gt; username VARCHAR (100), &lt;br /&gt; dt DATETIME, &lt;br /&gt; msg TEXT)&quot;) &lt;br /&gt; or die (&quot;Не могу создать таблицу gb.&quot;); &lt;p&gt; Таблица gb создается с необходимыми нам полями: &lt;br /&gt; username - имя пользователя, оставляющего сообщение в гостевой; &lt;br /&gt; dt - время и дата сообщения; &lt;br /&gt; msg - текст сообщения. &lt;br /&gt; Если база данных и таблица уже имеются, то ничего не происходит. &lt;p&gt; Если уж очень хочется экономить на запросах к БД, то строки с созданием БД и созданием таблицы можно вынести в отдельный *.php файл-установщик, который надо будет запускать всего 1 раз. &lt;p&gt; Файл dbconnect.php мы будем загружать каждый раз, если есть необходимость обращения к БД. &lt;p&gt; 2. Что у нас в БД? Выводим содержимое гостевой книги &lt;p&gt; Файл index.php служит для отображения содержимого гостевой книги и формы отправки сообщения. &lt;p&gt; Вывод сообщений гостевой книги осуществляется следующим блоком кода. Записи поочередно выдергиваются из результата запроса к базе данных. Порядок вывода таков: новые записи выше старых. Обратим также внимание на то, что подсветка чётных и нечётных сообщений выполняется разными цветами. &lt;p&gt; $c=0; &lt;br /&gt; // выбор всех записей из БД, отсортированных так, &lt;br /&gt; // что самая последняя отправленная запись будет всегда первой. &lt;br /&gt; $r=mysql_query (&quot;SELECT * FROM gb ORDER BY dt DESC&quot;); &lt;br /&gt; while ($row=mysql_fetch_array($r)) // для каждой записи организуем вывод. &lt;br /&gt; { &lt;br /&gt; if ($c%2) &lt;br /&gt; $col=&quot;bgcolor=&apos;#f9f9f9&apos;&quot;; // цвет для четных записей &lt;br /&gt; else &lt;br /&gt; $col=&quot;bgcolor=&apos;#f0f0f0&apos;&quot;; // цвет для нечетных записей &lt;p&gt; ?&gt; &lt;br /&gt; &lt;table border=&quot;0&quot; cellspacing=&quot;3&quot; cellpadding=&quot;0&quot; width=&quot;90%&quot; &lt;br /&gt; &lt;? echo $col; ?&gt; style=&quot;margin: 10px 0px;&quot;&gt; &lt;br /&gt; &lt;tr&gt; &lt;br /&gt; &lt;td width=&quot;150&quot; style=&quot;color: #999999;&quot;&gt;Имя пользователя:&lt;/td&gt; &lt;br /&gt; &lt;td&gt;&lt;?php echo $row[&apos;username&apos;]; ?&gt;&lt;/td&gt; &lt;br /&gt; &lt;/tr&gt; &lt;br /&gt; &lt;tr&gt; &lt;br /&gt; &lt;td width=&quot;150&quot; style=&quot;color: #999999;&quot;&gt;Дата опубликования:&lt;/td&gt; &lt;br /&gt; &lt;td&gt;&lt;?php echo $row[&apos;dt&apos;]; ?&gt;&lt;/td&gt; &lt;br /&gt; &lt;/tr&gt; &lt;br /&gt; &lt;tr&gt; &lt;br /&gt; &lt;td colspan=&quot;2&quot; style=&quot;color: #999999;&quot;&gt; &lt;br /&gt; --------------------------------------------------------------- &lt;br /&gt; &lt;/td&gt; &lt;br /&gt; &lt;/tr&gt; &lt;br /&gt; &lt;tr&gt; &lt;br /&gt; &lt;td colspan=&quot;2&quot;&gt; &lt;br /&gt; &lt;?php echo $row[&apos;msg&apos;]; ?&gt; &lt;br /&gt; &lt;br&gt; &lt;br /&gt; &lt;/td&gt; &lt;br /&gt; &lt;/tr&gt; &lt;p&gt; &lt;/table&gt; &lt;br /&gt; &lt;?php &lt;br /&gt; $c++; &lt;br /&gt; } &lt;p&gt; if ($c==0) // если ни одной записи не встретилось &lt;br /&gt; echo &quot;Гостевая книга пуста!&lt;br&gt;&quot;; &lt;p&gt; Код формы для отправки сообщений выглядит следующим образом: &lt;p&gt; &lt;form name=&quot;myForm&quot; action=&quot;action.php&quot; method=&quot;post&quot; onSubmit=&quot;return splash();&quot;&gt; &lt;br /&gt; &lt;input type=&quot;hidden&quot; name=&quot;action&quot; value=&quot;add&quot;&gt; &lt;br /&gt; &lt;table border=&quot;0&quot;&gt; &lt;br /&gt; &lt;tr&gt; &lt;br /&gt; &lt;td width=&quot;160&quot;&gt; &lt;br /&gt; Имя пользователя: &lt;br /&gt; &lt;/td&gt; &lt;br /&gt; &lt;td&gt; &lt;br /&gt; &lt;input name=&quot;username&quot; style=&quot;width: 300px;&quot;&gt; &lt;br /&gt; &lt;/td&gt; &lt;br /&gt; &lt;/tr&gt; &lt;br /&gt; &lt;tr&gt; &lt;br /&gt; &lt;td width=&quot;160&quot; valign=&quot;top&quot;&gt; &lt;br /&gt; Сообщение: &lt;br /&gt; &lt;/td&gt; &lt;br /&gt; &lt;td&gt; &lt;br /&gt; &lt;textarea name=&quot;msg&quot; style=&quot;width: 300px;&quot;&gt;&lt;/textarea&gt; &lt;br /&gt; &lt;/td&gt; &lt;br /&gt; &lt;/tr&gt; &lt;br /&gt; &lt;tr&gt; &lt;br /&gt; &lt;td width=&quot;160&quot;&gt; &lt;p&gt; &lt;/td&gt; &lt;br /&gt; &lt;td&gt; &lt;br /&gt; &lt;input type=&quot;submit&quot; value=&quot;Отправить сообщение&quot;&gt; &lt;br /&gt; &lt;/td&gt; &lt;br /&gt; &lt;/tr&gt; &lt;br /&gt; &lt;/table&gt; &lt;br /&gt; &lt;/form&gt; &lt;p&gt; Проверка правильности заполнения формы происходит на стороне клиента, для чего реализована JavaScript-функция splash(); &lt;p&gt; function splash() &lt;br /&gt; { &lt;br /&gt; if (document.myForm.username.value ==&apos;&apos;) &lt;br /&gt; { &lt;br /&gt; alert (&quot;Заполните имя пользователя!&quot;); &lt;br /&gt; return false; &lt;br /&gt; } &lt;p&gt; if (document.myForm.msg.value ==&apos;&apos;) &lt;br /&gt; { &lt;br /&gt; alert (&quot;Заполните текст сообщения!&quot;); &lt;br /&gt; return false; &lt;br /&gt; } &lt;p&gt; return true; &lt;br /&gt; } &lt;p&gt; Данные из формы передаются в файл action.php. &lt;p&gt; 3. Добавляем записи в гостевую книгу &lt;p&gt; Файл action.php - ядро гостевой книги. В этот файл принимаются данные из формы отправки сообщения и может выполняться одно из двух действий: &lt;br /&gt; - добавление записи в гостевую книгу (при параметре action=add) &lt;br /&gt; - удаление всех записей из гостевой книги (при параметре action=delete) &lt;p&gt; Заметим, что случай, когда action=delete может наступить только тогда, когда эта команда будет передана в ручную, с помощью вызова action.php?action=delete. &lt;p&gt; &lt;?php &lt;br /&gt; include (&quot;dbconnect.php&quot;); &lt;p&gt; // получаем переменные из формы &lt;br /&gt; $username=$_REQUEST[&apos;username&apos;]; &lt;br /&gt; $msg=$_REQUEST[&apos;msg&apos;]; &lt;br /&gt; $action=$_REQUEST[&apos;action&apos;]; &lt;p&gt; if ($action==&quot;add&quot;) &lt;br /&gt; { &lt;br /&gt; // добавление данных в БД &lt;br /&gt; $sql=&quot;INSERT INTO gb(username, dt, msg) VALUES (&apos;$username&apos;, NOW(), &apos;$msg&apos;)&quot;; &lt;br /&gt; $r=mysql_query ($sql); &lt;br /&gt; } &lt;p&gt; if ($action==&quot;delete&quot;) &lt;br /&gt; { &lt;br /&gt; // удаление базы гостевой &lt;br /&gt; $sql=&quot;DELETE FROM gb&quot;; &lt;br /&gt; $r=mysql_query($sql); &lt;br /&gt; } &lt;p&gt; header(&quot;Location: index.php&quot;); &lt;br /&gt; ?&gt; &lt;p&gt; Файл action.php создан специально для того, чтобы не передавать данные в файл index.php. Если бы мы передавали данные в index.php, то при обновлении страницы или при пользовании кнопками &quot;назад&quot;, &quot;вперед&quot; в браузере, мы бы могли встретиться с ситуацией излишней повторной отправки данных. Что приводило бы созданию дубликатов записей в гостевой книге и излишней путанице пользователей. &lt;p&gt; Файл action.php ничего не возвращает браузеру. При выполнении action.php происходит редирект на файл index.php.[/table]</content:encoded>
			<category>Статьи Web-мастеру</category>
			<dc:creator>stim</dc:creator>
			<guid>https://rus-16.do.am/forum/32-24-1</guid>
		</item>
		<item>
			<title>Синтаксические различия HTML и XHTML</title>
			<link>https://rus-16.do.am/forum/32-23-1</link>
			<pubDate>Sat, 26 Mar 2011 19:34:44 GMT</pubDate>
			<description>Форум: &lt;a href=&quot;https://rus-16.do.am/forum/32&quot;&gt;Статьи Web-мастеру&lt;/a&gt;&lt;br /&gt;Автор темы: stim&lt;br /&gt;Автор последнего сообщения: stim&lt;br /&gt;Количество ответов: 0</description>
			<content:encoded>[table]Вот возможный пример одного из наиболее кратких HTML-документов, обнаруживающий соответствие DTD HTML 4.01 Strict: &lt;p&gt; &lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01//EN&quot; &quot;http://www.w3.org/TR/html4/strict.dtd&quot;&gt; &lt;br /&gt; &lt;title&gt;&lt;/title&gt; &lt;br /&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt; Убедиться в том, что документ соответствует стандарту, можно при помощи онлайнового валидатора, доступного на сайте Консорциума W3C по адресу &lt;a class=&quot;link&quot; target=&quot;_blank&quot; href=&quot;http://u.to/Azsi&quot; title=&quot;http://validator.w3.org/.&quot; rel=&quot;nofollow&quot;&gt;http://validator.w3.org/.&lt;/a&gt; &lt;p&gt; Если мы откроем созданный нами документ при помощи какого-либо браузера, то мы увидим… пустое окно. Это неудивительно — наш документ не содержит никакой полезной информации. Элемент &lt;title&gt;&lt;/title&gt;, определяющий название документа, равно как и контейнер &lt;p&gt;&lt;/p&gt;, задающий абзац текста, в нашем примере совершенно пусты. &lt;p&gt; Давайте заполним их содержательной информацией: &lt;p&gt; &lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01//EN&quot; &quot;http://www.w3.org/TR/html4/strict.dtd&quot;&gt; &lt;br /&gt; &lt;title&gt;Минимальный документ&lt;/title&gt; &lt;br /&gt; &lt;p&gt;Эта веб-страница имеет простейшую структуру из всех возможных.&lt;/p&gt; &lt;p&gt; Обновив содержимое окна браузера, мы получим вполне осязаемый результат. Текст «Минимальный документ», являющийся названием нашей веб-страницы, отобразится в заголовке окна браузера, а содержимое контейнера &lt;p&gt;...&lt;/p&gt; — абзац текста — мы увидим непосредственно в окошке браузера. &lt;p&gt; Если мы просто попытаемся заменить ссылку на объявление типа документа, торжественно провозгласив, что наша веб-страница отныне является никак не просто HTML-, а вовсе даже XHTML-документом, у нас ничего путного не выйдет. &lt;p&gt; XHTML-документ может содержать только один корневой элемент разметки — а у нас их целых два: это &lt;title&gt;...&lt;/title&gt; и &lt;p&gt;...&lt;/p&gt;. Кроме того, в XHTML 1.0 Strict являются обязательными элементы &lt;head&gt;...&lt;/head&gt; и &lt;body&gt;...&lt;/body&gt;, определяющие соответственно заголовок и тело документа. Впрочем, хорошим тоном считается наличие этих элементов и в документах, созданных при помощи «обычного» HTML 4. &lt;p&gt; Заголовок — это раздел документа, куда включаются служебные, вспомогательные, управляющие элементы, которые не являются частью контента страницы. Такие элементы не отображаются в окне браузера. В их числе — элемент &lt;title&gt;...&lt;/title&gt;, содержимое которого, как мы помним, никак не влияет на внешний вид веб-страницы, а показывается лишь в заголовке окна браузера. &lt;br /&gt; Напротив, тело документа — это контейнер, куда помещается полезное содержание веб-страницы. Оно отображается в окне браузера и воспроизводится прочими пользовательскими агентами в соответствии с определенными для них правилами. &lt;p&gt; Перевод страницы, код которой представлен в вышеприведенном листинге, на язык XHTML будет выглядеть примерно так: &lt;p&gt; &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt; &lt;p&gt; &lt;html&gt; &lt;br /&gt; &lt;head&gt; &lt;br /&gt; &lt;title&gt;Минимальный документ&lt;/title&gt; &lt;br /&gt; &lt;/head&gt; &lt;br /&gt; &lt;body&gt; &lt;br /&gt; &lt;p&gt;Эта веб-страница имеет простейшую структуру из всех возможных.&lt;/p&gt; &lt;br /&gt; &lt;/body&gt; &lt;br /&gt; &lt;/html&gt; &lt;p&gt; Как видите, первая строка видоизменилась — именно так выглядит ссылка на определение типа документа XHTML 1.0 Strict. &lt;p&gt; Кстати говоря, для общего развития совсем не вредно прогуляться по тем URL, которые указываются в этих самых объявлениях, и посмотреть воочию, как выглядят файлы DTD. По адресу &lt;a class=&quot;link&quot; target=&quot;_blank&quot; href=&quot;http://u.to/wF54&quot; title=&quot;http://www.w3.org/TR/html4/strict.dtd&quot; rel=&quot;nofollow&quot;&gt;http://www.w3.org/TR/html4/strict.dtd&lt;/a&gt; вы найдете определение типа документа HTML 4.01 Strict, а по адресу &lt;a class=&quot;link&quot; target=&quot;_blank&quot; href=&quot;http://u.to/j9GZ&quot; title=&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot; rel=&quot;nofollow&quot;&gt;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&lt;/a&gt; — DTD для XHTML 1.0 Strict. Анализ файлов DTD выходит за пределы тематики нашей статьи — но ничего сверхъестественного они в себе не таят, и интересующиеся после некоторой подготовки вполне смогут самостоятельно в них разобраться. &lt;p&gt; К другим синтаксическим различиям. Необходимо, чтобы все теги XHTML-документа были набраны непременно в нижнем регистре, ибо с точки зрения синтаксических правил XML записи &lt;html&gt; и &lt;HTML&gt; являются совершенно различными. Требуется, чтобы элементы-контейнеры снабжались закрывающим тегом, а пустые элементы закрывались при помощи косой черты (к примеру, так: &lt;br /&gt;; пробел здесь необязателен, но его рекомендуется оставлять для совместимости со старыми браузерами). &lt;p&gt; Атрибут name для элементов &lt;a&gt;, &lt;applet&gt;, &lt;form&gt;, &lt;frame&gt;, &lt;iframe&gt;, &lt;img&gt; и &lt;map&gt; является нежелательным, вместо него полагается использовать атрибут id. &lt;p&gt; В XML не поддерживается минимизация атрибутов, поэтому булевы атрибуты должны быть записаны в полной форме. К примеру, конструкция &lt;option selected&gt; с точки зрения XHTML некорректна — правильной записью будет &lt;option selected=&quot;selected&quot;&gt;, несколько смахивающая на тавтологию. К сожалению, совсем старые браузеры, не совместимые с HTML 4, могут не понимать подобных конструкций, но таковых сегодня почти не осталось. &lt;p&gt; С прицелом на будущее &lt;p&gt; Того шаблона минимального документа на языке XHTML 1.0 Strict, который был описан в предыдущем подразделе, вполне достаточно для создания весьма качественных веб-страниц. &lt;p&gt; Есть, однако, еще несколько пожеланий. Пожеланий факультативных, необязательных, но способствующих дальнейшему усовершенствованию создаваемых документов, улучшению их в плане универсальности. &lt;p&gt; W3C, пропагандируя доступность контента веб-ресурсов для максимально широкого круга пользователей и выступая за интернационализацию Всемирной паутины, рекомендует указывать язык содержимого веб-страниц при помощи атрибута lang тега &lt;html&gt;. Это касается документов, созданных как при помощи HTML 4, так и с применением XHTML. &lt;p&gt; Нижеследующий фрагмент XHTML-кода свидетельствует, что данный документ — на русском языке:С прицелом на будущее &lt;p&gt; Того шаблона минимального документа на языке XHTML 1.0 Strict, который был описан в предыдущем подразделе, вполне достаточно для создания весьма качественных веб-страниц. &lt;p&gt; Есть, однако, еще несколько пожеланий. Пожеланий факультативных, необязательных, но способствующих дальнейшему усовершенствованию создаваемых документов, улучшению их в плане универсальности. &lt;p&gt; W3C, пропагандируя доступность контента веб-ресурсов для максимально широкого круга пользователей и выступая за интернационализацию Всемирной паутины (см. WAI — Web Accessibility Initiative), рекомендует указывать язык содержимого веб-страниц при помощи атрибута lang тега &lt;html&gt;. Это касается документов, созданных как при помощи HTML 4, так и с применением XHTML. &lt;p&gt; Нижеследующий фрагмент XHTML-кода свидетельствует, что данный документ — на русском языке: &lt;p&gt; &lt;html lang=&quot;ru&quot;&gt; &lt;br /&gt; ... &lt;br /&gt; &lt;/html&gt; &lt;p&gt; Буквенный код того или иного языка, указываемый в значении атрибута lang, приводится в соответствии со стандартом ISO 639. Так, например, английскому языку соответствует код en, французскому — fr, немецкому — de, украинскому — uk, белорусскому — be и т. д. &lt;p&gt; Дальнейшее в этом подразделе касается только XHTML-документов. Любая XHTML-страница, как известно, представляет собой XML-документ. &lt;p&gt; Считается хорошим тоном начинать XML-документы с объявления XML. Оно содержит номер версии языка, а также (иногда) некоторые дополнительные параметры, например, кодировку документа. Объявление XML не является обязательным для XML-документов, но все же его рекомендуется указывать, ибо в будущем вероятны ситуации, что документы без объявления XML будут восприняты как соответствующие самой последней версии языка, что может привести к ошибкам и разного рода несовместимостям. В настоящий момент в качестве официальных рекомендаций утверждены две версии XML — 1.0 и 1.1. Язык XHTML 1.0, напоминаю, базируется на XML 1.0, являясь подмножеством последнего. &lt;p&gt; В XML, который, как мы уже говорили, является универсальным стандартом для хранения любых структурированных данных, определен атрибут xml:lang, предназначенный для тех же целей, что и атрибут lang в HTML, с той лишь разницей, что xml:lang применим для любых XML-документов, а не только для XHTML-страниц. Можно сказать, что xml:lang носит более глобальный характер, нежели lang. Применение атрибута xml:lang является предпочтительным для современных XML-ориентированных пользовательских агентов, поисковых систем и т. д., но, к сожалению, старые браузеры, не совместимые с XML, не понимают и попросту игнорируют этот атрибут. Поэтому рекомендуется употреблять как xml:lang, так и lang «в одном флаконе», чтоб уж наверняка… &lt;p&gt; Кроме того, рекомендуется указывать принадлежность элемента &lt;html&gt;...&lt;/html&gt; к пространству имен XHTML. &lt;p&gt; Пояснение. XML, являя собой метаязык, позволяет разработчикам придумывать свои собственные, совершенно произвольные теги. Поскольку именами тегов назначаются, как правило, осмысленные слова естественного языка, которых, положа руку на сердце, не так уж и много в человеческой речи, в XML-документах разных типов вполне могут присутствовать одинаковые теги, обозначающие совершенно различные вещи. В этом нет ничего криминального. (Можно привести такую аналогию: скажем, в английском и французском языках есть слова, которые пишутся одинаково, но звучат по-разному, а порой обладают и различными смысловыми значениями.) Однако если элементы, наделяемые различной смысловой нагрузкой, но при этом определяемые одинаковыми тегами, встретятся в одном документе, произойдет конфликт имен — при обработке такого документа станет весьма проблематичным определить, данные какого типа несет в себе тот или иной элемент. Механизм пространств имен как раз-таки позволяет разрешать подобные конфликты. Впрочем, мне не хотелось бы здесь вдаваться в его устройство и вообще углубляться в тонкости XML — скажу лишь, что наличие или отсутствие ссылки на пространство имен XHTML никак не сказывается на поведении привычных нам браузеров; все это можно рассматривать скорее как задел на светлое будущее и лишний фактор душевного спокойствия разработчиков и уверенности в том, что все сделано «как надо». А это само по себе неплохо. &lt;p&gt; С учетом всего вышесказанного «минимальный» XHTML-документ превращается в нечто вроде такого: &lt;p&gt; &lt;?xml version=&quot;1.0&quot; encoding=&quot;windows-1251&quot;?&gt; &lt;br /&gt; &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt; &lt;p&gt; &lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; lang=&quot;ru&quot; xml:lang=&quot;ru&quot;&gt; &lt;p&gt; &lt;head&gt; &lt;br /&gt; &lt;title&gt;Минимальный документ&lt;/title&gt; &lt;br /&gt; &lt;/head&gt; &lt;p&gt; &lt;body&gt; &lt;br /&gt; &lt;p&gt;Эта веб-страница имеет простейшую структуру из всех возможных.&lt;/p&gt; &lt;br /&gt; &lt;/body&gt; &lt;p&gt; &lt;/html&gt; &lt;p&gt; Первая строка — то самое объявление XHTML; указываемая здесь кодировка должна, разумеется, совпадать с той, в которой документ возвращается сервером. Тег &lt;html&gt; «оброс» новыми атрибутами — так, значением атрибута xmlns является идентификатор пространства имен XHTML, а после атрибута lang добавился атрибут xml:lang с тем же самым значением, что и у lang. &lt;p&gt; Ограничения &lt;p&gt; По правде говоря, использовать приведенный выше «прогрессивный» шаблон XHTML-документа возможно нынче только с некоторыми ограничениями. &lt;p&gt; Большинство современных браузеров может работать в двух режимах — режиме соответствия стандартам и режиме совместимости (надо понимать, совместимости со страницами, сверстанными по «диким» правилам второй половины 1990-х). &lt;p&gt; Как правило, в режиме соответствия стандартам браузеры работают тогда, когда обрабатываемый документ снабжен правильным элементом &lt;!DOCTYPE ...&gt;. Если таковой элемент отсутствует либо некорректен, браузер переключается в режим совместимости. &lt;br /&gt; Одной из особенностей режима совместимости в Internet Explorer 6.0 является тот факт, что при отсутствующем или некорректном элементе &lt;!DOCTYPE ...&gt; этот браузер начинает вести себя, как Internet Explorer 5.0 — например, некорректно интерпретировать CSS-свойства width и height. (Значения этих свойств, согласно спецификации CSS, относятся только к размерам содержимого блочного элемента — без учета полей, рамки и отступов. Браузер же Internet Explorer 5.x,за исключением версии 5.5 для Macintosh, в пику стандарту трактует значения свойств width и height как ширину и высоту блочного элемента с учетом величин полей и толщины рамки, но все же без учета отступов.) &lt;p&gt; «Приятный» сюрприз, подготовленный для нас компанией Microsoft, состоит в следующем. IE6 работает в режиме обратной совместимости с IE5 в любом случае, если только правильный элемент &lt;!DOCTYPE ...&gt; не встретится этому замечательному браузеру в самой первой значащей строке кода. &lt;br /&gt; А что у нас в первой строке кода? Правильно, объявление XML! Элемент &lt;!DOCTYPE ...&gt; идет следом. Firefox, Opera и даже IE7 его исправно распознают, а вот для IE6 этой строчки будто бы и нет вовсе. &lt;p&gt; Мораль сей басни такова. Когда условия работы меняются с «учебных» на «боевые», и речь заходит о реальных проектах, а не об экспериментальных примерах, напоминающих сферического коня в вакууме, не стоит безоглядно полагаться на стандарты. Стараясь придерживаться их духа и буквы, где только это возможно, необходимо, тем не менее, принимать во внимание и особенности интерпретации тех или иных спецификаций реальными браузерами, которые, к сожалению, пока что далеки от идеала. &lt;p&gt; Пока ситуация складывается таким образом, что от объявления XML в первой строке XHTML-документов в реальной практике лучше воздерживаться, ибо «народный браузер» IE6 (которым, по данным SpyLog — &lt;a class=&quot;link&quot; target=&quot;_blank&quot; href=&quot;http://u.to/K5rZ&quot; title=&quot;http://gs.spylog.ru/&quot; rel=&quot;nofollow&quot;&gt;http://gs.spylog.ru/&lt;/a&gt; — пользуются свыше 57% посетителей сайтов Рунета; информация приводится за период с 17 мая по 4 июля 2007 г.) за объявлением XML не видит элемента &lt;!DOCTYPE ...&gt;, влияющего на корректность отображения элементов страницы. К слову, повода для расстройства почти нет — ведь мы уже акцентировали внимание на том, что объявление XML является факультативным, необязательным элементом…[/table]</content:encoded>
			<category>Статьи Web-мастеру</category>
			<dc:creator>stim</dc:creator>
			<guid>https://rus-16.do.am/forum/32-23-1</guid>
		</item>
		<item>
			<title>Как правильно верстать на HTML</title>
			<link>https://rus-16.do.am/forum/32-22-1</link>
			<pubDate>Sat, 26 Mar 2011 19:32:29 GMT</pubDate>
			<description>Форум: &lt;a href=&quot;https://rus-16.do.am/forum/32&quot;&gt;Статьи Web-мастеру&lt;/a&gt;&lt;br /&gt;Автор темы: stim&lt;br /&gt;Автор последнего сообщения: stim&lt;br /&gt;Количество ответов: 0</description>
			<content:encoded>[table]Просматривая различные сайты в Интернете, мы не смотрим в код HTML. Ну не берём в расчёт верстальщиков, которым интересно посмотреть на чужую работу. Да и совсем не нужно это обычному пользователю? Но достаточно бывает только взглянуть на html код, чтобы составить впечатление о самих создателях сайта. Код HTML страниц - это как зеркало умений веб-мастера, который занимался созданием сайта. &lt;p&gt; Заглянув на код можно легко узнать о том, как сделана сама страничка: программкой для клепания сайтов пачками или руками html-верстальщика. Программа не обладает человеческой логикой и не заметит эллиментраных ошибок, к тому же засоряя всё своими комментариями, ненужными тегами и конструкциями. А псевдо &quot;мастеру&quot; до этого нет дела, ведь в его браузере все смотрится хорошо, а то, что браузеров существует великое множество ему и дела нет... &lt;p&gt; Создание минималистичного (чем меньше кода в странице, тем лучше для дальнейшей раскрутки сайта в поисковиках), аккуратного и работающего во всех браузерах - это своеобразное, но искусство. Особенно это заметно, когда вы создаёте сайт не для себя, а для работодателя, который разбирается в html. &lt;p&gt; Встречаются сайты с очень сложной структурой, в которых работа верстальщика занимает самое большое по времени всего создания сайта. К примеру, сложная вложенность слоёв, абсолютное позиционирование совместно с JavaScript кодом делает html вёрстку одним из сложнейших занятий, без опыта в которых сложно нормально работать и зарабатывать. &lt;p&gt; Чтобы ваш код страницы выглядел достойно, аккуратно и «неискусственно», вам было легко в нем ориентироваться, то внимательно изучите нижеперечисленные пункты и придерживайтесь их при написании HTML: &lt;p&gt; * Писать html теги большими прописными буквами является неправильным (TABLE, BODY, IMG) — это первый признак неручной работы и в таком коде тяжело ориентироваться, так как большинство кода в Интернете все-таки написано строчными буквами (table, body, img) и это является стандартом и весь html код, написаный строчными буквами признается html-валидатором невалидным! &lt;p&gt; * Атрибуты всегда записывайте в кавычки (напр., align=&quot;right&quot;), что придаст вашему коду аккуратность и совместимость с языком XML. &lt;p&gt; * Присваивая какое-либо значение (ширины, высоты) в пикселях, не забывайте это указать, т.е. width=&quot;5px&quot;. Например, height=23 будет ошибкой, приавльно писать height=&quot;23%&quot;; &lt;p&gt; * Есть теги, в которых нет закрывающего тега (img, hr, br), но по стандартам W3C - это те люди, которые диктуют правила написания html кода (да и многого другого). В таких случаях надо закрывать одиночный тег закрывающим слешем &lt;br /&gt; &lt;p&gt; * Лишние комментарии, которыми программы засоряют код, так же, не пойдут на пользу вашему сайту, а вот ваши собственные комментарии помогут разобраться через некоторое время намного быстрее. Тем более, если сайтом станет заниматься другой мастер; &lt;p&gt; * Старайтесь не оставлять стили и JavaScript код в страничке. Выводите их в отдельный файл — так проще что-либо поменять и код страницы уменьшится (иногда очень заметно); &lt;p&gt; * У любого символа есть своя замена. В каждом справочнике по HTML есть список этих подстановок. Желательно использовать их, что бы не было проблем с просмотром в некоторых браузерах. &lt;p&gt; Напоследок скажу, что программами для клипания быстрых сайтов пользоваться не стоит, потому что они очень сильно засоряют код и ничего хорошего из этого никогда не выйдет. Советую использовать специальные редакторы для программистов, в которых вы сами пишете код, но скорость работы увеличивается за счёт специльных возможностей, таких как подсветка кода или проверка на валидность - правильность с точки зрения стандарта html и css. (Как пример, Notepad++) &lt;p&gt; Чаще всего при создании сайта больше всего сил и времени уделяется визуальному дизайну сайта, с точки зрения дизайнера, это правильно - ведь именно его увидят рядовые посетители сайта. И часто экономия на коде сайта может сыграть медвежью услугу: увеличиваются расходы на раскрутку сайт (в том числе и время), начинают открываться проблемы с кроссбраузерностью (внешним видом в различных браузерах) сайта и в конце-концов, сайт приходиться перевёрстывать. &lt;p&gt; Как видите, скупой (или ленивый) платит дважды, а то и трижды! Из-за такого отношения в нашем Рунете множество сайтов с замечательным внешним дизайном имеют отвратительный код, сделанный на скорую руку в программе-клепалке, осовенной не полностью. Не повторяйте ошибок таких сайтостроителей, верстайте аккуратно и красиво, выделяйте структуру кода, и всегда помните, что язык HTML — основа сайта.[/table]</content:encoded>
			<category>Статьи Web-мастеру</category>
			<dc:creator>stim</dc:creator>
			<guid>https://rus-16.do.am/forum/32-22-1</guid>
		</item>
	</channel>
</rss>