воскресенье, 20 ноября 2016 г.

Вложенные Backbone представления в WordPress

Backbone — это JavaScript библиотека, которая используется в административной панели WordPress для работы с медиа, ревизиями и т.д. WordPress дополняет эту библиотеку вложенными представлениями (Subviews). Рассмотрим, как их можно использовать. Предположим, у нас есть продукты, имеющие свойства. При щелчке на названии продукта мы добавляем новое свойство в коллекцию свойств продукта.
Необходимо подключить: jquery.js, underscore.min.js, backbone.min.js, wp-util.js, wp-backbone.js

<div id="container"></div> <!-- шаблон для продукта --> <script id="tmpl-product" type="text/html"> <p style="cursor: pointer">{{data.name}}</p> <ul class="properties"></ul> </script> <!-- шаблон для свойства продукта --> <script id="tmpl-property" type="text/html">{{{data.name}}}</script> <script> // создаем главное представление var main_view = wp.Backbone.View.extend({ prepare: function() { return this.model.toJSON(); } }); // модель для свойства продукта var property_model = Backbone.Model.extend({}); // коллекция моделей свойств продукта var property_collection = Backbone.Collection.extend({ model: property_model }); // представление для свойства продукта var property_view = main_view.extend({ tagName: 'li', template: wp.template( 'property' ), }); // модель для продукта var product_model = Backbone.Model.extend({ // коллекция свойств продукта properties: {}, initialize: function() { this.properties = new property_collection(); }, }); // представление для продукта var product_view = main_view.extend({ className: "product", template: wp.template( 'product' ), events: { // добавляем новое свойство в коллекцию свойств продукта 'click p': 'add_property' }, initialize: function() { // при добавлении нового свойства к продукту, добавляем вложенное представление this.listenTo( this.model.properties, 'add', function( property ) { this.views.add( '.properties', new property_view({ model: property }) ); } ); // рендер this.render(); jQuery( '#container' ).html( this.el ); this.views.ready(); }, add_property: function() { this.model.properties.add( {name: 'property ' + Math.random() } ); }, }); // создаем представление и передаем ему модель одиного продукта без свойств new product_view( { model: new product_model( { 'name': 'product 1', } ) } ); </script>

воскресенье, 6 ноября 2016 г.

Новый класс WP_List_Util в WordPress 4.7

В WordPress есть удобные функции для работы с массивом объектов или массивов. Создадим массив, работа с которым будет рассмотрена далее:

$array = array (
    array ( 'order' => 5, 'title' => 'five' ),
    array ( 'order' => 3, 'title' => 'three' ),
    array ( 'order' => 1, 'title' => 'two' ),
    array ( 'order' => 1, 'title' => 'one' ),
    array ( 'order' => 4, 'title' => 'four' ),
);


wp_list_filter позволяет фильтровать массив на основе набора пар ключ => значение
Аргументы:
  1. фильтруемый массив
  2. массив условий в форме пар ключ => значение
  3. оператор: AND (по умолчанию), OR, NOT
// ключ 'title' равен 'four'
$result = wp_list_filter( $array, array( 'title' => 'four' ) );

array (
    array ( 'order' => 4, 'title' => 'four' ),
);

// ключ 'order' не равен 1
 $result = wp_list_filter( $array, array( 'order' => 1 ), 'NOT' );

array (
    array ( 'order' => 5, 'title' => 'five' ),
    array ( 'order' => 3, 'title' => 'three' ),
    array ( 'order' => 4, 'title' => 'four' ),
);


wp_list_pluck позволяет:
  • взять определенное свойство из каждого объекта, находящегося в массиве
  • взять определенный элемент из каждого массива, находящегося а массиве

$result = wp_list_pluck( $array, 'title' );

array ( 'five', 'three', 'two', 'one', 'four' );


wp_filter_object_list позволяет применить wp_list_filter, затем wp_list_pluck


в WordPress 4.7 было добавлена новая функция wp_list_sort, которая позволяет сортировать массив:
  • массивов, по ключу из этих массивов
  • объектов, по свойству из этих объектов

// сортировка по ключу 'order'
$result = wp_list_sort( $array, 'order', 'ASC');

