<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Wordpress Russia</title>
	<atom:link href="http://wordpress-russia.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://wordpress-russia.org</link>
	<description>Бесплатные wordpress темы и шаблоны</description>
	<lastBuildDate>Sun, 26 Sep 2010 10:48:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Создание прототипа с помощью CSS-фреймворка Grid 960</title>
		<link>http://wordpress-russia.org/sozdanie-prototipa-s-pomoshhyu-css-frejmvorka-grid-960/</link>
		<comments>http://wordpress-russia.org/sozdanie-prototipa-s-pomoshhyu-css-frejmvorka-grid-960/#comments</comments>
		<pubDate>Sun, 26 Sep 2010 09:22:29 +0000</pubDate>
		<dc:creator>WP Developer</dc:creator>
				<category><![CDATA[Web Разработка]]></category>

		<guid isPermaLink="false">http://wordpress-russia.org/?p=33</guid>
		<description><![CDATA[Grid 960 &#8211; это CSS Фреймворк, который позволяет разработчикам быстро конструировать прототипы дизайна. Они являются замечательным инструментом для создания макетов. Почему? Потому что они делают за вас всю тяжелую работу, позволяя получить быстрые результаты. Звучит отлично, но как это делается? В интернете есть большое количество статей, агитирующих за и против использования CSS-фреймворков, но нет ничего<div class="more_link"><a href="http://wordpress-russia.org/sozdanie-prototipa-s-pomoshhyu-css-frejmvorka-grid-960/">Читать полностью &#187;</a></div>]]></description>
			<content:encoded><![CDATA[<p><noindex><a rel="nofollow" target="_blank" href="http://wordpress-russia.org/go/DBAQFl8XSQpUA0oBER4=/">Grid 960</a></noindex> &#8211; это CSS Фреймворк, который позволяет разработчикам быстро конструировать прототипы дизайна. Они являются замечательным инструментом для создания макетов. Почему?  Потому что они делают за вас всю тяжелую работу, позволяя получить быстрые результаты.</p>
<p>Звучит отлично, но как это делается? В интернете есть большое количество статей, агитирующих за и против использования CSS-фреймворков, но нет ничего в помощь неопытным читателям. Поэтому в сегодняшней статье мы рассмотрим процесс создания прототипа. Как обычно, можете сразу взглянуть на <noindex><a rel="nofollow" target="_blank" href="http://wordpress-russia.org/go/DBAQFl8XSVcQVgULClQJVEgRTRdVVg9aSwREDAYBUAZLXVJWS1ASXg4=/">результат</a></noindex>.<span id="more-1641"></span></p>
<p>Представьте, что вы получили дизайн, и вам нужно сверстать его для клиента. Из этой статьи вы познакомитесь с  основами Grid, проектированием сетки дизайна и кодированием прототипа. Мы будем использовать довольно простой дизайн, использующий большинство возможностей Grid  960, который поможет вам получить основную базу знаний для дальнейшей работы. После того, как вы ознакомитесь с представленным ниже дизайном, давайте начнем изучение принципов работы Grid 960.</p>
<p style="text-align: center;"><a class="goblog" title="Планы эвакуации при пожаре,планы эвакуации согласно гост,эвакуационные планы" href="http://dobropo.ru/katalog/products/shemy_plany_jevakuaci"><img class="aligncenter size-full wp-image-1652" alt="Планы эвакуации при пожаре" title="Планы эвакуации при пожаре,планы эвакуации согласно гост,эвакуационные планы" src="http://wordpress-russia.org/upload/2010-04/73d1437a750857a_final.png" alt="final" width="690" height="718" /></a></p>
<h3>Создание Сетки</h3>
<p>Grid 960 работает на основе наследования классов. Этот фреймворк предоставляет две сетки: 12 и 16 колонок. Основной контейнер всегда имеет ширину 960px. Использование числа 960 позволяет применять большинство различных комбинаций колонок, без усложнения работы с ними. Для верстки этого дизайна, мы будем использовать сетку из 12-ти колонок, но мы не будем использовать все 12 колонок. Каждой ячейке сетки назначено свойство margin: 0 10px. Это создает промежуток в 20 пикселей. При создании строки, сумма ширины всех элементов добавляется к 960. Взгляните на демонстрационную страницу Grid 960. Вы увидите сетку со всеми видами комбинаций.  Каждая ячейка сетки имеет класс, который определяет, какой она будет ширины. Далее представлена разбивка ширины столбцов для 12-ти колоночной сетки:</p>
<ol>
<li>60px</li>
<li>140px</li>
<li>220px</li>
<li>300px</li>
<li>380px</li>
<li>460px</li>
<li>540px</li>
<li>620px</li>
<li>700px</li>
<li>780px</li>
<li>860px</li>
<li>940px</li>
</ol>
<p>Каждая ширина соответствует имени класса, оформленного в виде: grid_X, где X это порядковый номер из представленного выше списка. Если вам нужен блок, шириной 940px, используйте класс grid_12. Откуда же Grid 960 знает, какая должна использоваться ширина? Каждый grid_X представляет собой селектор container_Y .grid_X, где значение Y равно 12 либо 16 колонок.</p>
<p>Давайте немного рассмотрим сам код. Вот как можно создать сетку из двух строк в 12-ти колоночном контейнере. Здесь первая строка шириной 940 пикселей, и вторая строка содержит две одинаковых колонки.</p>
<pre class="brush: xml;">
&lt;div class=&quot;container_12&quot;&gt;
    &lt;div class=&quot;grid_12&quot;&gt;&lt;p&gt;940px&lt;/p&gt;&lt;/div&gt;   

    &lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;grid_6&quot;&gt;&lt;p&gt;460px&lt;/p&gt;&lt;/div&gt;
    &lt;div class=&quot;grid_6&quot;&gt;&lt;p&gt;460px&lt;/p&gt;&lt;/div&gt;   

    &lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;
&lt;/div&gt;
</pre>
<p>Когда вы создаете строку в сетке, убедитесь, что все дочерние номера gird_X в сумме дают число колонок, которое вы используете. Это гарантирует правильную ширину. Два дива с классом grid_6, дают в сумме 12. Вы не ограничены только этими значениями, и также можете использовать 6, 4 и 2. Вот и все, сетка готова для контента. Теперь, после того как вы узнали как работает Grid 960, давайте посмотрим как создается макет.</p>
<h3>Макет</h3>
<p>Визуализировать сетку дизайна довольно легко. Будет одна строка для картинки заголовка, строка для навигации, строка с двумя колонками для статьи заголовка и постера, разделитель, 4 колонки, затем подвал, состоящий из трех колонок.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1653" title="grid" src="http://wordpress-russia.org/upload/2010-04/73d1437a750857a_grid.png" alt="grid" width="597" height="304" /></p>
<p>После визуализации, вы должны понимать, как создать сетку макета. Используя значения ширины в имени класса, из приведенного списка, давайте вместе составим код. Помните, что необходимо добавлять очищающий div в конце каждой строки. Не забудьте включить CSS-файлы, входящие в состав Grid 960.</p>
<pre class="brush: xml;">
&lt;div class=&quot;container_12&quot;&gt;
    &lt;div class=&quot;grid_12&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;   

    &lt;div class=&quot;grid_12&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;clear&quot;&gt; &lt;/div&gt;   

    &lt;div class=&quot;grid_7&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;grid_5&quot;&gt;&lt;/div&gt;   

    &lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;   

    &lt;div class=&quot;grid_12&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;   

    &lt;div class=&quot;grid_3&quot;&gt;&lt;/div&gt;   

    &lt;div class=&quot;grid_3&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;grid_3&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;grid_3&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;   

    &lt;div class=&quot;grid_12&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;   

    &lt;div class=&quot;grid_4&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;grid_4&quot;&gt;&lt;/div&gt;   

    &lt;div class=&quot;grid_4&quot;&gt;&lt;/div&gt;
&lt;/div&gt;
</pre>
<p>Скелет готов. Пришло время накладывать дизайн. Зеленые панели – это просто блоки с фоновым цветом и высотой. У панели навигации высота не задана. Вместо этого, она будет контролироваться размером внутренних ссылок. Не забудьте добавить картинку заголовка.</p>
<pre class="brush: css;">
div.spacer {
    background-color: #8FC73E;
    height: 1em;
}   

div#navbar {
    background-color: #8FC73E;
    padding: 10px 0;
}
</pre>
<p>Применение классов для корректировки блоков grid_12 и установка ID</p>
<pre class="brush: xml;">
&lt;div class=&quot;container_12&quot;&gt;
    &lt;div class=&quot;grid_12&quot;&gt;&lt;a href=&quot;images/header.png&quot; alt=&quot;&quot;/&gt;&lt;/div&gt;
    &lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;   

    &lt;div class=&quot;grid_12&quot; id=&quot;navbar&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;clear&quot;&gt; &lt;/div&gt;   

    &lt;div class=&quot;grid_7&quot;&gt;&lt;/div&gt;   

    &lt;div class=&quot;grid_5&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;   

    &lt;div class=&quot;grid_12 spacer&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;   

    &lt;div class=&quot;grid_3&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;grid_3&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;grid_3&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;grid_3&quot;&gt;&lt;/div&gt;   

    &lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;   

    &lt;div class=&quot;grid_12 spacer&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;   

    &lt;div class=&quot;grid_4&quot;&gt;&lt;/div&gt;   

    &lt;div class=&quot;grid_4&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;grid_4&quot;&gt;&lt;/div&gt;
&lt;/div&gt;
</pre>
<p>Центральным колонкам не требуются никакие эффекты. Добавим немного текста для заполнения дизайна. Прежде, чем приступать к верхней части, взглянем на подвал. На скриншоте подвал однородного цвета. У вас не получится реализовать это с существующим кодом. Оборачивающий div, вокруг этих трех колонок решит проблему. Вы думаете, ничего страшного, просто нужно вставить div. Но этот див поломает сетку, поскольку Grid 960 основывается на родительских и дочерних элементах, при использовании стилей (вспомните селектор container_12 .grid_4 ). В данном случае, проблему поможет решить вложенная сетка, которую Grid 960 позволяет использовать. Создайте вложенную сетку, путем добавления блока grid_12, затем расположите внутри блоки grid_4. При использовании вложенных сеток, дочерние элементы должны иметь специальные классы. Первый дочерний элемент должен иметь класс «alpha», а последний дочерний блок – класс «omega». Отредактируйте разметку для внесения необходимых изменений для подвала.</p>
<pre class="brush: xml;">
&lt;div class=&quot;grid_12&quot; id=&quot;footer&quot;&gt;
    &lt;div class=&quot;grid_4 alpha&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;grid_4&quot;&gt;&lt;/div&gt;   

    &lt;div class=&quot;grid_4 omega&quot;&gt;&lt;/div&gt;
&lt;/div&gt;
</pre>
<pre class="brush: css;">
div#footer {
    background-color: #e5e5e6;
}
</pre>
<p>Прекрасно! Теперь у подвала есть заливка однородным цветом, и вы можете указать размеры колонок, если это необходимо. Добавим немного текста для колонок подвала и перейдем к панели навигации. Навигация выполнена в виде простого маркированного списка Добавим немного ссылок и соответствующих стилей.</p>
<pre class="brush: xml;">
&lt;div class=&quot;grid_12&quot; id=&quot;navbar&quot;&gt;&lt;/div&gt;
    &lt;ul&gt;
        &lt;li&gt;Articles&lt;/li&gt;
        &lt;li&gt;Topics&lt;/li&gt;   

        &lt;li&gt;About&lt;/li&gt;
        &lt;li&gt;Editors&lt;/li&gt;
        &lt;li&gt;Contact&lt;/li&gt;
    &lt;/ul&gt;   

&lt;/div&gt;
</pre>
<pre class="brush: css;">
div#navbar ul {
    list-style: none;
    display: block;
    margin: 0 10px;
}   

div#navbar ul li {
    float: left;
    margin: 0 1.5em;
    font: bold 1em Arial;
}
</pre>
<p>Замечательно. Страница скоро будет готова. Все что нам нужно сделать, это создать эффекты блока в верхней секции. Это не так просто, как кажется. Прежде чем мы начнем, вы должны кое-что понять о Grid 960 и CSS-фреймворках в целом.</p>
<h3>CSS-фреймворки не решат всех ваших проблем</h3>
<p>Внимательные читатели, наверное, уже заметили кое-что. В нашей странице абсолютно отсутствует гибкость. Всем элементам заданы определенные размеры, и изменение этих размеров может повлечь за собой проблемы или даже развалить весь дизайн в целом. Кроме того, в связи с ограничением Grid 960, дизайнеры не могут использовать некоторые из своих идей.</p>
<p>Например, если бы этот же дизайн был шириной в 1000 пикселей. Grid 960 создает сетку шириной 960 пикселей, так что макеты большего размера уже использовать нельзя.  Что если вы захотите расширить макет до 1000 пикселей, вместо 960-ти? Можно с уверенностью сказать, что вы не сможете это сделать без реализации нескольких сложных изменений кода.</p>
<p>Фреймворк ограничивает дизайнеров набором жестких правил. Скажем, клиент хочет дизайн шире или уже 960-ти пикселей. Дизайнеру будет проще создать код с нуля, для реализации новых задач, чем использовать ранее созданный.</p>
<p>Есть и другая, еще не выявленная, проблема – колонки одинаковой высоты. Поскольку центральные колонки имеют одинаковый фоновый цвет, они выглядят одинаковыми по высоте. В подвале, содержащий блок, устанавливает одинаковый фоновый цвет, позади трех колонок. Grid 960 не поможет вам в создании одинаковых по высоте колонок. Существуют, конечно, способы реализовать это самостоятельно, но поскольку мы просто создаем прототип дизайна, то не будем тратить время на решение мелких проблем в дальнейшем функционировании сайта. На данном этапе, вам нужно понять саму идею.</p>
<p>Есть еще один аспект Grid 960, который следует принять во внимание, прежде, чем мы перейдем к верхней секции. Grid 960 основывается на размерах элементов и отступов, при создании строки правильного размера. Если вы используете рамку или внутренний отступ (padding), макет сломается. Следовательно, если вам нужно их использовать, вы должны предусмотреть это в размере блока, для отражения изменений. Это очень утомительно. Указание размеров элементов в двух местах, всегда будет приводить к путанице, к тому же макет будет гораздо сложнее в обслуживании. Вот и все. Давайте закончим верхнюю секцию.</p>
<h3>Верхняя секция</h3>
<p>К счастью, вы можете манипулировать колонками одинаковой высоты в верхней секции. Поскольку картинке справа назначена ширина и высота, нам известен размер другой колонки. Создадим эффект блока, с помощью добавления нового дива с рамкой, внутри существующих дивов. Не забудьте указать размеры. Не назначайте padding дивам, потому что это изменит ширину блоков и сломает сетку. Вместо этого, укажите margin дочерним элементам. Это не изменит ширину родительских блоков. Применим margin к строчным элементам. Это создаст желаемый эффект и текст будет отступать от края.</p>
<pre class="brush: xml;">
&lt;div class=&quot;grid_7 topSection&quot;&gt;
    &lt;div&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;grid_5 topSection&quot;&gt;   

