<?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>2Coders &#8212; блог web-разработчика</title>
	<atom:link href="http://2coders.ru/feed/" rel="self" type="application/rss+xml" />
	<link>https://2coders.ru</link>
	<description>Web - программирование и SEO</description>
	<lastBuildDate>Mon, 14 Nov 2016 18:58:53 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.33</generator>
	<item>
		<title>Числовая капча в Yii2</title>
		<link>https://2coders.ru/chislovaya-kapcha-v-yii2/</link>
		<comments>https://2coders.ru/chislovaya-kapcha-v-yii2/#respond</comments>
		<pubDate>Mon, 14 Nov 2016 18:58:53 +0000</pubDate>
		<dc:creator><![CDATA[Max]]></dc:creator>
				<category><![CDATA[Yii2]]></category>
		<category><![CDATA[Фреймворки]]></category>

		<guid isPermaLink="false">http://2coders.ru/?p=2481</guid>
		<description><![CDATA[По умолчанию, Yii2 использует буквы английского алфавита. Капча при этом выглядит вот так: Заменим, её на числовую капчу вида: Для этого расширим класс CaptchaAction и переопределим метод generateVerifyCode(). Именно, этот метод отвечает за то, из каких символов будет состоять капча в Yii2. Создадим файл NumericCaptcha.php в app\common. Код файла будет следующим: Теперь, нужно прописать пусть [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>По умолчанию, Yii2 использует буквы английского алфавита. Капча при этом выглядит вот так:<br />
<a href="http://2coders.ru/2coders.ru/wp-content/uploads/2016/11/yii2-captcha.png"><img src="http://2coders.ru/2coders.ru/wp-content/uploads/2016/11/yii2-captcha.png" alt="yii2-captcha" width="120" height="50" class="alignnone size-full wp-image-2482" /></a></p>
<p>Заменим, её на числовую капчу вида:<br />
<a href="http://2coders.ru/2coders.ru/wp-content/uploads/2016/11/yii2-captcha-numeric.png"><img src="http://2coders.ru/2coders.ru/wp-content/uploads/2016/11/yii2-captcha-numeric.png" alt="yii2 numeric captcha " width="120" height="50" class="alignnone size-full wp-image-2484" /></a><br />
<span id="more-2481"></span></p>
<p>Для этого расширим класс <a rel='nofollow' href="http://www.yiiframework.com/doc-2.0/yii-captcha-captchaaction.html">CaptchaAction</a> и переопределим метод generateVerifyCode(). Именно, этот метод отвечает за то, из каких символов будет состоять капча в Yii2.</p>
<p>Создадим файл NumericCaptcha.php в app\common. Код файла будет следующим:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php

namespace app\common;

use yii\captcha\CaptchaAction as DefaultCaptchaAction;

class NumericCaptcha extends DefaultCaptchaAction
{
    protected function generateVerifyCode()
    {
        //Длина
        $length = 5;

        //Цифры, которые используются при генерации
        $digits = '0123456789';

        $code = '';
        for($i = 0; $i &lt; $length; $i++) {
            $code .= $digits[mt_rand(0, 9)];
        }
        return $code;
    }
}
</pre>
<p>Теперь, нужно прописать пусть до новой капчи в контроллере:</p>
<pre class="brush: php; title: ; notranslate">
public function actions()
    {
        return [
            'captcha' =&gt; [
                //'class' =&gt; 'yii\captcha\CaptchaAction',
                'class' =&gt; 'app\common\NumericCaptcha',
            ],
        ];
    }
</pre>
<p>Теперь, при генерации должны использоваться цифры.</p>
]]></content:encoded>
			<wfw:commentRss>https://2coders.ru/chislovaya-kapcha-v-yii2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Изменение постраничной навигации в Yii2</title>
		<link>https://2coders.ru/izmenenie-postranichnoj-navigacii-v-yii2/</link>
		<comments>https://2coders.ru/izmenenie-postranichnoj-navigacii-v-yii2/#respond</comments>
		<pubDate>Sun, 27 Sep 2015 16:06:02 +0000</pubDate>
		<dc:creator><![CDATA[Max]]></dc:creator>
				<category><![CDATA[Yii2]]></category>

		<guid isPermaLink="false">http://2coders.ru/?p=2467</guid>
		<description><![CDATA[Как и в первой версии фреймворка, Yii использует встроенный виджет для создания постраничной навигации. По умолчанию, при выводе страницы находятся в ul>li. Предположим, что нам нужно, чтобы ссылки на страницы были в div&#8217;е, вместо ul>li. Для этого нужно переопределить класс LinkPager. По умолчанию, вывод постраничной навигации в Yii2 делается так: SiteController.php index.php Создадим класс frontend/components/MyPager.php, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Как и в первой версии фреймворка, Yii использует встроенный виджет для создания постраничной навигации. По умолчанию, при выводе страницы находятся в ul>li. Предположим, что нам нужно, чтобы ссылки на страницы были в div&#8217;е, вместо ul>li. Для этого нужно переопределить класс LinkPager.</p>
<p><span id="more-2467"></span></p>
<p>По умолчанию, вывод постраничной навигации в Yii2 делается так:</p>
<p><strong>SiteController.php<br />
</strong></p>
<pre class="brush: php; title: ; notranslate">
public function actionIndex()
{
    $query = Post::find();
    $countQuery = clone $query;
    $pages = new Pagination(['totalCount' =&gt; $countQuery-&gt;count()], , 
        'pageSize'=&gt;5, 'defaultPageSize'=&gt;5
);
    $posts = $query-&gt;offset($pages-&gt;offset)
        -&gt;limit($pages-&gt;limit)
        -&gt;all();

    return $this-&gt;render('index', [
         'posts' =&gt; $posts,
         'pages' =&gt; $pages,
    ]);
}
</pre>
<p><strong>index.php</strong></p>
<pre class="brush: php; title: ; notranslate">
foreach ($posts as $post) {
    //Вывод данных поста.
}
//Виджет, который выводит странцы
echo \yii\widgets\LinkPager::widget([
    'pagination' =&gt; $pages,
]);
</pre>
<p>Создадим класс frontend/components/MyPager.php, в нем мы и будем переопределять LinkPager. За рендеринг кнопок отвечают 2 метода: renderPageButton() и renderPageButtons(). Меняем, в них ul на div, а li на span. В итоге, должно получиться:</p>
<p><strong>MyPager.php</strong></p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
namespace frontend\components;

use Yii;
use yii\base\InvalidConfigException;
use yii\helpers\Html;
use yii\base\Widget;
use yii\data\Pagination;

class MyPager  extends \yii\widgets\LinkPager
{

   protected function renderPageButton($label, $page, $class, $disabled, $active)
   {
       $options = ['class' =&gt; $class === '' ? null : $class];
       if ($active) {
           Html::addCssClass($options, $this-&gt;activePageCssClass);
       }
       if ($disabled) {
           Html::addCssClass($options, $this-&gt;disabledPageCssClass);

           return  Html::tag('span', $label);
       }
       $linkOptions = $this-&gt;linkOptions;
       $linkOptions['data-page'] = $page;

       return Html::a($label, $this-&gt;pagination-&gt;createUrl($page), $linkOptions);
   }


   protected function renderPageButtons()
   {
       $pageCount = $this-&gt;pagination-&gt;getPageCount();
       if ($pageCount &lt; 2 &amp;&amp; $this-&gt;hideOnSinglePage) {
           return '';
       }

       $buttons = [];
       $currentPage = $this-&gt;pagination-&gt;getPage();

       // first page
       $firstPageLabel = $this-&gt;firstPageLabel === true ? '1' : $this-&gt;firstPageLabel;
       if ($firstPageLabel !== false) {
           $buttons[] = $this-&gt;renderPageButton($firstPageLabel, 0, $this-&gt;firstPageCssClass, $currentPage &lt;= 0, false);
       }

       // prev page
       if ($this-&gt;prevPageLabel !== false) {
           if (($page = $currentPage - 1) &lt; 0) {
               $page = 0;
           }
           $buttons[] = $this-&gt;renderPageButton($this-&gt;prevPageLabel, $page, $this-&gt;prevPageCssClass, $currentPage &lt;= 0, false);
       }

       // internal pages
       list($beginPage, $endPage) = $this-&gt;getPageRange();
       for ($i = $beginPage; $i &lt;= $endPage; ++$i) {
           $buttons[] = $this-&gt;renderPageButton($i + 1, $i, null, false, $i == $currentPage);
       }

       // next page
       if ($this-&gt;nextPageLabel !== false) {
           if (($page = $currentPage + 1) &gt;= $pageCount - 1) {
               $page = $pageCount - 1;
           }
           $buttons[] = $this-&gt;renderPageButton($this-&gt;nextPageLabel, $page, $this-&gt;nextPageCssClass, $currentPage &gt;= $pageCount - 1, false);
       }

       // last page
       $lastPageLabel = $this-&gt;lastPageLabel === true ? $pageCount : $this-&gt;lastPageLabel;
       if ($lastPageLabel !== false) {
           $buttons[] = $this-&gt;renderPageButton($lastPageLabel, $pageCount - 1, $this-&gt;lastPageCssClass, $currentPage &gt;= $pageCount - 1, false);
       }

       return Html::tag('div', implode(&quot;\n&quot;, $buttons), $this-&gt;options);
   }
}
</pre>
<p>Теперь, вместо:</p>
<pre class="brush: php; title: ; notranslate">
echo \yii\widgets\LinkPager::widget([
    'pagination' =&gt; $pages,
]);
</pre>
<p>Можно прописать наш класс:</p>
<pre class="brush: php; title: ; notranslate">
echo \frontend\components\MyPager::widget([
   'pagination' =&gt; $pages,
]);
</pre>
<p>После изменения, постраничная навигация будет в следующем виде:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;div class=&quot;pagination&quot;&gt;&lt;span&gt;←&lt;/span&gt;
    &lt;a href=&quot;/blog?page=1&quot; data-page=&quot;0&quot;&gt;1&lt;/a&gt;
    &lt;a href=&quot;/blog?page=2&quot; data-page=&quot;1&quot;&gt;2&lt;/a&gt;
    &lt;a href=&quot;/blog?page=2&quot; data-page=&quot;1&quot;&gt;→&lt;/a&gt;
&lt;/div&gt;
</pre>
<p>Подробнее, о том, как работает LinkPager, можно ознакомиться в официальной <a rel="nofollow" href="http://www.yiiframework.com/doc-2.0/yii-widgets-linkpager.html">документации</a>. На момент, написания статьи, актуальная версия фреймворка &#8212; 2.0.6.</p>
]]></content:encoded>
			<wfw:commentRss>https://2coders.ru/izmenenie-postranichnoj-navigacii-v-yii2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Дорабатываем CGridView под свои задачи</title>
		<link>https://2coders.ru/dorabatyvaem-cgridview-pod-svoi-zadachi/</link>
		<comments>https://2coders.ru/dorabatyvaem-cgridview-pod-svoi-zadachi/#comments</comments>
		<pubDate>Mon, 08 Apr 2013 19:34:55 +0000</pubDate>
		<dc:creator><![CDATA[Max]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Yii]]></category>

		<guid isPermaLink="false">http://2coders.ru/?p=2316</guid>
		<description><![CDATA[Спонсор поста: EximusCommerce &#8212; платформа для создания интернет-магазинов на Yii framework. Продолжаем знакомиться с виджетами в Yii framework. Сегодня рассмотрим CGridView. CGridView &#8212; это стандартный виджет, располагается в /framework/zii/widgets/grid/CGridView.php. Виджет служит, для отображения данных в табличной форме. Поддерживается сортировка по атрибутам, постраничная навигация и поиск. Сортировка и постраничная навигация могут осуществляться, как с помощью AJAX&#8217;а, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><strong>Спонсор поста: <a href="http://eximuscommerce.com/">EximusCommerce</a> &#8212; платформа для создания интернет-магазинов на Yii framework.<br />
</strong><br />
Продолжаем знакомиться с виджетами в Yii framework. Сегодня рассмотрим CGridView. CGridView &#8212; это стандартный виджет, располагается в /framework/zii/widgets/grid/CGridView.php. Виджет служит, для отображения данных в табличной форме. Поддерживается сортировка по атрибутам, постраничная навигация и поиск. Сортировка и постраничная навигация могут осуществляться, как с помощью AJAX&#8217;а, так и без него. Если, у пользователя отключен javascript, то сортировка и переключение страниц будет происходить обычным образом, без AJAX. </p>
<p>Минимальный код необходимы для вызова виджета:</p>
<pre class="brush: php; title: ; notranslate">
$dataProvider=new CActiveDataProvider('Model');

$this-&gt;widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=&gt;$dataProvider,
));
</pre>
<p>Под катом, мы рассмотрим следующие пункты:</p>
<p>1. Добавление календаря в фильтры (jquery datepicker).<br />
2. Выпадающие списки в фильтрах.<br />
3. Изменение дизайна.</p>
<p>Все действия будут производиться на немного измененном демо-блоге, который можно скачать вместе с Yii. В конце статьи будет архив с готовым примером.<br />
<span id="more-2316"></span></p>
<p>Создадим таблицу tbl_news с такой структурой:<br />
<img src="http://2coders.ru/2coders.ru/wp-content/uploads/2013/04/tbl_news1.png" alt="Структура таблицы tbl_news" title="tbl_news" width="210" height="162" class="alignnone size-full wp-image-2325" /></p>
<p><strong>name</strong> &#8212; название новости.<br />
<strong>content</strong> &#8212; содержимое новости.<br />
<strong>status</strong> &#8212; статус новости. Новости с 0 статусом не показываются.<br />
<strong>created_at</strong> &#8212; дата создания новости.</p>
<p>SQL:</p>
<pre class="brush: sql; title: ; notranslate">
CREATE TABLE `tbl_news` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `content` text NOT NULL,
  `status` tinyint(1) NOT NULL DEFAULT '1',
  `created_at` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;