array (
    array ( 'order' => 1, 'title' => 'two' ),
    array ( 'order' => 1, 'title' => 'one' ),
    array ( 'order' => 3, 'title' => 'three' ),
    array ( 'order' => 4, 'title' => 'four' ),
    array ( 'order' => 5, 'title' => 'five' ),
);

// сортировка по ключу 'order', затем по ключу 'title'.
$result = wp_list_sort( $array, array( 'order' => 'ASC', 'title' => 'ASC' ) );

array (
    array ( 'order' => 1, 'title' => 'one' ),
    array ( 'order' => 1, 'title' => 'two' ),
    array ( 'order' => 3, 'title' => 'three' ),
    array ( 'order' => 4, 'title' => 'four' ),
    array ( 'order' => 5, 'title' => 'five' ),
);


В WordPress 4.7 также появился новый класс WP_List_Util, позволяющий применять рассмотренные функции в определенной последовательности. Например, функция wp_filter_object_list может делать следующее (при передаче соответствующих аргументов):

// исключить элементы с ключом 'order' равным 1, затем выбрать значения по ключу 'title'
$util = new WP_List_Util( $array );
$util->filter( array( 'order' => 1 ), 'NOT' );
$util->pluck( 'title' );
$result = $util->get_output();

array ( 'five', 'three', 'four' );



четверг, 3 ноября 2016 г.

Навигация по PHP проекту с помощью Vim и Ctags

Ctags — это программа, генерирующая индексный файл, который содержит информацию об именах, переменных и функциях в исходном коде приложения. Этот файл позволяет текстовым редакторам, таким как Vim, осуществлять навигацию по проекту.

Установка Ctags

Мне нужно было установить Ctags на сервере OpenShift, поэтому я установил его используя исходный код. Вероятно, Ctags уже присутствует в вашей системе, или вы можете более просто установить его из пакета.

Последовательность действий для OpenShift:

#создать директорию и перейти в нее
mkdir -p ~/app-root/data/ctags && cd ~/app-root/data/ctags
#скачать Ctags
curl -sSOL http://prdownloads.sourceforge.net/ctags/ctags-5.8.tar.gz
# распаковать архив
tar zxf ctags-5.8.tar.gz
#перейти в директорию
cd ctags-5.8
#указать текущую директорию для установки
./configure --prefix=$(pwd)
#установить
make && make install
создать псевдоним
alias ctags=$(pwd)/bin/ctags
echo "alias ctags=$(pwd)/bin/ctags" >> ~/app-root/data/.bash_profile


Индексирование

1. Выполните команду ctags --help чтобы увидеть предлагаемые настройки индексирования
2. Перейдите в директорию с проектом.
3. Выполните команду
ctags \
--recurse \
--exclude=".git" \
--tag-relative=yes \
--languages=PHP \
--PHP-kinds=+cif-dv \
--regex-PHP="/abstract class ([^ ]+)/\1/c/" \
--regex-PHP="/interface ([^ ]+)/\1/c/" \
--regex-PHP="/(public |static |abstract |protected |private )+ function +([^ \(]*)/\2/f/"
4. Выполните команду :set tags+=project_folder в Vim, где project_folder - директория проекта

Навигация в Vim

Переход к тегу

  • переместите курсор на тег, или выделить текст с помощью визуального режима и нажмите <ctrl + ]>
  • выполните команду :tag <tagname> — переход к тегу, например :tag register_post_type. Здесь также работает автодополнение. Вы можете набрать :tag register_post_ и нажимать <tab> чтобы видеть список предлагаемых вариантов

Список тегов

  • переместите курсор на тег, или выделить текст с помощью визуального режима и нажмите <g]>. В появившемся окне наберите номер варианта для перехода
  • выполните команду :tselect /<шаблон>, например :tselect /register_post_ — вывести список с возможностью выбора варианта для перехода
  • :tjump /<шаблон>, например :tjump /register_post_ — перейти к тегу если он используется один раз. Если более одного раза — вывести список с возможностью выбора варианта для перехода
чтобы вернуться обратно после перехода, нажмите <ctrl+t>

суббота, 29 октября 2016 г.

