Компонент "Мои патчи" v.1.1

3908
Новогодние каникулы прошли не зря crazy
Представляю публике следующую версии своего компонента.
Компонент "Мои патчи" v.1.1

Установка/обновление стандартным (для ICMS2) способом.
Минимально необходимая версия системы 2.1.2
При обновлении версии 1.0, данные базы патчей сохраняется.
Но это не значить, что перед обновлением не надо делать бэкап.
Бэкап наше все - поэтому его следует делать всегда!

Disclaimer

Данный компонент имеет деструктивные функции!
То есть компонент изменяет содержимое файлов InstantCMS. Впрочем для этого компонент и создавался. joke
Поэтому использование компонента подразумевает использование на свой страх и риск.
Мною были предприняты всевозможные защиты "от дурака", но идеального кода не бывает.
Поэтому пользуйтесь данным компонентом с осторожностью!
А на живых сайта - с двойной осторожностью.
Как говорится, автор никакой ответственности за причиненные убытки не несет. glasses

Изменения в версии 1.1
+ добавлена возможность выгружать и загружать патчи в/из файлов
+ добавлена проверка соответствия версии патча и системы
+ добавлена возможность включать/отключать маркер места где производилась замена кода (вкладка "Опции")
+ добавлена возможность изменять вид маркера (Осторожно! Защиты от "дурака" в данной опции пока нет)
- из дистрибутива удалены данные демо - патча необходимого для работы компонента (его теперь необходимо скачать отдельно)

Инструкция версия 1.1
Описание демо патча
Планы
Тема на форуме о ходе работы над компонентом.

Прошу строго не судить. Здравая критика приветствуется.
C удовольствием выслушаю все замечания и пожелания zst

Приятных всем хаков! dance
Компонент "Мои патчи" v.1.0.0 | Патч (включение DIV + отключение очистки) для компонента "Мои патчи"
Комментарии (60)
Алексей Тимофеев 9 января 2015 в 10:41 0
Хорошая штука +
Reborn 9 января 2015 в 11:54 0
C удовольствием выслушаю все замечания и пожелания
Очень удобная штука vqmod , не перезаписывает измененные файлы, давно использую.
Хорошо бы взять за основу для этого компонента.
Скорпион 9 января 2015 в 12:01 0
PolarOne уже упоминал мне об этой штуке, когда обсуждали версию 1.0
Боюсь для меня это сложно будет, да и привык я все делать своими руками, пусть будет "изобретение велосипеда", но это изобретение своего велосипеда :)
Да и немного практики в PHP мне не помешает, ибо в свое время, лет так надцать назад, я не уделил достаточного внимания данному языку :)
Теперь вот наверстываю :)
Reborn 9 января 2015 в 12:04 0
Простейший пример работы~ найти и заменить.
Код XML:
  1.  
  2. <modification>
  3. <file name="admin/model/*/*.php">
  4. <operation error = "skip">
  5. <search position="after"><![CDATA[$this->cache->delete]]></search>
  6. <add><![CDATA[ $this->cache->delete('seo_pro');]]></add>
  7. </operation>
  8. </file>
  9.  
  10. <file name="catalog/view/theme/*/template/product/product.tpl">
  11. <operation><!--Share Product-->
  12. <search position="replace" offset="4"><![CDATA[<div class="product-sharing img-thumbnail-transparent hidden-xs"><div class="addthis_sharing_toolbox"></div></div>]]></search>
  13. <add><![CDATA[
  14. <div class="yashare-auto-init" data-yashareL10n="ru" data-yashareType="none" data-yashareQuickServices="vkontakte,facebook,twitter,odnoklassniki,moimir,lj,gplus"></div>
  15. ]]></add>
  16. </operation>
  17. </modification>
  18.  