--
-- Дамп данных таблицы `tbl_news`
--

INSERT INTO `tbl_news` (`id`, `name`, `content`, `status`, `created_at`) VALUES
(1, 'name1', 'content1', 1, '2013-03-23'),
(2, 'name2', 'content2', 1, '2013-04-01'),
(3, 'name3', 'content3', 0, '2013-04-03'),
(4, 'name4', 'content4', 1, '2013-04-01'),
(5, 'name5', 'content5', 0, '2013-04-05');
</pre>
<p>После того, как создали таблицу tbl_news в базе данных, генерируем модель <strong>News</strong>, с помощью gii. Если все прошло правильно, то новая модель доступна в models/News.php. Изменим немного метод search. Меняем:</p>
<pre class="brush: php; title: ; notranslate">
return new CActiveDataProvider($this, array(
			'criteria'=&gt;$criteria,
		));
</pre>
<p>На следующий код:</p>
<pre class="brush: php; title: ; notranslate">
return new CActiveDataProvider($this, array(
             'criteria'=&gt;$criteria,
                 'pagination'=&gt;array(
                     'pageSize'=&gt;10,
                  ),
                  sort'=&gt;array(
                      'defaultOrder'=&gt;array(
                       'created_at'=&gt;&quot;DESC&quot;
                  ))
        ));
</pre>
<p>В приведенном выше коде, задается, что на странице будет выводится 10 записей и сортировка будет по полю created_at. </p>
<p>Создадим контроллер <strong>NewsController.php</strong> в protected/controllers (CRUD-методы специально не включены в контроллер).</p>
<p>Содержимое NewsController:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class NewsController extends Controller
{
    /**
     * Главная страница новостей
     */
    public function actionIndex()
    {
        $model = new News('search');

        $model-&gt;unsetAttributes();

        if(isset($_GET['News'])) {
            $model-&gt;attributes = $_GET['News'];
        }

        $this-&gt;render('index', array('model'=&gt;$model));
    }
}
?&gt;
</pre>
<p>Создаем директорию news в protected/views и представление index.php в views/news. В файле index.php будут выводится все новости в виджете CGRidView.</p>
<p>Содержимое index.php:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
$this-&gt;widget('zii.widgets.grid.CGridView', array(
    'dataProvider' =&gt; $model-&gt;search(),
    'filter' =&gt; $model,
    'columns' =&gt; array(
        array(
            'name' =&gt; 'name',
            'type' =&gt; 'raw',
            'value' =&gt; '$data-&gt;name',
        ),
        array(
            'name' =&gt; 'status',
            'type' =&gt; 'raw',
            'value' =&gt; '$data-&gt;status',
        ),
        array(
            'name' =&gt; 'created_at',
            'type' =&gt; 'raw',
            'value' =&gt; '$data-&gt;created_at',
        ),
        array(
            'class' =&gt; 'CButtonColumn',
            'template' =&gt; '{update}&amp;nbsp;{delete}',
            'buttons' =&gt; array(
                'update' =&gt; array(
                    //здесь должен быть url для редактирования записи
                    'url' =&gt; 'Yii::app()-&gt;createUrl(&quot;/edit/$data-&gt;id&quot;)',
                ),
                'delete' =&gt; array(
                    //здесь должен быть url для удаления записи
                    'url' =&gt; 'Yii::app()-&gt;createUrl(&quot;/delete/$data-&gt;id&quot;)',
                ),
            ),
        ),
    ),
));
</pre>
<p>Открыв страницу с новостями, вы увидите 5-ть записей в таблице, со стандартным оформлением. Можно производить сортировку по атрибутам, искать значения в фильтрах, но для того, чтобы найти записи за определенную дату нужно вводить значение вручную. Это не слишком удобно. Исправим это, добавив календарь для поля created_at.</p>
<h2>Добавление календаря в CGridView</h2>
<p>Заменяем:</p>
<pre class="brush: php; title: ; notranslate">
array(
      'name' =&gt; 'created_at',
      'type' =&gt; 'raw',
      'value' =&gt; '$data-&gt;created_at',
     ),
</pre>
<p>На следующий код:</p>
<pre class="brush: php; title: ; notranslate">
array(
      'name' =&gt; 'created_at',
      'type' =&gt; 'raw',
      'value' =&gt; '$data-&gt;created_at',
      'filter'=&gt;$this-&gt;widget('zii.widgets.jui.CJuiDatePicker', array(
           'model'=&gt;$model,
           'attribute'=&gt;'created_at',
           'language'=&gt;'ru',
           'options'=&gt;array(
           'showAnim'=&gt;'fold',
           'dateFormat'=&gt;'yy-mm-dd',
           'changeMonth' =&gt; 'true',
           'changeYear'=&gt;'true',
                ),
       ),true),
    ),
</pre>
<p>Теперь, при клике в поле фильтра для created_at, будет появляться календарь с возможностью выбора даты. Чтобы, datepicker работал и после выполнения ajax-запросов, нужно добавить следующий код после columns:</p>
<pre class="brush: php; title: ; notranslate">
'afterAjaxUpdate'=&gt;&quot;function() {
        jQuery('#News_created_at').datepicker(jQuery.extend(jQuery.datepicker.regional['ru'],{
                                            'showAnim':'fold',
                                            'dateFormat':'yy-mm-dd',
                                            'changeMonth':'true',
                                            'changeYear':'true'}));
    }&quot;,
</pre>
<h2>Добавление выпадающего списка в CGridView</h2>
<p>Изменим код колонки status&#8217;а на следующий:</p>
<pre class="brush: php; title: ; notranslate">
array(
      'name' =&gt; 'status',
      'type' =&gt; 'raw',
      'value' =&gt; '$data-&gt;getStatus($data-&gt;status)',
      'filter' =&gt; array(''=&gt;'Все', 1 =&gt; 'Показывается', 0=&gt; 'Не показывается'), ),