Отладка кода в Vim с помощью плагина Vdebug

Для текстового редактора Vim есть замечательный плагин Vdebug, позволяющий работать с xDebug. Хорошая подробная документация доступна прямо в репозитории. Кроме того, можно изучать документацию не выходя из Vim. Если вы установили Vim читая статью Установка плагина для Vim с помощью pathogen.vim, вы можете сгенерировать документацию командой :helptags ~/app-root/data/vim/bundle/vdebug/doc/. Команда :help Vdebug отображает документацию.

Запуск отладчика осуществляется клавишей <F5>, после чего, отладчик будет ждать входящие подключения. Разберем отладку на примере WordPress.

1. Откройте файл ~/app-root/data/current/wp-settings.php
2. Установите точку остановки, нажав клавишу <F10>, например, здесь:
if ( is_multisite() )
      ms_cookie_constants();

// Define constants after multisite is loaded.
wp_cookie_constants();

3. Запустите отладчик клавишей <F5>. Вы увидите сообщение Waiting for a connection (Ctrl-C to cancel, this message will self-destruct in  20  seconds...)
4. Откройте ваш блог в браузере

Vdebug остановится на первой строке в файле index.php. Нажмите <F5> еще раз. Как мы видим, vdebug перешел к нашей точке остановки.

Отладчик Vdebug в работе

Окно DebuggerWatch показывает переменные на момент остановки. Они отображаются в виде дерева, чтобы иметь возможность показать объекты и массивы. Чтобы свернуть/развернуть ветвь , нажмите <enter> (<cr>).
Чтобы посмотреть глобальные переменные, установите курсор на слово Superglobals и нажмите <enter> (<cr>).

Окно DebuggerStack показывает стек (файлы, функции, методы) через которые прошла программа чтобы оказаться в текущей ([0]) позиции. Вы можете перемещаться по стеку с помощью клавиши <enter> (<cr>) - участок кода откроется в окне слева.

Окно DebuggerBreakpoints скрыто по умолчанию. Выполните команду :BreakpointWindow чтобы его отобразить.

Основные команды

  • <F5>: Run (запуск/переход к следующей точке остановки или концу программы)
  • <F2>: Step over (выполнение команды, не входя в функции и подключаемые файлы)
  • <F3>: Step in (выполнение команды, входя в функции и подключаемые файлы)
  • <F4>: Step out (выход назад из функции или подключаемого файла)
  • <F6>: Stop/close (остановить отладку и программу, двойное нажатие также скрывает интерфейс отладчика)
  • <F7>: Detach (отключить отладчик и продолжить выполнение программы)
  • <F9>: Run to cursor (выполнить весь код до курсора)
  • <F10>: Toggle breakpoint (установить/снять точку остановки)
  • <F11>: Show context variables (показать контекстные переменные после выполнения выражения)
  • <F12>: Evaluate variable under cursor (получить значение переменной под курсором)


Точки остановки

Есть несколько типов точек остановки:
  • Line (остановка на строке в файле). Устанавливается клавишей <F10>, или командой :Breakpoint
  • Conditional (остановка на строке в файле если условие истинно). Устанавливается командой :Breakpoint conditional <condition>, например, :Breakpoint conditional $a==5
  • Exception (остановка при выбросе исключения). Устанавливается командой :Breakpoint exception <exception-name>, например :Breakpoint exception PDOException
  • Call (остановка при вызове функции). Отладчик остановится на первой строке в функции. Устанавливается командой :Breakpoint call <function-name>, например, :Breakpoint call open_file
  • Return (остановка при возврате значения из функции). Отладчик остановится на слове return. Устанавливается командой :Breakpoint return <function-name>, например, :Breakpoint return open_file


Выполнение выражения

Вы можете выполнить выражение в текущем контексте выполнения программы и отобразить его значение в окне DebuggerWatch:
  • выполнив команду :VdebugEval $variable + 5, вы получите ответ. Здесь мы прибавляем 5 к уже определенной в коде переменной
  • чтобы продолжить отображать значение выражения и обновлять его в ходе выполнения программы в окне DebuggerWatch, выполните команду :VdebugEval! $variable + 5. Здесь мы прибавляем 5 к уже определенной в коде переменной. Чтобы выйти из этого режима, выполните команду :VdebugEval!
  • установив курсор на переменную, и нажав <F12>, вы получите ее значение

