tag:blogger.com,1999:blog-32704976444725590862024-03-08T08:57:00.176-08:00Решения и ответыNexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.comBlogger33125tag:blogger.com,1999:blog-3270497644472559086.post-42944720944197004162017-01-19T21:50:00.000-08:002017-01-19T21:50:12.850-08:00Использование расширений в обход композера<div dir="ltr" style="text-align: left;" trbidi="on">
Иногда необходимо подключить расширение Yii2 в обход Composer.<br />
<br />
Например, в каком-то расширении обнаружился досадный баг. Сообщили разработчикам, ждём исправления... Но что делать с нашим приложением, пока баг не исправлен?<br />
<br />
Можно исправить код прямо в папке "vendor". Но этого делать не стоит - в первую очередь потому, что править придётся на каждой машине, где установлено приложение, включая продакшн. И при любом обновлении файлы затрутся.<br />
<br />
Выход - подключить расширение в обход стандартного механизма Composer. Это делается легко.<br />
<br />
<b>1.</b> Удаляем расширение из зависимостей Composer.<br />
<span style="font-family: Courier New, Courier, monospace;">composer remove coolvendor/coolextension</span><br />
<b><br /></b>
<b>2.</b> Качаем нужную версию расширения из репозитория в виде архива, распаковываем в какую-нибудь папку проекта. Например, "common/external/coolvendor/coolextension-1.0.0".<br />
<br />
<b>3.</b> Указываем алиас в соответствии с именем расширения.<br />
<span style="font-family: Courier New, Courier, monospace;">return [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ...</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'aliases' => [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> '@coolvendor/coolextension' => '@common/external/coolvendor/coolextension-1.0.0',</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ...</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ]</span><br />
<span style="font-family: Courier New, Courier, monospace;">];</span><br />
<br />
Готово!<br />
<br />
Можем пользоваться расширением, с тем же удобством, как если оно было подключено через Composer.<br />
<br />
Когда необходимость в отдельном подключении отпадёт - например, разработчики исправили мешающий баг - можно легко и быстро вернуть расширение на своё место. Удаляем папку расширения, удаляем алиас, подключаем расширение через Composer.</div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com2tag:blogger.com,1999:blog-3270497644472559086.post-49369070327498976512017-01-18T21:55:00.000-08:002017-01-18T21:55:05.384-08:00Подключение AdminLTE в приложении Advanced<div dir="ltr" style="text-align: left;" trbidi="on">
AdminLTE - симпатичная и простая тема для админки сайта.<br />
<br />
Разберём, как подключить её в Advanced-приложение Yii2 вместо стандартной темы.<br />
<br />
<b>1.</b> Подключаем расширение с темой AdminLTE.<br />
composer require dmstr/yii2-adminlte-asset<br />
<br />
<b>2.</b> Удаляем файл стандартной вёрстки - он нам уже не нужен.<br />
"backend/web/css/site.css"<br />
<br />
<b>3.</b> Открываем папку "vendor\dmstr\yii2-adminlte-asset\example-views\yiisoft\yii2-app".<br />
Берём оттуда шаблоны, копируем в свой проект в папку "backend\views", заменяем содержимое по своему вкусу, настраиваем внешний вид, вёрстку.<br />
Пример уже обработанных файлов, можно посмотреть в моём проекте "nex-otaku/yii2-app-ganimede".<br />
<br />
<b>4.</b> При необходимости, настроить некоторые параметры темы можно в яваскрипте.<br />
https://almsaeedstudio.com/themes/AdminLTE/documentation/index.html#adminlte-options<br />
<div>
<br /></div>
</div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com1tag:blogger.com,1999:blog-3270497644472559086.post-74439096245539696262017-01-18T05:03:00.000-08:002017-01-18T05:03:13.348-08:00Отладка htaccess в OpenServer<div dir="ltr" style="text-align: left;" trbidi="on">
Правильная настройка htaccess - та ещё морока.<br />
<br />
Иногда, всё настроил вроде бы правильно, но где-то что-то не работает, по неизвестным причинам.<br />
<br />
Выяснить, в чём же дело, нам поможет отладка.<br />
<br />
Открываем в меню Опенсервера:<br />
Отладка -> Конфигурация -> Apache-2.4<br />
<br />
В блокнотах откроются два шаблона конфигурации. Нас интересует большой конфигурационный файл от сервера: Apache-2.4_server.conf<br />
<br />
Ищем строку "LogLevel warn" в разделе "Конфигурация сообщений об ошибках".<br />
<br />
Меняем на следующий текст:<br />
<span style="font-family: Courier New, Courier, monospace;">LogLevel warn rewrite:trace8</span><br />
<br />
Теперь модуль mod_rewrite расскажет нам всё о своей работе в логе Апача.<br />
<br />
В меню Опенсервера выбираем<br />
Просмотр логов -> Apache отладка<br />
<br />
По завершению отладки, не забываем поменять настройку обратно. Иначе файл лога расплодится до неприличных размеров.</div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com0tag:blogger.com,1999:blog-3270497644472559086.post-25207210151309095552017-01-03T10:32:00.000-08:002017-01-03T10:32:00.126-08:00Очистка кеша "aptitude"<div dir="ltr" style="text-align: left;" trbidi="on">
Чистим кеш "aptitude" - стандартного менеджера пакетов в Ubuntu.<br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">sudo apt-get clean</span><br />
<span style="font-family: Courier New, Courier, monospace;">sudo apt-get autoclean</span><br />
<span style="font-family: Courier New, Courier, monospace;">sudo apt-get autoremove</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
Зачем это может понадобиться? Чтобы освободить побольше места.<br />
<br />
После установки Ubuntu и накатывания последних обновлений, кеш aptitude сильно разрастается. Файлы кеша могут занимать сотни мегабайт. Для тарифов с малым объёмом диска это может быть критично.<br />
<br />
Чистим кеш после всех обновлений, и у нас снова полно свободного места )</div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com0tag:blogger.com,1999:blog-3270497644472559086.post-86665204026836651072016-12-26T05:41:00.000-08:002016-12-26T05:41:26.975-08:00Ошибка "Не удалось проверить переданные данные" при отправке формы в Yii2<div dir="ltr" style="text-align: left;" trbidi="on">
На Yii2 сделана защита от CSRF-атак. Когда она срабатывает, то при отправке формы вы получаете ошибку "Не удалось проверить переданные данные".<br />
<br />
Я столкнулся с тем, что эта ошибка появлялась случайным образом. В итоге выяснилось, что проблема в настройках куки.<br />
<br />
Два моих приложения, "backend" и "frontend", имели разный код для шифровки кук: "cookieValidationKey". Он настраивается в файле "config/main-local.php" для каждого из приложений.<br />
<br />
Из-за этого, открыв сначала страницу на одном приложении, а потом на другом, сбрасывался CSRF-код - ведь шифровали куки с одним ключом, а расшифровывать пытаемся с другим.<br />
<br />
<b>Решение:</b> прописать в конфигах одинаковые значения для "cookieValidationKey". Теперь всё работает )</div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com2tag:blogger.com,1999:blog-3270497644472559086.post-75092903524059111192016-12-22T02:12:00.000-08:002016-12-22T02:12:23.402-08:00Решение конфликтов при слиянии для файлов Composer.<div dir="ltr" style="text-align: left;" trbidi="on">
Как решить конфликты файлов "composer.lock" и "composer.json" при слиянии веток?<br />
<br />
Обычно ситуация такая. Вы в своей ветке добавляете новые пакеты Composer, ваш напарник тоже добавляет новые пакеты Composer в своей ветке.<br />
Оба файла "composer.json" и "composer.lock" при этом находятся в репозитории.<br />
<br />
Попытавшись вытянуть изменения напарника, сделать слияние веток, вы скорее всего получите конфликт по обоим файлам. А если он ещё делал "composer update" по всем пакетам, то это практически гарантированно.<br />
<br />
Не беспокойтесь, решается это достаточно просто.<br />
<br />
<b>1.</b> Посмотрите composer.json - какие изменения были от вас, а какие от напарника.<br />
Особенно запомните, какие изменения вносили вы.<br />
<br />
<b>2.</b> Сбросьте оба файла на "внешнюю" версию ("theirs"). Таким образом, содержимое у них будет как в той ветке, из которой вы тянете изменения в свою.<br />
Конфликты отмечаем как решённые, завершаем слияние.<br />
Прогоняем "composer install". Вытянутся пакеты напарника.<br />
<br />
<b>3.</b> Добавьте ваши изменения ещё раз. Это занимает немного времени, написать один или несколько раз "composer require" для нужных вам пакетов.<br />
<br />
Теперь можно выкатывать обновлённые файлы "composer.json" и "composer.lock", они будут корректно работать.</div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com0tag:blogger.com,1999:blog-3270497644472559086.post-59504813831762537312016-12-03T22:56:00.001-08:002016-12-03T23:14:36.856-08:00Создание проекта Yii2 по шаблону Ганимед<div dir="ltr" style="text-align: left;" trbidi="on">
Ганимед - это мой шаблон для быстрой разработки сайтов. В него включены все минимально необходимые модули и настройки.<br />
<br />
Шаблон разработан на базе "yiisoft/yii2-app-advanced".<br />
<br />
<a href="https://github.com/Nex-Otaku/yii2-app-ganimede">https://github.com/Nex-Otaku/yii2-app-ganimede</a><br />
<br />
<b>Установка</b><br />
<br />
<b>1.</b> Используем репозиторий https://github.com/Nex-Otaku/yii2-app-ganimede<br />
<br />
Запускаем консоль OpenServer.<br />
cd domains<br />
composer create-project --prefer-dist --stability=dev nex-otaku/yii2-app-ganimede myhost.local<br />
<br />
<b>2.</b> После установки<br />
<span style="font-family: "courier new" , "courier" , monospace;">cd myhost.local</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">init</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">0</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">y</span><br />
<br />
<b>3.</b> Создаём БД в менеджере БД.<br />
<br />
<b>4.</b> Настраиваем подключение.<br />
<br />
Указываем IP, указанный в настройках OpenServer,<br />
либо "localhost", если не настроен доступ к серверу по локальной сети.<br />
common/config/main-local.php<br />
<span style="font-family: "courier new" , "courier" , monospace;">'dsn' => 'mysql:host=my.super.host.ip;dbname=mysuperdbname',</span><br />
<b><br /></b>
<b>5.</b> Запускаем миграцию, которая поднимает необходимые таблицы.<br />
Запускаем консоль OpenServer.<br />
<span style="font-family: "courier new" , "courier" , monospace;">cd domains</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">cd myhost.local</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">yii migrate</span><br />
<div>
<br /></div>
</div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com0tag:blogger.com,1999:blog-3270497644472559086.post-91417134293760152262016-12-03T00:53:00.001-08:002017-03-04T03:50:30.036-08:00Автоматический вход SSH с помощью ключей<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="background-color: white;">Задача: полностью автоматизировать вход пользователя на сервер посредством <a href="http://www.putty.org/" target="_blank">putty</a>, по протоколу SSH.</span><br />
<span style="background-color: white;"><br /></span>
<span style="background-color: white;">Для этого нам понядобятся ключи авторизации SSH.</span><br />
<span style="background-color: white;"><br /></span>
<br />
<span style="background-color: white;"><b>1.</b> Создаём</span><span style="background-color: white;"> ключ на сервере.</span><br />
<em style="background-color: white;">ssh-keygen -t rsa</em><br />
<span style="background-color: white;"><b><br /></b></span>
<span style="background-color: white;"><b>2.</b> С</span><span style="background-color: white;">охраняем ключ в предлагаемый файл (</span><em style="background-color: white;">/home/myuser/.ssh/id_rsa</em><span style="background-color: white;">)</span><br />
<span style="background-color: white;"><br /></span>
<span style="background-color: white;"><b>3.</b> П</span><span style="background-color: white;">ри необходимости указываем пароль на использование приватного ключа.</span><br />
<span style="background-color: white;">В этом случае его необходимо будет вводить при каждой новой сесии.</span><br />
<span style="background-color: white;"><br /></span>
<span style="background-color: white;"><b>4.</b> К</span><span style="background-color: white;">опируем публичный ключ </span><em style="background-color: white;">id_rsa.pub</em><span style="background-color: white;"> в </span><em style="background-color: white;">authorized_keys</em><br />
<em style="background-color: white;">cd .ssh</em><br />
<em style="background-color: white;">cp id_rsa.pub authorized_keys</em><br />
<em style="background-color: white;"><br /></em>
<b>6.</b> П<span style="background-color: white;">роверяем права на файл. </span><div>
<span style="background-color: white;">Должны быть 600, иначе может не сработать. Если права отличаются, устанавливаем значение 600.</span><div>
<em style="background-color: white;">chmod 600 authorized_keys</em><div>
<br /></div>
<div>
<b>7.</b> К<span style="background-color: white;">опируем приватный ключ id_rsa</span><span style="background-color: white;"> в файл на локальном комьютере (например my_session.ppk)</span></div>
<div>
<em style="background-color: white;">more id_rsa</em></div>
<div>
<br /></div>
<div>
<b>8.</b> П<span style="background-color: white;">рогоняем скопированный приватный ключ через </span><a class="externalLink" href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html" style="background-attachment: initial; background-clip: initial; background-image: url("about:blank"); background-origin: initial; background-position: right center; background-repeat: no-repeat; background-size: initial; padding-right: 13px;">puttygen.exe</a><span style="background-color: white;"> делая приватный ключ пригодным к использованию. (Там есть кнопочка "Load", напротив надписи </span><em style="background-color: white;">"Load an existing private key file"</em><span style="background-color: white;">, юзаем сначала ее, а затем нажимаем "Save private key".)</span></div>
<div>
<br /></div>
<div>
<b>9. </b>О<span style="background-color: white;">ткрываем </span><em style="background-color: white;">Putty</em><span style="background-color: white;">, загружаем нашу сессию, идем в </span><em style="background-color: white;">SSH->Auth</em><span style="background-color: white;">, указываем путь к готовому приватному ключу.</span></div>
<div>
<br /></div>
<div>
<b>10.</b> И<span style="background-color: white;">дем в </span><em style="background-color: white;">Connection->Data</em><span style="background-color: white;"> и в секции </span><em style="background-color: white;">Auto-login</em><span style="background-color: white;"> в поле username указываем логин сессии</span></div>
<div>
<br /></div>
<div>
<b>11. </b>П<span style="background-color: white;">ри необходимости в пункте меню </span><em style="background-color: white;">SSH</em><span style="background-color: white;"> в поле </span><em style="background-color: white;">Remote Command</em><span style="background-color: white;"> можно указать команду, которая автоматически будет выполняться при входе пользователя.</span></div>
<div>
<br /></div>
<div>
<b>12.</b> С<span style="background-color: white;">охраняем сессию.</span></div>
<div>
<b><br /></b></div>
<div>
<b>13.</b> Д<span style="background-color: white;">елаем отдельный ярлык Putty, в котором указываем имя сессии, чтобы при запуске ярлыка нужная сессия запускалась автоматически.</span></div>
<div>
<i>"<span style="background-color: white;">C:\Program Files (x86)\PuTTY\putty.exe" -load "mycoolproject"</span></i></div>
<div>
<br /><div>
Всё готово. Теперь по клику на ярлык откроется консоль на вашем сервере. Удобно и безопасно.<br />
<br />
Инструкцию нашёл здесь: <a href="http://xpoint.ru/forums/computers/os/unix/thread/40057.xhtml">http://xpoint.ru/forums/computers/os/unix/thread/40057.xhtml</a></div>
</div>
</div>
</div>
</div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com0tag:blogger.com,1999:blog-3270497644472559086.post-19396725606054446242016-12-03T00:17:00.000-08:002017-03-04T07:54:51.342-08:00Развёртывание проекта с BitBucket на удалённый сервер.<div dir="ltr" style="text-align: left;" trbidi="on">
1. Выбираем публичный ключ SSH, он хранится в файле "/.ssh/id_rsa.pub" в домашней папке.<br />
Если его нет, создаём по <a href="http://nex-otaku-ru.blogspot.ru/2016/12/ssh.html" target="_blank">инструкции</a>.<br />
Копируем содержимое ключа в буфер обмена.<br />
<br />
Внимание: если вы копируете ключ с экрана Putty, то в буфере обмена ключ может быть разбит на несколько строк. Нам это не нужно. Уберите переводы строк. Весь ключ должен быть в одной длинной-длинной строке.<br />
<br />
2. В настройках репозитория Битбакета добавляем в разделе "Access keys".<br />
Теперь пользователь может читать из репозитория без ввода пароля, доступ осуществляется по ключу.<br />
<br />
3. Клонируем репозиторий.<br />
<span style="font-family: "courier new" , "courier" , monospace;">git clone CoolUser@bitbucket.org:CoolUser/cool-repo.git</span></div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com0tag:blogger.com,1999:blog-3270497644472559086.post-74578997232564623512016-11-17T00:59:00.002-08:002016-11-17T01:03:06.307-08:00Развёртывание существующего проекта Yii2 для разработки.<div dir="ltr" style="text-align: left;" trbidi="on">
Вам нужно развернуть проект на Yii2 для разработки.<br />
<br />
У вас установлен и настроен OpenServer на локальной машине.<br />
<br />
<b>1. Клонируем репозиторий в папку доменов OpenServer. </b><br />
<br />
Называем папку проекта, например, "my-cool-project.local".<br />
<br />
<b>2. После успешного клонирования, устанавливаем файлы окружения.</b><br />
<br />
Запускаем консоль OpenServer.<br />
<span style="font-family: "courier new" , "courier" , monospace;">cd domains</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">cd my-cool-project.local</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">init</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">0</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">yes</span><br />
<br />
<b>3. Устанавливаем зависимости.</b><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">composer install</span><br />
<br />
<b>4. Создаём БД в менеджере БД.</b><br />
<br />
<b>5. Настраиваем подключение.</b><br />
<br />
Указываем имя БД, пользователя и пароль в конфиге.<br />
<span style="font-family: "courier new" , "courier" , monospace;">common/config/main-local.php</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">'dsn' => 'mysql:host=localhost;dbname=my_cool_project_dbname',</span><br />
<br />
<b>6. Запускаем миграции, которые создают необходимые таблицы.</b><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">yii migrate</span><br />
<div>
<br />
<br />
См. также:<br />
<a href="http://nex-otaku-ru.blogspot.ru/2016/10/ide-yii2.html">Настройка IDE и окружения для разработки на Yii2</a></div>
</div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com0tag:blogger.com,1999:blog-3270497644472559086.post-605037589585993662016-10-04T06:37:00.001-07:002017-01-18T05:52:32.635-08:00Настройка IDE и окружения для разработки на Yii2<div dir="ltr" style="text-align: left;" trbidi="on">
Вы решили делать сайты на Yii2, и используете:<br />
<br />
<u>Windows 10</u>, <u>IDE Netbeans</u>, локальный сервер <u>OpenServer</u>.<br />
<br />
У вас уже всё установлено? Хорошо!<br />
<br />
Несколько дополнительных настроек сделает вашу работу легче и приятнее.<br />
<br />
<b>1.</b> Включаем в OpenServer расширение PHP, необходимое для работы Yii2.<br />
В файле php.ini раскомментируем строку<br />
extension=php_intl.dll<br />
<br />
Без этого расширения, вместо русских дат будут отображаться английские.<br />
<br />
<b>2.</b> Настраиваем LESS.<br />
OpenServer. <a href="http://nex-otaku-ru.blogspot.ru/2016/05/less-yii2-openserver.html">http://nex-otaku-ru.blogspot.ru/2016/05/less-yii2-openserver.html</a><br />
Netbeans. <a href="http://nex-otaku-ru.blogspot.ru/2016/08/less-netbeans.html">http://nex-otaku-ru.blogspot.ru/2016/08/less-netbeans.html</a><br />
<br />
<b>3.</b> Настраиваем форматирование PSR в Netbeans.<br />
<a href="https://github.com/bobsta63/netbeans-psr-formatting">https://github.com/bobsta63/netbeans-psr-formatting</a><br />
<br />
<b>4.</b> Включаем строгое отображение ошибок на машине разработки.<br />
В php.ini (трей OpenServer -> Дополнительно -> Конфигурация -> PHP x.x)<br />
error_reporting = E_ALL<br />
<br />
<b>5.</b> Настраиваем xDebug.<br />
Включаем xDebug, настраиваем Netbeans. <a href="http://nex-otaku-ru.blogspot.ru/2016/09/xdebug-openserver-netbeans.html">http://nex-otaku-ru.blogspot.ru/2016/09/xdebug-openserver-netbeans.html</a><br />
Отключаем xDebug для Composer. <a href="http://nex-otaku-ru.blogspot.ru/2016/09/xdebug-composer-openserver.html">http://nex-otaku-ru.blogspot.ru/2016/09/xdebug-composer-openserver.html</a><br />
<br />
<b>6.</b> Настраиваем вывод UTF8 в консоли, для консольных команд Yii.<br />
Запускаем консоль, правой кнопкой нажимаем на заголовок окна, выбираем Settings -> Startup -> Environment.<br />
Дописываем строку<br />
<span style="font-family: "courier new" , "courier" , monospace;">chcp 65001</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: inherit;">Также можно настроить автоматический вход в папку "domains".</span><br />
<span style="font-family: inherit;">Прописываем в настройках</span><br />
<span style="font-family: inherit;">Startup -> Tasks -> Shells::cmd</span><br />
<span style="font-family: inherit;">В окошке "Commands", находим строку </span><br />
<span style="font-family: courier new, courier, monospace;">cmd.exe /k "%ConEmuBaseDir%\CmdInit.cmd"</span><br />
<span style="font-family: inherit;">дописываем в конец строки, указав полный путь к папке Опенсервера</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">-new_console:d:Z:\OpenServer\domains</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
Теперь сохраняем: "Save Settings".<br />
<br />
Готово!</div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com3tag:blogger.com,1999:blog-3270497644472559086.post-86625350255438785912016-09-28T06:06:00.000-07:002016-09-28T06:06:33.736-07:00Подключение yii2-user и yii2-admin для управления пользователями и правами доступа<div dir="ltr" style="text-align: left;" trbidi="on">
Как настроить управление пользователями и правами доступа в Yii2 с нуля.<br />
<br />
Будем использовать приложение Yii2 Advanced, подключим модули <a href="https://github.com/dektrium/yii2-user" target="_blank">"yii2-user"</a> и <a href="https://github.com/mdmsoft/yii2-admin" target="_blank">"yii2-admin"</a>.<br />
<br />
Если у вас уже есть готовое приложение, шаги с 1 по 5 можно пропустить.<br />
<br />
<b>1.</b> Создаём проект по шаблону <a href="https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide/README.md" target="_blank">Advanced</a>.<br />
<br />
Здесь предполагается, что вы уже настроили Composer. Если нет, см. <a href="https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide/start-installation.md" target="_blank">документацию</a> к шаблону.<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">composer create-project --prefer-dist yiisoft/yii2-app-advanced yii2-user-combo.local</span><br />
<br />
<span style="font-family: Courier New, Courier, monospace;">cd yii2-user-combo.local</span><br />
<span style="font-family: Courier New, Courier, monospace;">init </span><br />
<span style="font-family: Courier New, Courier, monospace;">0</span><br />
<span style="font-family: Courier New, Courier, monospace;">yes</span><br />
<br />
<b>2.</b> Удаляем миграцию стандартных юзеров, она нам не нужна: "<span style="font-family: inherit;">console/migrations/m130524_201442_init.php</span>".<br />
<br />
<b>3.</b> Добавляем файлы ".htaccess" в папки "/frontend/web", "/backend/web", а также в корень проекта.<br />
<br />
В моём примере, фронтенд будет доступен по адресу "http://yii2-user-combo.local".<br />
<br />
Бэкенд по адресу "http://yii2-user-combo.local/admin".<br />
<br />
/.htaccess<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">Options -Indexes</span><br />
<span style="font-family: Courier New, Courier, monospace;">Options FollowSymlinks</span><br />
<span style="font-family: Courier New, Courier, monospace;">RewriteEngine on</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">RewriteCond %{HTTP_HOST} ^www\.(.*)$</span><br />
<span style="font-family: Courier New, Courier, monospace;">RewriteRule ^(.*)$ http://%1/$1 [L,R=301]</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">RewriteCond %{REQUEST_URI} ^/admin/$</span><br />
<span style="font-family: Courier New, Courier, monospace;">RewriteRule ^(admin)/$ /$1 [R=301,L]</span><br />
<span style="font-family: Courier New, Courier, monospace;">RewriteCond %{REQUEST_URI} ^/admin</span><br />
<span style="font-family: Courier New, Courier, monospace;">RewriteRule ^admin(/.+)?$ /backend/web/$1 [L,PT]</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">RewriteCond %{REQUEST_URI} ^.*$</span><br />
<span style="font-family: Courier New, Courier, monospace;">RewriteRule ^(.*)$ /frontend/web/$1</span><br />
<br />
/backend/web/.htaccess<br />
<br />
<span style="font-family: Courier New, Courier, monospace;"># use mode rewrite for pretty URL support</span><br />
<span style="font-family: Courier New, Courier, monospace;">RewriteEngine on</span><br />
<span style="font-family: Courier New, Courier, monospace;"># if a directory or a file exists, use the request directly</span><br />
<span style="font-family: Courier New, Courier, monospace;">RewriteCond %{REQUEST_FILENAME} !-f</span><br />
<span style="font-family: Courier New, Courier, monospace;">RewriteCond %{REQUEST_FILENAME} !-d</span><br />
<span style="font-family: Courier New, Courier, monospace;"># otherwise forward the request to index.php</span><br />
<span style="font-family: Courier New, Courier, monospace;">RewriteRule . index.php</span><br />
<br />
/frontend/web/.htaccess<br />
<br />
<span style="font-family: Courier New, Courier, monospace;"><IfModule mod_rewrite.c></span><br />
<span style="font-family: Courier New, Courier, monospace;"> Options +FollowSymlinks</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> # Включаем mod_rewrite и перенаправляем со слэша</span><br />
<span style="font-family: Courier New, Courier, monospace;"> RewriteEngine On</span><br />
<span style="font-family: Courier New, Courier, monospace;"> RewriteBase /</span><br />
<span style="font-family: Courier New, Courier, monospace;"> RewriteCond %{HTTP_HOST} (.*)</span><br />
<span style="font-family: Courier New, Courier, monospace;"> RewriteCond %{REQUEST_URI} /$ [NC]</span><br />
<span style="font-family: Courier New, Courier, monospace;"> RewriteRule ^(.*)(/)$ $1 [L,R=301]</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> # Если это папка или файл, открываем ее/его</span><br />
<span style="font-family: Courier New, Courier, monospace;"> RewriteCond %{REQUEST_FILENAME} !-f</span><br />
<span style="font-family: Courier New, Courier, monospace;"> RewriteCond %{REQUEST_FILENAME} !-d</span><br />
<span style="font-family: Courier New, Courier, monospace;"> # В противном случае перенаправляем на index.php</span><br />
<span style="font-family: Courier New, Courier, monospace;"> RewriteRule . index.php</span><br />
<span style="font-family: Courier New, Courier, monospace;"></IfModule></span><br />
<br />
<br />
<b>4.</b> Создаём БД, указываем её в конфиге "common/config/main-local.php".<br />
<br />
<b>5.</b> Настраиваем конфиги.<br />
<br />
backend/config/main.php<br />
<span style="font-family: Courier New, Courier, monospace;"> 'components' => [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'request' => [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ...</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'baseUrl'=>'/admin',</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ],</span><br />
<br />
common/config/main.php<br />
<span style="font-family: Courier New, Courier, monospace;"> 'language' => 'ru-RU',</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ...</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'components' => [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ...</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'urlManager' => [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'enablePrettyUrl' => true,</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'showScriptName' => false,</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ],</span><br />
<br />
frontend/config/main.php<br />
<span style="font-family: Courier New, Courier, monospace;"> 'components' => [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'request' => [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> // Избавляемся от /frontend/web</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'baseUrl' => '',</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ...</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ],</span><br />
<br />
<b>6.</b> Ставим "yii2-user".<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">composer require dektrium/yii2-user</span><br />
<br />
<b>7.</b> Убираем из конфига компонент "user", вместо него подключаем дектриумовский модуль.<br />
<br />
Настройку модуля пользователей сделаем только для бэкенда. Для фронтенда настройки будут аналогичные.<br />
<br />
backend/config/main.php<br />
<span style="font-family: Courier New, Courier, monospace;"> 'modules' => [</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>// ID модуля должен обязательно быть "user", иначе модуль не загрузится.</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'user' => [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'class' => 'dektrium\user\Module',</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>'admins' => ['MegaAdmin'], // Хардкод для админского пользователя. После настройки прав доступа, нужно удалить эту строку.</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ],</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ], </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<b>8.</b> Подключаем консольные команды.<br />
<br />
console/config/main.php<br />
<span style="font-family: Courier New, Courier, monospace;">'modules' => [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'user' => [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'class' => 'dektrium\user\Module',</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ],</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ],</span><br />
<b><br /></b>
<b>9.</b> Создаём таблицы для пользователей.<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">yii migrate --migrationPath=@vendor/dektrium/yii2-user/migrations</span><br />
<br />
<b>10.</b> Убираем неиспользуемые действия из контроллеров.<br />
<br />
backend/controllers/SiteController.php<br />
<br />
Приводим "behaviors" к такому виду.<br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">public function behaviors()</span><br />
<span style="font-family: Courier New, Courier, monospace;">{</span><br />
<span style="font-family: Courier New, Courier, monospace;"> return [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'access' => [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'class' => AccessControl::className(),</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'rules' => [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'actions' => ['error'],</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'allow' => true,</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ],</span><br />
<span style="font-family: Courier New, Courier, monospace;"> [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'actions' => ['index'],</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'allow' => true,</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'roles' => ['@'],</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ],</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ],</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ],</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ];</span><br />
<span style="font-family: Courier New, Courier, monospace;">}</span><br />
<div>
<br /></div>
<br />
Убираем лишние действия.<br />
<span style="font-family: Courier New, Courier, monospace;">public function actionLogin()</span><br />
<span style="font-family: Courier New, Courier, monospace;">public function actionLogout()</span><br />
<br />
<b>11.</b> Удаляем файл представления<br />
<span style="font-family: Courier New, Courier, monospace;">/backend/views/site/login.php</span><br />
<b><br /></b>
<b>12.</b> Меняем в файле<br />
/backend/views/layouts/main.php<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">/site/login</span> на <span style="font-family: Courier New, Courier, monospace;">/user/security/login</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">/site/logout</span> на <span style="font-family: Courier New, Courier, monospace;">/user/security/logout</span><br />
<br />
<b>13.</b> Ставим расширение "yii2-admin".<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">composer require mdmsoft/yii2-admin</span><br />
<br />
<b>14.</b> Настраиваем конфиги.<br />
<br />
backend/config/main.php<br />
<span style="font-family: Courier New, Courier, monospace;"> 'bootstrap' => [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ...</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'users-admin',</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ],</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>...</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'modules' => [</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>...</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>// ID модуля может быть любой.</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'users-admin' => [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'class' => 'mdm\admin\Module',</span><br />
<span style="font-family: Courier New, Courier, monospace;"> // Отключаем шаблон модуля,</span><br />
<span style="font-family: Courier New, Courier, monospace;"> // используем шаблон нашей админки.</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'layout' => null,</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ]</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ], </span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>...</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'as access' => [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'class' => 'mdm\admin\classes\AccessControl',</span><br />
<span style="font-family: Courier New, Courier, monospace;"> // Маршруты, открытые по умолчанию всегда.</span><br />
<span style="font-family: Courier New, Courier, monospace;"> // Открываем только для начальной разработки.</span><br />
<span style="font-family: Courier New, Courier, monospace;"> // Как только основные данные о ролях заполнены,</span><br />
<span style="font-family: Courier New, Courier, monospace;"> // убираем отсюда всё лишнее.</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'allowActions' => [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> // Маршруты модуля пользователей.</span><br />
<span style="font-family: Courier New, Courier, monospace;"> // Логин и так разрешён, но разлогиниться </span><br />
<span style="font-family: Courier New, Courier, monospace;"> // без этой настройки и без настроенных ролей не получится.</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'user/*',</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'site/*',</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'users-admin/*',</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'debug/*',</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ]</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ],</span><br />
<br />
common/config/main.php<br />
<span style="font-family: Courier New, Courier, monospace;"> 'components' => [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'authManager' => [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'class' => 'yii\rbac\DbManager',</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ],</span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<b>15.</b> Добавляем ассет для корректного отображения админки в нашем шаблоне.<br />
<br />
backend\assets\AppAsset.php<br />
<span style="font-family: Courier New, Courier, monospace;"> public $depends = [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ...</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'dee\adminlte\AdminlteAsset',</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ];</span><br />
<br />
<b>16.</b> Применяем миграции для использования RBAC.<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">yii migrate --migrationPath=@yii/rbac/migrations</span><br />
<br />
<b>17.</b> Применяем миграции для редактирования меню.<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">yii migrate --migrationPath=@mdm/admin/migrations</span><br />
<br />
<b>18.</b> Всё готово.<br />
<br />
Управление правами доступа:<br />
<span style="font-family: Courier New, Courier, monospace;">http://yii2-user-combo.local/</span><span style="font-family: "Courier New", Courier, monospace;">admin/users-admin/</span><br />
<br />
Управление пользователями:<br />
<span style="font-family: Courier New, Courier, monospace;">http://yii2-user-combo.local/</span><span style="font-family: "Courier New", Courier, monospace;">admin/user/admin</span><br />
<br />
Настройки профиля:<br />
<span style="font-family: Courier New, Courier, monospace;">http://yii2-user-combo.local/</span><span style="font-family: "Courier New", Courier, monospace;">admin/user/settings/profile</span><br />
<br />
Полный список маршрутов модуля пользователей: <a href="https://github.com/dektrium/yii2-user/blob/master/docs/available-actions.md">https://github.com/dektrium/yii2-user/blob/master/docs/available-actions.md</a><br />
<br />
<br />
<br />
<b>P.S.</b> Можно подключать расширение "dektrium/yii2-rbac" для управления правами доступа.<br />
<br />
Но расширение "mdmsoft/yii2-admin" удобнее.<br />
<br />
Оба расширения позволяют полноценно настраивать права доступа.<br />
<b><br /></b>
<b>Преимущества "yii2-admin":</b><br />
<br />
1. Более удобное редактирование прав доступа.<br />
<br />
2. Помощник для вывода меню с учётом прав доступа.<br />
<br />
3. Редактор меню.<br />
<b><br /></b>
<b>Преимущества "yii2-rbac":</b><br />
<br />
1. Удобно создавать консольные миграции прав доступа.<br />
<br />
2. Есть интеграция с yii2-user в виде общей админки.<br />
<br /></div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com27tag:blogger.com,1999:blog-3270497644472559086.post-68783804762675559732016-09-04T23:16:00.000-07:002017-01-04T03:09:37.539-08:00Создание расширения для Yii2<div dir="ltr" style="text-align: left;" trbidi="on">
Основа расширения создаётся с помощью Gii.<br />
<br />
<b>1. Создание расширения в Gii.</b><br />
<br />
Открываем "Extension Generator", заполняем форму.<br />
<br />
Vendor Name: аккаунт на гитхабе, в моём случае "nex-otaku".<br />
<br />
Package Name: например, "yii2-toolkit". Начинается с "yii2-".<br />
<br />
Namespace: nex_otaku\toolkit\<br />
<br />
Лицензию выбираем MIT, как самую простую и свободную.<br />
<br />
<b>2. Подключение локального репозитория.</b><br />
<br />
Создаём репозиторий.<br />
<span style="font-family: "courier new" , "courier" , monospace;">D:\repos\yii2-toolkit</span><br />
<br />
Перемещаем туда сгенерированные файлы.<br />
<br />
Подключаем в проекте локальный репозиторий:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">"repositories": [</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> "type": "vcs",</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> "url": "file://D:/repos/yii2-toolkit"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">]</span><br />
<br />
По завершению тестирования, расширение нужно опубликовать на Гитхабе и зарегистрировать в Packagist. Тогда мы сможем подключать его через Composer.<br />
Локальный репозиторий, соответственно, нужно будет удалить.<br />
<br />
<b>3. Подключение расширения.</b><br />
<br />
Подключаем:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">composer require nex-otaku/yii2-toolkit</span><br />
<br />
<b>4. Публикация в Github и Packagist.</b><br />
<br />
Расширение протестировано и готово к публикации? Заливаем на Гитхаб и регистрируем его на Packagist.<br />
<br />
Регистрация в Packagist:<br />
Нажимаем кнопку "SUBMIT", вводим URL нашего репозитория на Гитхабе. Нажимаем "Check", потом "Submit". Наше расширение добавлено в каталог.<br />
<br />
<b>5. Настройка обновлений.</b><br />
<br />
Включаем хук для автоматических обновлений на Гитхабе.<br />
<br />
В репозитории Github:<br />
"Settings" -> "Integrations & Services"<br />
Добавляем сервис, выбираем из списка "Packagist".<br />
Заполняем поля, имя пользователя Packagist (но не email), токен берём из профиля на сайте Packagist.<br />
Поле "Domain" оставляем пустым.<br />
Отправляем форму. Хук привязан.<br />
<br />
Для проверки, нажимаем кнопку "Test service" (в правом верхнем углу в форме настроек хука).<br />
После нажатия кнопки, со страницы пакета на Packagist должно пропасть предупреждение "This package is not auto-updated".<br />
<br />
<b>6. Использование.</b><br />
<br />
Всё готово, можно править расширение и заливать изменения на Гитхаб. Пакет будет обновляться автоматически.<br />
<br />
Версии пакета проставляются тегами в репозитории, и подгружаются из репозитория автоматически композером.<br />
<br />
Можно версии вообще не указывать, если пакет подключен на "dev-master":<br />
<span style="font-family: "courier new" , "courier" , monospace;">"nex-otaku/yii2-toolkit": "dev-master"</span><br />
Пакет подключается так по умолчанию. При обновлении всегда будет загружаться последний коммит.<br />
<br />
Если нам нужно обновить только наш пакет, а остальные не трогать, используем команду:<br />
<span style="font-family: "courier new" , "courier" , monospace;">composer update nex-otaku/yii2-toolkit</span></div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com6tag:blogger.com,1999:blog-3270497644472559086.post-8496067447895062822016-09-04T06:12:00.000-07:002016-09-04T06:12:32.507-07:00Настройка xDebug в OpenServer, для среды NetBeans.<div dir="ltr" style="text-align: left;" trbidi="on">
Настроим расширение xDebug для отладки PHP-скриптов в IDE Netbeans.<br />
<br />
В качестве локального сервера мы используем OpenServer.<br />
<br />
<b>1. Включаем xDebug.</b><br />
<br />
Open Server -> Дополнительно -> Конфигурация -> PHP x.x. (ваша версия PHP)<br />
<span style="font-family: Courier New, Courier, monospace;">[Xdebug]</span><br />
<span style="font-family: Courier New, Courier, monospace;">zend_extension="%sprogdir%/modules/php/%phpdriver%/ext/php_xdebug.dll"</span><br />
<span style="font-family: Courier New, Courier, monospace;">xdebug.idekey = "netbeans-xdebug"</span><br />
<span style="font-family: Courier New, Courier, monospace;">xdebug.remote_enable = 1</span><br />
<br />
Дебажная сессия должна автоматически открываться в окне браузера, при запуске отладки.<br />
Откроется адрес вида<br />
http://myhost.local/?XDEBUG_SESSION_START=netbeans-xdebug<br />
<br />
<b>2. Настраиваем браузер.</b><br />
<br />
Для того, чтобы удобно было включать режим отладки в Хроме, я использую расширение "Xdebug helper".<br />
<br />
<a href="https://chrome.google.com/webstore/detail/eadndfjplgieldjbigjakmdgkmoaaaoc">https://chrome.google.com/webstore/detail/eadndfjplgieldjbigjakmdgkmoaaaoc</a><br />
<br />
Оно позволяет переключать режим на уже открытой странице, и не засоряет строку запроса.<br />
<br />
Ключ отладки передаётся через куки.<br />
<br />
В настройках плагина нужно выбрать ключ для Netbeans.<br />
<br />
В настройках NetBeans снимаем галочку:<br />
Сервис -> Параметры -> PHP -> Отладка -> Остановиться в первой строке<br />
<br />
Если сразу не заработало, нужно перезапустить NetBeans.<br />
<br />
<b>3. Настраиваем IDE Netbeans.</b><br />
<br />
<b>3.1</b> В настройках проекта указываем:<br />
<br />
Выполнить настройку -> Дополнительно -> Отладка URL-адреса -> Не открывать веб-браузер<br />
<br />
Чтобы NetBeans не открывал на каждый сеанс отладчика новую вкладку в браузере.<br />
<br />
Для управления режимом отладки, удобнее использовать расширение Chrome.<br />
<br />
<b>3.2</b> Ставим таймаут для отладки, иначе будет отваливаться SQL-соединение: wait_timeout=6000<br />
<div>
<br /></div>
Также см. <a href="http://nex-otaku-ru.blogspot.ru/2016/09/xdebug-composer-openserver.html">Отключение xDebug для Composer на OpenServer</a>.</div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com6tag:blogger.com,1999:blog-3270497644472559086.post-29536007841309309812016-09-04T05:54:00.000-07:002016-09-04T05:54:12.561-07:00Отключение xDebug для Composer на OpenServer<div dir="ltr" style="text-align: left;" trbidi="on">
Композер обычно ругается на включенный xDebug.<br />
<br />
<span style="background-color: #fff2cc;">You are running composer with xdebug enabled. This has a major impact on runtime performance.</span><br />
<br />
Можно отключить xDebug в настройках PHP, но это расширение необходимо для отладки. Поэтому отключить его нужно только для композера.<br />
<br />
Рассмотрим, как это сделать, если вы используете OpenServer.<br />
<br />
Вот мой рецепт, как навсегда отключить xDebug при запуске композера.<br />
<br />
<b>1.</b> Ищем файл "<span style="font-family: Courier New, Courier, monospace;">php.ini</span>".<br />
<br />
Путь к файлу "<span style="font-family: Courier New, Courier, monospace;">C:\path\to\OpenServer\modules\php\PHP-x.x\php.ini</span>".<br />
<br />
Вместо "<span style="font-family: Courier New, Courier, monospace;">x.x</span>" - используемая вами версия PHP, "<span style="font-family: Courier New, Courier, monospace;">C:\path\to\</span>" - директория установки OpenServer на вашей машине.<br />
<br />
<b>2.</b> Создаём его копию в этой же папке, "<span style="font-family: Courier New, Courier, monospace;">php-no-xdebug.ini</span>".<br />
<br />
<b>3.</b> Открываем на редактирование файл "<span style="font-family: Courier New, Courier, monospace;">php-no-xdebug.ini</span>", ищем строку:<br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">zend_extension="c:\path\to\OpenServer\modules\php\PHP-x.x\ext\php_xdebug.dll"</span><br />
<br />
Закомментируем её. Ставим точку с запятой, строка примет вид:<br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">;zend_extension="c:\path\to\OpenServer\modules\php\PHP-x.x\ext\php_xdebug.dll"</span><br />
<br />
Сохраняем файл.<br />
<br />
<b>4. </b>Теперь меняем скрипт, запускающий сам композер.<br />
<br />
Ищем файл "<span style="font-family: Courier New, Courier, monospace;">C:\path\to\OpenServer\modules\php\PHP-x.x\composer.bat</span>".<br />
<br />
Открываем его на редактирование, видим:<br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">@"%PHP_BIN%" -d output_buffering=0 "%PHP_DIR%composer.phar" %* </span><br />
<br />
<b>5.</b> Меняем на следующую строку:<br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">@"%PHP_BIN%" -c "%PHP_DIR%\php-no-xdebug.ini" -d output_buffering=0 "%PHP_DIR%composer.phar" %*</span><br />
<br />
Сохраняем изменения.<br />
<br />
Всё, теперь композер больше не ругается, а "глобально" xDebug остался включенным.<br />
<br />
Убедитесь в этом, открыв страничку "Информация PHP" в меню OpenServer.</div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com0tag:blogger.com,1999:blog-3270497644472559086.post-21091950460649355202016-08-29T03:07:00.001-07:002016-08-29T03:07:45.691-07:00Кроссдоменные куки с помощью AJAX<div dir="ltr" style="text-align: left;" trbidi="on">
Кроссдоменные куки можно установить с помощью AJAX-запроса.<br />
<br />
Для этого используем CORS.<br />
<br />
Пример для Yii2:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;"><?php</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">namespace frontend\controllers;</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">use yii\web\Response;</span><br />
<span style="font-family: Courier New, Courier, monospace;">use Yii;</span><br />
<span style="font-family: Courier New, Courier, monospace;">use app\components\MyUtility;</span><br />
<span style="font-family: Courier New, Courier, monospace;">use yii\web\Controller;</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">class CoolController extends Controller</span><br />
<span style="font-family: Courier New, Courier, monospace;">{</span><br />
<span style="font-family: Courier New, Courier, monospace;"> // Отключаем CSRF для контроллера.</span><br />
<span style="font-family: Courier New, Courier, monospace;"> // Кроссдоменный запрос работает только без CSRF.</span><br />
<span style="font-family: Courier New, Courier, monospace;"> public $enableCsrfValidation = false;</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> public function behaviors()</span><br />
<span style="font-family: Courier New, Courier, monospace;"> {</span><br />
<span style="font-family: Courier New, Courier, monospace;"> // Включаем CORS для контроллера.</span><br />
<span style="font-family: Courier New, Courier, monospace;"> return [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'corsFilter' => [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'class' => \yii\filters\Cors::className(),</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'cors' => [</span><br />
<span style="font-family: Courier New, Courier, monospace;"> // Разрешаем доступ с указанных доменов.</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'Origin' => ['http://site1.com', 'http://site2.com'],</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'Access-Control-Allow-Origin' => true,</span><br />
<span style="font-family: Courier New, Courier, monospace;"> // Куки от кроссдоменного запроса</span><br />
<span style="font-family: Courier New, Courier, monospace;"> // будут установлены браузером только при заголовке</span><br />
<span style="font-family: Courier New, Courier, monospace;"> // "Access-Control-Allow-Credentials".</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'Access-Control-Allow-Credentials' => true,</span><br />
<span style="font-family: Courier New, Courier, monospace;"> // Разрешаем только метод POST.</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'Access-Control-Request-Method' => ['POST'],</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ],</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ],</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ];</span><br />
<span style="font-family: Courier New, Courier, monospace;"> }</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> public function actionSelect()</span><br />
<span style="font-family: Courier New, Courier, monospace;"> {</span><br />
<span style="font-family: Courier New, Courier, monospace;"> Yii::$app->response->format = Response::FORMAT_JSON;</span><br />
<span style="font-family: Courier New, Courier, monospace;"> return MyUtility::processPostParamsAndSetCookie(Yii::$app->request->post());</span><br />
<span style="font-family: Courier New, Courier, monospace;"> }</span><br />
<span style="font-family: Courier New, Courier, monospace;">}</span><br />
<div>
<br /></div>
<div>
Код JQuery:</div>
<div>
<br /></div>
<div>
<div>
<span style="font-family: Courier New, Courier, monospace;">$.ajax('http://site.com/set-global-cookie', {</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> type : 'POST',</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> data : {veryImportantData: someInformation},</span></div>
<div>
<span style="font-family: "Courier New", Courier, monospace;"> success : function (response) {</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> if (response.status !== 'success') {</span></div>
<div>
<span style="font-family: "Courier New", Courier, monospace;"> if (response.status === 'error') {</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> console.error('Возникла ошибка: ' + response.message);</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> } else {</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> console.error('Возникла неизвестная ошибка.');</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> }</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> }</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> },</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> error : function(xhr, str){</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> console.error('Возникла ошибка AJAX: ' + xhr.responseCode + ', "' + str + '"');</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> },</span></div>
<div>
<span style="font-family: "Courier New", Courier, monospace;"> xhrFields: {</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> // Необходимо для установки куков.</span></div>
<div>
<span style="font-family: "Courier New", Courier, monospace;"> withCredentials: true</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> },</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">});</span></div>
</div>
<div>
<br /></div>
</div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com2tag:blogger.com,1999:blog-3270497644472559086.post-31578269028330622562016-08-23T01:24:00.001-07:002016-08-23T01:35:01.702-07:00Настройка LESS в Netbeans<div dir="ltr" style="text-align: left;" trbidi="on">
Для начала, настройте автоматическую сборку LESS на OpenServer: <a href="http://nex-otaku-ru.blogspot.ru/2016/05/less-yii2-openserver.html">Настройка LESS в Yii2 на OpenServer.</a><br />
<br />
LESS-файлы теперь компилируются автоматически, но при изменении в редакторе, приходится вручную чистить кеш.<br />
<br />
Чтобы не чистить кеш вручную, настраиваем автоматическую компиляцию при сохранении.<br />
<br />
При сохранении изменённого LESS-файла, Netbeans будет автоматически запускать компиляцию в CSS.<br />
<br />
Открываем свойства проекта, "Препроцессоры CSS", вкладка "LESS".<br />
<br />
Ставим галочку "Скомпилировать файлов при сохранении: LESS".<br />
<br />
Заполняем список "корневыми" LESS-файлами, по-хорошему, это должен быть один файл на проект. Дополнительные LESS-файлы включаются в него с помощью директивы "@import".<br />
<br />
Для Yii2 список аналогичен прописанному в файле "<span style="font-family: "courier new" , "courier" , monospace;">frontend\assets\AppAsset.php</span>".<br />
<span style="font-family: "courier new" , "courier" , monospace;">Ввод Вывод</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">/frontend/web/css/less/style.less /frontend/web/css/less/style.css</span><br />
<br />
Для проверки компиляции, открываем "Окно -> Вывод". Здесь будут сообщения о запуске LESS-компилятора при сохранении LESS-файлов.<br />
<br />
<br /></div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com0tag:blogger.com,1999:blog-3270497644472559086.post-41165234522056777072016-07-08T02:16:00.005-07:002016-09-27T23:33:55.943-07:00Настройка интеграции TinyMCE и "RESPONSIVE filemanager" в Yii2 Advanced Template.<div dir="ltr" style="text-align: left;" trbidi="on">
Редактор TinyMCE очень хорош, но по умолчанию в бесплатной версии нет поддержки для загрузки файлов и картинок на сервер.<br />
<br />
Для загрузки файлов и картинок подключаем отличное расширение "RESPONSIVE filemanager".<br />
<br />
Для подключения самого редактора TinyMCE я использую расширение "2amigos/yii2-tinymce-widget".<br />
<br />
1. Скачиваем расширение <a href="http://www.responsivefilemanager.com/#download-section" target="_blank">http://www.responsivefilemanager.com/</a>, распаковываем целиком в папку, допустим "<span style="font-family: "courier new" , "courier" , monospace;">/backend/web/plugins/responsivefilemanager</span>".<br />
<br />
Папка "<span style="font-family: "courier new" , "courier" , monospace;">/backend/web</span>" в моём проекте доступна по адресу "<span style="font-family: "courier new" , "courier" , monospace;">/admin/</span>".<br />
<br />
2. Открываем файл "<span style="font-family: "courier new" , "courier" , monospace;">/responsivefilemanager/filemanager/config/config.php</span>".<br />
<br />
3. Настраиваем пути.<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"> // Путь к загруженным файлам относительно корневого URL.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> 'upload_dir' => '/uploads/',</span><br />
<span class="Apple-tab-span" style="white-space: pre;"><span style="font-family: "courier new" , "courier" , monospace;"> </span></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> // Путь к папке для загрузки файлов относительно папки "/responsivefilemanager".</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> 'current_path' => '../../../../../frontend/web/uploads/',</span><br />
<span class="Apple-tab-span" style="white-space: pre;"><span style="font-family: "courier new" , "courier" , monospace;"> </span></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> // Путь к папке для загрузки миниатюр относительно папки "/responsivefilemanager".</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> 'thumbs_base_path' => '../../../../../frontend/web/uploads_thumbs/',</span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
4. Настраиваем максимальный размер загружаемых файлов. Я ставлю 50 мегабайт. Для большинства файлов этого хватает.<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"> 'MaxSizeUpload' => 50,</span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
5. Настраиваем язык интерфейса.<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"> 'default_language' => "ru",</span><br />
<br />
6. Создаём папки для загрузки:<br />
<span style="font-family: "courier new" , "courier" , monospace;"> /frontend/web/uploads/</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> /frontend/web/uploads_thumbs/</span><br />
<br />
7. Прописываем необходимые настройки TinyMCE. Я делаю это в файле "<span style="font-family: "courier new" , "courier" , monospace;">/backend/config/bootstrap.php</span>", чтобы настройки применялись глобально во всех формах.<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">// Конфигурация по умолчанию для виджета TinyMCE.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Yii::$container->set('dosamigos\tinymce\TinyMce', [</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> 'language' => 'ru',</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> 'options' => ['rows' => 20],</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> 'clientOptions' => [</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> 'plugins' => [</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> "advlist autolink lists link charmap hr preview pagebreak",</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> "searchreplace wordcount textcolor visualblocks visualchars code fullscreen nonbreaking",</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> "save insertdatetime media table contextmenu template paste image <b>responsivefilemanager filemanager</b>",</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> ],</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> 'toolbar' => "undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | <b>responsivefilemanager</b> link <b>image</b> media",</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <b>'external_filemanager_path' => '/admin/plugins/responsivefilemanager/filemanager/',</b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><b> 'filemanager_title' => 'Responsive Filemanager',</b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> 'external_plugins' => [</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> // Кнопка загрузки файла в диалоге вставки изображения.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <b>'filemanager' => '/admin/plugins/responsivefilemanager/filemanager/plugin.min.js',</b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> // Кнопка загрузки файла в тулбаре.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <b>'responsivefilemanager' => '/admin/plugins/responsivefilemanager/tinymce/plugins/responsivefilemanager/plugin.min.js',</b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> ],</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> ]</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">]);</span></div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com5tag:blogger.com,1999:blog-3270497644472559086.post-2147245835684823562016-05-29T00:40:00.000-07:002016-08-23T01:26:07.036-07:00Настройка LESS в Yii2 на OpenServer.<div dir="ltr" style="text-align: left;" trbidi="on">
Устанавливаем LESS-компилятор, чтобы Yii мог автоматически собирать ассеты с расширением ".less".<br />
<br />
К сожалению, по умолчанию OpenServer этого не умеет. Поэтому устанавливаем вручную.<br />
<br />
1. Скачать и установить Node.js: <a href="https://nodejs.org/">https://nodejs.org</a><br />
<br />
2. В командной строке Windows выполнить:<br />
<span style="font-family: "courier new" , "courier" , monospace;">npm install -g less</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">npm install -g less-plugin-autoprefix</span><br />
<br />
3. Выбрать в настройках OpenServer "Сервер > Настройка использования переменной PATH" : "Свой Path + Win Path", перезагрузить компьютер.<br />
<br />
Также см. <a href="http://nex-otaku-ru.blogspot.ru/2016/08/less-netbeans.html">Настройка LESS в Netbeans</a></div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com0tag:blogger.com,1999:blog-3270497644472559086.post-81821329109877301882016-05-05T01:11:00.000-07:002016-05-05T01:23:35.678-07:00Убираем отступы колонок Bootstrap<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: inherit;">В бутстрапе есть замечательная система сетки, которая подстраивается под разные размеры окна. </span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"><a href="https://getbootstrap.com/examples/grid/">https://getbootstrap.com/examples/grid/</a></span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
Но эта сетка идёт в комплекте с отступами, и часто приходится их обнулять. При большом количестве вложенных блоков, за этим тяжело уследить.<br />
<br />
Есть выход - назначим всем "строкам", внутри которых отступы не нужны, специальный стиль с помощью класса "slim".<br />
<br />
Таким образом, нам не потребуется добавлять правила обнуления для каждого блока, достаточно только указать <br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">class="row slim"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: inherit;">Готовый код для вставки в CSS:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">/* </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> Специальный класс для очистки от </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> вездесущих отрицательных границ и отступов бутстрапа. </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> Без него, контейнер и колонки добавляют отступы,</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> а строки их нейтрализуют отрицательными границами.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> С этим приходится бороться, </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> обнуляя эти отступы и границы специальными правилами CSS.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> Чтобы не засорять файлы стилей постоянными обнулениями,</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> мы зададим этот класс для всех строк, </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> которые не предполагают работы с границами и отступами.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">*/</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">.row.slim {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> margin-left: 0;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> margin-right: 0;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">}</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">.row.slim > [class^="col-"], .slim > [class*=" col-"] {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> padding-left: 0 !important;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> padding-right: 0 !important;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">}</span><br />
<div>
<br /></div>
</div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com1tag:blogger.com,1999:blog-3270497644472559086.post-46109928443632800242016-04-26T07:32:00.000-07:002016-04-26T07:32:49.450-07:00Заполнение изначальной сортировки в MySQL.<div dir="ltr" style="text-align: left;" trbidi="on">
Допустим, у вас большой набор данных, для которых внезапно потребовалось сделать возможность ручной сортировки.<br />
<br />
Вы добавили код, который работает с сортировкой.<br />
<br />
Но нужно ещё отсортировать ранее введённые данные. Когда их мало, это можно сделать вручную.<br />
<br />
А если их много, то поможет такая процедура на MySQL:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">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))</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>LANGUAGE SQL</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>NOT DETERMINISTIC</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>CONTAINS SQL</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>SQL SECURITY DEFINER</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>COMMENT 'Заполняет поле сортировки.'</span><br />
<span style="font-family: Courier New, Courier, monospace;">BEGIN</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"># Пример использования:</span><br />
<span style="font-family: Courier New, Courier, monospace;"># CALL reindex_table('my_cool_table', 'sort', 'group_id', 'group_table', 'id');</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">DECLARE done INT DEFAULT 0;</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"># В нашей таблице используется бинарный UUID, </span><br />
<span style="font-family: Courier New, Courier, monospace;"># поэтому такой же тип назначаем переменной.</span><br />
<span style="font-family: Courier New, Courier, monospace;"># В обычных таблицах, здесь был бы INT.</span><br />
<span style="font-family: Courier New, Courier, monospace;">DECLARE group_id BINARY(16);</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"># Курсоры и обработчики объявляются последними.</span><br />
<span style="font-family: Courier New, Courier, monospace;">DECLARE cur_1 CURSOR FOR SELECT id FROM group_table_tmp;</span><br />
<span style="font-family: Courier New, Courier, monospace;">DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"># Создаём временную таблицу для прочёсывания курсором.</span><br />
<span style="font-family: Courier New, Courier, monospace;"># Это единственный способ заставить курсор двигаться по таблице, </span><br />
<span style="font-family: Courier New, Courier, monospace;"># заданной водными параметрами.</span><br />
<span style="font-family: Courier New, Courier, monospace;"># Есть ещё вариант с созданием VIEW, </span><br />
<span style="font-family: Courier New, Courier, monospace;"># с преимуществом по производительности и со своими недостатками.</span><br />
<span style="font-family: Courier New, Courier, monospace;"># Так как скорость нас в данном случае не волнует, делаем через временную таблицу.</span><br />
<span style="font-family: Courier New, Courier, monospace;">DROP TEMPORARY TABLE IF EXISTS group_table_tmp;</span><br />
<span style="font-family: Courier New, Courier, monospace;">SET @sql_text = CONCAT('CREATE TEMPORARY TABLE group_table_tmp ENGINE=MEMORY AS SELECT ', group_id_column, ' AS id FROM ', group_table);</span><br />
<span style="font-family: Courier New, Courier, monospace;">PREPARE stmt FROM @sql_text;</span><br />
<span style="font-family: Courier New, Courier, monospace;">EXECUTE stmt;</span><br />
<span style="font-family: Courier New, Courier, monospace;">DEALLOCATE PREPARE stmt;</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"># Проходим цикл по внешнему ключу, который разбивает нашу таблицу на группы сортировки.</span><br />
<span style="font-family: Courier New, Courier, monospace;">OPEN cur_1;</span><br />
<span style="font-family: Courier New, Courier, monospace;">REPEAT</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>FETCH cur_1 INTO group_id;</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span># Бинарный UUID нуждается в преобразовании.</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span># Если у вас обычный целочисленный ID, вставляйте его, как есть.</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>SET @group_id_converted = CONCAT('0x', HEX(group_id));</span><br />
<span class="Apple-tab-span" style="white-space: pre;"><span style="font-family: Courier New, Courier, monospace;"> </span></span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span># Пронумеровываем строки.</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>SET @curRow = 0;</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>SET @sql_text = CONCAT('UPDATE ', sorted_table, ' sorted_tbl,',</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>' (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',</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>' SET sorted_tbl.', sorting_column, ' = indexed_rows.row_number',</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>' WHERE sorted_tbl.id = indexed_rows.id;');</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>PREPARE stmt FROM @sql_text;</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>EXECUTE stmt;</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>DEALLOCATE PREPARE stmt;</span><br />
<span class="Apple-tab-span" style="white-space: pre;"><span style="font-family: Courier New, Courier, monospace;"> </span></span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>UNTIL done = 1 </span><br />
<span style="font-family: Courier New, Courier, monospace;">END REPEAT;</span><br />
<span style="font-family: Courier New, Courier, monospace;">CLOSE cur_1;</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"># Удаляем временную таблицу.</span><br />
<span style="font-family: Courier New, Courier, monospace;">DROP TEMPORARY TABLE IF EXISTS group_table_tmp;</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">END</span></div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com0tag:blogger.com,1999:blog-3270497644472559086.post-2424442908798992152015-12-29T06:48:00.003-08:002015-12-29T06:48:53.540-08:00Быстрое удаление из больших таблиц MySQL<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="tr_bq">
Если требуется удалить большие объёмы данных из таблиц MySQL, это занимает слишком много времени.</div>
<br />
Ускорить процесс может такая процедура.<br />
<br />
<pre># Пример использования процедуры:
# 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 ;
</pre>
<div>
<br /></div>
<br /></div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com0tag:blogger.com,1999:blog-3270497644472559086.post-13567833921290361882014-10-31T06:49:00.000-07:002014-10-31T06:49:45.427-07:00Копирование БД Postgres<div dir="ltr" style="text-align: left;" trbidi="on">
<pre>#!/bin/sh
# Этот скрипт копирует БД mycooldb на локальный хост разработчика.
#------------------------------------ </pre>
<pre> </pre>
<pre># определяем 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
#------------------------------------ </pre>
<pre> </pre>
<pre># Сохраняем полный дамп базы "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</pre>
</div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com0tag:blogger.com,1999:blog-3270497644472559086.post-77965478475674818232014-06-18T01:19:00.000-07:002014-06-18T01:19:14.594-07:00Подчёркивания в приватных методах и свойствах - плохо<div dir="ltr" style="text-align: left;" trbidi="on">
Не следует использовать подчёркивания в начале имени для приватных методов и свойств.<br />
<br />
<br />
<pre>$this->_myPrivateMethod($this->_myPrivateVar);
</pre>
<br />
Когда требуется изменить видимость, например, сделать какой-то метод публичным, то приходится изменять его имя во всём коде. Целая куча переименований - следовательно, есть высокая вероятность появления проблем.<br />
<br />
Не используя подчёркивания, мы делаем код более защищённым. Да и просто красиво.</div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com0tag:blogger.com,1999:blog-3270497644472559086.post-81771908313400425322014-05-10T12:07:00.003-07:002016-08-12T23:28:49.138-07:00Заменить белый цвет на прозрачность в Photoshop<div dir="ltr" style="text-align: left;" trbidi="on">
Понадобилось заменить белый цвет на прозрачность в фотошопе.<br />
<br />
Сделать это встроенными средствами фотошопа нереально. Есть десятки способов, но ни один не даёт идеального результата.<br />
<br />
Единственный рабочий способ - использование плагина <a href="http://mikes3d.com/extra/scripting-plugins/killwhite" target="_blank">Kill White</a>. Увы, он работает только в старых версиях Photoshop, не в СС. Но хоть так.</div>
Nexhttp://www.blogger.com/profile/09775924280835086251noreply@blogger.com0