</pre>
<p>Кроме измененного фильтра, был добавлен метод getStatus() для возвращения значения статуса. Данный метод нужно добавить в модель News.</p>
<pre class="brush: php; title: ; notranslate">
public function getStatus($status)
{
    $data = array(0=&gt;&quot;Не показывается&quot;, 1=&gt;&quot;Показывается&quot;);
    return $data[$status];
}
</pre>
<h2>Добавление своих стилей в CGridView</h2>
<p>Если посмотреть на страницу новостей после изменений, то можно увидеть, что текстовое поле под колонкой &#171;Статус&#187; заменено на выпадающий список. Вместо 1 и 0, выводятся текстовые значения статуса. Осталось изменить кнопки для редактирования, удаления записей и стили. Добавьте следующие стили в файл main.css (входит в комплект с демо блогом):</p>
<pre class="brush: css; title: ; notranslate">
.table-striped td {
    border-top: 1px solid #DDDDDD;
    line-height: 20px;
    padding: 8px;
    text-align: left;
    vertical-align: top;
}
.grid-view table.table-striped th {
    padding-bottom: 8px;
}
.table-striped {
    width: 100%;
}
.table-striped th {
    background: #ffffff;
    text-align: center;
}
.grid-view table.table-striped tr.selected {
    background-color: #BCE774 !important;
}
.grid-view table.table-striped {
    border-collapse: collapse;
}
</pre>
<p>В views/news/index.php после &#8216;filter&#8217; => $model добавляем &#8216;itemsCssClass&#8217;=>&#8217;table-striped&#8217;. Этим мы указали значение для атрибута class, для нашей таблицы. Изменим кнопки, для удаления и редактирования. </p>
<p>Для редактирования будет такая картинка:<img src="http://2coders.ru/2coders.ru/wp-content/uploads/2013/04/edit.png" alt="" title="edit" width="16" height="16" class="alignnone size-full wp-image-2365" /></p>
<p>Для удаления, вот такая:<br />
<img src="http://2coders.ru/2coders.ru/wp-content/uploads/2013/04/delete.png" alt="" title="delete" width="16" height="16" class="alignnone size-full wp-image-2367" /></p>
<p>Обе картинки находятся в директории images. Предварительно ее нужно создать, если ее нет.</p>
<p>В &#8216;update&#8217;, перед url, добавляем: &#8216;imageUrl&#8217;=>&#8217;/images/edit.png&#8217;, а в &#8216;delete&#8217; &#8216;imageUrl&#8217;=>&#8217;/images/delete.png&#8217;,</p>
<p>Должно получиться вот так:  </p>
<pre class="brush: php; title: ; notranslate">
array(
            'class' =&gt; 'CButtonColumn',
            'template' =&gt; '{update}&amp;nbsp;{delete}',
            'buttons' =&gt; array(
                'update' =&gt; array(
                    //url до картинки
                    'imageUrl'=&gt;'/images/edit.png',
                    //здесь должен быть url для редактирования записи
                    'url' =&gt; 'Yii::app()-&gt;createUrl(&quot;/edit/$data-&gt;id&quot;)',
                ),
                'delete' =&gt; array(
                    //url до картинки
                    'imageUrl'=&gt;'/images/delete.png',
                    //здесь должен быть url для удаления записи
                    'url' =&gt; 'Yii::app()-&gt;createUrl(&quot;/delete/$data-&gt;id&quot;)',
                ),
            ),
        ),