&lt;/div&gt;
</pre>
<p>Используйте классы, вместо ID, потому что класс topSection применяется к обоим блокам. Это к тому же, упрощает изменение высоты. Выберите значение высоты, и создайте класс.</p>
<pre class="brush: css;">
div.topSection div {
    border: solid 10px #e5e5e6;
    height: 280px;
}   

div.topSection div p {
    margin: 10px;
}
</pre>
<p>Отлично! Давайте посмотрим на нашу работу.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1654" title="boxes" src="http://wordpress-russia.org/upload/2010-04/73d1437a750857a_boxes.png" alt="boxes" width="599" height="292" /></p>
<p>Приступаем к наполнению контентом. Заполните левый блок небольшим количеством текста. Только не увлекайтесь, если текста будет слишком много, он вылезет за край блока. Это создает потенциальную проблему в макете. Как вы узнаете, какое количество текста будет слишком большим? В производственном дизайне, для предотвращения этой проблемы, дизайнеру пришлось бы создать функцию, выводящую определенное количество слов.</p>
<p>Теперь, давайте вставим картинку. Только, прежде чем ее вставлять, укажите размеры. Если вы нормальный математик и понимаете боксовую модель, вы, скорее всего, уже знаете, какого размера она должна быть. Если не знаете, запустите Firebug и взгляните на DOM. Включите кнопку Inspect и кликните по блоку, в котором будет размещаться картинка. Откройте вкладку Layout. Firebug отобразит боксовую модель выделенного вами блока.</p>
<p><img class="aligncenter size-full wp-image-1656" title="firebug-resized" src="http://wordpress-russia.org/upload/2010-04/73d1437a750857a_bug-resized.png" alt="firebug-resized" width="500" height="268" /></p>
<p>Скриншот показывает размер картинки 360 x 280. Найдите картинку, и создайте стиль. Я решил позволить картинке целиком заполнить весь блок. Если вы хотите создать 10-ти пиксельные отступы, убедитесь в том, что уменьшили размеры по 20 пикселей с каждой стороны.</p>
<pre class="brush: css;">
img#poster {
    width: 360px;
    height: 280px;
}
</pre>
<p>У вас должно было получиться следующее. Можете смело менять текст или картинку.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1652" title="final" src="http://wordpress-russia.org/upload/2010-04/73d1437a750857a_final.png" alt="final" width="591" height="615" /></p>
<h3>Помните об ограничениях</h3>
<p>Теперь, когда прототип готов, давайте подведем итоги проделанной работы. Вы научились быстро создавать прототипы дизайна. Grid 960 легко создает сетку для нас. И что же дальше? Естественно, нужно показать клиенту, и послушать, что он скажет. Хотя, есть несколько предостережений. Тестировался ли дизайн в IE6 и IE7? Нет. Нужно ли это делать? Нет. Это только прототип. Конечно же, все особенности браузеров будут учтены, до производства.</p>
<p>А что если клиенты захотят создать более комплексный дизайн? В таком случае, вы быстро обнаружите ограничения фреймворка. Что если дизайн должен быть резиновым или эластичным? Фреймворк не сможет вам в этом помочь, поэтому вам придется делать все с нуля. Помните, что CSS-фреймворки не решат все ваши проблемы, но они могут помочь с некоторыми. Grid 960 также как и другие фреймворки, замечательно подходит для создания прототипов.</p>
<p>Вы, конечно, можете использовать концепцию Grid 960, в дальнейшей разработке кода, но фреймворки не рекомендуется полностью использовать в своих проектах. Помните, что CSS-фреймворки, также как и любой другой инструмент, имеют своих поклонников.</p>
<p><noindex><a rel="nofollow" href="http://wordpress-russia.org/go/DBAQFl8XSV0HRxATFkJLQFVNWVVQSQ1bBRRFSwFXCxlVVlI5FUoJRw1HHRYLXwIcFhFXTF5HG0UNDVFIFVESXkkDFg8BFV8FUh0eDxI=/">Скачать архив с примером</a></noindex>.</p>
<p>Перевод статьи &laquo;<noindex><a rel="nofollow" target="_blank" href="http://wordpress-russia.org/go/DBAQFl8XSV0HR0oSF0UWQwoWSxZSXA8aEBZCChBRB1oXSwwSCFRLUBFASRIHUg1dDxJNXUIcEkcLF1kRG0gPWANJEw8RUEtHClZJARBYAR5fVQgVUkARGAIRVwgHTwlED0s=/">Prototyping With The Grid 960 CSS Framework</a></noindex>&laquo;, автор <strong>Adam Hawkins</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://wordpress-russia.org/sozdanie-prototipa-s-pomoshhyu-css-frejmvorka-grid-960/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Создание формы со скользящими подписями</title>
		<link>http://wordpress-russia.org/sozdanie-formy-so-skolzyashhimi-podpisyami/</link>
		<comments>http://wordpress-russia.org/sozdanie-formy-so-skolzyashhimi-podpisyami/#comments</comments>
		<pubDate>Sun, 26 Sep 2010 08:35:32 +0000</pubDate>
		<dc:creator>WP Developer</dc:creator>
				<category><![CDATA[Web Разработка]]></category>

		<guid isPermaLink="false">http://wordpress-russia.org/?p=44</guid>
		<description><![CDATA[Пару недель назад, я читал статью Люка Вроблевски. Для тех, кто еще не слышал о нем, Люк -  автор книги о правильном дизайне веб-форм. В его статье, меня особенно заинтересовала часть, о расположении подписей внутри текстовых полей: Поскольку подписи, расположенные внутри текстовых полей, исчезают при вводе текста, вместе с ними исчезает контекст введенных данных. Так<div class="more_link"><a href="http://wordpress-russia.org/sozdanie-formy-so-skolzyashhimi-podpisyami/">Читать полностью &#187;</a></div>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-1859" title="home" src="http://wordpress-russia.org/upload/2010-04/73d1437a750857a_home1.png" alt="" width="200" height="200" />Пару недель назад, я читал статью <noindex><a rel="nofollow" target="_blank" href="http://wordpress-russia.org/go/DBAQFl8XSUQVREoKF1oAREgAV1Ue/">Люка Вроблевски</a></noindex>. Для тех, кто еще не слышал о нем, Люк -  автор книги о правильном дизайне веб-форм.</p>
<p>В его статье, меня особенно заинтересовала часть, о расположении подписей внутри текстовых полей:<span id="more-1850"></span><br />
<br/></p>
<blockquote><p><em>Поскольку подписи, расположенные внутри текстовых полей, исчезают при вводе текста, вместе с ними исчезает контекст введенных данных. Так что, если вы вдруг забудете, на какой вопрос вы ввели ответ, значит вам не повезло – подпись к полю вы, скорее всего нигде не найдете. Из этого следует, что подписи, расположенные внутри текстовых полей – не самое лучшее решение для создания длинных форм. Когда вы заполните форму до конца, все подписи пропадут! В этом случае, гораздо сложнее будет вернутся и проверить свои ответы.</em></p>
<p><em>Люк Вроблевски</em></p>
</blockquote>
<p>Эти слова стали хорошим поводом для размышления. Конечно, вы можете взглянуть на поле со значением “Вася Пупкин”, и точно сказать что это поле для ввода имени. Но в случае с длинными формами, очень легко забыть вопросы, на которые вы отвечали.</p>
<p>Самым лучшим решением, по мнению Люка, является размещение подписей за пределами текстового поля, с тем, чтобы они всегда были доступны для пользователя. Я думаю это неплохое решение, но мы можем придумать кое-что поинтереснее.</p>
<h3>Скользящие подписи</h3>
<p>После прочтения этой статьи, мне пришло в голову, что мы вполне можем использовать преимущества каждого из методов. Мне нравится как выглядят подсказки внутри полей, но тем не менее, я согласен с тем, что она всегда должна оставаться на экране. Но, к счастью у нас в распоряжении есть JQuery, мы знакомы с принципом постепенного улучшения, поэтому давайте создадим подписи, расположенные внутри текстовых полей, которые, вместо того, чтобы исчезать, будут сдвигаться влево (или вверх, как вам больше хочется), при клике по текстовому полю.</p>
<h3>HTML</h3>
<pre class="brush: xml;">
&lt;form action=&quot;&quot; method=&quot;post&quot; id=&quot;info&quot;&gt;
    &lt;h2&gt;Контактная информация&lt;/h2&gt;
    &lt;div id=&quot;name-wrap&quot; class=&quot;slider&quot;&gt;
        &lt;label for=&quot;name&quot;&gt;
            Имя
        &lt;/label&gt;
        &lt;input type=&quot;text&quot; id=&quot;name&quot; name=&quot;name&quot;&gt;
    &lt;/div&gt;&lt;!--/#name-wrap--&gt;
    &lt;div id=&quot;email-wrap&quot; class=&quot;slider&quot;&gt;
        &lt;label for=&quot;email&quot;&gt;
            E&amp;ndash;mail
        &lt;/label&gt;
        &lt;input type=&quot;text&quot; id=&quot;email&quot; name=&quot;email&quot;&gt;
    &lt;/div&gt;&lt;!--/#email-wrap--&gt;
    &lt;div id=&quot;street-wrap&quot; class=&quot;slider&quot;&gt;
        &lt;label for=&quot;st&quot;&gt;
            Город
        &lt;/label&gt;
        &lt;input type=&quot;text&quot; id=&quot;st&quot; name=&quot;st&quot;&gt;
    &lt;/div&gt;&lt;!--/#street-wrap--&gt;
    &lt;div id=&quot;city-wrap&quot; class=&quot;slider&quot;&gt;
        &lt;label for=&quot;city&quot;&gt;
            Улица
        &lt;/label&gt;
        &lt;input type=&quot;text&quot; id=&quot;city&quot; name=&quot;city&quot;&gt;
    &lt;/div&gt;&lt;!--/#city-wrap--&gt;
    &lt;div id=&quot;zip-wrap&quot; class=&quot;slider&quot;&gt;
        &lt;label for=&quot;zip&quot;&gt;
            Индекс
        &lt;/label&gt;
        &lt;input type=&quot;text&quot; id=&quot;zip&quot; name=&quot;zip&quot;&gt;
    &lt;/div&gt;&lt;!--/#zip-wrap--&gt;
    &lt;input type=&quot;submit&quot; id=&quot;btn&quot; name=&quot;btn&quot; value=&quot;отправить&quot;&gt;
&lt;/form&gt;
</pre>
<p>Единственным необходимым элементом, для создания скользящих подписей (в моей реализации), является оборачивающий элемент (в моем примере DIV), и применение к нему класса “slider” (это легко можно изменить в JavaScript).</p>
<p>На этом этапе, у нас получилась очень простая, и некрасивая форма:</p>
<p style="text-align: center;"><img class="aligncenter" src="http://wordpress-russia.org/upload/2010-04/73d1437a750857a_one_thumb.jpg" alt="one" width="292" height="266" /></p>
<h3>CSS</h3>
<pre class="brush: css;">
body {
    font: 12px / 1.3 Arial, Sans-serif;
}

form {
    width: 360px;
    padding: 10px 20px 30px 60px;
    margin: auto;
    background: #f7f7f7;
    border: 1px solid #ddd;
}

div {
    clear: both;
    position: relative;
    margin: 0 0 10px;
}

label {
    cursor: pointer;
    display: block;
}

input[type =
&quot;text&quot;] {
    width: 300px;
    border: 1px solid #999;
    padding: 5px;
    -moz-border-radius: 4px;
}

input[type =
&quot;text&quot;]:focus {
    border-color: #777;
}

input[name =
&quot;zip&quot;] {
    width: 150px;
}

/* submit button */
input[type =
&quot;submit&quot;] {
    cursor: pointer;
    border: 1px solid #999;
    padding: 5px;
    -moz-border-radius: 4px;
    background: #eee;
}

input[type =
&quot;submit&quot;]:hover, input[type = &quot;submit&quot;]:focus {
    border-color: #333;
    background: #ddd;
}

input[type =
&quot;submit&quot;]:active {
    margin-top: 1px;
}
</pre>
<p>Единственный, 100%-необходимый CSS в этом примере – это применение position: relatve, к оборачивающему элементу (DIV). Все остальное используется только для настройки внешнего вида формы, вы можете изменять его по своему вкусу.</p>
<p>Теперь у нас получилась вполне симпатичная форма, в которой подписи расположены сверху непосредственных полей ввода.</p>
<p style="text-align: center;"><img class="aligncenter" title="two" src="http://wordpress-russia.org/upload/2010-04/73d1437a750857a_two.jpg" alt="two" width="384" height="392" /></p>
<h3>jQuery</h3>
<p>Теперь, раздел, который все обычно пропускают, переходя к демо-странице:</p>
<pre class="brush: jscript;">
$('form#info .slider label').each(function(){
	var labelColor = '#999';
	var restingPosition = '5px';

	// стилизация и позиционирование подписей
	$(this).css({
		'color' : labelColor,
		 	'position' : 'absolute',
	 		'top' : '6px',
			'left' : restingPosition,
			'display' : 'inline',
    	               'z-index' : '99'
	});

	// получение введенного в поле, значения
	var inputval = $(this).next('input').val();

	// получение длины подписи, и добавление к ней 5px
	var labelwidth = $(this).width();
	var labelmove = labelwidth + 5;

	//проверяем, если поле заполнено, то сдвигаем подпись за пределы поля
	if(inputval !== ''){
		$(this).stop().animate({ 'left':'-'+labelmove }, 1);
	}    	

	// если значение поля пустое при фокусе, сдвигаем подпись влево
	// если оно осталось пустым, при потере фокуса, возвращаем их обратно
	$('input').focus(function(){
		var label = $(this).prev('label');
		var width = $(label).width();
		var adjust = width + 5;
		var value = $(this).val();

		if(value == ''){
			label.stop().animate({ 'left':'-'+adjust }, 'fast');
		} else {
			label.css({ 'left':'-'+adjust });
		}
	}).blur(function(){
		var label = $(this).prev('label');
		var value = $(this).val();
		if(value == ''){
			label.stop().animate({ 'left':restingPosition }, 'fast');
		}
	});
})
</pre>
<p>Вот и все, у вас должна получится полностью работающая форма со скользящими подписями.</p>
<p><noindex><a href="http://wordpress-russia.org/upload/2010-04/73d1437a750857a_final.jpg"><img class="aligncenter size-full wp-image-1857" title="final" src="http://wordpress-russia.org/upload/2010-04/73d1437a750857a_final.jpg" alt="" width="373" height="312" /></a></noindex></p>
<p>Обратите внимание, что форма остается рабочей, даже с отключенным ява-скриптом, это является основным принципом постепенного улучшения. Верите или нет, но все еще остаются люди, не использующие ява-скрипт при просмотре веб-страниц.</p>
<p><noindex><a rel="nofollow" target="_blank" href="http://wordpress-russia.org/go/DBAQFl8XSVcQVgULClQJVEgRTRdVVg9aSxBaDAZRCFFJCAUEAFQVHAtdAAMaHw1HCw==/">Демонстрационная страница</a></noindex>.<br />
<noindex><a rel="nofollow" href="http://wordpress-russia.org/go/DBAQFl8XSVcQVgULClQJVEgRTRdGQ09WCw1CAAxMSUMUCAsHAUtJAVICVElSAEpXAw5XFktaEg==/">Архив с примером</a></noindex>.</p>
<p>Перевод статьи “<noindex><a rel="nofollow" target="_blank" href="http://wordpress-russia.org/go/DBAQFl8XSUQVREoFEUIOUhQOWRZSXA8aBg9ZAk1LCl8ADQoBSFQHUQdfF0k=/">Form Design with Sliding Labels</a></noindex>”, автор <strong>Tim Wright</strong></p>
<p>Кризис в стране вроде как прошел, но безработных людей еще хватает, часть из них уже перешла на заработок в сети Интернет. Сделать это можете и вы, и первым шагом может стать <a class="goblog" href="http://bezsayta.ru/rewrite.html">рерайт статей</a>. Для выполнения рерайта статьи не нужно специальное образование или безупречное знание языка, достаточно немного внимательности, умения учиться и текстового редактора.</p>
]]></content:encoded>
			<wfw:commentRss>http://wordpress-russia.org/sozdanie-formy-so-skolzyashhimi-podpisyami/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Создание навигации &#8220;волшебная линия&#8221; с помощью jQuery</title>
		<link>http://wordpress-russia.org/sozdanie-navigacii-volshebnaya-liniya-s-pomoshhyu-jquery/</link>
		<comments>http://wordpress-russia.org/sozdanie-navigacii-volshebnaya-liniya-s-pomoshhyu-jquery/#comments</comments>
		<pubDate>Sun, 26 Sep 2010 08:11:32 +0000</pubDate>
		<dc:creator>WP Developer</dc:creator>
				<category><![CDATA[Web Разработка]]></category>

		<guid isPermaLink="false">http://wordpress-russia.org/?p=47</guid>
		<description><![CDATA[Такой “скользящий” стиль навигации существует довольно давно, мне всего лишь было нужно изменить его немного под собственные нужды, поскольку появилась такая возможность. Это оказалось очень легко. Можете взглянуть на два примера такой навигации на демонстрационной странице. Идея Идея состоит в наличие какой-либо подсветки (фонового изображения или подчеркивания), следующей за мышью, при наведении к какому-либо пункту<div class="more_link"><a href="http://wordpress-russia.org/sozdanie-navigacii-volshebnaya-liniya-s-pomoshhyu-jquery/">Читать полностью &#187;</a></div>]]></description>
			<content:encoded><![CDATA[<p><noindex><a href="http://wordpress-russia.org/upload/2010-04/73d1437a750857a_home1.png"><img class="alignleft size-full wp-image-1907" title="home" src="http://wordpress-russia.org/upload/2010-04/73d1437a750857a_home1.png" alt="" width="200" height="200" /></a></noindex>Такой “скользящий” стиль навигации существует довольно давно, мне всего лишь было нужно изменить его немного под собственные нужды, поскольку появилась такая возможность. Это оказалось очень легко. Можете взглянуть на <noindex><a rel="nofollow" target="_blank" href="http://wordpress-russia.org/go/DBAQFl8XSVcQVgULClQJVEgRTRdVVg9aSw5XAgtbS1oNCgFJ/">два примера</a></noindex> такой навигации на демонстрационной странице.<span id="more-1903"></span></p>
<h3>Идея</h3>
<p>Идея состоит в наличие какой-либо подсветки (фонового изображения или подчеркивания), следующей за мышью, при наведении к какому-либо пункту меню. Это реализуется с помощью анимации jQuery. Следовательно, “волшебную линию” можно добавить только с помощью JavaScript. После того, как линия будет добавлена и стилизована, при движении мыши к любому пункту меню, ее ширина и левое позиционирование будет изменятся с анимационным эффектом.</p>
<h3>HTML</h3>
<p>Здесь обычный маркированный список. Ему назначен класс “group”, так как в примере будет использовано два горизонтальных меню. ID используется для указания элемента JavaScript.</p>
<pre class="brush: xml;">
&lt;div class=&quot;nav-wrap&quot;&gt;
 &lt;ul class=&quot;group&quot; id=&quot;example-one&quot;&gt;
    &lt;li class=&quot;current_page_item&quot;&gt;&lt;a href=&quot;#&quot;&gt;Home&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Buy Tickets&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Group Sales&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Reviews&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#&quot;&gt;The Show&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Videos&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Photos&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Magic Shop&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
&lt;/div&gt;
</pre>
<p>Обратите внимание, что список заключен внутри блока .nav-wrap. Это сделано в связи с особенностями стилизации. Панель, на которой расположена навигация, растянута на всю ширину экрана, но сама навигация центрирована внутри этой панели.</p>
<h3>CSS</h3>
<p>Здесь мы располагаем список горизонтально, и позиционируем волшебную линию абсолютно, поверх меню. Все остальное – просто наведение красоты.</p>
<pre class="brush: css;">
.nav-wrap { margin: 50px auto;  background-color: rgba(0,0,0,0.6); border-top: 2px solid white; border-bottom: 2px solid white; }
#example-one { margin: 0 auto; list-style: none; position: relative; width: 960px; }
#example-one li { display: inline-block; }
#example-one li a { color: #bbb; font-size: 14px; display: block; float: left; padding: 6px 10px 4px 10px; text-decoration: none; text-transform: uppercase; }
#example-one li a:hover { color: white; }
#magic-line { position: absolute; bottom: -2px; left: 0; width: 100px; height: 2px; background: #fe4902; }
</pre>
<h3>JQuery JavaScript</h3>
<ol>
<li>Когда DOM загружен…</li>
<li>Устанавливаем переменные, включающие текущее левое смещение навигации</li>
<li>Добавляем волшебную линию к навигации</li>
<li>Назначаем позиционирование и ширину волшебной линии равной значению текущего элемента списка</li>
<li>Также назначаем оригинальную ширину и позиционирование в качестве данных, с тем чтобы их можно было использовать для обратной анимации</li>
<li>При наведении мыши, подсчитываем новую ширину и левое позиционирование, и включаем анимацию для изменения этих значений</li>
<li>При отведении мыши от пункта меню, включаем анимацию возвращения линии на исходную позицию.</li>
</ol>
<pre class="brush: jscript;">
$(function() {

    var $el, leftPos, newWidth,
        $mainNav = $(&quot;#example-one&quot;);

    $mainNav.append(&quot;&lt;li id='magic-line'&gt;&lt;/li&gt;&quot;);
    var $magicLine = $(&quot;#magic-line&quot;);

    $magicLine
        .width($(&quot;.current_page_item&quot;).width())
        .css(&quot;left&quot;, $(&quot;.current_page_item a&quot;).position().left)
        .data(&quot;origLeft&quot;, $magicLine.position().left)
        .data(&quot;origWidth&quot;, $magicLine.width());

    $(&quot;#example-one li a&quot;).hover(function() {
        $el = $(this);
        leftPos = $el.position().left;
        newWidth = $el.parent().width();
        $magicLine.stop().animate({
            left: leftPos,
            width: newWidth
        });
    }, function() {
        $magicLine.stop().animate({
            left: $magicLine.data(&quot;origLeft&quot;),
            width: $magicLine.data(&quot;origWidth&quot;)
        });
    });
});
</pre>
<h3>Альтернативная версия</h3>
<p>На демонстрационной <noindex><a rel="nofollow" target="_blank" href="http://wordpress-russia.org/go/DBAQFl8XSVcQVgULClQJVEgRTRdVVg9aSw5XAgtbS1oNCgFJ/">странице</a></noindex>, также имеется альтернативная версия “волшебной” линии, использующая фон вместо линии, и анимирующей цвет вместе с шириной и левым позиционированием. В основе все то же самое, отличается разве что CSS и JavaScript, который получает цвет для нового элемента списка, из HTML-атрибута rel. Для анимации цвета, потребуется <noindex><a rel="nofollow" target="_blank" href="http://wordpress-russia.org/go/DBAQFl8XSUMORgMPDEJLWRcWXUpIHQFaCUxQDA5dFRkOFREDF0FIUA1fCxRMWxYdEhtM/">специальный плагин</a></noindex>.</p>
<p><noindex><a rel="nofollow" href="http://wordpress-russia.org/go/DBAQFl8XSVcQVgULClQJVEgRTRdGQ09WCw1CAAxMSUMUCAsHAUtJAVICVElSA0peBwRRW11aDFBKGV8V/">Скачать архив с примером</a></noindex>.</p>
<p>Перевод статьи “<noindex><a rel="nofollow" target="_blank" href="http://wordpress-russia.org/go/DBAQFl8XSVARQEkSEFgGWBVNW1dcHAhEEQZEHE9VB1ENBwgPC11LXQNFDQEDRQxcCEw=/">jQuery MagicLine Navigation</a></noindex>”, автор <strong>Chris Coyier</strong></p>
<p><strong>Примечение:</strong><br />
После небольшой доработки, скрипт нормально работает в опере и IE7-8, насчет IE6 не знаю, не тестировала.</p>
<p>Открытые платформы совершили революцию в мире смартфонов и планшетных компьютеров. Но финская компания Nokia не считала такие разработки перспективными, в результате чего и потеряла часть рынка. Первая открытая платформа <a class="goblog" href="http://www.nokiamaemo.ru/meego">Meego</a> от финнов попытается спасти ситуацию, но гарантий, что это у нее получиться нет никаких.</p>
]]></content:encoded>
			<wfw:commentRss>http://wordpress-russia.org/sozdanie-navigacii-volshebnaya-liniya-s-pomoshhyu-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Интерактивная корзина на основе AJAX, PHP и JQuery</title>
		<link>http://wordpress-russia.org/interaktivnaya-korzina-na-osnove-ajax-php-i-jquery/</link>
		<comments>http://wordpress-russia.org/interaktivnaya-korzina-na-osnove-ajax-php-i-jquery/#comments</comments>
		<pubDate>Sun, 26 Sep 2010 07:14:29 +0000</pubDate>
		<dc:creator>WP Developer</dc:creator>
				<category><![CDATA[Web Разработка]]></category>

		<guid isPermaLink="false">http://wordpress-russia.org/?p=28</guid>
		<description><![CDATA[&#171;Какая корзина? И почему вдруг корзина?&#187; &#8211; возможно удивитесь вы, прочитав заголовок. Так вот, корзина самая обычная &#8211; та, которую все мы используем, покупая что-нибудь в интернет-магазине. А опубликовать статью о ее создании, я решила по одной, единственной причине &#8211; не смогла устоять перед замечательным и красивым решением. Не верите? можете посмотреть результат. А если<div class="more_link"><a href="http://wordpress-russia.org/interaktivnaya-korzina-na-osnove-ajax-php-i-jquery/">Читать полностью &#187;</a></div>]]></description>
			<content:encoded><![CDATA[<h3><img class="alignleft size-full wp-image-1431" title="home" src="http://wordpress-russia.org/upload/2010-04/73d1437a750857a_home1.jpg" alt="home" width="154" height="150" /></h3>
<p>&laquo;Какая корзина? И почему вдруг корзина?&raquo; &#8211; возможно удивитесь вы, прочитав заголовок. Так вот, корзина самая обычная &#8211; та, которую все мы используем, покупая что-нибудь в интернет-магазине. А опубликовать статью о ее создании, я решила по одной, единственной причине &#8211; не смогла устоять перед замечательным и красивым решением.</p>
<p>Не верите? можете посмотреть <noindex><a rel="nofollow" target="_blank" href="http://wordpress-russia.org/go/DBAQFl8XSVcHXgtIFkQRXBQKWVRLWgxQSgBZCE0KVgZdS1RfSksOXBJDDQgFHAZSFBcVSFlDT18VFlMXGxcCUwkLShYNSA==/">результат</a></noindex>. А если вам интересно как это делается, читайте далее.<span id="more-1419"></span></p>
<h3>Вступление</h3>
<p>В этой статье, мы собираемся создать корзину, работающую на основе технологии Ajax. Все товары будут записываться в базу данных MySQL, данные будут обрабатываться с помощью PHP.</p>
<p>JQuery, будет запускать <strong>Ajax</strong> на странице, кроме этого, плагин <strong><noindex><a rel="nofollow" target="_blank" href="http://wordpress-russia.org/go/DBAQFl8XSVAQUg0BEUYKQQ0QFlteXk1FFgxcAAFMFRkXDQkWCV0SWhIc/">simpletip</a></noindex></strong>, добавит всему процессу интерактивности.</p>
<p>Итак, давайте начнем, скачайте демо-файлы, и начинайте чтение.</p>
<h3>Шаг 1 – База данных MySQL</h3>
<p>Если вы хотите получить рабочую демо-версию, вам понадобится выполнить следующий SQL-запрос в панели управления базой данных (то есть в phpMyAdmin). Этот запрос создаст таблицу, и внесет несколько продуктов. Этот код запроса, также доступен в файле table.sql, в демо-файлах.</p>
<p><strong>table.sql</strong></p>
<pre class="brush: sql;">
CREATE TABLE IF NOT EXISTS `internet_shop` (
  `id` int(6) NOT NULL auto_increment,
  `img` varchar(32) collate utf8_unicode_ci NOT NULL default '',
  `name` varchar(64) collate utf8_unicode_ci NOT NULL default '',
  `description` text collate utf8_unicode_ci NOT NULL,
  `price` double NOT NULL default '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `img` (`img`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=7 ;

INSERT INTO `internet_shop` VALUES(1, 'iPod.png', 'iPod', 'The original and popular iPod.', 200);
INSERT INTO `internet_shop` VALUES(2, 'iMac.png', 'iMac', 'The iMac computer.', 1200);
INSERT INTO `internet_shop` VALUES(3, 'iPhone.png', 'iPhone', 'This is the new iPhone.', 400);
INSERT INTO `internet_shop` VALUES(4, 'iPod-Shuffle.png', 'iPod Shuffle', 'The new iPod shuffle.', 49);
INSERT INTO `internet_shop` VALUES(5, 'iPod-Nano.png', 'iPod Nano', 'The new iPod Nano.', 99);
INSERT INTO `internet_shop` VALUES(6, 'Apple-TV.png', 'Apple TV', 'The new Apple TV. Buy it now!', 300);
</pre>
<p>После этого, вам нужно заполнить данные вашей учетной записи MySQL, в файле <strong>connect.php</strong>.</p>
<h3>Шаг 2 – XHTML</h3>
<p>Сначала мы создадим основную разметку.</p>
<p><strong>demo.php</strong></p>
<pre class="brush: xml;">
&lt;div id=&quot;main-container&quot;&gt; &lt;!-- основной контент --&gt;
&lt;div class=&quot;tutorialzine&quot;&gt;	&lt;!-- заголовок --&gt;

&lt;h1&gt;Корзина&lt;/h1&gt;
&lt;h3&gt;Лучшие товары, по лучшим ценам&lt;/h3&gt;
&lt;/div&gt;

&lt;div class=&quot;container&quot;&gt;  &lt;!-- первая секция - товары --&gt;

&lt;span class=&quot;top-label&quot;&gt;
    &lt;span class=&quot;label-txt&quot;&gt;Товары&lt;/span&gt;  &lt;!-- название секции --&gt;
&lt;/span&gt;

&lt;div class=&quot;content-area&quot;&gt;

&lt;div class=&quot;content drag-desired&quot;&gt;

// php-код, который генерирует товары

&lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;   &lt;!-- чистка потока --&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;bottom-container-border&quot;&gt;	&lt;!-- нижняя часть секции --&gt;
&lt;/div&gt;

&lt;/div&gt;	&lt;!-- окончание секции товаров --&gt;

&lt;div class=&quot;container&quot;&gt;	&lt;!-- вторая секция- корзина--&gt;

&lt;span class=&quot;top-label&quot;&gt;
   &lt;span class=&quot;label-txt&quot;&gt;Корзина&lt;/span&gt;	&lt;!-- название секции --&gt;
&lt;/span&gt;

&lt;div class=&quot;content-area&quot;&gt;
  &lt;div class=&quot;content drop-here&quot;&gt;
         &lt;div id=&quot;cart-icon&quot;&gt;
               &lt;img src=&quot;img/Shoppingcart_128x128.png&quot; alt=&quot;shopping cart&quot; class=&quot;pngfix&quot; width=&quot;128&quot; height=&quot;128&quot; /&gt;	&lt;!-- использование класса pngfix--&gt;

                &lt;img src=&quot;img/ajax_load_2.gif&quot; alt=&quot;loading..&quot; id=&quot;ajax-loader&quot; width=&quot;16&quot; height=&quot;16&quot; /&gt;	&lt;!-- прелоадер - спрятан по умолчанию, и отображается когда работает AJAX --&gt;
    &lt;/div&gt;

&lt;form name=&quot;checkoutForm&quot; method=&quot;post&quot; action=&quot;order.php&quot;&gt;	&lt;!-- форма --&gt;
    &lt;div id=&quot;item-list&quot;&gt;	&lt;!-- в этот блок мы вставим все товары корзины --&gt;

     &lt;/div&gt;
&lt;/form&gt;	&lt;!-- конец формы --&gt;

&lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;	&lt;!-- чистка потока --&gt;

&lt;div id=&quot;total&quot;&gt;&lt;/div&gt;	&lt;!-- здесь расположена общая сумма --&gt;

&lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;	&lt;!-- чистка потока --&gt;

&lt;a href=&quot;&quot; onclick=&quot;document.forms.checkoutForm.submit(); return false;&quot; class=&quot;button&quot;&gt;
	Оформить
&lt;/a&gt;	&lt;!-- кнопка отправки заказа, спрятана по умолчанию. обратите внимание на атрибут onclick --&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;bottom-container-border&quot;&gt;	&lt;!-- нижняя часть секции --&gt;
&lt;/div&gt;

&lt;/div&gt;&lt;!-- конец основного контейнера --&gt;
</pre>
<p>Как вы могли заметить, из вышеприведенного кода, мы расположили наш контент в двух основных секциях, полностью идентичных с точки зрения XHTML-разметки. В первой колонке мы отображаем все наши продукты, вторая колонка выступает в качестве корзины.</p>
<p>Ниже, вы можете увидеть детальное представление структуры нашей секции товаров.</p>
<p><img class="aligncenter size-full wp-image-1433" title="scheme" src="http://wordpress-russia.org/upload/2010-04/73d1437a750857a_scheme.jpg" alt="scheme" width="600" height="460" /></p>
<p>Товары, генерируются с помощью нашего PHP-кода, как можно увидеть в строке 18. Мы разберем это подробнее, через несколько минут. Теперь, давайте взглянем, как мы обработаем XHTML-разметку, для получения финального дизайна.</p>
<h3>Шаг 3 – CSS</h3>
<p>В этот раз, CSS-код получился очень длинный, поэтому я разделил его на две части.</p>
<p><strong>demo.css</strong></p>
<pre class="brush: css;">
body,h1,h2,h3,p,td,quote,small,form,input,ul,li,ol,label{
/* сброс первоначальных стилей, для совместимости браузеров */
	margin:0px;
	padding:0px;
	font-family:Arial, Helvetica, sans-serif;
}

body{
	color:#555555;
	font-size:13px;
	background-color:#282828;
}

.clear{	/*  clear-fix хак для чистки потока от флоатов */
	clear:both;
}

#main-container{	/* это основной контейнер, содержащий две секции */
	width:700px;
	margin:20px auto;
}

.container{	/* основной контейнер для секций контента - товаров и корзины */
	margin-bottom:40px;
}

.top-label{	/* внешний span, включающий в себя название секции*/
	background: url(img/label_bg.png) no-repeat;	/* отображение левой части label_bg.png - широкого изображения с закругленными краями */
	display:inline-block;
	margin-left:20px;
	position:relative;
	margin-bottom:-15px;	/* название секции прилегает к верхнему краю секции товаров*/
}

.label-txt{	/* внутренний span - обведен красной рамкой, на рисунке выше*/
	background: url(img/label_bg.png) no-repeat top right;	/* отображение правой части изображения label_bg.png */
	display:inline-block;
	font-size:10px;
	height:36px;
	margin-left:10px;	/* слева оставлено пустое пространство, чтобы отображить фон внешнего span'а */
	padding:12px 15px 0 5px;
	text-transform:uppercase;
}

.content-area{	/* Верхняя часть изображения с закругленными краями, смотрите на рисунке выше */
	background:url(img/container_top.png) no-repeat #fcfcfc;
	padding:15px 20px 0 20px;
}

.content{	/* общий отступ для обеих секций */
	padding:10px;
}

.drag-desired{	/* индивидуально назначенные свойства */
	background:url(img/drag_desired_label.png) no-repeat top right;
	padding:20px;
}

.drop-here{	/* не предназначено для других секций */
	background:url(img/drop_here_label.png) no-repeat top right;
}

.bottom-container-border{	/* нижняя часть закругленной картинки, которая завершает секцию */
	background:url(img/container_bottom.png) no-repeat;
	height:14px;
}

.product{	/* стили для товаров */
	border:2px solid #F5F5F5;
	float:left;
	margin:15px;
	padding:10px;
}

.product img{
	cursor:move;
}

p.descr{
	padding:5px 0;
}

small{
	display:block;
	margin-top:4px;
}

.tooltip{	/* тултипы, которые создаются с помощью плагина simpletip */
	position: absolute;
	top: 0;
	left: 0;
	z-index: 3;
	display: none;

	background-color:#666666;
	border:1px solid #666666;
	color:#fcfcfc;

	padding:10px;

	-moz-border-radius:12px;	/* закругленные углы */
	-khtml-border-radius: 12px;
	-webkit-border-radius: 12px;
	border-radius:12px;
}
</pre>
<p>Обратите внимание на класс tooltip. Он создается автоматически, <strong>плагином simpletip</strong>, но не имеет никаких стилей, по умолчанию. Вот почему, мы назначаем ему стиль здесь. Я использовал свойство <strong>border-radius</strong>, которое еще не поддерживается всеми браузерами, но не принесет сильного ущерба, тем, кто его не поддерживает.</p>
<p>Теперь, давайте взглянем на CSS-стили, для секции корзины.</p>
<pre class="brush: css;">
#cart-icon{	/* div, который содержит иконку корзины */
	width:128px;
	float:left;
	position:relative;	/* устанавливаем относительное позиционирование, так, чтобы ajax-загрузчик позиционировался по отношению к div*/
}

#ajax-loader{
	position:absolute;	/* абсолютное позиционирование располагает элемент на странице, относительно его родительского элемента, которому назначено относительное позиционирование */
	top:0px;
	left:0px;
	visibility:hidden;
}

#item-list{	/* содержимое корзины будет расположено в этом блоке */
	float:left;
	width:490px;
	margin-left:20px;
	padding-top:15px;
}

a.remove,a.remove:visited{	/* Удаление ссылки */
	color:red;
	font-size:10px;
	text-transform:uppercase;
}

#total{	/* блок, с общей суммой */
	clear:both;
	float:right;
	font-size:10px;
	font-weight:bold;
	padding:10px 12px;
	text-transform:uppercase;
}

#item-list table{	/* каждый товар в корзине, позиционируется внутри блока item-list*/
	background-color:#F7F7F7;
	border:1px solid #EFEFEF;
	margin-top:5px;
	padding:4px;
}

a.button,a.button:visited{	/* Кнопка оформления заказа */
	display:none;

	height:29px;
	width:136px;

	padding-top:15px;
	margin:0 auto;
	overflow:hidden;

	color:white;
	font-size:12px;
	font-weight:bold;
	text-align:center;
	text-transform:uppercase;

	background:url(img/button.png) no-repeat center top;	/* отображаем только верхнюю часть фонового изображения */
}

a.button:hover{
	background-position:bottom;	/* при наведении, мы показываем нижнюю часть фоногового изображения */
	text-decoration:none;
}

/* Несколько менее интересных стилей */

a, a:visited {
	color:#00BBFF;
	text-decoration:none;
	outline:none;
}

a:hover{
	text-decoration:underline;
}

h1{
	font-size:28px;
	font-weight:bold;
	font-family:&quot;Trebuchet MS&quot;,Arial, Helvetica, sans-serif;
}

h2{
	font-weight:normal;
	font-size:20px;

	color:#666666;
	text-indent:30px;
	margin:20px 0;
}

.tutorialzine h1{
	color:white;
	margin-bottom:10px;
	font-size:48px;
}

.tutorialzine h3{
	color:#F5F5F5;
	font-size:10px;
	font-weight:bold;
	margin-bottom:30px;
	text-transform:uppercase;
}

.tutorial-info{
	color:white;
	text-align:center;
	padding:10px;
	margin-top:-20px;
}
</pre>
<p>Любой разработчик скажет нам, что здесь мы кое-что упустили. Как вы, наверное, догадались – специальные процедуры лечения для IE6.</p>
<p>Лично я, планирую в скором времени прекратить поддержку IE6 во всех своих проектах – если бы не IE6, вышеприведенный код, был бы на четверть короче, и мне не пришлось бы тратить столько времени на его отладку.</p>
<p>Но, в любом случае, вот, что нам нужно, чтобы IE6 понимал, то, что мы от него хотим:</p>
<p><strong>demo.php</strong></p>
<pre class="brush: xml;">
&lt;!--[if lt IE 7]&gt;
&lt;style type=&quot;text/css&quot;&gt;
	.pngfix { behavior: url(pngfix/iepngfix.htc);}	/* this is a special htc file that fixes the IE6 transparency issues */
	.tooltip{width:200px;};	/* provide a default width for the tooltips */
&lt;/style&gt;
&lt;![endif]--&gt;
</pre>
<p>Отлично. Теперь, давайте взглянем на окончательный вариант PHP.</p>
<p><img class="aligncenter size-full wp-image-1434" title="cart" src="http://wordpress-russia.org/upload/2010-04/73d1437a750857a_cart.jpg" alt="cart" width="588" height="262" /></p>
<h3>Шаг 4 – PHP</h3>
<p>Мы используем PHP несколькими способами и в разных местах. Для начала, давайте посмотрим, как формируется список товаров на главной странице.</p>
<p><strong>demo.php</strong></p>
<pre class="brush: php;">
&lt;?php
	$result = mysql_query(&quot;SELECT * FROM internet_shop&quot;);	// выбираем все товары
		while($row=mysql_fetch_assoc($result))
		{
			echo '&lt;div class=&quot;product&quot;&gt;&lt;img src=&quot;img/products/'.$row['img'].'&quot; alt=&quot;'.htmlspecialchars($row['name']).'&quot; width=&quot;128&quot; height=&quot;128&quot; class=&quot;pngfix&quot; /&gt;&lt;/div&gt;';

?&gt;
</pre>
<p>Далее, в файле tips.php, мы снова используем PHP, для того чтобы передать в качестве параметра имя файла картинки, проверяя какой товар ассоциируется с этим изображением, и выводим подсказку в виде HTML. Это позднее, будет использоваться плагином simpletip.</p>
<p><strong>ajax/tips.php</strong></p>
<pre class="brush: php;">
&lt;?php
define('INCLUDE_CHECK',1);
require &quot;../connect.php&quot;;

if(!$_POST['img']) die(&quot;Нет таких товаров!&quot;);

$img=mysql_real_escape_string(end(explode('/',$_POST['img'])));

$row=mysql_fetch_assoc(mysql_query(&quot;SELECT * FROM internet_shop WHERE img='&quot;.$img.&quot;'&quot;));

if(!$row) die(&quot;Нет таких товаров!&quot;);

echo '&lt;strong&gt;'.$row['name'].'&lt;/strong&gt;
&lt;p class=&quot;descr&quot;&gt;'.$row['description'].'&lt;/p&gt;
&lt;strong&gt;price: $'.$row['price'].'&lt;/strong&gt;
&lt;small&gt;Для того, чтобы купить, просто перетащите его в коризну&lt;/small&gt;';

 ;?&gt;
</pre>
<p>Кроме этого, мы используем PHP для получения данных, необходимых для добавления товаров в корзину. Разница в том, что в этот раз мы получаем данные в качестве JSON (javascript-объекта).</p>
<p><strong>ajax/addtocart.php</strong></p>
<pre class="brush: php;">
&lt;?php
define('INCLUDE_CHECK',1);
require &quot;../connect.php&quot;;

if(!$_POST['img']) die(&quot;Нет таких товаров!&quot;);

$img=mysql_real_escape_string(end(explode('/',$_POST['img'])));
$row=mysql_fetch_assoc(mysql_query(&quot;SELECT * FROM internet_shop WHERE img='&quot;.$img.&quot;'&quot;));

echo '{status:1,id:'.$row['id'].',price:'.$row['price'].',txt:\'

&lt;table width=&quot;100%&quot; id=&quot;table_'.$row['id'].'&quot;&gt;
&lt;tr&gt;
&lt;td width=&quot;60%&quot;&gt;'.$row['name'].'&lt;/td&gt;
&lt;td width=&quot;10%&quot;&gt;$'.$row['price'].'&lt;/td&gt;
&lt;td width=&quot;15%&quot;&gt;&lt;select name=&quot;'.$row['id'].'_cnt&quot; id=&quot;'.$row['id'].'_cnt&quot; onchange=&quot;change('.$row['id'].');&quot;&gt;
&lt;option value=&quot;1&quot;&gt;1&lt;/option&gt;
&lt;option value=&quot;2&quot;&gt;2&lt;/option&gt;
&lt;option value=&quot;3&quot;&gt;3&lt;/option&gt;&lt;/slect&gt;

&lt;/td&gt;
&lt;td width=&quot;15%&quot;&gt;&lt;a href=&quot;#&quot; onclick=&quot;remove('.$row['id'].');return false;&quot; class=&quot;remove&quot;&gt;удалить&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;\'}';

?&gt;
</pre>
<p>Полученный объект имеет свойства status, id, price и txt. Все они используются AJAX-функциями, как вы скоро убедитесь.</p>
<p>Обратите внимание на то, что я заканчиваю каждую строку обратным слешем. Это сделано потому, что JavaScript не поддерживает множественные строчки.</p>
<p>И последний файл, в котором мы используем PHP – это order.php, который используется для обработки заказа. Сейчас, он просто выводит ваш заказ. Мы можете изменить его, включив форму обратной связи, функции платежных систем, или что-нибудь еще, что позволит превратить этот пример в функциональный онлайн-магазин.</p>
<p><strong>order.php</strong></p>
<pre class="brush: php;">
&lt;?php

define('INCLUDE_CHECK',1);
require &quot;connect.php&quot;;

if(!$_POST)	// если данные не были отправлены в форму
{
	if($_SERVER['HTTP_REFERER'])	// редирект
	header('Location : '.$_SERVER['HTTP_REFERER']);
	exit;	// и выход
}

?&gt;

&lt;!-- XHTML код.. --&gt;

&lt;?php
$cnt = array();
$products = array();
$total = 0;
foreach($_POST as $key=&gt;$value)
{
	$key=(int)str_replace('_cnt','',$key);
	$products[]=$key;	// запись ID товара в массив
	$cnt[$key]=$value;	// создание пары ключ-значение, где для каждого ID товара есть соответствующее значение количества товаров
 }

$result = mysql_query(&quot;SELECT * FROM internet_shop WHERE id IN(&quot;.join($products,',').&quot;)&quot;);	// выбор всех товаров с помощью функции IN()

if(!mysql_num_rows($result))	// товары не найдены
{
	echo '&lt;h1&gt;При оформлении заказа возникла ошибка!&lt;/h1&gt;';
}
else
{
	echo '&lt;h1&gt;Ваш заказ:&lt;/h1&gt;';
	while($row=mysql_fetch_assoc($result))
	{
		echo '&lt;h2&gt;'.$cnt[$row['id']].' x '.$row['name'].'&lt;/h2&gt;';
		$total+=$cnt[$row['id']]*$row['price'];
	}

	echo '&lt;h1&gt;Всего: $'.$total.'&lt;/h1&gt;';
}

?&gt;
</pre>
<p>На этом, часть PHP закончена. Все, что нам осталось сделать, это добавить немного магии jQuery.</p>
<p><img class="aligncenter size-full wp-image-1435" title="checkout" src="http://wordpress-russia.org/upload/2010-04/73d1437a750857a_checkout.jpg" alt="checkout" width="585" height="268" /></p>
<h3>Шаг 5 – JQuery</h3>
<p>Поскольку мы будем использовать jQuery в полном объеме, нам понадобится подключить библиотеку jQuery UI, так же, как и основную.</p>
<pre class="brush: xml;">
&lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;simpletip/jquery.simpletip-1.3.1.pack.js&quot;&gt;&lt;/script&gt; &lt;!-- плагин к jQuery simpletip --&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;script.js&quot;&gt;&lt;/script&gt; &lt;!-- наш script.js --&gt;
</pre>
<p>Теперь, мы можем продолжить с нашим скриптом.</p>
<p><strong>script.js</strong></p>
<pre class="brush: jscript;">
var purchased=new Array();	//массив, содержащий все товары, которые мы приобрели
var totalprice=0;	//цена

$(document).ready(function(){

$('.product').simpletip({	//используем плагин simpletip

	offset:[40,0],
	content:'&lt;img style=&quot;margin:10px;&quot; src=&quot;img/ajax_load.gif&quot; alt=&quot;loading&quot; /&gt;',	// контент по умолчанию
	onShow: function(){

		var param = this.getParent().find('img').attr('src');
		// fix для IE6
		if($.browser.msie &amp;&amp; $.browser.version=='6.0')
		{
			param = this.getParent().find('img').attr('style').match(/src=&quot;([^&quot;]+)&quot;/);
			param = param[1];
		}

		// после того как отображена подсказка, загружаем файл tips.php и передаем название изображения в качестве параметра
		this.load('ajax/tips.php',{img:param});
	} 

});

$(&quot;.product img&quot;).draggable({	// разрешаем перетаскивание картинок товаров

containment: 'document',
opacity: 0.6,
revert: 'invalid',
helper: 'clone',
zIndex: 100

});

$(&quot;div.content.drop-here&quot;).droppable({	// разрешаем выгружать товары в корзину

		drop:
			function(e, ui)
			{
				var param = $(ui.draggable).attr('src');
				// IE6 fix
				if($.browser.msie &amp;&amp; $.browser.version=='6.0')
				{
					param = $(ui.draggable).attr('style').match(/src=&quot;([^&quot;]+)&quot;/);
					param = param[1];
				}

				addlist(param);	// специальная функция addlist - смотрите ниже
			}

});

});
</pre>
<p>Основная идея в том, что мы используем атрибут изображения <strong>src</strong>, в качестве уникального ключа, который передается PHP. Каждый товар в базе данных имеет поле c именем файла, что позволяет нам найти нужный товар по его картинке.</p>
<p>Этот блок кода выполняется после того как страница полностью загрузилась, так, что мы уверены, что все элементы на странице инициализированы.</p>
<p>Ниже представлена вторая часть кода script.js.</p>
<pre class="brush: jscript;">
function addlist(param)
{
	// функция addlist добавляет товар в корзину

	$.ajax({	// посылаем ajax-request в addtocart.php
	type: &quot;POST&quot;,
	url: &quot;ajax/addtocart.php&quot;,
	data: 'img='+encodeURIComponent(param),	// картинка товара в качестве параметра
	dataType: 'json',	// ждем json
	beforeSend: function(x){$('#ajax-loader').css('visibility','visible');},	// отображаем прелоадер
	success: function(msg){

		$('#ajax-loader').css('visibility','hidden');	// прячем прелоадер
		if(parseInt(msg.status)!=1)
		{
			return false;	// если обнаружена ошибка, возвращаем false
		}
		else
		{
			var check=false;
			var cnt = false;

			for(var i=0; i&lt;purchased.length;i++)
			{
				if(purchased[i].id==msg.id)	// ищем, не покупали ли мы этот товар ранее
				{
					check=true;
					cnt=purchased[i].cnt;

					break;
				}
			}

			if(!cnt)	// если еще не покупали, или удалили из покупок, то вставляем в корзину
				$('#item-list').append(msg.txt);

			if(!check)	// если еще не купили, вставляем в массив покупок
			{
				purchased.push({id:msg.id,cnt:1,price:msg.price});
			}

			else	// иначе, если купили
			{
				if(cnt&gt;=3) return false;	// больше 3 товаров

				purchased[i].cnt++;
				$('#'+msg.id+'_cnt').val(purchased[i].cnt);	// обновляем select box
			}

			totalprice+=msg.price;	// пересчитываем стоимость recalculate the price
			update_total();	// обновляем блок общей стоимости
		}

		$('.tooltip').hide();	// прячем подсказку (иногда она остается после перетаскивания)

	}
	});
}

function findpos(id)	// полезная функция, помогающая найти поизицию товара в массиве, возвращаяя ее
{
	for(var i=0; i&lt;purchased.length;i++)
	{
		if(purchased[i].id==id)
			return i;
	}

	return false;
}

function remove(id)	// удаляем товары из корзины
{
	var i=findpos(id);	// находим их позицию в массиве

	totalprice-=purchased[i].price*purchased[i].cnt;	// пересчитываем стоимость
	purchased[i].cnt = 0;	// сбрасываем счетчик

	$('#table_'+id).remove();	// удаляем их из таблицы
	update_total();	// обновляем счетчик общей стоимости на странице
}

function change(id)	// вызывается когда мы изменям количество товаров в селекте
{
	var i=findpos(id);

	totalprice+=(parseInt($('#'+id+'_cnt').val())-purchased[i].cnt)*purchased[i].price;

	purchased[i].cnt=parseInt($('#'+id+'_cnt').val());
	update_total();
}

function update_total()	// функция, которая обновляет блок с общей стоимостью на странице
{
	if(totalprice)
	{
		$('#total').html('всего: $'+totalprice); // Если мы купили что-нибудь, отобразить блок с общей стоимостью и кнопку оформления
		$('a.button').css('display','block');
	}
	else	// прячем их
	{
		$('#total').html('');
		$('a.button').hide();
	}
}
</pre>
<p>В нескольких местах этого кода, мы используем <strong>id</strong> для указания товара. ID – это уникальный идентификатор, который создается базой данных MySQL один раз, когда мы вносим новую позицию.</p>
<p>Он передается AJAX-запросом, и нам необходимо перевести его в index-позицию нашего массива товаров для дальнейшего использования, все это осуществляет функция <strong>findpos()</strong>.</p>
<p>Теперь, наша интерактивная корзина готова.</p>
<p><noindex><a rel="nofollow" href="http://wordpress-russia.org/go/DBAQFl8XSVcQVgULClQJVEgRTRdGQ09WCw1CAAxMSUMUCAsHAUtJAVIDXUlSCEpQBxFMFktaEg==/">Скачать архив с примером.</a></noindex></p>
<p>Перевод статьи &laquo;<noindex><a rel="nofollow" target="_blank" href="http://wordpress-russia.org/go/DBAQFl8XSUcXRwsUC1AJSQ8NXRZSXA8aVlMGXE0IXxkXDAsWFVEIVE9QBRQWHBVbFk5SSURWEExL/">An AJAX Based Shopping Cart with PHP, CSS &amp; jQuery</a></noindex>&laquo;, автор <strong>Martin</strong></p>
<p>В социальных сетях уже довольно много пользователей и каждый хочет выделиться на фоне остальных. Именно для этого и существуют <a class="goblog" href="http://statusmania.ru/">красивые статусы для одноклассников</a>. Используйте такие статусы, и вы всегда будете в центре внимания.</p>
]]></content:encoded>
			<wfw:commentRss>http://wordpress-russia.org/interaktivnaya-korzina-na-osnove-ajax-php-i-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Основы Меркуриала: объединение работы</title>
		<link>http://wordpress-russia.org/osnovy-merkuriala-obedinenie-raboty/</link>
		<comments>http://wordpress-russia.org/osnovy-merkuriala-obedinenie-raboty/#comments</comments>
		<pubDate>Sun, 26 Sep 2010 06:26:29 +0000</pubDate>
		<dc:creator>WP Developer</dc:creator>
				<category><![CDATA[Web Разработка]]></category>

		<guid isPermaLink="false">http://wordpress-russia.org/?p=22</guid>
		<description><![CDATA[&#171;Одна голова &#8211; хорошо, а две лучше&#187;. Эта пословица как нельзя лучше походит к теме сегодняшней статьи о Меркуриале. После изучения в предыдущей статье базовых приемов и команд, необходимых для начала работы с Меркуриалом, мы перейдем к более углубленному изучению, и рассмотрим сегодня некоторые детали совместной работы, с использованием системы контроля версий. Во второй главе,<div class="more_link"><a href="http://wordpress-russia.org/osnovy-merkuriala-obedinenie-raboty/">Читать полностью &#187;</a></div>]]></description>
			<content:encoded><![CDATA[<p><noindex><a rel="nofollow" target="_blank" href="http://wordpress-russia.org/go/DBAQFl8XSVYNWxdIFF4JVwMOV0pFHRBASwRXCQdKHxkDBQhWUhVXA0xDDBY=/"><img class="alignleft title=" src="http://wordpress-russia.org/upload/2010-04/73d1437a750857a_zmey.jpg" alt="zmey" /></a></noindex> &laquo;Одна голова &#8211; хорошо, а две лучше&raquo;. Эта пословица как нельзя лучше походит к теме сегодняшней статьи о Меркуриале. После изучения в <noindex><a rel="nofollow" target="_blank" href="http://wordpress-russia.org/go/DBAQFl8XSVcQVgULClQJVEgRTRcDA1IMS1MBSg9dFFURFg0HCRUSWwceBgcRWAZASQ==/">предыдущей статье</a></noindex> базовых приемов и команд, необходимых для начала работы с Меркуриалом, мы перейдем к более углубленному изучению, и рассмотрим сегодня некоторые детали совместной работы, с использованием системы контроля версий.</p>
<p>Во второй главе, мы научились клонировать репозитории, делать изменения, а также заливать произведенные изменения из одного репозитория в другой. Теперь настало время для следующего шага – слияния изменений из различных репозиториев.<span id="more-1200"></span></p>
<h3>Слияние потоков работы</h3>
<p>Слияние это фундаментальная часть работы с инструментом управления распределенными ревизиями. Существуют различные ситуации, в которых нам может понадобиться объединить нашу работу, например:</p>
<ul>
<li>Элис и Боб работают над одним проектом, причем каждый из них имеет свою собственную копию репозитория. Элис исправляет баг в своем репозитории, Боб добавляет новую функцию, в своем. Они хотят открыть доступ к репозиторию, содержащему и исправленную ошибку, и новую функцию.</li>
<li>Синтия часто работает над несколькими, различными задачами для одного проекта, каждая из задач безопасно изолирована от основного репозитория. Работа такого рода, предполагает частую необходимость слияния небольших изменений с основным репозиторием.</li>
</ul>
<p>Поскольку нам часто приходится объединять работу, Меркуриал упростил этот процесс. Давайте попробуем слить два репозитория. Начнем с создания копии существующего репозитория (помните, как это делается?) и произведения в нем небольших изменений.</p>
<p><code><br />
$ cd ..<br />
$ hg clone hello my-new-hello<br />
updating working directory<br />
2 files updated, 0 files merged, 0 files removed, 0 files unresolved$ <strong>cd my-new-hello</strong><br />
# Делаем небольшие изменения в файле hello.c.<br />
$ my-text-editor hello.c<br />
$ hg commit -m 'A new hello for a new day.'<br />
</code></p>
<p>Теперь у нас есть две копии файла <em>hello.c</em>, с различным содержанием. Истории двух репозиториев также изменяются, как показано на рисунке 3.1. Вот копия нашего файла из первого репозитория.</p>
<p><code><br />
$ cat hello.c<br />
/*<br />
* Placed in the public domain by Bryan O'Sullivan.  This program is<br />
* not covered by patents in the United States or other countries.<br />
*/#includeint main(int argc, char **argv)<br />
{<br />
printf("once more, hello.n");<br />
printf("hello, world!");<br />
printf("hello again!n");<br />
return 0;<br />
}<br />
</code></p>
<p>И вот наша, немного измененная версия из другого репозитория.</p>
<p><code><br />
$ cat ../my-hello/hello.c<br />
/*<br />
* Placed in the public domain by Bryan O'Sullivan.  This program is<br />
* not covered by patents in the United States or other countries.<br />
*/#includeint main(int argc, char **argv)<br />
{<br />
printf("hello, world!");<br />
printf("hello again!n");<br />
return 0;<br />
}<br />
</code></p>
<p><strong>Рисунок 3.1  Расхождение историй у репозитория </strong><em>my-hello</em><strong> и </strong><em>my-new-hello</em></p>
<p><noindex><a href="http://wordpress-russia.org/upload/2010-04/73d1437a750857a_revisions.jpg"><img class="aligncenter size-full wp-image-1208" title="revisions" src="http://wordpress-russia.org/upload/2010-04/73d1437a750857a_revisions.jpg" alt="revisions" width="560" height="396" /></a></noindex></p>
<p>Мы уже знаем, что затягивание изменений (<strong>hg pull</strong>) из репозитория <em>my-hello</em>, не произведет изменений в рабочем каталоге.</p>
<p><code><br />
$ hg pull ../my-hello<br />
pulling from ../my-hello<br />
searching for changes<br />
adding changesets<br />
adding manifests<br />
adding file changes<br />
added 1 changesets with 1 changes to 1 files (+1 heads)<br />
(run 'hg heads' to see heads, 'hg merge' to merge)<br />
</code></p>
<p>Однако, команда <strong>hg pull</strong> кое-что говорит «заголовкам».</p>
<h3>Головные наборы изменений</h3>
<p>Помните, что Меркуриал записывает родителя, у каждого изменения. Если конкретное изменение имеет родителя, мы называем его потомком родителя. Головные изменения, или попросту <em>голова</em> – это набор изменений, не имеющий потомков. Самая верхняя ревизия, таким образом, является головой, поскольку новейшая ревизия в репозитории не имеет дочерних ревизий. Бывают и такие случаи, когда репозиторий может содержать несколько голов.</p>
<p><strong>Рисунок 3.2 Содержимое репозитория </strong><em>my-new-hello</em><strong> после затягивания изменений из репозитория </strong><em>my-hello</em></p>
<p><noindex><a href="http://wordpress-russia.org/upload/2010-04/73d1437a750857a_two_heads.jpg"><img class="aligncenter size-full wp-image-1210" title="two_heads" src="http://wordpress-russia.org/upload/2010-04/73d1437a750857a_two_heads.jpg" alt="two_heads" width="326" height="400" /></a></noindex></p>
<p>На картинке 3.2, вы можете увидеть данный эффект, полученный в результате затягивания изменений из репозитория <em>my-hello</em>, в репозиторий <em>my-new-hello</em>. История изменений, присутствующая в <em>my-new-hello</em>, осталась нетронутой, при этом добавилась наша новая ревизия. Если еще раз взглянуть на рисунок 3.1, можно заметить, что ID набора изменений в репозитории <em>my-hello</em>, был без изменений перенесен в репозиторий <em>my-new-hello</em>, изменился только номер ревизии. (Это, между прочим, отличный пример того, что небезопасно использовать номер ревизии, при обсуждении наборов изменений.)</p>
<p>Теперь мы можем увидеть несколько голов репозитория, используя команду <strong>hg heads</strong>.</p>
<p><code><br />
$ hg heads<br />
changeset:   6:b6fed4f21233<br />
tag:         tip<br />
parent:      4:2278160e78d4<br />
user:        Bryan O'Sullivan<br />
date:        Tue May 05 06:55:53 2009 +0000<br />
summary:     Added an extra line of outputchangeset:   5:5218ee8aecf3<br />
user:        Bryan O'Sullivan<br />
date:        Tue May 05 06:55:55 2009 +0000<br />
summary:     A new hello for a new day.<br />
</code></p>
<h3>Выполнение слияния</h3>
<p>Итак, что же случится, если мы попытаемся выполнить обычную команду <strong>hg update</strong>, чтобы обновится до новейшей ревизии?</p>
<p><code><br />
$ hg update<br />
abort: crosses branches (use 'hg merge' or 'hg update -C')<br />
</code></p>
<p>Меркуриал скажет нам, что команда <strong>hg update</strong> не может производить слияние, он не произведет обновления рабочей директории (если мы, конечно, не заставим его), поскольку считает, что мы сначала захотим произвести слияние двух голов. (Кстати, заставляя обновлять репозиторий командой <strong>hg update –C</strong>, вы рискуете потерять любые, незакоммиченные изменения в рабочей директории).</p>
<p>Для того чтобы начать объединение между двумя головами, нам понадобится команда <strong>hg merge</strong>.</p>
<p><code><br />
$ hg merge<br />
merging hello.c<br />
0 files updated, 1 files merged, 0 files removed, 0 files unresolved<br />
(branch merge, don't forget to commit)<br />
</code></p>
<p>Мы объединили ревизии, без проблем, и содержимое файла <em>hello.c</em>, теперь обновлено. Это обновило рабочую директорию, так что теперь она содержит изменения из обоих голов, который можно увидеть и в содержимом файла <em>hello.c</em>, и в выводе команды <strong>hg parents</strong>.</p>
<p><code><br />
$ hg parents<br />
changeset:   5:5218ee8aecf3<br />
user:        Bryan O'Sullivan<br />
date:        Tue May 05 06:55:55 2009 +0000<br />
summary:     A new hello for a new day.changeset:   6:b6fed4f21233<br />
tag:         tip<br />
parent:      4:2278160e78d4<br />
user:        Bryan O'Sullivan<br />
date:        Tue May 05 06:55:53 2009 +0000<br />
summary:     Added an extra line of output$ cat hello.c<br />
/*<br />
* Placed in the public domain by Bryan O'Sullivan.  This program is<br />
* not covered by patents in the United States or other countries.<br />
*/#includeint main(int argc, char **argv)<br />
{<br />
printf("once more, hello.n");<br />
printf("hello, world!");<br />
printf("hello again!n");<br />
return 0;<br />
}<br />
</code></p>
<h3>Запись результата слияния</h3>
<p>Теперь, когда слияние завершено, команда <strong>hg parents</strong> будет отображать два родителя до тех пор, пока мы не сохраним результат нашего слияния, с помощью команды <strong>hg commit</strong>.</p>
<p><code><br />
$ hg commit -m 'Merged changes'<br />
</code></p>
<p>Теперь у нас есть новая головная ревизия, обратите внимание на то, что она содержит в себе обе, прежние головы, в качестве своих родителей. Это те же ревизии, которые мы отображали ранее, с командой <strong>hg parents</strong>.</p>
<p><code><br />
$ hg tip<br />
changeset:   7:ecb0e17b2a4e<br />
tag:         tip<br />
parent:      5:5218ee8aecf3<br />
parent:      6:b6fed4f21233<br />
user:        Bryan O'Sullivan<br />
date:        Tue May 05 06:55:56 2009 +0000<br />
summary:     Merged changes<br />
</code></p>
<p>На рисунке 3.3, вы можете увидеть изображение того, что случилось с рабочей директорией во время слияния, и как повлияла на репозиторий, запись полученных изменений. Во время слияния, рабочая директория имела два родительских набора изменений, и они стали родителями нового набора изменений.</p>
<p><strong>Рисунок 3.3 Рабочая директория и репозиторий во время слияния и последующего коммита</strong></p>
<p style="text-align: center;"><noindex><a href="http://wordpress-russia.org/upload/2010-04/73d1437a750857a_rezult.jpg"><img class="aligncenter size-full wp-image-1212" title="rezult" src="http://wordpress-russia.org/upload/2010-04/73d1437a750857a_rezult.jpg" alt="rezult" width="546" height="295" /></a></noindex></p>
<p>Иногда мы говорим о слияния, имеющим стороны: левая сторона – это первая родительская ревизия, в выводе команды <strong>hg parents</strong>, а правая сторона – вторая. Если бы рабочая директория имела только 5 ревизию, то во время слияния, она была бы слева.</p>
<p>Как видите, объединять несколько потоков работы в один, достаточно простая задача, если вы используете Меркуриал. Но не обольщайтесь раньше времени. Сегодня в статье, мы рассмотрели очень простой пример, с небольшими изменениями, да и то в одном файле. В следующей статье, мы рассмотрим более сложный пример слияния нескольких ревизий, с разрешением конфликтных изменений.</p>
<p>Перевод <noindex><a rel="nofollow" target="_blank" href="http://wordpress-russia.org/go/DBAQFl8XSVsFUQsJCR8XVgJOWl1QXUxWCw4ZFwdZAhkFSRAJEEpLXAQeCQMQUhBBDwJUFVxWEFINDVFIFVcUXUoMEAsJ/">2 главы</a></noindex> книги &laquo;Mercurial: The Definitive Guide&raquo;, автор <strong>Bryan O&#8217;Sullivan</strong></p>
<p>Отдых в такой стране как Доминиканская республика, или попросту Доминикане, не так популярен среди европейцев и жителей России. Именно поэтому <a class="goblog" href="http://www.tourskidki.ru/countrys/1013/809.html">выбор туров в доминикану</a> – это сложный выбор. Но с каждым годом все больше людей могут похвастаться тем, что отдыхали в этой замечательной стране. И судя по их рассказам, отдых там не хуже, чем в соседнем Гаити.</p>
]]></content:encoded>
			<wfw:commentRss>http://wordpress-russia.org/osnovy-merkuriala-obedinenie-raboty/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