Скорпион 9 января 2015 в 12:08 0
Reborn, дружище ты мне вот что скажи.
Для запуска vqmod править сами файлы InstantCMS надо? Ну там код какой-либо вставить, для перехватов и преобразований на лету.
Или оригинальные файлы совсем-совсем не затрагиваются и используются как есть?
Reborn 9 января 2015 в 12:16 0
Reborn, дружище ты мне вот что скажи. Для запуска vqmod править сами файлы InstantCMS надо? Ну там код какой-либо вставить, для перехватов и преобразований на лету. Или оригинальные файлы совсем-совсем не затрагиваются и используются как есть?
Минимальная правка в index.php
Код PHP:
  1. // VirtualQMOD
  2. require_once('./vqmod/vqmod.php');
  3. VQMod::bootup();
  4.  
  5. // VQMODDED Startup
  6. require_once(VQMod::modCheck(DIR_SYSTEM . 'startup.php'));
  7.  
  8. // Application Classes
  9. require_once(VQMod::modCheck(DIR_SYSTEM . 'library/customer.php'));
  10. require_once(VQMod::modCheck(DIR_SYSTEM . 'library/affiliate.php'));
  11. require_once(VQMod::modCheck(DIR_SYSTEM . 'library/currency.php'));
  12. require_once(VQMod::modCheck(DIR_SYSTEM . 'library/tax.php'));
  13. require_once(VQMod::modCheck(DIR_SYSTEM . 'library/weight.php'));
  14. require_once(VQMod::modCheck(DIR_SYSTEM . 'library/length.php'));
  15. require_once(VQMod::modCheck(DIR_SYSTEM . 'library/cart.php'));
  16. require_once(VQMod::modCheck(DIR_SYSTEM . 'library/ocstore.php'));
Reborn 9 января 2015 в 12:24 0
Ставим права на запись index.php , vqmod при инсталляции вносит свои правки, после чего возвращаем права.
Если интересно, просто скачайте Ocstore , vqmod и не лишним будет менеждер. Хотел я портировать это все, да руки не доходят.
Скорпион 9 января 2015 в 12:04 0
В минус vqmod - я так понял он на лету преобразует страницы. То есть при каждом обращении - временные затраты на преобразование необходимой страницы.
В моем же случае - измененные страницы статичны - и изменяются однажды - при применении патча.
Reborn 9 января 2015 в 12:12 0
Измененные файлы с одноименным названием кешируются в отдельной директории, и подставляются вместо оригинального файла.
Пример: вы изменили файл /component/content/frontend.php.
На выходе в папке vqcache получаете файл vq2-component_content_frontend.php
Так же имеется vqmod manager для управления скриптами.
WebMan 9 января 2015 в 23:33 0
Вы смотрели, насколько сильно падает производительность при подстановке изменённых файлов?
WebMan 9 января 2015 в 23:34 0
Это был вопрос к Reborn.
Reborn 10 января 2015 в 06:21 0
Смотрели.
Пропорционально использованию стандартной cms до момента перехода на новый уровень со всеми вытекающими.
Пока у меня при 6 к стр в одной категории с выборкой по более чем 100 атрибутов у 1 стр не возникло желания перенести все правки вручную, хотя конечно надеюсь наступит и этот момент, потрачу тогда день.
WebMan 9 января 2015 в 23:44 0
Скорпион, зачем же так сразу пугать людей? joke Патчер имеет не деструктивные (направленные на разрушение) функции, а очень полезные, но потенциально опасные при неправильном использовании.

Маркер места изменения кода - полезная штука. Действительно пригодится программистам не только при отладке, а и чтобы легче ориентироваться. Отличная идея!