</pre>
<p>Для того, чтобы все изменения вступили в силу, нужно <strong>очистить директорию assets</strong>. Кнопки задаются по шаблону, определенному в &#8216;template&#8217; => &#8216;{update}&nbsp;{delete}&#8217;. В скобках можно задать шаблон для своей кнопки, а потом добавить ее в массив  buttons.</p>
<p>Полный листинг файла news/index.php:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
$this-&gt;widget('zii.widgets.grid.CGridView', array(
    'dataProvider' =&gt; $model-&gt;search(),
    'filter' =&gt; $model,
    'itemsCssClass'=&gt;'table-striped',
    'columns' =&gt; array(
        array(
            'name' =&gt; 'name',
            'type' =&gt; 'raw',
            'value' =&gt; '$data-&gt;name',
        ),
        array(
            'name' =&gt; 'status',
            'type' =&gt; 'raw',
            'value' =&gt; '$data-&gt;getStatus($data-&gt;status)',
            'filter' =&gt; array(''=&gt;'Все', 1 =&gt; 'Да', 0=&gt; 'Нет'),
        ),
        array(
            'name' =&gt; 'created_at',
            'type' =&gt; 'raw',
            'value' =&gt; '$data-&gt;created_at',
            'filter'=&gt;$this-&gt;widget('zii.widgets.jui.CJuiDatePicker', array(
                'model'=&gt;$model,
                'attribute'=&gt;'created_at',
                'language'=&gt;'ru',
                'options'=&gt;array(
                    'showAnim'=&gt;'fold',
                    'dateFormat'=&gt;'yy-mm-dd',
                    'changeMonth' =&gt; 'true',
                    'changeYear'=&gt;'true',

                ),
            ),true),
        ),
        array(
            'class' =&gt; 'CButtonColumn',
            'template' =&gt; '{update}&amp;nbsp;{delete}',
            'buttons' =&gt; array(
                'update' =&gt; array(
                    //url до картинки
                    'imageUrl'=&gt;'/images/edit.png',
                    //здесь должен быть url для редактирования записи
                    'url' =&gt; 'Yii::app()-&gt;createUrl(&quot;/edit/$data-&gt;id&quot;)',
                ),
                'delete' =&gt; array(
                    //url до картинки
                    'imageUrl'=&gt;'/images/delete.png',
                    //здесь должен быть url для удаления записи
                    'url' =&gt; 'Yii::app()-&gt;createUrl(&quot;/delete/$data-&gt;id&quot;)',
                ),
            ),
        ),
    ),
    'afterAjaxUpdate'=&gt;&quot;function() {
        jQuery('#News_created_at').datepicker(jQuery.extend(jQuery.datepicker.regional['ru'],{
                                            'showAnim':'fold',
                                            'dateFormat':'yy-mm-dd',
                                            'changeMonth':'true',
                                            'changeYear':'true'}));
    }&quot;,
));
</pre>
<p>В статье показаны лишь немногие методы доступные для CGridView. Подробное описание доступно на <a href="http://www.yiiframework.com/doc/api/1.1/CGridView">официальном сайте</a>. </p>
<p><a href="http://2coders.ru/2coders.ru/wp-content/uploads/2013/04/yiiblog.zip">Архив</a> с примером. Новости из примера, запускаются по адресу: http://yiiblog/news.</p>
]]></content:encoded>
			<wfw:commentRss>https://2coders.ru/dorabatyvaem-cgridview-pod-svoi-zadachi/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Пример работы с CListView в Yii</title>
		<link>https://2coders.ru/primery-raboty-s-clistview-v-yii/</link>
		<comments>https://2coders.ru/primery-raboty-s-clistview-v-yii/#comments</comments>
		<pubDate>Sun, 25 Nov 2012 19:51:32 +0000</pubDate>
		<dc:creator><![CDATA[Max]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Yii]]></category>

		<guid isPermaLink="false">http://2coders.ru/?p=2165</guid>
		<description><![CDATA[CListView &#8212; это стандартный виджет для отображения записей. Поддерживает сортировку по определенным атрибутам и постраничную навигацию. Виджет расположен в /framework/zii/widgets/CListView.php. Минимальный код необходимый для вызова виджета: Рассмотрим, как можно немного изменить виджет для своих целей. Но, для начала разберем, какие параметры передаются в CListView в примере выше. dataProvider &#8212; dataProvider . itemView &#8212; представление, в [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>CListView &#8212; это стандартный виджет для отображения записей. Поддерживает сортировку по определенным атрибутам и постраничную навигацию. Виджет расположен в /framework/zii/widgets/CListView.php. Минимальный код необходимый для вызова виджета:</p>
<pre class="brush: php; title: ; notranslate">
$dataProvider = new CActiveDataProvider('Model');

$this-&gt;widget('zii.widgets.CListView', array(
    'dataProvider'=&gt;$dataProvider,
    'itemView'=&gt;'_testimonial', 
    'sortableAttributes'=&gt;array(
        'rating',
        'create_time',
    ),
));
</pre>
<p>Рассмотрим, как можно немного изменить виджет для своих целей. Но, для начала разберем, какие параметры передаются в CListView в примере выше.<br />
<span id="more-2165"></span><br />
<strong>dataProvider</strong> &#8212; <a target="_blank" href="http://www.yiiframework.com/doc/api/1.1/CDataProvider" title="dataProvider">dataProvider</a> .<br />
<strong>itemView</strong> &#8212; представление, в котором будет рендерится каждая запись выводимая в CListView.<br />
<strong>sortableAttributes</strong> &#8212; атрибуты, по которым происходит сортировка.</p>
<p>Усложним пример и изменим для своих целей виджет. Представим, что у нас есть таблица с отзывами, с такой структурой:<br />
<img src="http://2coders.ru/2coders.ru/wp-content/uploads/2012/11/scheme.png" alt="scheme" title="scheme" width="204" height="156" class="alignnone size-full wp-image-2185" /></p>
<p><strong>name</strong> &#8212; имя человека оставившего отзыв.<br />
<strong>city</strong> &#8212; город.<br />
<strong>rating</strong> &#8212; рейтинг отзыва.<br />
<strong>created_at</strong> &#8212; дата создания отзыва.</p>
<p>Нам нужно вывести отзывы из таблицы tbl_testimonials в CListView. Сортировка будет по rating и created_at. Для сортера, должен задаваться собственный стиль. Постраничная навигация в стандартном виде тоже не пойдет. Все атрибуты сортера будут выводиться в span и со стрелочками ▲▼.   </p>
<p>Создадим контроллер <strong>TestimonialController.php</strong></p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class TestimonialController extends Controller
{
        public function actionIndex()
        {
            $model = new Testimonial();

            $dataProvider = new CActiveDataProvider('Testimonial', array(
                //Критерий для запроса. В этом примере, выбираются все отзывы, которые прошли модерацию.
                'criteria'=&gt;array('condition'=&gt; 'moderation != 1'),
                //Настройки для постраничной навигации
                'pagination'=&gt;array(
                    //Количество отзывов на страницу
                    'pageSize'=&gt;5,
                    'pageVar'=&gt;'page',
                ),
                //Настройки для сортировки
                'sort'=&gt;array(
                    //атрибуты по которым происходит сортировка
                    'attributes'=&gt;array(
                        'rating'=&gt;array(
                            'asc'=&gt;'rating ASC',
                            'desc'=&gt;'rating DESC',
                            //по умолчанию, сортируем поле rating по убыванию (desc)
                            'default'=&gt;'desc',
                        ),
                        'created_at'=&gt;array(
                            'asc'=&gt;'created_at ASC',
                            'desc'=&gt;'created_at DESC',
                            'default'=&gt;'desc',
                        )
                    ),
                    /** После того, как будет загружена страница с виджетом, 
                     * сортировка будет происходить по этому параметру.
                     * Если указан defaultOrder, то задается стиль для атрибута, по которому происходит сортировка.
                     * В данном случае у created_at будет class=&quot;desc&quot;.  
                     */
                    'defaultOrder'=&gt;array(
                        'created_at'=&gt;CSort::SORT_DESC,
                    )
                ),
            ));

            $this-&gt;render('index', array('dataProvider'=&gt;$dataProvider,
                                         'model'=&gt;$model));

        }
}
</pre>
<p>Нет смысла приводить модель <strong>Testimonial</strong>, там все стандартно. Получить ее можно, после генерации кода в gii.</p>
<p>Т.к. нам нужны собственные стили для для постраничной навигации и для сортируемых атрибутов, переопределим виджет, наследовав класс CListView. Для этого создадим файл <strong>MyClistView.php</strong>. У меня он находится в site/protected/widgets. В дальнейшем этот путь будет использоваться при подключении виджета.</p>
<p>Код <strong>MyClistView.php</strong></p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class MyClistView extends CListView {

    /**
     * Для изменения сортера нужно изменить метод renderSorter()
     * Renders the sorter.
     */
    public function renderSorter()
    {
        //В качестве пейджера используем свой класс, со своими стилями
        $this-&gt;pager = array('class'=&gt;'MyPager');

  if($this-&gt;dataProvider-&gt;getItemCount()&lt;=0 || !$this-&gt;enableSorting || empty($this-&gt;sortableAttributes))
            return;
        echo CHtml::openTag('div',array('class'=&gt;$this-&gt;sorterCssClass)).&quot;\n&quot;;
        echo $this-&gt;sorterHeader===null ? Yii::t('zii','Sort by: ') : $this-&gt;sorterHeader;
        echo &quot;&lt;ul&gt;\n&quot;;
        $sort=$this-&gt;dataProvider-&gt;getSort();
        foreach($this-&gt;sortableAttributes as $name=&gt;$label)
        {
            if($label == 'created_at') {
                $link_name = &quot;&lt;span&gt;по дате добавления&lt;/span&gt;&quot;;
            } else {
                $link_name = &quot;&lt;span&gt;по рейтингу&lt;/span&gt;&quot;;
            }

            if(is_integer($name)){

                //если производят сортировку
                if(!empty($_GET['Testimonial_sort'])) {

                    $sorter_type = $_GET['Testimonial_sort'];

                    if($sorter_type == 'created_at' &amp;&amp; $name == 1) {
                        echo $sort-&gt;link($label, $link_name.' ▼', $htmlOptions=array('class'=&gt;'active'));

                    } elseif($sorter_type == 'created_at.desc' &amp;&amp; $name == 1) {
                        echo $sort-&gt;link($label, $link_name.'  ▲', $htmlOptions=array('class'=&gt;'active'));

                    } elseif($sorter_type == 'rating' &amp;&amp; $name == 0) {
                        echo $sort-&gt;link($label, ''.$link_name.'  ▼', $htmlOptions=array('class'=&gt;'active'));

                    } elseif($sorter_type == 'rating.desc' &amp;&amp; $name == 0) {
                        echo $sort-&gt;link($label, $link_name.' ▲', $htmlOptions=array('class'=&gt;'active'));

                    } else {
                        echo $sort-&gt;link($label, $link_name);
                    }


                } else {

                    //sorter до сортировки
                    if($label == 'created_at') {
                        echo $sort-&gt;link($label, $link_name.' ▲', $htmlOptions=array('class'=&gt;'active'));
                    } else {
                        echo $sort-&gt;link($label, $link_name);
                    }
                }

            } else {
                echo $sort-&gt;link($name,$label);
            }
        }
        echo &quot;&lt;/ul&gt;&quot;;
        echo $this-&gt;sorterFooter;
        echo CHtml::closeTag('div');
    }
}
?&gt;
</pre>
<p>Все запросы для сортировки в CListView передаются в виде $_GET-параметров. Поэтому, я не придумал ничего лучше использования $_GET[&#8216;Testimonial_sort&#8217;] для определения какой атрибут сейчас сортируется. Для сортировки по убыванию в $_GET[&#8216;Testimonial_sort&#8217;] передается attribute_name.desc, если по возрастанию, то просто attribute_name. В $name передается 0 или 1, в зависимости от атрибута. Возможно для достижения поставленной цели, есть более лучшее решение.  </p>
<p>Для вывода всех отзывов используется <strong>index.php</strong>.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
$this-&gt;widget('application.widgets.MyClistView', array(
     'dataProvider'=&gt;$dataProvider,
     'ajaxUpdate'=&gt;true,
     'template'=&gt;'{sorter}{items}{pager}',
     'itemView'=&gt;'_view',
     'cssFile'=&gt;false,
     'sorterHeader'=&gt;'Сортировка',
     'sorterCssClass'=&gt;'filter-menu sort',
     'pagerCssClass'=&gt;'YiiPager',
     'pager'=&gt;array('maxButtonCount'=&gt;'5',),
     'sortableAttributes'=&gt;array(
                           'rating',
                           'created_at',
                       ),
));
?&gt;
</pre>
<p><strong>application.widgets.MyClistView</strong> &#8212; это путь до виджета.<br />
<a target="_blank" rel="nofollow" href="http://www.yiiframework.com/doc/api/1.1/CListView#afterAjaxUpdate-detail">ajaxUpdate</a> &#8212; использование ajax&#8217;a в работе виджета. По умолчанию true.<br />
<a href="http://www.yiiframework.com/doc/api/1.1/CListView#template-detail">template</a> &#8212; шаблон отображения записей, навигации и атрибутов, которые буду участвовать в сортировке.<br />
<a target="_blank" rel="nofollow" href="http://www.yiiframework.com/doc/api/1.1/CListView#itemView-detail">itemView</a> &#8212; представление в котором рендерится отзыв.<br />
<a target="_blank" rel="nofollow" href="http://www.yiiframework.com/doc/api/1.1/CListView#cssFile-detail">cssFile</a> &#8212; включаем/выключаем стандартные css-стили.<br />
<a target="_blank" rel="nofollow" href="http://www.yiiframework.com/doc/api/1.1/CListView#sorterHeader-detail">sorterHeader</a> &#8212; заголовок, который выводится перд ссылками сортера.<br />
<a target="_blank" href="http://www.yiiframework.com/doc/api/1.1/CListView#sorterCssClass-detail">sorterCssClass</a> &#8212; css-класс для сортера.<br />
<a target="_blank" rel="nofollow" href="http://www.yiiframework.com/doc/api/1.1/CBaseListView#pagerCssClass-detail">pagerCssClass</a> &#8212; css-класс используемый в постраничной навигации.<br />
<a target="_blank" rel="nofollow" href="http://www.yiiframework.com/doc/api/1.1/CListView#afterAjaxUpdate-detail">afterAjaxUpdate</a> &#8212; javascript, который срабатывает после загрузки CListView.<br />
<a target="_blank" rel="nofollow" href="http://www.yiiframework.com/doc/api/1.1/CBaseListView#pager-detail">pager</a> &#8212; количество данных на страницу. В нашем случае будет выводится 5 отзывов на 1-й странице.<br />
<a target="_blank" rel="nofollow" href="http://www.yiiframework.com/doc/api/1.1/CListView#sortableAttributes-detail">sortableAttributes</a> &#8212; атрибуты, которые будут сортироваться.</p>
<p>Код в представлении <strong>_view.php</strong>:</p>
<pre class="brush: php; title: ; notranslate">
&lt;div&gt;
    &lt;strong&gt;&lt;?php echo CHtml::encode($data-&gt;name); ?&gt;&lt;/strong&gt;&lt;br /&gt;
    г. &lt;?php echo CHtml::encode($data-&gt;city); ?&gt; &lt;br /&gt;
    Рейтинг: &lt;?php echo CHtml::encode($data-&gt;rating); ?&gt;
&lt;/div&gt;
</pre>
<p>Итак, в этой статье мы рассмотрели несколько примеров работы с CListview в yii. Подробнее о свойствах и методах CListview можно прочитать на <a href="http://www.yiiframework.com/doc/api/1.1/CListView#methods">http://www.yiiframework.com</a></p>
]]></content:encoded>
			<wfw:commentRss>https://2coders.ru/primery-raboty-s-clistview-v-yii/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Примеры работы с миграциями в Yii framework</title>
		<link>https://2coders.ru/primery-raboty-s-migraciyami-v-yii-framework/</link>
		<comments>https://2coders.ru/primery-raboty-s-migraciyami-v-yii-framework/#comments</comments>
		<pubDate>Fri, 02 Mar 2012 19:05:01 +0000</pubDate>
		<dc:creator><![CDATA[Max]]></dc:creator>
				<category><![CDATA[Yii]]></category>

		<guid isPermaLink="false">http://2coders.ru/?p=2103</guid>
		<description><![CDATA[Миграции &#8212; это очень полезный и удобный инструмент для управления структурой бд, значительно упрощающий командную разработку. В этом посте, я покажу примеры часто используемых миграций: create table, insert, update и add column. В качестве примера будем использовать таблицу tbl_news: Создание таблицы с помощью миграции 1. Управлениями миграциями в Yii производится с помощью консольной команды yiic [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><strong>Миграции</strong> &#8212; это очень полезный и удобный инструмент для управления структурой бд, значительно упрощающий командную разработку. В этом посте, я покажу примеры часто используемых миграций: create table, insert, update и add column.<br />
<span id="more-2103"></span><br />
В качестве примера будем использовать таблицу <strong>tbl_news</strong>:</p>
<pre class="brush: sql; title: ; notranslate">
CREATE TABLE IF NOT EXISTS `tbl_news` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(200) CHARACTER SET utf8 NOT NULL,
  `content` text CHARACTER SET utf8,
  `created_at` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
</pre>
<h3>Создание таблицы с помощью миграции</h3>
<p>1. Управлениями миграциями в Yii производится с помощью консольной команды yiic migrate. Для того, чтобы создать нашу первую миграцию, выполним в консоли команду: <strong>yiic migrate create create_tbl_news</strong>. При вопросе &#171;Create new migration &#187;%path_to_migration%&#187;, отвечаем yes. Если все прошло правильно, то в директории protected/migrations должен появиться файл, с примерно таким названием m120302_172329_create_tbl_news.php. Первая часть названия файла это timestamp, вторая это название миграции, которое мы задали. </p>
<p>2. Редактируем созданный файл, в нем будет два метода <strong>up()</strong> и <strong>down()</strong>. Для создания таблицы нам нужен будет метод up(). Изменим его содержимое, дописав следующий код:</p>
<pre class="brush: php; title: ; notranslate">
            $this-&gt;createTable('tbl_news', array(
                  'id' =&gt; 'pk',
                  'title' =&gt; 'VARCHAR(200) NOT NULL',
                  'content' =&gt; 'text',
            ));

</pre>
<p>Полностью файл миграции должен выглядеть так (не забываем, что timestamp у вас будет другой):</p>
<pre class="brush: php; title: ; notranslate">
class m120302_172329_create_tbl_news extends CDbMigration
{
	public function up()
	{
		$this-&gt;createTable('tbl_news', array(
                  'id' =&gt; 'pk',
                  'title' =&gt; 'VARCHAR(200) NOT NULL',
                  'content' =&gt; 'text',
            ));
	}

	public function down()
	{
		echo &quot;m120302_172329_create_tbl_news does not support migration down.\n&quot;;
		return false;
	}

	/*
	// Use safeUp/safeDown to do migration with transaction
	public function safeUp()
	{
	}

	public function safeDown()
	{
	}
	*/
</pre>
<p>3. Теперь, выполним в консоли  команду yiic migrate, если все прошло удачно, то видим надпись Migrated up Scuccessfully! В бд должна появиться таблица <strong>tbl_news</strong> и <strong>tbl_migration</strong>. Двигаемся дальше.</p>
<h3>Добавление записи в таблицу с помощью миграции</h3>
<p>1. Выполняем команду: <strong>yiic migrate create insert_tbl_news</strong>.<br />
2. Редактируем сгенерированный файл с миграцией. Добавляем в метод up() следующий код:</p>
<pre class="brush: php; title: ; notranslate">
$this-&gt;insert('tbl_news', array(
                   'title' =&gt; 'Title 1',
                   'content' =&gt; 'Content 1',
));
</pre>
<p>3.Выполняем команду yiic migrate.</p>
<h3>Изменение записи в таблице с помощью миграции</h3>
<p>1. Выполняем команду: <strong>yiic migrate create update_tbl_news</strong>.<br />
2. Редактируем сгенерированный файл с миграцией. Добавляем в метод up():</p>
<pre class="brush: php; title: ; notranslate">
$this-&gt;update('tbl_news', array(
              'title' =&gt; 'Updated title'), 
              'id=1'
);
</pre>
<p>3.Выполняем команду yiic migrate.</p>
<h3>Добавление колонки в таблицу с помощью миграции</h3>
<p>1. Выполняем команду: <strong>yiic migrate create add_column_tbl_news</strong>.<br />
Редактируем сгенерированный файл с миграцией. Добавляем в метод up():</p>
<pre class="brush: php; title: ; notranslate">
$this-&gt;addColumn('tbl_news', 'created_at', 'date');
</pre>
<p>3. Выполняем команду yiic migrate.</p>
<h3>Удаление колонки</h3>
<p>1. Выполняем команду: <strong>yiic migrate create drop_column_tbl_news</strong>.<br />
Редактируем сгенерированный файл с миграцией. Добавляем в метод up():</p>
<pre class="brush: php; title: ; notranslate">
$this-&gt;dropColumn('tbl_news', 'created_at');
</pre>
<p>3. Выполняем команду yiic migrate.</p>
<p>Вот собственно и все. Подробнее об остальных миграциях можно почитать на официальном <a href="http://www.yiiframework.com/doc/guide/1.1/ru/database.migration">сайте</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://2coders.ru/primery-raboty-s-migraciyami-v-yii-framework/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>12 jQuery плагинов для проигрывания видео и аудио файлов</title>
		<link>https://2coders.ru/12-jquery-plugins-for-playing-video-audio/</link>
		<comments>https://2coders.ru/12-jquery-plugins-for-playing-video-audio/#comments</comments>
		<pubDate>Thu, 01 Sep 2011 18:48:18 +0000</pubDate>
		<dc:creator><![CDATA[Max]]></dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jquery плагины]]></category>

		<guid isPermaLink="false">http://2coders.ru/?p=1946</guid>
		<description><![CDATA[Я уже делал несколько раз подборки jquery плагинов здесь и здесь. Сегодняшние плагины посвящены проигрыванию видео и аудио файлов на сайте. jPlayer Этот плеер поддерживает следующие форматы в HTML5-версии: mp3, m4a (AAC), m4v (H.264), ogv*, oga*, wav*, webm*. При использовании flash: mp3, m4a (AAC), m4v (H.264). По заверению автора, плеер работает в Chrome, Opera, Safari, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Я уже делал несколько раз подборки jquery плагинов <a href="http://2coders.ru/25-poleznyx-plaginov-na-jquery/">здесь</a> и <a href="http://2coders.ru/10-poleznyx-plaginov-na-jquery/">здесь</a>. Сегодняшние плагины посвящены проигрыванию видео и аудио файлов на сайте.</p>
<p><strong>jPlayer</strong><br />
Этот плеер поддерживает следующие форматы в HTML5-версии: mp3, m4a (AAC), m4v (H.264), ogv*, oga*, wav*, webm*. При использовании flash: mp3, m4a (AAC), m4v (H.264). По заверению автора, плеер работает в Chrome, Opera, Safari, IE6, IE7, IE8, IE9, iPad, iPhone, iPod.<br />
<img src="http://2coders.ru/2coders.ru/wp-content/uploads/2011/08/jplayer3.jpg" alt="jplayer" title="jplayer" width="593" height="411" class="aligncenter size-full wp-image-1992" srcset="https://2coders.ru/2coders.ru/wp-content/uploads/2011/08/jplayer3.jpg 593w, https://2coders.ru/2coders.ru/wp-content/uploads/2011/08/jplayer3-300x207.jpg 300w" sizes="(max-width: 593px) 100vw, 593px" /><a href="http://www.jplayer.org/latest/demos/" rel='nofollow'>Перейти на сайт</a></p>
<p><span id="more-1946"></span><br />
<strong>Video JS</strong><br />
Честно говоря, для использования Video JS необязательно использовать jquery, но автор любезно предоставил <a href="http://videojs.com/jquery/" rel="nofollow">jquery-версию</a>.<br />
<img src="http://2coders.ru/2coders.ru/wp-content/uploads/2011/09/Video-JS.jpg" alt="Video JS" title="Video JS" width="593" height="245" class="aligncenter size-full wp-image-2016" srcset="https://2coders.ru/2coders.ru/wp-content/uploads/2011/09/Video-JS.jpg 593w, https://2coders.ru/2coders.ru/wp-content/uploads/2011/09/Video-JS-300x123.jpg 300w" sizes="(max-width: 593px) 100vw, 593px" /><a href="http://videojs.com/jquery/" rel='nofollow'>Перейти на сайт</a></p>
<div style='margin-top:30px'></div>
<p><strong>Acorn Media Player</strong><br />
Этот проигрыватель использует HTML5 video  тег и делает акцент на количестве настроек.<br />
<img src="http://2coders.ru/2coders.ru/wp-content/uploads/2011/09/acorn_media_player.jpg" alt="" title="acorn_media_player" width="593" height="288" class="size-full wp-image-2019" srcset="https://2coders.ru/2coders.ru/wp-content/uploads/2011/09/acorn_media_player.jpg 593w, https://2coders.ru/2coders.ru/wp-content/uploads/2011/09/acorn_media_player-300x145.jpg 300w" sizes="(max-width: 593px) 100vw, 593px" /><a href="http://ghinda.net/acornmediaplayer/demos.html" rel='nofollow'>Перейти на сайт</a></p>
<div style='margin-top:30px'></div>
<p><strong>Media Element</strong><br />
Воспроизводит аудио и видео файлы. Есть специальные версии для: WordPress, Drupal и для RoR.<br />
<img src="http://2coders.ru/2coders.ru/wp-content/uploads/2011/09/media_element.jpg" alt="Media Element" title="media_element" width="538" height="303" class="aligncenter size-full wp-image-2036" srcset="https://2coders.ru/2coders.ru/wp-content/uploads/2011/09/media_element.jpg 538w, https://2coders.ru/2coders.ru/wp-content/uploads/2011/09/media_element-300x168.jpg 300w" sizes="(max-width: 538px) 100vw, 538px" /><a href="http://mediaelementjs.com/" rel='nofollow'>Перейти на сайт</a></p>
<div style='margin-top:30px'></div>
<p><strong>Flare Video</strong><br />
По функционалу похож на ранее рассмотренные плееры. Можно использовать разные темы оформления.<br />
<img src="http://2coders.ru/2coders.ru/wp-content/uploads/2011/09/flare_video_player.jpg" alt="Flare Video" title="flare_video_player" width="593" height="296" class="aligncenter size-full wp-image-2058" srcset="https://2coders.ru/2coders.ru/wp-content/uploads/2011/09/flare_video_player.jpg 593w, https://2coders.ru/2coders.ru/wp-content/uploads/2011/09/flare_video_player-300x149.jpg 300w" sizes="(max-width: 593px) 100vw, 593px" /><a href="http://flarevideo.com/" rel='nofollow'>Перейти на сайт</a></p>
<div style='margin-top:30px'></div>
<p><strong>Open Standard Media</strong><br />
Плеер с кучей настроек, но с неудобным интерфейсом.<br />
<img src="http://2coders.ru/2coders.ru/wp-content/uploads/2011/09/open_standard_media.jpg" alt="Open Standard Media" title="open_standard_media" width="593" height="394" class="aligncenter size-full wp-image-2061" srcset="https://2coders.ru/2coders.ru/wp-content/uploads/2011/09/open_standard_media.jpg 593w, https://2coders.ru/2coders.ru/wp-content/uploads/2011/09/open_standard_media-300x199.jpg 300w" sizes="(max-width: 593px) 100vw, 593px" /><a href="http://www.mediafront.org/" rel='nofollow'>Перейти на сайт</a></p>
<div style='margin-top:30px'></div>
<p><strong>jMP3</strong><br />
jMP3 (javaScript MP3 player) поможет воспроизвести mp3 файлы на вашем сайте. Поддерживает только mp3 формат.<br />
<img src="http://2coders.ru/2coders.ru/wp-content/uploads/2011/09/jmp3.jpg" alt="jMp3" title="jmp3" width="313" height="232" class="aligncenter size-full wp-image-2063" srcset="https://2coders.ru/2coders.ru/wp-content/uploads/2011/09/jmp3.jpg 313w, https://2coders.ru/2coders.ru/wp-content/uploads/2011/09/jmp3-300x222.jpg 300w" sizes="(max-width: 313px) 100vw, 313px" /><a href="http://www.sean-o.com/jquery/jmp3/" rel='nofollow'>Перейти на сайт</a></p>
<div style='margin-top:30px'></div>
<p><strong>Malsup jquery media plugin</strong><br />
Поддерживает следующие видео форматы: asx, asf, avi, flv, mov, mpg, mpeg, mp4, qt, ra, smil, swf, wmv, 3g2, 3gp.<br />
И может воспроизводить такие аудио-файлы: aif, aac, au, gsm, mid, midi, mov, mp3, m4a, snd, ra, ram, rm, wav, wma.<br />
<img src="http://2coders.ru/2coders.ru/wp-content/uploads/2011/09/malsup_jquery.jpg" alt="malsup jquery" title="malsup_jquery" width="250" height="249" class="aligncenter size-full wp-image-2066" srcset="https://2coders.ru/2coders.ru/wp-content/uploads/2011/09/malsup_jquery.jpg 250w, https://2coders.ru/2coders.ru/wp-content/uploads/2011/09/malsup_jquery-150x150.jpg 150w" sizes="(max-width: 250px) 100vw, 250px" /><a href="http://malsup.com/jquery/media/#demos" rel='nofollow'>Перейти на сайт</a></p>
<div style='margin-top:30px'></div>
<p><strong>Oiplayer</strong><br />
Основан на <a rel='nofollow' href="http://flowplayer.org/">flowplayer</a>&#8216;е. Работает на Safari, Google Chrome, Firefox, Internet Explorer.<br />
<img src="http://2coders.ru/2coders.ru/wp-content/uploads/2011/09/oiplayer_jquery_plugin.jpg" alt="OIPlayer jQuery plugin" title="oiplayer_jquery_plugin" width="488" height="277" class="aligncenter size-full wp-image-2069" srcset="https://2coders.ru/2coders.ru/wp-content/uploads/2011/09/oiplayer_jquery_plugin.jpg 488w, https://2coders.ru/2coders.ru/wp-content/uploads/2011/09/oiplayer_jquery_plugin-300x170.jpg 300w" sizes="(max-width: 488px) 100vw, 488px" /><a href="http://www.openbeelden.nl/oiplayer/" rel='nofollow'>Перейти на сайт</a></p>
<div style='margin-top:30px'></div>
<p><strong>Simple Player</strong><br />
Проигрывает mp3-файлы. Работает во всех браузерах поддерживающих audio тег HTML5.<br />
<img src="http://2coders.ru/2coders.ru/wp-content/uploads/2011/09/simple_player.jpg" alt="Simple Player" title="simple_player" width="243" height="28" class="aligncenter size-full wp-image-2072" /><a href="http://jay-notes.blogspot.com/2010/06/simple-player-very-simple-html5-audio.html" rel='nofollow'>Перейти на сайт</a></p>
<div style='margin-top:30px'></div>
<p><strong>IWishQuery</strong><br />
Делает все тоже самое, что и Simple Player.<br />
<img src="http://2coders.ru/2coders.ru/wp-content/uploads/2011/09/iwishquery.jpg" alt="IWishQuery" title="iwishquery" width="300" height="33" class="aligncenter size-full wp-image-2074" /><a href="http://code.internuts.se/jquery/iwish/" rel='nofollow'>Перейти на сайт</a></p>
<div style='margin-top:30px'></div>
<p><strong>JQuery Sound Plugin</strong><br />
Не слишком удобный плеер. К тому же, без <a rel="nofollow" href="http://www.apple.com/quicktime/download/">Quicktime</a> плагина не запускается.<br />
<img src="http://2coders.ru/2coders.ru/wp-content/uploads/2011/09/jquery_sound_plugin.png" alt="JQuery Sound Plugin" title="jquery_sound_plugin" width="276" height="94" class="aligncenter size-full wp-image-2076" /><a href="http://esblog.in/sound_plugin_demo/" rel='nofollow'>Перейти на сайт</a></p>
]]></content:encoded>
			<wfw:commentRss>https://2coders.ru/12-jquery-plugins-for-playing-video-audio/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Полезные .htaccess правила</title>
		<link>https://2coders.ru/useful-rules-htaccess/</link>
		<comments>https://2coders.ru/useful-rules-htaccess/#comments</comments>
		<pubDate>Fri, 26 Aug 2011 20:03:55 +0000</pubDate>
		<dc:creator><![CDATA[Max]]></dc:creator>
				<category><![CDATA[Разное]]></category>
		<category><![CDATA[.htaccess]]></category>

		<guid isPermaLink="false">http://2coders.ru/?p=1908</guid>
		<description><![CDATA[Иногда, при создании/редактировании .htaccess&#8217;a возникает необходимость изменить/добавить какое-либо правило. Но, не всегда помнишь точный синтаксис. И для того, чтобы не спрашивать каждый раз гугл, я собрал небольшую подборку чрезвычайно полезных и часто используемых правил и решений. Убрать www из урла Для удобства или для SEO, вы можете захотеть убрать (или использовать) www в адресе вашего [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Иногда, при создании/редактировании .htaccess&#8217;a возникает необходимость изменить/добавить какое-либо правило. Но, не всегда помнишь точный синтаксис. И для того, чтобы не спрашивать каждый раз гугл, я собрал небольшую подборку чрезвычайно полезных и часто используемых правил и решений.</p>
<p><strong>Убрать www из урла </strong><br />
Для удобства или для SEO, вы можете захотеть убрать (или использовать) www в адресе вашего сайта. Приведенный код убирает www из урла сайта и перенаправляет на адрес вида http://mysite.ru.</p>
<pre class="brush: php; title: ; notranslate">
RewriteEngine On
RewriteCond %{HTTP_HOST} !^mysite.ru$ [NC]
RewriteRule ^(.*)$ http://mysite.ru/$1 [L,R=301]
</pre>
<p><strong>Автоматически устанавливать файлам кодировку utf-8  </strong><br />
Один из вариантов избежать проблем с кодировкой &#8212; это создать .htaccess с таким содержанием: </p>
<pre class="brush: php; title: ; notranslate">
&lt;FilesMatch &quot;\.(htm|html|css|js)$&quot;&gt;
AddDefaultCharset UTF-8
&lt;/FilesMatch&gt;
</pre>
<p><span id="more-1908"></span><br />
<strong>Убрать расширение файла</strong><br />
Расширения файлов могут быть полезны для разработчиков, но они абсолютно не нужны обычным посетителям вашего сайта. Приведенный ниже код удаляет .html расширение у всех html-файлов.</p>
<pre class="brush: php; title: ; notranslate">
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html
# Вместь html может быть любое другое расширение: php, htm, asp
</pre>
<p><strong>Запись php ошибок в лог-файл</strong><br />
Интересный способ записи ошибок выполнения скрипта. Просто создайте файл php_error.log у вас на сервере и укажите до него путь в последней строке кода.</p>
<pre class="brush: php; title: ; notranslate">
php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off
# log to file
php_flag log_errors on
php_value error_log /location/to/php_error.log
</pre>
<p><strong>Перенаправление со старого домена на новый</strong><br />
Перенаправляем посетителей со своего старого сайта на новый, используя 301 редирект.</p>
<pre class="brush: php; title: ; notranslate">
RewriteEngine On
RewriteRule ^(.*)$ http://www.newsite.ru/$1 [R=301,L]
</pre>
<p><strong>Изменяем некоторые системные значения</strong><br />
Данный трюк может срабатывать не всегда. </p>
<pre class="brush: php; title: ; notranslate">
#Увеличиваем максимальный размер загружаемого файла
php_value upload_max_filesize 100M
#Увеличиваем максимальный размер файла передаваемого пост-запросом
php_value post_max_size 100M
#Увеличиваем время выполнения скрипта
php_value max_execution_time 700
</pre>
<p><strong>Удалить подраздел/категорию из урла</strong><br />
Для того, чтобы изменить урл вида: http://site.ru/category/seo на http://site.ru/seo, дописываем в .htaccess следующий код.</p>
<pre class="brush: php; title: ; notranslate">
RewriteRule ^category/(.+)$ http://www.yourdomain.com/$1 [R=301,L]
</pre>
<p><strong>Свои страницы с ошибками (404, 403, 500, etc.)</strong><br />
Не нравятся дефолтные страницы с ошибками? Просто создайте для каждой ошибки свой html-файл и пропишите в .htaccess следующий код.</p>
<pre class="brush: php; title: ; notranslate">
ErrorDocument 400 /errors/badrequest.html
ErrorDocument 401 /errors/authrequest.html
ErrorDocument 403 /errors/forbidden.html
ErrorDocument 404 /errors/notfound.html
ErrorDocument 500 /errors/servererror.html
</pre>
<p><strong>Запрет выполнения php-скриптов</strong><br />
Данный код может быть очень быть полезен там, где вы храните файлы или картинки.  Только,  нужно запретить перезаписывать .htaccess.</p>
<pre class="brush: php; title: ; notranslate">
php_flag engine off
</pre>
<p><strong>Защита от хотлинкинга</strong><br />
Хотлинк  — это включение в веб-страницу файлов-изображений или других ресурсов с чужого сервера. Для избежания этого злостного деяния используем следующий код.</p>
<pre class="brush: php; title: ; notranslate">
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?mysite\.ru/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
</pre>
]]></content:encoded>
			<wfw:commentRss>https://2coders.ru/useful-rules-htaccess/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>I&#8217;m back!</title>
		<link>https://2coders.ru/im-back/</link>
		<comments>https://2coders.ru/im-back/#comments</comments>
		<pubDate>Wed, 27 Apr 2011 18:03:28 +0000</pubDate>
		<dc:creator><![CDATA[Max]]></dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://2coders.ru/?p=1898</guid>
		<description><![CDATA[Блог восстановлен после аварии у хостера. Правда восстановить удалось, из очень старого бекапа и на новом хостинге. Но, я вернулся и это уже хорошо.]]></description>
				<content:encoded><![CDATA[<p>Блог восстановлен после аварии у хостера. Правда восстановить удалось, из очень старого бекапа и на новом хостинге. Но, я вернулся и это уже хорошо.</p>
]]></content:encoded>
			<wfw:commentRss>https://2coders.ru/im-back/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Обфускатор javascript-кода</title>
		<link>https://2coders.ru/obfuskator-javascript-koda/</link>
		<comments>https://2coders.ru/obfuskator-javascript-koda/#comments</comments>
		<pubDate>Sat, 04 Sep 2010 17:31:10 +0000</pubDate>
		<dc:creator><![CDATA[Max]]></dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Полезные скрипты]]></category>

		<guid isPermaLink="false">http://2coders.ru/?p=1867</guid>
		<description><![CDATA[Что?! При слове обфускация к тебе на ум приходят неприличные слова? Если да, то тогда тебе сюда. В обратном случае, продолжаем дальше читать статью. Обфусцировать (язык можно сломать), мы будем с целью затруднения изучения/понимания javascript-кода. Для примера, обфускации подвергнется следующий код: 1 alert&#40;'2coders.ru'&#41; В результате обфускации мы получим: 1 2 3 4 5 &#60;script&#62; &#40;function&#40;O,o&#41;&#123;o&#40;O&#40;97,108,101,114,116,40,39, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Что?! При слове обфускация к тебе на ум приходят неприличные слова? Если да, то тогда тебе <a  rel='nofollow' href="http://ru.wikipedia.org/wiki/Обфускация">сюда</a>. В обратном случае, продолжаем дальше читать статью. Обфусцировать (язык можно сломать), мы будем с целью затруднения изучения/понимания javascript-кода.<br />
Для примера, обфускации подвергнется следующий код:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'2coders.ru'</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>В результате обфускации мы получим:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>O<span style="color: #339933;">,</span>o<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>o<span style="color: #009900;">&#40;</span>O<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">97</span><span style="color: #339933;">,</span><span style="color: #CC0000;">108</span><span style="color: #339933;">,</span><span style="color: #CC0000;">101</span><span style="color: #339933;">,</span><span style="color: #CC0000;">114</span><span style="color: #339933;">,</span><span style="color: #CC0000;">116</span><span style="color: #339933;">,</span><span style="color: #CC0000;">40</span><span style="color: #339933;">,</span><span style="color: #CC0000;">39</span><span style="color: #339933;">,</span>
<span style="color: #CC0000;">50</span><span style="color: #339933;">,</span><span style="color: #CC0000;">99</span><span style="color: #339933;">,</span><span style="color: #CC0000;">111</span><span style="color: #339933;">,</span><span style="color: #CC0000;">100</span><span style="color: #339933;">,</span><span style="color: #CC0000;">101</span><span style="color: #339933;">,</span><span style="color: #CC0000;">114</span><span style="color: #339933;">,</span><span style="color: #CC0000;">115</span><span style="color: #339933;">,</span>
<span style="color: #CC0000;">46</span><span style="color: #339933;">,</span><span style="color: #CC0000;">114</span><span style="color: #339933;">,</span><span style="color: #CC0000;">117</span><span style="color: #339933;">,</span><span style="color: #CC0000;">39</span><span style="color: #339933;">,</span><span style="color: #CC0000;">41</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>String.<span style="color: #660066;">fromCharCode</span><span style="color: #339933;">,</span><span style="color: #000066; font-weight: bold;">eval</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

<p><span id="more-1867"></span><br />
Но, это в конце, а пока что у нас все еще предельно понятный alert(&#8216;2coders.ru&#8217;). Первым делом, переведем символы в их ASCII эквивалент:</p>
<p><strong>a</strong> &#8212; 97<br />
<strong>l </strong> &#8212; 108<br />
<strong>e</strong> &#8212; 101<br />
<strong>r </strong> &#8212; 114<br />
<strong>t</strong>  &#8212; 116<br />
Ну и т.д.</p>
<p>После преобразования, <strong>alert(&#8216;2coders.ru&#8217;)</strong> будет выглядить вот так:<br />
97,108,101,114,116,40,39,50,99,111,100,101,114,115,46,114,117,39,41<br />
Уже лучше, но нам нужно как-то перевести ASCII значения обратно, и запустить код. В этом нам помогут: функция <strong>eval()</strong> и метод <strong>fromCharCode()</strong>.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #000066; font-weight: bold;">eval</span><span style="color: #009900;">&#40;</span>String.<span style="color: #660066;">fromCharCode</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">97</span><span style="color: #339933;">,</span><span style="color: #CC0000;">108</span><span style="color: #339933;">,</span><span style="color: #CC0000;">101</span><span style="color: #339933;">,</span><span style="color: #CC0000;">114</span><span style="color: #339933;">,</span><span style="color: #CC0000;">116</span><span style="color: #339933;">,</span><span style="color: #CC0000;">40</span><span style="color: #339933;">,</span><span style="color: #CC0000;">39</span><span style="color: #339933;">,</span><span style="color: #CC0000;">50</span><span style="color: #339933;">,</span><span style="color: #CC0000;">99</span><span style="color: #339933;">,</span><span style="color: #CC0000;">111</span><span style="color: #339933;">,</span>
<span style="color: #CC0000;">100</span><span style="color: #339933;">,</span><span style="color: #CC0000;">101</span><span style="color: #339933;">,</span><span style="color: #CC0000;">114</span><span style="color: #339933;">,</span><span style="color: #CC0000;">115</span><span style="color: #339933;">,</span><span style="color: #CC0000;">46</span><span style="color: #339933;">,</span><span style="color: #CC0000;">114</span><span style="color: #339933;">,</span><span style="color: #CC0000;">117</span><span style="color: #339933;">,</span><span style="color: #CC0000;">39</span><span style="color: #339933;">,</span><span style="color: #CC0000;">41</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

<p>Приведенный код, эквивалентен alert() c сообщением 2coders.ru. Попробуйте протестировать его у себя, если непонятно. Идем дальше и еще усложняем код:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>O<span style="color: #339933;">,</span>o<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>o<span style="color: #009900;">&#40;</span>O<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">97</span><span style="color: #339933;">,</span><span style="color: #CC0000;">108</span><span style="color: #339933;">,</span><span style="color: #CC0000;">101</span><span style="color: #339933;">,</span><span style="color: #CC0000;">114</span><span style="color: #339933;">,</span><span style="color: #CC0000;">116</span><span style="color: #339933;">,</span><span style="color: #CC0000;">40</span><span style="color: #339933;">,</span><span style="color: #CC0000;">39</span><span style="color: #339933;">,</span><span style="color: #CC0000;">50</span><span style="color: #339933;">,</span><span style="color: #CC0000;">99</span><span style="color: #339933;">,</span><span style="color: #CC0000;">111</span><span style="color: #339933;">,</span><span style="color: #CC0000;">100</span><span style="color: #339933;">,</span><span style="color: #CC0000;">101</span><span style="color: #339933;">,</span><span style="color: #CC0000;">114</span><span style="color: #339933;">,</span><span style="color: #CC0000;">115</span><span style="color: #339933;">,</span><span style="color: #CC0000;">46</span><span style="color: #339933;">,</span><span style="color: #CC0000;">114</span><span style="color: #339933;">,</span><span style="color: #CC0000;">117</span><span style="color: #339933;">,</span><span style="color: #CC0000;">39</span><span style="color: #339933;">,</span><span style="color: #CC0000;">41</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>String.<span style="color: #660066;">fromCharCode</span><span style="color: #339933;">,</span><span style="color: #000066; font-weight: bold;">eval</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

<p>Опять у нас все тот же alert(&#8216;2coders.ru&#8217;), но уже в менее понятном виде. Создадим, небольшую форму и функцию, чтобы не пришлось все преобразовывать ручками.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;</span>
<span style="color: #003366; font-weight: bold;">function</span> obf<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> str <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'text'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">value</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> a <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">''</span><span style="color: #339933;">+</span>str<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/./g</span> <span style="color: #339933;">,</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>b<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>a.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>b.<span style="color: #660066;">charCodeAt</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'container'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'&amp;lt;script&gt;(function(O,o){o(O('</span><span style="color: #339933;">+</span>a.<span style="color: #660066;">join</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">','</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #3366CC;">'))})(String.fromCharCode,eval)&amp;lt;/script&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span>
&lt;div id=&quot;container&quot;&gt;
&lt;/div&gt;
&lt;textarea cols=&quot;50&quot; rows=&quot;10&quot; name=&quot;text&quot; id=&quot;text&quot;&gt;&lt;/textarea&gt; &lt;br /&gt;
&lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;Поехали!&quot; onclick=&quot;obf()&quot;/&gt;</pre></td></tr></table></div>

<p>Вводим в форму наш javascript код, и после <del datetime="2010-09-04T15:51:21+00:00">магии</del> обфускации получаем, что-то мало понятное и непохожее на то, что мы вводили ранее. Качаем готовую версию <a href='http://2coders.ru/wp-content/uploads/2010/09/obfuscator.zip'>отсюда</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://2coders.ru/obfuskator-javascript-koda/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>jQuery прелоадер</title>
		<link>https://2coders.ru/jquery-preloader/</link>
		<comments>https://2coders.ru/jquery-preloader/#comments</comments>
		<pubDate>Fri, 03 Sep 2010 06:34:47 +0000</pubDate>
		<dc:creator><![CDATA[Max]]></dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Полезные скрипты]]></category>

		<guid isPermaLink="false">http://2coders.ru/?p=1833</guid>
		<description><![CDATA[Сегодня, мы рассмотрим, как можно сделать прелоадер. Прелоадер будет появляться, при отправке данных из формы. Для работы нам понадобятся: jQuery и собственно, сама картинка прелоадера. Картинку можно взять осюда &#8212; http://preloaders.net/. Мне понравилась вот такая: Ок, картинку выбрали и даже не забыли, что нужно будет подключить jQuery. Теперь, можно приступать к созданию формы и кода, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://2coders.ru/wp-content/uploads/2010/09/preloader.gif" rel="lightbox[pics1833]" title="preloader-pic"><img src="http://2coders.ru/wp-content/uploads/2010/09/preloader.gif" alt="preloader-pic" width="149" height="129" class="attachment wp-att-1862 alignleft" /></a>Сегодня, мы рассмотрим, как можно сделать <strong>прелоадер</strong>. Прелоадер будет появляться, при отправке данных из формы. Для работы нам понадобятся: <strong>jQuery</strong> и собственно, сама <strong>картинка прелоадера</strong>. Картинку можно взять осюда &#8212; <a href="http://preloaders.net/" rel="nofollow">http://preloaders.net/</a>.<br />
<span id="more-1833"></span><br />
<br />
Мне понравилась вот такая:  </p>
<p><img src="http://2coders.ru/wp-content/uploads/2010/09/jquery-preloader1.gif" alt="jquery preloader" width="32" height="32" class="attachment wp-att-1837 " /><br />
Ок, картинку выбрали и даже не забыли, что нужно будет подключить jQuery. Теперь, можно приступать к созданию формы и кода, отвечающего за работу прелоадера. Форма будет простая, с 3 полями: Имя, Почта и Комментарии. Данные из формы будут передаваться в файл <strong>ajax.php</strong>.</p>
<p>Создаем файл <strong>index.php</strong>, с таким содержанием:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;http://code.jquery.com/jquery-latest.js&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span>
$<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#submit'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #006600; font-style: italic;">//Добавляем нашу картинку в &lt;div  id=&quot;container&quot;&gt;</span>
		$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#container'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">append</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;img src=&quot;jquery-preloader.gif&quot; alt=Загрузка...&quot; id=&quot;loading&quot; /&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #003366; font-weight: bold;">var</span> <span style="color: #000066;">name</span> <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#name'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #003366; font-weight: bold;">var</span> email <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#email'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #003366; font-weight: bold;">var</span> comments <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#comments'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                        <span style="color: #006600; font-style: italic;">//Передаем данные в файл ajax.php</span>
			$.<span style="color: #660066;">ajax</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
				url<span style="color: #339933;">:</span> <span style="color: #3366CC;">'ajax.php'</span><span style="color: #339933;">,</span>
				type<span style="color: #339933;">:</span> <span style="color: #3366CC;">'POST'</span><span style="color: #339933;">,</span>
				data<span style="color: #339933;">:</span> <span style="color: #3366CC;">'name='</span> <span style="color: #339933;">+</span> <span style="color: #000066;">name</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&amp;email='</span> <span style="color: #339933;">+</span> email <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&amp;comments='</span> <span style="color: #339933;">+</span> comments<span style="color: #339933;">,</span>
&nbsp;
				success<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>result<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#response'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">remove</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#container'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">append</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;p id=&quot;response&quot;&gt;'</span> <span style="color: #339933;">+</span> result <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&lt;/p&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#loading'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">fadeOut</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">500</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
						$<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">remove</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
			<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>style<span style="color: #339933;">&gt;</span>
label <span style="color: #009900;">&#123;</span>
display<span style="color: #339933;">:</span> block<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #339933;">&lt;/</span>style<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>form action<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;&quot;</span> method<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;post&quot;</span><span style="color: #339933;">&gt;</span>
	<span style="color: #339933;">&lt;</span>div id<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;container&quot;</span><span style="color: #339933;">&gt;</span>
        <span style="color: #339933;">&lt;</span>label <span style="color: #000066; font-weight: bold;">for</span><span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;name&quot;</span><span style="color: #339933;">&gt;</span>Имя<span style="color: #339933;">&lt;/</span>label<span style="color: #339933;">&gt;</span>
		<span style="color: #339933;">&lt;</span>input type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;name&quot;</span> id<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;name&quot;</span> <span style="color: #339933;">/&gt;</span>
&nbsp;
		<span style="color: #339933;">&lt;</span>label <span style="color: #000066; font-weight: bold;">for</span><span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;email&quot;</span><span style="color: #339933;">&gt;</span>Почта<span style="color: #339933;">&lt;/</span>label<span style="color: #339933;">&gt;</span>
		<span style="color: #339933;">&lt;</span>input type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;email&quot;</span> id<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;email&quot;</span> <span style="color: #339933;">/&gt;</span>
&nbsp;
		<span style="color: #339933;">&lt;</span>label <span style="color: #000066; font-weight: bold;">for</span><span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;comments&quot;</span><span style="color: #339933;">&gt;</span>Комментарии<span style="color: #339933;">&lt;/</span>label<span style="color: #339933;">&gt;</span>
		<span style="color: #339933;">&lt;</span>textarea rows<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;5&quot;</span> cols<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;30&quot;</span> <span style="color: #000066;">name</span><span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;comments&quot;</span> id<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;comments&quot;</span><span style="color: #339933;">&gt;&lt;/</span>textarea<span style="color: #339933;">&gt;</span>
		<span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
		<span style="color: #339933;">&lt;</span>input type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;submit&quot;</span> <span style="color: #000066;">name</span><span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;submit&quot;</span> id<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;submit&quot;</span> value<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;Отправить&quot;</span> <span style="color: #339933;">/&gt;</span>
&nbsp;
	<span style="color: #339933;">&lt;/</span>div<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;/</span>form<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

<p>Давайте разберем более подробно некоторые моменты, относительно работы скрипта. После нажатия кнопки, мы добавляем нашу картинку в див с id=&#187;container&#187;. После этого передаем данные в файл ajax.php.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">$.<span style="color: #660066;">ajax</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
				url<span style="color: #339933;">:</span> <span style="color: #3366CC;">'ajax.php'</span><span style="color: #339933;">,</span>
				type<span style="color: #339933;">:</span> <span style="color: #3366CC;">'POST'</span><span style="color: #339933;">,</span>
				data<span style="color: #339933;">:</span> <span style="color: #3366CC;">'name='</span> <span style="color: #339933;">+</span> <span style="color: #000066;">name</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&amp;email='</span> <span style="color: #339933;">+</span> email <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&amp;comments='</span> <span style="color: #339933;">+</span> comments<span style="color: #339933;">,</span>
&nbsp;
				success<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>result<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#response'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">remove</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#container'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">append</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;p id=&quot;response&quot;&gt;'</span> <span style="color: #339933;">+</span> result <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&lt;/p&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#loading'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">fadeOut</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">500</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
						$<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">remove</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Ответ, из скрипта <strong>ajax.php</strong>, возвращается в параграф p c id=&#187;response&#187;. После того, как получили данные, применяем к нашей картинке прелоадеру эффект fadeOut и удаляем её.</p>
<p>Создадим файл принимающий данные из формы. Содержимое файла <strong>ajax.php</strong> будет следующим:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">//Добавляем/извлекаем данные из БД</span>
<span style="color: #666666; font-style: italic;">//Выводим сообщение о том, что комментарий добавлен</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Комментарий добавлен&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Думаю, с последним скриптом у вас не должно возникнуть осложнений. Скачать готовую версию можно <a href='http://2coders.ru/wp-content/uploads/2010/09/preaploader.zip'>здесь</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://2coders.ru/jquery-preloader/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
