Динамическое дерево в ExtJS modern

В данной статье пойдет речь о том, как создать динамическое дерево (TreeList) в ExtJS Modern. Возможно данная реализация есть в «коробке», но я ее не нашел.

Стандарный компонент treelist отлично работает, если в хранилище находится например 100 записей, но если их будет тысяча или более? У меня получилось так, что мобильный телефон стал заметно тормозить. И после долгих поисков решения в интернете, решил доработать компонент.

Первое что я сделал — это создал наследник от treelist

Ext.define('MobileService.view.routeList.items.MobileTreeList', {
    extend: 'Ext.list.Tree',
    xtype: 'mobiletreelist',
 
    privates: {
// expand - стоит строить дочернии элементы или нет. По умолчанию null createItem: function (node, parent, expand) { var isRootItem = node.get('isRootItem'); // требуется для определения корневого элемента (те записи которые видит пользователь на первом уровне) if (!isRootItem && !expand) return null; return this.callParent(arguments); }, // переопределен. Основной метод для добавления дочерних элементов onNodeExpand: function (node) { var item = this.getItem(node); var childNodes = node.childNodes; for (i = 0, len = childNodes.length; i < len; ++i) { child = childNodes[i]; if (!this.itemMap[child.internalId]) { var _item = item.getOwner().createItem(child, item, true); if (_item) { this.itemMap[child.internalId] = _item; item.insertItem(_item, null); } } } this.callParent(arguments); } } });

Второе, создаем наследник от Ext.list.TreeItem

/*
 * для вывода дерево документов и строк я создал собственный класс для TreeItem
 */
Ext.define('MobileService.view.routeList.items.RouteListItem', {
    extend: 'Ext.list.TreeItem',
    xtype: 'routelistitem',
 
    privates: {
        updateNode: function (node) {
            if (node) {
                var me = this,
                    map = me.itemMap,
                    childNodes, owner, len, i, item, child;
                me.element.dom.setAttribute('data-recordId', node.internalId);
                if (!map) {
                    childNodes = node.childNodes;
                    owner = me.getOwner();
                    me.itemMap = map = {};
                    for (i = 0, len = childNodes.length; i < len; ++i) {
                        child = childNodes[i];
                        item = owner.createItem(child, me);
                        if (item) { // добавили проверку на возможность создания ветки
                            map[child.internalId] = item;
                            me.insertItem(item, null);
                        }
                    }
                }
                me.setExpanded(node.isExpanded());
                me.doNodeUpdate(node);
            }
        }
    }
});

Третье, создаем данные для хранилища

var root = {
    expanded: true,
    children: [
        {
            text: 'item1',
            isRootItem: true,
            children: [
                ....
            ]
        },
        {
            text: 'item1',
            isRootItem: true,
            children: [
                ....
            ]
        }
    ]
};
var store = Ext.create('Ext.data.TreeStore', {
            root: root
});

Наконец и сам компонент

                xtype: 'mobiletreelist',
                height: '100%',
                defaults: {
                    xtype: 'routelistitem'
                }

Вроде все, должно работать. Все дочернии элементы будут отрисовывать динамически

Ext JS 6.0.0.640

Выводим Дочерние Страницы На Родительской

Для того, чтобы отобразить список дочерних страниц под родительской, вам понадобится добавить следующий код в файл functions.php темы:

function devise_list_child_pages() {

global $post;

if ( is_page() && $post->post_parent )

$childpages = wp_list_pages( ‘sort_column=menu_order&title_li=&child_of=’ . $post->post_parent . ‘&echo=0’ );
else
$childpages = wp_list_pages( ‘sort_column=menu_order&title_li=&child_of=’ . $post->ID . ‘&echo=0’ );

if ( $childpages ) {

$string = ‘

    ‘ . $childpages . ‘

‘;
}

return $string;

}

add_shortcode(‘devise_childpages’, ‘devise_list_child_pages’);

Оригинал статьи.

Настройка и установка git на собственном сервере

Устанавливаем следующие компоненты:

apt-get install git

apt-get install fcgiwrap spawn-fcgi — нужно для nginx

apt-get install gitweb — web сайт для git. Настройки можно изменить в /etc/gitweb.conf (обычно здесь меняет параметр $projectroot)

Настраиваем nginx для GitWeb

server
{
  access_log /var/log/nginx/gitweb.access.log;

  error_log /var/log/nginx/gitweb.error.log info;

  server_name gitweb.developernote.com;

  location /index.cgi {
    root /usr/share/gitweb/;
    include fastcgi_params;
    gzip off;
    fastcgi_param SCRIPT_NAME $uri;
    fastcgi_param GITWEB_CONFIG /etc/gitweb.conf;
    fastcgi_pass  unix:/var/run/fcgiwrap.socket;
  }
  location / {
    root /usr/share/gitweb/;
    index index.cgi;
  }
}

Далее создаем директорию для хранения репозиториев

cd /var/www
mkdir git
cd /var/www/git
git init --bare project.git
cd project.git
touch readme
git add .
git commit -m "first"
chown -R www-data:www-data . 
chmod -R 777 .
service fcgiwrap restart # возможно это не нужно выполнять

После этого можно спокойно открыть сайт по адресу gitweb.developernote.com

Теперь настраиваем сам git. В Nginx добавляем еще один сайт

server
{
  access_log /var/log/nginx/git.access.log;

  error_log /var/log/nginx/git.error.log info;

  server_name git.developernote.com;

  gzip off;

  location / {
        root /home/git/repositories;

        fastcgi_pass unix:/var/run/fcgiwrap.socket;
        fastcgi_param SCRIPT_FILENAME   /usr/lib/git-core/git-http-backend;
        fastcgi_param PATH_INFO         $uri;
        fastcgi_param GIT_PROJECT_ROOT  /home/git/repositories;
        fastcgi_param GIT_HTTP_EXPORT_ALL "";
        fastcgi_param REMOTE_USER $remote_user;
        include fastcgi_params;
  }
}

И если все правильно настроить, то гит должен заработать

Чтобы использовать авторизацию нужно установить

apt-get install apache2-utils

sudo htpasswd /var/www/git/htpasswd hitesh , где
/var/www/git/htpasswd путь где содержится файл, каталог которого должен быть заблокирован
hitesh — имя пользователя для доступа

И в Настройках nginx сайтов прописываем

server
{
 ...
  auth_basic "GitWeb requires authorization";
  auth_basic_user_file /home/git/.gitpasswd;
  
  ...
}

Оригинал статьи: https://developernote.com/2015/01/installing-git-on-ubuntu-12-04-and-enabling-http-access-with-nginx/

Как создать базу данных и пользователя MySQL

Если на вашем сервере не установлена какая-нибудь удобная панель администрирования и вам нужно добавить пользователя и базу данных mysql для создания сайта, сделать это можно через консоль.

Для начала подключитесь к серверу mysql.

# mysql -u root -p

При этом, будет запрошен пароль администратора.

Создаём базу данных:

mysql> CREATE DATABASE `db`;

name замените на имя базы данных.

Следующим шагом будет создание пользователя базы данных. В консоли напечатайте команду:

mysql> CREATE USER 'name'@'localhost' IDENTIFIED BY 'password';

Здесь нужно заменить name на имя пользователя, а password — на пароль для этого пользователя.

Последний шаг — это выдача всех превилегий на базу данных для созданного пользователя. Выполните следующую команду, заменив db на имя базы, a nameна имя пользователя.

mysql> GRANT ALL PRIVILEGES ON `db`.* TO 'name'@'localhost';

Обновите превилегии командой:

mysql> FLUSH PRIVILEGES;

Сжатие JS-файлов

Для создание одного js-файлай из нескольких можно использовать утилиту от Google — Closure Compiler

  1. устанавливаем Java Runtime Environment version 7, если у Вас её нет
  2. Скачиваем файл compiler.jar
  3. Распаковываем в папку например e:\compressionjs
  4. Для примера создаем в этой папке js — файл (например simple.js)
1
2
3
4
5
// A simple function.
function hello(longName) {
  alert('Hello, ' + longName);
}
hello('New User');

5. Выполняем команду java -jar compiler.jar —js sample.js —js_output_file hello-compiled.js

Примечание: Если нужно по всей папке собрать, то можно выполнить java -jar compiler.jar —js=»*.js» —js_output_file hello-compiled.js

Подробнее о командах можно узнать java -jar compiler.jar —help

Закрыть окно merge_msg

It’s not a Git error message, it’s the editor as git uses your default editor.

To solve this:

  1. press «i»
  2. write your merge message
  3. press «esc»
  4. write «:wq»
  5. then press enter

Короткий справочник по git командам

Оригинал статьи

Решил собрать небольшой справочник по git командам, чтобы можно было просто и легко освежить у себя в памяти то что когда-то использовалось.

 

*Основы*


Настройка Git клиента для идентификации пользователя:

git config –global user.name “Your Name”

git config –global user.email “your@email.address”

git config –global core.editor “your editor”

 

Инициализация репозитория в текущем каталоге:

git init

 

Создает репозиторий в указанном каталоге:

git init <directory>

 

Клонирование репозитория на локальную машину:

git clone <repo>

 

Добавить файл для идексации и следить за всеми изменениями в нем ( можно задавать по маске ):

git add <file>

 

Добавить каталог для индексации:

git add <directory>

 

Удалить файл из индексации ( можно задавать по маске ):

git rm <file>

 

Перенести или переименовать файл / каталог:

git mv <source> <destination>

 

Сделать “снапшот” всех выполненных изменений:

git commit -a -m “message”

 

Статус репозитория ( добавление, удаление, изменение файлов ):

git status

 

Показать историю коммитов:

git log

 

Показать только определенное количество коммитов:

git log -n <limit>

 

Показать историю коммитов по конкретному файлу:

git log <file>

 

Посмотреть различия между последним коммитом и текущими изменениями:

git diff

 

Просмотр всех различий между коммитами:

git diff <commit> <commit>

 

Посмотреть различия между коммитом и текущими изменениями:

git diff <commit> <file>

 

Посмотреть различия между коммитами для файла:

git diff <commit> <commit> <file>

 

Показать список всех файлов в основной ветке:

git ls-tree master -r –name-only

 

*Работа с ветками*


Список веток:

git branch

 

Создание ветки:

git branch <new_branch_name>

 

Безопастное удаление ветки, если не были сделаны изменения:

git branch -d <branch_name>

 

Удаление ветки, даже если были сделаны изменения:

git branch -D <branch_name>

 

Переименование текущей ветки:

git branch -m <rename_current_branch>

Отмена изменений в локальном файле

git checkout FETCH_HEAD — — <file>

 

Переход к существующей ветке:

git checkout <branch_name>

 

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

git checkout -b <new_branch_name>

 

Слияние текущей ветки с указанной:

git merge <branch>

 

*Откат изменений*


Перейти на последний коммит ветки “master”:

git checkout master

 

Откатить изменения во всех файлах до указанного коммита:

git checkout <commit>

 

Откатить изменения для конкретного файла до указанного коммита:

git checkout <commit> <file>

 

Сделать откат всех изменений выполненных в коммите, при этом создается новый коммит указывающий на откат изменений:

git revert <commit>

 

Отмена изменений до последнего коммита, а также сбрасывает индексацию для конкретного файла:

git reset HEAD <file>

 

Отмена изменений до последнего коммита и сбрасывает индексацию:

git reset –soft

 

Отмена изменений до последнего коммита, сбрасывает индексацию, а так же отменить любые изменения в рабочей директории:

git reset –hard

 

programming Удаляет файлы которые не были добавлены в репозиторий:

git clean -f

 

Удаляет файлы которые не были добавлены в репозиторий по указанному пути:

git clean -f <path>

 

Удаляет файлы и каталоги которые не были добавлены в репозиторий:

git clean -df

 

Только показывает, что будет удаленно:

git clean -n

*Работа с удаленными репозиториями*


Список соединений с удаленными репозиториями:

git remote

 

Добавить соединение:

git remote add <name> <url>

 

Удалить соединение:

git remote rm <name>

 

Переименовать соединение:

git remote rename <old_name> <new_name>

 

Получить изменения из репозитория со списком всех веток ( при этом стираются любые локальные изменения ):

git fetch <remote>

 

Получить изменения из репозитория для конкретной ветки ( при этом стираются любые локальные изменения ):

git fetch <remote> <branch>

 

Получить копию текущей ветки с удаленного репозитория и слить ее с локальной копией:

git pull <remote>

 

Залить указанную ветку на удаленный репозиторий:

git push <remote> <branch>

 

И напоследок несколько ссылок где можно найти более подробное руководство по git:

 

Git How To

Pro Git

Git Reference

Atlassian Git Tutorials