С интересом буду ждать развития компонента.
Скорпион 11 января 2015 в 15:37 0
Я считаю лучше пере.....чем недо...:) Да и все-таки патч - это изменение кода, разрушение его первоначального, оригинального состояния smile Поэтому это все-таки деструктивные функции :))))
На счет "маркера" - он и в первой версии был. Но не отключался. Просто в некоторых местах этот "маркер" вылазиет наружу, например при правке кода в шаблоне. Поэтому пришлось сделать возможность его отключения. Вообще я бы был очень благодарен, если бы мне кто-нибудь подсказал как правильно закоментировать "маркер", чтобы он не вылазил куда непоподя.
Скорпион 11 января 2015 в 15:32 0
Странно - 69 человек скачало,а отписалось всего трое :(
Не работает? Или это не кому не нужно?
Скорпион 11 января 2015 в 20:03 0
Спасибо WebMan.
Обнаружена зависимость компонента от версии PHP. Так как у меня по умолчанию везде (на стенде и на боевом сервере) стоит PHP 5.4 в двух местах в коде при использовании версии 5.3 получаем ошибку.
Исправил - архив перезалил.
Либо повторите установку либо можете сами поменять в файле - system\controllers\mypatch\backend\actions\patch_download.php
это
Код PHP:
  1.  
  2. $version = explode("[version]", $data_version [0])[1];
  3.  
на это
Код PHP:
  1.  
  2. $version = explode("[version]", $data_version [0]);
  3. $version = $version[1];
  4.  
и это
Код PHP:
  1.  
  2. if (pathinfo($patch_name)['extension'] == "zip"){
  3.  
на это
Код PHP:
  1.  
  2. $patch_name_info = pathinfo($patch_name);
  3. if ($patch_name_info['extension'] == "zip"){
  4.  
Если кто-либо найдет ещё проблемы работы компонента на версии 5.3 - не стесняйтесь - пишите - поправлю.
С неправильной версией PHP мой косяк - приношу извинения. zst Негоже использовать версию PHP отличную от минимальной версии требуемой для самого движка. facepalm

WebMan - еще раз большое спасибо.
WebMan 11 января 2015 в 20:55 0
Спасибо за испраление ошибок, Скорпион. Теперь появилось поле для загрузки файла патча. Хотя ещё вылазят предупреждения. Подробности напишу в личку.
vikont 31 декабря 2015 в 02:30 0
Всех благ и с Новым Годом!
Попробовал воспользоваться вашим патчем и столкнулся с тем, что в нем можно только заменить одно на другое, а если надо вставить до, после или между какими то строчками, тогда что делать?
Скорпион 31 декабря 2015 в 09:57 0
Спасибо и Вас с наступающим!
А в чем проблема вставки?

Посмотрите на демо-патч.
Там имеет место быть вставки дополнительных строк.

Ну и на пальцах попробую обьяснить.
Например есть код
Код PHP:
  1.  
  2. buttonSource: true,
  3. cleanOnPaste: false
  4.  
задача вставить между ними строку
Код PHP:
  1. replaceDivs: false
в окно код для поиска вставляем

Код PHP:
  1.  
  2. buttonSource: true,
  3. cleanOnPaste: false
  4.  

в окно код для замены вставляем

Код PHP:
  1.  
  2. buttonSource: true,
  3. replaceDivs: false,
  4. cleanOnPaste: false
  5.  
Только не забывайте про основные правила написания кода на PHP.
Я про запятую после вставляемой строчки.
vikont 7 января 2016 в 21:36 0
Спасибо все понял. Сейчас возникла другая проблема, после патча видны комментарии к патчу
/*===== начало патча -> Правка файла шаблона NEWS поля "Возраст" =====*/ /*===== окончание патча -> Правка файла шаблона NEWS поля "Возраст" =====*/
Движек 2.4.0 как сделать комментарии не видными на сайте?
Скорпион 8 января 2016 в 13:32 0
Отключить вставку комментариев в настройках компонента.
Скорпион 8 января 2016 в 13:34 0
Они нужны при отладке, а в рабочем варианте лучше отключать.
Также, в настройках, Вы можете поменять как будет выглядеть сам комментарий.
vikont 8 января 2016 в 15:41 0
Отключить не проблема! Они удобны тем,, что сразу видно где патч., но я не знаю какой синтаксис применить для комментирования.
Можете подсказать?
Есть одно неудобство, весь патч вставляется одной длинной строкой, а не так как написан. Как это исправить?
Скорпион 8 января 2016 в 16:05 0
А зачем они Вам в продакшене?
Когда все настроено и работает?
Во время отладки - согласен - в них есть толк......но не более. Они для ОТЛАДКИ и предназначены.....чтобы применить и если что пошло не так - заглянуть в код и легко найти место применения патча и разобраться что не так.
На счет синтаксиса - имеется ввиду правил комментарий в коде.
Где-то достаточно одного слеша, гдето то нужно два , а гдето решетка.
Единственное мое "добавление" это параметр $description, который выводит название патча. По желанию его можно убрать и оставить только сами метки.

По поводу "одной строки" - хм....не должно быть так, там перевод строки вставляется. Может Ваш редактор как-то не корректно отображает код. Вы чем смотрите?
Скорпион 8 января 2016 в 16:08 0
Так как в некоторых местах кода комментарий "вылазеет наружу" и было принято решение о возможности отключать их.
В планах отключение метки будет возможно для каждого отдельного патча.
BoAnRo 20 января 2016 в 20:07 0
Почему не внесли свой плагин в каталог дополнений? Там на него наверное бы значительно больше людей обратили внимание чем здесь.
Скорпион 21 января 2016 в 00:31 0
Всему свое время.
Особую популярность он не получил, поэтому не куда торопиться.
BoAnRo 22 января 2016 в 16:30 0
Обнаружил один важный баг. Если просто выключить патч (кликом на птичку, после чего она становится серой) - изменения внесенные в код этим патчем не отменяются. Даже если после этого нажать "Применить". И чтобы отменить действие патча, нужно его полностью удалить. Тестировал несколько раз на разных файлах.

А в целом это дополнение - просто супер!
Скорпион 22 января 2016 в 19:54 0
Хм....что-то не так.
Не должно такого быть.
Можно поподробней.....а лучше пришлите файлик патча - я попробую у себя.
BoAnRo 22 января 2016 в 20:06 0
https://drive.google.com/open?id=0BwDEfleRxwZUTDQ0WHFvTFJRWFk
https://drive.google.com/open?id=0BwDEfleRxwZURzdNSVpUbS1GUlk

Один патч меняет цвет главного меню, второй - цвет заголовков виджетов. Там когда настраивается доступ до ФТП, нужно выбирать пассивный режим (по-умолчанию так стоит)?
Скорпион 22 января 2016 в 19:59 0
Там вот может быть какой косяк, точнее не доработка с моей стороны, выясненная во время использования компонента.
Для того чтобы отменить патч, сначала нужно отменить все - нажатием "Восстановить".
Потом включить те что нужно - и снова нажать "Применить".
То есть отключения одного патча без других невозможно.
Знаю - косяк мой - в планах записан - но все руки не доберутся выпустить версию с исправлениями. :(
BoAnRo 22 января 2016 в 20:08 0
Понятно. Но это не критический косяк. Так что спокойно можно пользоваться компонентом!
Скорпион 22 января 2016 в 20:23 0
Получилось?
BoAnRo 22 января 2016 в 20:30 0
Да, сделал так как Вы написали. Нажал "Востановить", после чего включил только нужный патч и "Применить". Все хорошо! Спасибо!
Скорпион 22 января 2016 в 20:01 +2
Вообще хочу переделать чтобы патчи применялись/отменялись по нажатию этой самой птички.
BoAnRo 22 января 2016 в 20:08 +1
Было бы чудесно!
BoAnRo 22 января 2016 в 20:44 0
И еще такой вопрос. Не дает импортировать патч, если в нем указана другая версия icms. То есть после обновления системы чтобы внести патчи в обновленные файлы придется перед тем открывать файл каждого патча и редактировать версию системы. Может логичнее чтобы все таки позволяло загружать все патчи? А если не получится какие-то из них применить к обновленным файлам новой версии системы - просто сообщать об ошибке.
Скорпион 22 января 2016 в 20:49 0
Да. Слишком строго я сделал - признаю.
В планах - чекбокс, отключающий этого зверя - контролера версии.
WebMan 22 января 2016 в 20:57 0
Патчи делаются под конкретные версии. И очень желательно, чтобы автор патча или кто-то другой, хорошо понимающий его работу, проверил патч перед его применением. А после проверки автор легко поменяет версию в патче. Поэтому я думаю, что версию проверять нужно обязательно.

Другое дело, что можно сделать указание не одной версии CMS в патче, а диапазона версий. Либо сделать галку в настройках, типа "Разрешить применять патчи для более ранних версий системы". Или при применении более старых патчей выдавать запрос. Или сделать всё вышеперечисленное и гибко это сочетать. smile
BoAnRo 22 января 2016 в 21:05 0
Я думаю, идеальный вариант, это когда бы просто выводилось сообщение - "Этот патч предназначен для другой версии системы, по-этому нажимая "Продолжить" вы его используете на свой страх и риск"
BoAnRo 1 февраля 2016 в 18:15 0
Нужно быть осторожным при обновлении системы. Перед обновлением нужно обязательно отменить все патчи, для того, чтобы удалились все файлы .origin.
Скорпион 3 февраля 2016 в 19:36 0
Вообще-то об этом написано в описании. :))
Скорпион 3 февраля 2016 в 19:40 0
Хм....оказывается вру smile Нету отчего-то этого в описании.
Но точно помню что где-то мы это уже обсуждали и я об этом писал...
BoAnRo 1 февраля 2016 в 18:28 0
А в целом, Скорпион, ваш этот компонент готов для использования на рабочих сайтах? Ну, понятно, что на свой страх и риск. Просто собираюсь создавать новый сайт, и хочу вносить изменения сразу через патчи, чтобы потом легко можно было вносить их повторно после обновлений системы. По-этому интересует правильно ли я понимаю, что вероятность каких-то конфликтов компонента с другими компонентами или еще с чем-то - минимальная, и какого-то ощутимого влияния на безопасность сайта тоже не должно быть? Сам не знаю PHP, по-этому не могу оценить.

Кстати, если нужно будет помочь с тестированием новой версии компонента, я с удовольствием присоединюсь!
Скорпион 3 февраля 2016 в 19:46 0
Ну...нареканий по "безопасности" пока не никто не предъявлял. А в остальном - я думаю можно не волноваться. Я использовал свой компонент на некоторых "своих сайтах"....глюков замечено не было. Оно то не "работает" постоянно. Применили.....оно поменяло файлы......и успокоилось....
Везде в компоненте есть проверки запуска из-под админа. Делал по видео-инструкции из документации. К сожалению это всего-лишь мое хобби, на которое у меня не так много времени.На икру я себе зарабатываю чуток другим, не как не связанным с сайтостроем. От этого и компонентом занимаюсь от случая к случаю.
BoAnRo 3 февраля 2016 в 21:10 +1
От этого и компонентом занимаюсь от случая к случаю.

Ну, для бесплатного компонента никто и не требует регулярной поддержки и улучшений smile
И за то что есть большущее Спасибо!
vikont 18 апреля 2016 в 02:37 0
У дополнения есть возможность загружать патчи, а как выгрузить свой патч, чтобы передать кому то или себе перенести на другой сайт?
BoAnRo 18 апреля 2016 в 10:32 +1
На странице патчей есть кнопка "Загрузка патчей". Но нужно учитывать версию InstantCMS на которой создавался патч. Если патч переносится например с версии 2.4.0 на 2.5.0, тогда нужно через текстовый редактор поменять версию системы в файле патча. Также напротив каждого патча есть кнопка для выгрузки патча в файл.

Кстати работу этого дополнения на 2.5.0 еще не тестировал. Но когда обновлял систему до 2.4.0, это дополнение мне очень помогло. Так перенес где-то 60 правок в системных файлах. Если бы вручную это делал, забрало бы много времени.

Надеюсь, у Скорпиона когда-то появится вдохновение и время чтобы еще чуть доработать компонент и выложить его в Каталог Дополнений, поскольку считаю этот модуль одним из самых полезных для icms.
vikont 26 апреля 2016 в 00:30 0
Спасибо за расширенный ответ! Но если бы там была кнопка выгрузки Патча в файл, то я бы не спрашивал!
У меня отсутствует кнопка выгрузки патчей в файл. Как ее вставить? Версия Компонента 1.1
Скорпион 26 апреля 2016 в 07:09 0
Как отсутствует? Скрин можно?
vikont 26 апреля 2016 в 18:28 0
Конечно можно! Высылаю 3 скрина. На первом список патчей, а на втором внутри одного из пунктов патча и на третьем сам патч.
Как видно, нигде даже намека на ВЫГРУЗКУ, только загрузка патча.
Спойлер
Спойлер
Спойлер
BoAnRo 26 апреля 2016 в 19:46 0
Действительно интересно... Кнопки выгрузки патча должны быть на первом скрине в колонке "Действия".
Скорпион 26 апреля 2016 в 23:05 0
Хм. Действительно нету.
А какая версия инстанта?
vikont 27 апреля 2016 в 00:31 0
Компонент ставил на версию 2.4.0, скрины с версии 2.5.1 Кнопки не было с самого начала.
BoAnRo 27 апреля 2016 в 09:44 0
На одном сайте я тоже ставил на 2.4.0. Проблем не было. Пробовали перезалить файлы компонента? Может что-то с картинкой...
vikont 28 апреля 2016 в 00:25 0
Послушался умных советов, перезалил файлы компонента! ... Никаких изменений.
На всякий случай закинул компонент и в свой шаблон! ... Реакций ноль!
Что делать?
Скорпион 28 апреля 2016 в 20:38 +1
Разобрались. Отсутствовала картинка (дискетка) по причине того, что не был применен патч по умолчанию, который необходим для работы самого компонента.
BoAnRo 30 декабря 2016 в 22:59 0
Чтобы компонент работал в InstantCMS 2.6.1 в демо-патче для файла /system/controllers/admin/frontend.php нужно искать код:
Код PHP:
  1.  
  2. public function getAdminMenu(){
  3.  
  4. return cmsEventsManager::hook('adminpanel_menu', array(
  5.  
и заменять его на код:

Код PHP:
  1.  
  2. public function getAdminMenu(){
  3.  
  4. return cmsEventsManager::hook('adminpanel_menu', array(
  5.  
  6. 'title' => LANG_CP_SECTION_MYPATCH,
  7. 'url' => href_to($this->name, 'controllers/edit/mypatch'),
  8. 'options' => array(
  9. 'class' => 'item-patch'
  10. )
  11. ),
  12.  
  13.  
P.S. У меня уже набралось где-то около 100 правок кода, которые я переношу с версии на версию используя этот чудесный компонент. Жаль, что так мало пользователей обратили на него внимание. Компонент действительно очень полезный, и сокращает мне время на внесение правок после обновления системы до нескольких минут. Даже не хочу думать, что было бы, если бы пришлось вносить правки каждый раз вручную.
WebMan 30 декабря 2016 в 23:12 0
Компонент действительно очень полезный, и сокращает мне время на внесение правок после обновления системы до нескольких минут.
Это правда, компонент очень полезен для не программистов. Он прост и не требует особых знаний для его использования.

Я сейчас пользуюсь модулем Git в NetBeans IDE. Кроме практически автоматического применения правок, он позволяет вести версии, видеть изменения с примечаниями, а в случае конфликтов позволяет их разрешить более наглядно. Но потребовалось много времеи, чтобы разобраться, как это всё работает. И я всё равно до сих пор не понимаю некоторые вещи. smile
BoAnRo 10 января 2018 в 17:16 +1
Чтобы компонент работал в InstantCMS 2.9.0 в демо-патче для файла /system/core/template.php нужно искать код:
Код PHP:
  1. $value = '<div class="flag_trigger '.($is_flag_on > 0 ? "{$flag_class}_on" : ($is_flag_on < 0 ? "{$flag_class}_middle" : "{$flag_class}_off")).'" data-class="'.$flag_class.'">'.$flag_content.'</div>';
и заменять его на код:
Код PHP:
  1. if (($field == 'state_patch' || $field == 'state_file') && ($value == 2)){
  2. $value = '<div class="flag_trigger '. "{$flag_class}_accept" . '"></div>';
  3. } elseif (($field == 'state_patch' || $field == 'state_file') && ($value == 3)){
  4. $value = '<div class="flag_trigger '. "{$flag_class}_error" . '"></div>';
  5. } else {
  6. $value = '<div class="flag_trigger '.($is_flag_on > 0 ? "{$flag_class}_on" : ($is_flag_on < 0 ? "{$flag_class}_middle" : "{$flag_class}_off")).'" data-class="'.$flag_class.'">'.$flag_content.'</div>';
  7. }
  8.