пятница, 8 июля 2016 г.

Настройка интеграции TinyMCE и "RESPONSIVE filemanager" в Yii2 Advanced Template.

Редактор TinyMCE очень хорош, но по умолчанию в бесплатной версии нет поддержки для загрузки файлов и картинок на сервер.

Для загрузки файлов и картинок подключаем отличное расширение "RESPONSIVE filemanager".

Для подключения самого редактора TinyMCE я использую расширение "2amigos/yii2-tinymce-widget".

1. Скачиваем расширение http://www.responsivefilemanager.com/, распаковываем целиком в папку, допустим "/backend/web/plugins/responsivefilemanager".

Папка "/backend/web" в моём проекте доступна по адресу "/admin/".

2. Открываем файл "/responsivefilemanager/filemanager/config/config.php".

3. Настраиваем пути.

    // Путь к загруженным файлам относительно корневого URL.
    'upload_dir' => '/uploads/',

    // Путь к папке для загрузки файлов относительно папки "/responsivefilemanager".
    'current_path' => '../../../../../frontend/web/uploads/',

    // Путь к папке для загрузки миниатюр относительно папки "/responsivefilemanager".
    'thumbs_base_path' => '../../../../../frontend/web/uploads_thumbs/',

4. Настраиваем максимальный размер загружаемых файлов. Я ставлю 50 мегабайт. Для большинства файлов этого хватает.

    'MaxSizeUpload' => 50,

5. Настраиваем язык интерфейса.

    'default_language' => "ru",

6. Создаём папки для загрузки:
    /frontend/web/uploads/
    /frontend/web/uploads_thumbs/

7. Прописываем необходимые настройки TinyMCE. Я делаю это в файле "/backend/config/bootstrap.php", чтобы настройки применялись глобально во всех формах.

// Конфигурация по умолчанию для виджета TinyMCE.
Yii::$container->set('dosamigos\tinymce\TinyMce', [
    'language' => 'ru',
    'options' => ['rows' => 20],
    'clientOptions' => [
        'plugins' => [
            "advlist autolink lists link charmap hr preview pagebreak",
            "searchreplace wordcount textcolor visualblocks visualchars code fullscreen nonbreaking",
            "save insertdatetime media table contextmenu template paste image responsivefilemanager filemanager",
        ],
        'toolbar' => "undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | responsivefilemanager link image media",
        'external_filemanager_path' => '/admin/plugins/responsivefilemanager/filemanager/',
        'filemanager_title' => 'Responsive Filemanager',
        'external_plugins' => [
            // Кнопка загрузки файла в диалоге вставки изображения.
            'filemanager' => '/admin/plugins/responsivefilemanager/filemanager/plugin.min.js',
            // Кнопка загрузки файла в тулбаре.
            'responsivefilemanager' => '/admin/plugins/responsivefilemanager/tinymce/plugins/responsivefilemanager/plugin.min.js',
        ],
    ]
]);

воскресенье, 29 мая 2016 г.

Настройка LESS в Yii2 на OpenServer.

Устанавливаем LESS-компилятор, чтобы Yii мог автоматически собирать ассеты с расширением ".less".

К сожалению, по умолчанию OpenServer этого не умеет. Поэтому устанавливаем вручную.

1. Скачать и установить Node.js: https://nodejs.org

2. В командной строке Windows выполнить:
npm install -g less
npm install -g less-plugin-autoprefix

3. Выбрать в настройках OpenServer "Сервер > Настройка использования переменной PATH" : "Свой Path + Win Path", перезагрузить компьютер.

Также см. Настройка LESS в Netbeans

четверг, 5 мая 2016 г.

Убираем отступы колонок Bootstrap

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

https://getbootstrap.com/examples/grid/

Но эта сетка идёт в комплекте с отступами, и часто приходится их обнулять. При большом количестве вложенных блоков, за этим тяжело уследить.

Есть выход - назначим всем "строкам", внутри которых отступы не нужны, специальный стиль с помощью класса "slim".

Таким образом, нам не потребуется добавлять правила обнуления для каждого блока, достаточно только указать