Клавиша <F11> позволяет отобразить контекстные переменные вместо результата выполнения выражения.




пятница, 28 октября 2016 г.

Установка плагина для Vim с помощью pathogen.vim

pathogen.vim облегчает установку плагинов для VIM в их собственные директории, автоматически прописывая пути в переменную runtimepath.

Передо мной стояла задача установить плагин NERDTree на сервере OpenShift. Далее я расскажу, как я ее решил.
NERDTree представляет файлы и директории в виде дерева, позволяя легко перемещаться между ними. Также он позволяет производить простые манипуляции над файлами и директориями.

1. Зайдите по ssh на сервер
2. Далее необходимо создать директорию bundle, где будут располагаться наши плагины, а также скопировать сам плагин в директорию autoload. Для этого выполните команды:
mkdir -p ~/app-root/data/vim/autoload ~/app-root/data/vim/bundle && curl -LSso ~/app-root/data/vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
3. Отредактируйте конфигурационный файл .vimrc, выполнив команду vim ~/app-root/data/.vimrc и добавив следующие строки:
set runtimepath+=~/app-root/data/vim
execute pathogen#infect()
syntax on
filetype plugin indent on
4. Установите плагин NERDTree, выполнив команду git clone https://github.com/scrooloose/nerdtree.git ~/app-root/data/vim/bundle/nerdtree
5. Готово. Запустите Vim, выполните команду :NERDTree чтобы увидеть дерево каталогов слева. Если вы хотите, чтобы NERDTree запускался каждый раз, вместе с запуском Vim, добавьте строку autocmd VimEnter * NERDTree | wincmd p в файл ~/app-root/data/.vimrc

среда, 26 октября 2016 г.

Удаленная отладка с Xdebug в Sublime Text

Перед выполнением данного урока, ознакомьтесь с системой контроля версий git.

Xdebug позволяет отлаживать код на удаленном севере без установки самого Xdebug на локальной машине. Используемый при этом протокол носит название DBGp и поддерживается во многих текстовых редакторах и Integrated Development Environments (IDE, Интегрированная среда разработки), в том числе в Sublime Text. Мы рассмотрим отладку кода, исполняемого на сервере OpenShift - Platform as a Service (PaaS, "платформа как услуга") от Red Hat.

Создание PHP приложения в OpenShift

1. Создайте аккаунт на Openshift перейдя по ссылке
2. Установите инструменты командной строки RHC.
3. Запустите командную строку, перейдите в директорию, где будет располагаться проект
4. Выполните команду rhc app create myphpapp php-5.4 
5. Введите пароль, полученный при регистрации
6. Вы получите данные созданного приложения: URL, параметры для ssh доступа и другие данные

Создание проекта

1. Перейдите в директорию с проектом (myphpappОткройте файл index.php и замените данные в файле index.php на:
<?php
$a = 1;
echo 'Hello World';

2. Создайте файл .htaccess следующего содержания:
php_flag xdebug.remote_enable on
php_value xdebug.remote_host '0.0.0.0'
php_value xdebug.remote_log 'xdebug.log'

здесь мы включили удаленную отладку, указали IP адрес локальной машины (замените '0.0.0.0' на ваш IP адрес) и имя файла для вывода лога.

3. Чтобы не сохранять настройки проекта в git репозитории, создайте файл .gitignore следующего содержания
*.sublime-project
*.sublime-workspace

4. Выполните коммит в git, чтобы зафиксировать изменения. Для этого выполните команду git add --all
5. Выполните команду git commit -m "initial commit" (замените "initial commit" на имя коммита)
6. Выполните команду git push чтобы отправить коммит на сервер.
7. Откройте URL (мы получили его при создании PHP приложения OpenShift из командной строки) в браузере, чтобы увидеть текст "Hello World"

Development Mode (Режим разработчика)

Режим разработчика позволяет отлаживать php код и включает расширение XDebug, а также:
- отображает детальные сообщения об ошибках
- отображает ошибки при запуске
- включает apc.stat  (проверка при каждом запросе, что скрипт был изменен)
- игнорирует файл composer.lock

1. Включите режим разработчика, выполнив команду rhc env set APPLICATION_ENV=development

2. Перезапустите приложение, выполнив команду rhc app restart


Настройка проекта в Sublime Text

1. Установите Package Control
2. Перейдите в меню Preferences->Package Control, выберите пункт: Package Control: install Package, в появившейся строке для поиска введите xdebug client. Установите этот пакет.
4. Откройте директорию с проектом myphpapp в Sublime Text (File->Open Folder)
5. Сохраните проект (Project->Save Project as) в директории с  проектом.
6. Отредактируйте настройки проекта, перейдя в меню Project->Edit Project

{
"folders":
[
{
"path": "."
}
],
    "settings": {
        "xdebug": {
        "path_mapping": {
"/var/lib/openshift/uuid/app-root/repo" : "***",
},
            "url": // url приложения, полученный при создании PHP приложения в OpenShift 
            "debug": true
        }
    }

}

В разделе path_mapping нужно указать соответствие директории с проектом на сервере директории с проектом на локальной машине. Значение uuid можно получить выполнив в командной строке команду rhc apps. Также можно зайти на сервер по ssh и узнать пут к директории.

Процесс отладки

Детальное рассмотрение XDebug выходит за рамки этой статьи. Рассмотрим лишь Breakpoints (точки остановки). Они позволяют остановить выполнение кода и посмотреть значения переменных на момент остановки. 

1. Чтобы установить точку остановки кликните на строку echo 'Hello World';  в файле index.php правой кнопкой мыши и выберите Xdebug->add/remove breakpoint. Установите точку остановки на строке 
<?php
$a = 1;
echo 'Hello World';

2, Перейдите в меню Tools->Xdebug->Start Debugging (Launch Browser). В браузере откроется страница http://myphpapp-***.rhcloud.com/?XDEBUG_SESSION_START=sublime.xdebug и
вы увидите значения переменных на момент остановки.

Просмотр значений переменных

3. Перейдите в меню Tools->Xdebug->Stop Debugging (Launch Browser) чтобы завершить отладку. В браузере откроется страница http://myphpapp-***.rhcloud.com/?XDEBUG_SESSION_STOP=sublime.xdebug




понедельник, 24 октября 2016 г.

Интерактивное индексирование в git

Предположим, вы сделали несколько изменений в различных частях файла. Git позволяет добавить только некоторые из них, затем сделать коммит.

Чтобы запустить интерактивное индексирование, наберите в консоли git add --patch имя_файла1 имя_файла_2. Вы увидите следующее сообщение:
Stage this hunk (добавить в индекс эту часть) [y,n,q,a,d,/,e,?]?

Наберите ?, чтобы получить описание команд:

y - stage this hunk (добавить часть в индекс)
n - do not stage this hunk (не добавлять часть в индекс)
q - quit; do not stage this hunk or any of the remaining ones (выйти; не добавлять эту, и последующие части в индекс)
a - stage this hunk and all later hunks in the file (добавить эту, и последующие части в индекс)
d - do not stage this hunk or any of the later hunks in the file (не не добавлять эту, и последующие части в текущем файле в индекс)
g - select a hunk to go to (выбрать часть для перехода к ней)
/ - search for a hunk matching the given regex (поиск части по регулярному выражению)
j - leave this hunk undecided, see next undecided hunk (отложить часть, смотреть следующую отложенную часть)
J - leave this hunk undecided, see next hunk (отложить часть, смотреть следующую часть)
k - leave this hunk undecided, see previous undecided hunk (отложить часть, смотреть предыдущую отложенную часть)
K - leave this hunk undecided, see previous hunk (отложить часть, смотреть предыдущую часть)
s - split the current hunk into smaller hunks (разделить текущую часть на меньшие части. Работает в случае, если между измененными строками есть не измененные строки)
e - manually edit the current hunk (отредактировать часть в редакторе)
? - print help (показать справку)

При редактировании части в редакторе (клавиша e), чтобы не удалять строку со знаком -, замените минус на пробел. Чтобы не добавлять строку со знаком +, удалите ее.