class="row slim"

Готовый код для вставки в CSS:

/* 
    Специальный класс для очистки от 
    вездесущих отрицательных границ и отступов бутстрапа. 

    Без него, контейнер и колонки добавляют отступы,
    а строки их нейтрализуют отрицательными границами.

    С этим приходится бороться, 
    обнуляя эти отступы и границы специальными правилами CSS.

    Чтобы не засорять файлы стилей постоянными обнулениями,
    мы зададим этот класс для всех строк, 
    которые не предполагают работы с границами и отступами.
*/
.row.slim {
    margin-left: 0;
    margin-right: 0;
}

.row.slim > [class^="col-"], .slim > [class*=" col-"] {
    padding-left: 0 !important;
    padding-right: 0 !important;
}

вторник, 26 апреля 2016 г.

Заполнение изначальной сортировки в MySQL.

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

Вы добавили код, который работает с сортировкой.

Но нужно ещё отсортировать ранее введённые данные. Когда их мало, это можно сделать вручную.

А если их много, то поможет такая процедура на MySQL:

CREATE DEFINER=`root`@`%` PROCEDURE `reindex_table`(IN `sorted_table` VARCHAR(50), IN `sorting_column` VARCHAR(50), IN `grouping_column` VARCHAR(50), IN `group_table` VARCHAR(50), IN `group_id_column` VARCHAR(50))
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT 'Заполняет поле сортировки.'
BEGIN

# Пример использования:
# CALL reindex_table('my_cool_table', 'sort', 'group_id', 'group_table', 'id');

DECLARE done INT DEFAULT 0;

# В нашей таблице используется бинарный UUID, 
# поэтому такой же тип назначаем переменной.
# В обычных таблицах, здесь был бы INT.
DECLARE group_id BINARY(16);

# Курсоры и обработчики объявляются последними.
DECLARE cur_1 CURSOR FOR SELECT id FROM group_table_tmp;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

# Создаём временную таблицу для прочёсывания курсором.
# Это единственный способ заставить курсор двигаться по таблице, 
# заданной водными параметрами.
# Есть ещё вариант с созданием VIEW, 
# с преимуществом по производительности и со своими недостатками.
# Так как скорость нас в данном случае не волнует, делаем через временную таблицу.
DROP TEMPORARY TABLE IF EXISTS group_table_tmp;
SET @sql_text = CONCAT('CREATE TEMPORARY TABLE group_table_tmp ENGINE=MEMORY AS SELECT ', group_id_column, ' AS id FROM ', group_table);
PREPARE stmt FROM @sql_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

# Проходим цикл по внешнему ключу, который разбивает нашу таблицу на группы сортировки.
OPEN cur_1;
REPEAT
FETCH cur_1 INTO group_id;
# Бинарный UUID нуждается в преобразовании.
# Если у вас обычный целочисленный ID, вставляйте его, как есть.
SET @group_id_converted = CONCAT('0x', HEX(group_id));

# Пронумеровываем строки.
SET @curRow = 0;
SET @sql_text = CONCAT('UPDATE ', sorted_table, ' sorted_tbl,',
' (SELECT @curRow := @curRow + 1 AS row_number, ', sorted_table, '.* FROM ', sorted_table, ' WHERE ', grouping_column, '=',  @group_id_converted, ' AND deleted=0 ORDER BY date_create) indexed_rows',
' SET sorted_tbl.', sorting_column, ' = indexed_rows.row_number',
' WHERE sorted_tbl.id = indexed_rows.id;');
PREPARE stmt FROM @sql_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

UNTIL done = 1 
END REPEAT;
CLOSE cur_1;

# Удаляем временную таблицу.
DROP TEMPORARY TABLE IF EXISTS group_table_tmp;

END

вторник, 29 декабря 2015 г.

Быстрое удаление из больших таблиц MySQL

Если требуется удалить большие объёмы данных из таблиц MySQL, это занимает слишком много времени.

Ускорить процесс может такая процедура.

# Пример использования процедуры:
# CALL cut_table('my_cool_table');


DROP PROCEDURE IF EXISTS cut_table;

DELIMITER //
CREATE PROCEDURE cut_table(IN tableName CHAR(255))
BEGIN

SET @tableName = tableName;
SET @tableNameOld = CONCAT(@tableName, '_old');
SET @tableNameCopy = CONCAT(@tableName, '_copy');

# Количество строк, которые мы оставляем в начале и конце таблицы.
SET @skipCount = 10000;

# Считаем общее количество строк в таблице.
SET @sql_text = CONCAT('SELECT count(*) INTO @totalRows FROM ', @tableName);

PREPARE stmt FROM @sql_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SELECT @totalRows;

SET @minRows = @skipCount*2;

# Если строк мало, то не обрезаем таблицу.
# Эта проверка спасает нас, если мы вызовем скрипт дважды для одной таблицы.
IF (@totalRows <= @minRows) THEN 
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Table has too few rows. No need to suck it.';
END IF;

# Создаём структурную копию таблицы.
# Внешние ключи не копируются, их требуется задать отдельно.
SET @sql_text = CONCAT('CREATE TABLE ', @tableNameCopy, ' LIKE ', @tableName);

PREPARE stmt FROM @sql_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

# Копируем те данные, которые нам нужны.
SET @sql_text = CONCAT('INSERT INTO ', @tableNameCopy, ' SELECT * FROM ', @tableName, ' ORDER BY id ASC LIMIT ?');

PREPARE stmt FROM @sql_text;
EXECUTE stmt USING @skipCount;
DEALLOCATE PREPARE stmt;


SET @sql_text = CONCAT('INSERT INTO ', @tableNameCopy, ' SELECT * FROM ', @tableName, ' ORDER BY id DESC LIMIT ?');

PREPARE stmt FROM @sql_text;
EXECUTE stmt USING @skipCount;
DEALLOCATE PREPARE stmt;

# Переименовываем таблицы, замещая старую таблицу новой.
SET @sql_text = CONCAT('RENAME TABLE ', @tableName, ' TO ', @tableNameOld, ', ', @tableNameCopy, ' TO ', @tableName);

PREPARE stmt FROM @sql_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

# Удаляем старую таблицу.
SET @sql_text = CONCAT('DROP TABLE ', @tableNameOld);

PREPARE stmt FROM @sql_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;


END //
DELIMITER ;


пятница, 31 октября 2014 г.

Копирование БД Postgres

#!/bin/sh
# Этот скрипт копирует БД mycooldb на локальный хост разработчика.
#------------------------------------ 
 
# определяем IP машины, с которой подключился пользователь "cooluser"
vmhost=`netstat -tapen | grep "sshd: cooluser" | head -n1 | awk '{split($5, a, ":"); print a[1]}'`
savebase="/home/cooluser"
dumpname="temp_postgres.dump"
savepath=$savebase"/"$dumpname
#------------------------------------ 
 
# Сохраняем полный дамп базы "mycooldb".
sudo -u postgres pg_dump -Fc -C -c mycooldb > $savepath
# Восстанавливаем базу на локальном хосте разработчика.
# Если база уже существует, удаляем её целиком. Иначе могут быть проблемы с восстановлением.
if psql  -U postgres -h $vmhost -lqt | cut -d \| -f 1 | grep -w 'mycooldb'; then
    dropdb -U postgres -h $vmhost mycooldb
fi
# Создаём пустую базу.
createdb -U postgres -h $vmhost mycooldb
# Заполняем её.
pg_restore -U postgres -h $vmhost --single-transaction --disable-triggers -Fc -d mycooldb $dumpname
# Удаляем временный файл.
rm $savepath

среда, 18 июня 2014 г.

Подчёркивания в приватных методах и свойствах - плохо

Не следует использовать подчёркивания в начале имени для приватных методов и свойств.


$this->_myPrivateMethod($this->_myPrivateVar);

Когда требуется изменить видимость, например, сделать какой-то метод публичным, то приходится изменять его имя во всём коде. Целая куча переименований - следовательно, есть высокая вероятность появления проблем.

Не используя подчёркивания, мы делаем код более защищённым. Да и просто красиво.