Всем привет!
Вышла новая версия InstantCMS. Мы проработали все ваши сообщения об ошибках и пожелания.
Релиз протестирован на следующих конфигурациях:
- Apache 2.4.58
- PHP 8.5.3
- MariaDB 10.11.14
Основные изменения
Для удобства мы разделили изменения по категориям:
Биллинг и подписки
- Добавлена возможность указывать характеристики подписок для их сравнения.
- Реализована возможность автоматического оформления подписки на тарифный план после регистрации.
- Тарифный план может быть бесплатным (автоматически становится бессрочным).
- Добавлена возможность создания плана путем копирования существующего.
- Добавлен виджет «Подписки» для Биллинга.
- В Биллинге операции покупки плана теперь имеют привязку к ID плана.
- Операции перевода между пользователями и покупки подписок можно отменять через админку.
- Добавлена опция «Реферальная программа разрешена группам».
- Добавлена опция «Хранить реферальную куку после успешной регистрации».
- Добавлены новые опции подписок: «Заменить группы пользователя» и зачисление баллов при покупке за реальную валюту.
- Добавлены опции НДС 22% для ЮKassa и Robokassa.
- В списке тарифов в админке теперь отображается минимальная цена.
- Исправлены ошибки: платежи WebMoney, сохранение времени при продлении подписки, связка Биллинга с фотоальбомами, работа реферальных ссылок при типе контента «по умолчанию» и отображение цен для гостей.
- Добавлены хуки на операции перевода между пользователями и регистрацию рефералов.
- Включение систем оплаты теперь доступно только администраторам (для отладки).
Рейтинг и контент
- Новые опции рейтинга: «Разрешить менять оценку», «Разрешить менять оценку только в рамках текущей сессии» и «Отключить отрицательные оценки».
- Оптимизирована работа виджета списка контента: поиск «похожего» по тегам теперь работает быстро даже на больших таблицах.
- В виджет категорий ТК добавлены опции выбора категории, отображения заголовка корневой категории и количества записей.
- Добавлены подписи к SEO-полям ТК: «Не забудьте включить правило доступа Управление SEO параметрами записей».
- Для поля fieldFieldsgroup добавлена возможность сортировки перетаскиванием.
- Исправлена путаница с модерацией отредактированных записей.
- Добавлена опция «Ограничить длину заголовка записи» для ленты активности и виджетов.
Безопасность и разработка
- Внедрены CSRF-токены в недостающие места, включая автоматический параметр на пунктах меню с подтверждением.
- Обновлен редактор Ace до актуальной версии.
- Добавлен новый класс cmsWysiwyg для наследования редакторов (совместимость сохранена).
- Обновлен PHPMailer до версии 7.0.2.
- Исправлены нотисы (Notices) под PHP 8.5 (включая свойства ТК и планировщик задач).
- Добавлен более удобный метод контроллера runExternalActionIfExists().
- В режиме отладки добавлены новые данные: версия MySQL, имя текущего шаблона, система кэширования и имена страниц для виджетов, а также подсветка SQL.
- Исправлена ошибка с доступом по IP к админке (теперь невозможно случайно запретить доступ самому себе).
Исправления и прочее
- Массовое удаление и перенос пунктов меню между их наборами.
- Исправлены проблемы с URL и логотипом при поиске по группам.
- Исправлен баг авторизации при включенных 2FA и капче.
- Исправлена ошибка настройки почты при определенных параметрах.
- При включенном типографе добавлен атрибут data-as-is для корректной обработки iframe.
- Обновлены иконки в гридах (теперь единый набор).
- Мелкие косметические правки и рефакторинг.
Подробнее обо всех изменениях можно узнать из списка коммитов.
⚡ Как установить обновление
⚠️ Важно! Убедитесь, что ваша текущая версия — 2.18.0. Если нет, сначала обновитесь до неё.
Внимание: Перед началом обновления обязательно сделайте резервную копию сайта и дамп базы данных. Мы не несем ответственности за потерю данных при некорректном обновлении.
- Используйте PHP версии не ниже 7.2.0.
- Отключите кэширование и объединение JS/CSS в настройках сайта.
- Если вы используете кастомный шаблон, обновите файлы, которые присутствуют в пакете обновления.
- При возникновении «белого экрана» прочитайте эту инструкцию.
- Если в обновлении изменились файлы вашего шаблона, рекомендуем ознакомиться с этой статьей.
- После обновления проверьте настройки компонентов «Биллинг» и «Рейтинг» и при необходимости пересохраните их.
Если в вашем шаблоне есть собственные правки в JS-файлах (из папок /templates/default/js/ или /templates/modern/js/), замените или объедините их с файлами из нового пакета. Не забудьте сбросить кэш браузера.
Для кастомных урезанных сборок: распакуйте пакет, удалите ненужные контроллеры, запакуйте обратно и проводите обновление.
Механизм установки подробно описан в документации.
📦 Пакет обновления для ручной установки: скачать
🌐 Демо-сайт обновлён.
Огромное спасибо за сообщения об ошибках, донаты и пул-реквесты. Спасибо, что выбираете InstantCMS!
💙 Поддержите проект
Ваша поддержка помогает нам развиваться и делать InstantCMS лучше каждый день.
- Станьте спонсором — постоянная поддержка с привилегиями
- Отправьте донат — разово или регулярно, в том числе в криптовалюте
- Поставьте ⭐ звезду на GitHub — это помогает проекту расти и находить новых пользователей
Каждое ваше действие имеет значение. Спасибо, что вы с нами!
Я буду первый спасибо за релиз много всего для себя вкусного в нем нашел.
Огромное спасибо
Отличная новость. Спасибо за релиз. Исправлены хоть и мелкие, но неприятные недочеты.
Спасибо за релиз, давно не обновлялся и не тестировал версию с биллингом. Подскажите, а планируется ли внедрение опции выбора подписки для разных групп пользователей?
К примеру, в биллинге есть 2 типа подписок: «Разработчик+» и «Закачик+». По идее должно быть так: пользователь, состоящий в группе Разработчик, может купить тарифный план «Разработчик+», а пользователи, состоящие в группе Закачик, могут купить подписку «Закачик+». Это удобно, когда на сайте пользователь выбирает при регистрации группу пользователей, и будет нелогично, если в списке подписок пользователя разработчика будет отображаться подписка «Закачик+». В последней тестируемой мной версии биллинга такой функции не было.
Скажите, а почему не отображается Каталог дополнений в админке?
Вероятно поэтому
Вероятно ))
Спасибо большое за обновление!
При обновлении выдало
Fatal error: Uncaught Error: Undefined constant «LANG_BILLING_PLAN_FEATURES_FULL» in
/system/controllers/billing/backend/forms/form_options.php:178 Stack trace: #0 /system/core/form.php(1191): formBillingOptions->init() #1 /upload/installer/install.php(113): cmsForm::getForm() #2 /upload/installer/install.php(66): save_controller_options() #3 /system/core/installer.php(602): install_package() #4 /system/core/installer.php(551): cmsInstaller->callInstallFunc() #5 /system/core/installer.php(161): cmsInstaller->runPackageInstaller() #6 /system/controllers/admin/actions/install_finish.php(27): cmsInstaller->install() #7 /system/core/controller.php(621): actionAdminInstallFinish->run() #8 /system/core/action.php(74): cmsController->runExternalAction() #9 /system/controllers/admin/actions/install.php(18): cmsAction->__call() #10 /system/core/controller.php(621): actionAdminInstall->run() #11 /system/core/controller.php(481): cmsController->runExternalAction() #12 /system/core/frontend.php(18): cmsController->executeAction() #13 /system/core/controller.php(457): cmsFrontend->executeAction() #14 /system/core/core.php(1032): cmsController->runAction() #15 /system/core/core.php(199): cmsCore->runController() #16 /index.php(28): cmsCore->runHttp() #17 {main} thrown in /system/controllers/billing/backend/forms/form_options.php on line 178
После обновления страницы вроде все работает корректно.
Возможны варианты:
Я проверял и ручное и авто обновление, такой проблемы не встретил.
Спасибо за релиз!
Круто, спасибо.
Когда включена продажа полей (поле Текст поста), в списке записей у поста выводится текст, а на странице записи не выводится и есть кнопка Купить. Получается можно получить доступ к контенту поля в списке. Кажется логичнее и в списке постов вместо контента выводить кнопку для покупки, как на странице поста.
Не выводите такое поле в списке
Так то да, самое простое, но не самое логичное) Даже на тестовом сайте такая же история. Немногие готовы заполнять отдельное поле с кратким описанием поста, которое можно было бы выводить в списке вместо основного текста.
Это не баг, просто поля в списке не учитываются. Посмотрим, подумаем, как это учесть для списков не жертвуя производительностью.
При нажатии на пункт Сохранить, система выдаёт «Ошибку в форме»
Даже без каких-либо изменений, выдаёт ошибку при сохранении.
Во кладке «Подписки» заполните поля
К сожаление, своим умом не смог разобраться, о каких характеристиках идёт речь и каким образом эти поля могут быть заполнены. Помогите, пожалуйста.
аналогично, не очень понял, что еще надо заполнить, так как при полном заполнении все равно выдает ошибку сохранения.
Я тоже завис на этом моменте. Было бы юзерфрендли, если была бы сразу подсказка, что необходимо заполнить.
Приветствую! При открытии ранее написанной публикации и попытке её отредактировать в «Редактор личных сообщений», пропадает элемент <details> и всё его содержимое, на версии 2.18.0 такого не было.
Redactor не правился в этой версии. Вероятно у вас были кастомные правки. Используйте tiny.
У тини вероятно встроена еще некая премиум версия? А то на одном из проектов появилось уведомление, что надо приобрести премиум, так как тестовый период завершился? Есть вроде еще форк тини, который позволяет пользоваться без ограничений. А если Lexical появится, то вообще супер)
что с комментариями? сначала отправить комментарий не мог, потом смог:) сейчас комментарии с проблемой нет
проблема с виджетом Категории, не сохраняется, ругается на заполненную форму

какое значение не ставь, не реагирует
Вообще пресеты скорее всего не должны быть обязательными для выбора, так как не всем нужны пресеты для категорий.
видимо так и было, каждый день это не трогаешь, а тут хотел посмотреть, что изменилось исходя из описания релиза, и все, не сохранятся.
Уверены, что это штатный виджет? Я видел, писали о этой проблеме, так и не смог повторить.
абсолютно уверен, проверил на двух сайтах, после обновления вот так.
Если «определяется автоматически», виджет не сохраняется. А если выбрать тип контента, то сохраняется.
Вот так сохраняется

если вас смущают какие то иконки после доступа:) То это от шаблона Next Modern
вот такая же ситуация на чистом сайте

Понял, да, ошибка. Откройте файл /system/controllers/content/widgets/categories/options.form.php и удалите примерно в 16 строке:
спасибо сохраняется, НО! нет возможности вывода без пресетов обложек. Удаляешь пресет, а оно все равно с ними отображается.
И это подтверждаю. Файл /system/controllers/content/actions/widget_cats_presets_ajax.php заменить
на
так да, вроде все починилось
Заметил еще на 2.18 вроде как есть интересный баг, когда на странице выведен виджет формы, например виджет Поиска. При попытке сохранить отправляет на страницу поиска. В файле /templates/modern/controllers/content/item_form.tpl.php корректировка позволила решить эту проблему. В 2.18.1 ни у кого не было такой?
После обновления сайт работает нормально. Так держать!
Круто, спасибо!
А в СЕО-шаблон не добавили выражение для родительской категории?
Нет. Опишите максимально подробно.
Смотрите, существует категория с названием Photoshop, в ней вложенные подкатегории Graphics, Brushes и т.д.
В тайтл записи через SEO шаблон нужно вывести так: Название плагина для Photoshop. Это не получится сделать, т.к. нет выражения чисто для родительской категории. Есть тэг {category}, и он работает, но только если выбрать одну родительскую категорию и не выбирать подкатегорию. А если кладешь запись в Photoshop/Graphics, то в тайтле получается Название плагина для Graphics
да, мне тоже давно актуально
Похоже, обновление выполнено, но сообщение Доступно обновление 2.18.1 не исчезает
а нет, исчезла 😀
Гуру подскажите пожалуйста, почему может так после обновления:
Fatal error: Uncaught TypeError: cmsWysiwyg::getEditor(): Argument #1 ($name) must be of type string, null given, called in /system/fields/html.php on line 227 and defined in /system/core/wysiwyg.php:28 Stack trace: #0 /system/fields/html.php(227): cmsWysiwyg::getEditor() #1 /system/fields/editorjs.php(103): fieldHtml->store() #2 /system/core/form.php(866): fieldEditorjs->store() #3 /system/controllers/content/actions/item_edit.php(160): cmsForm->parse() #4 /system/core/controller.php(636): actionContentItemEdit->run() #5 /system/core/controller.php(476): cmsController->runExternalAction() #6 /system/core/frontend.php(18): cmsController->executeAction() #7 /system/core/controller.php(452): cmsFrontend->executeAction() #8 /system/controllers/content/frontend.php(29): cmsController->runAction() #9 /system/core/controller.php(501): content->route() #10 /system/core/frontend.php(18): cmsController->executeAction() #11 /system/core/controller.php(452): cmsFrontend->executeAction() #12 /system/core/core.php(1032): cmsController->runAction() #13 /system/core/core.php(199): cmsCore->runController() #14 /index.php(28): cmsCore->runHttp() #15 {main} thrown in /system/core/wysiwyg.php on line 28
Строгая типизация в PHP 8+. Если проще — то поле editorjs не передаёт имя редактора, либо передаёт null. Смотрите что в методе store() в поле editorjs
Это поле видимо не адаптировано под php 8 instantcms.ru/forum/redaktor-editorjs.html
Ответил вам в ЛС
Спасибо, все работает!
Спасибо огромное за релиз! Не уверен, что нужно писать сюда, но раньше такой проблемы никогда не было. Короче не могу удалить уведомления в админке
Нажима. на крестик и… ничего не происходит. Прошу проверить и помочь пофиксить.
На демо сайте instantcms ситуация аналогична!
В файл github.com/instantsoft/icms2/blob/0d89b034baf84a8c949dc7652b5200178f33eba7/system/controllers/messages/actions/notice_action.php#L12 добавлена проверка на csrf_token, который при запросе из админки не добавляется.
Чтобы исправить ошибку откройте файл templates\admincoreui\js\admin-core.js
и замените строку В ДВУХ МЕСТАХ
на строку
вот на картинке
кнопки действий в уведомлениях в админке заработают.
Не забудьте почистить кеш браузера, так как это правки в js файле, который может быть закеширован браузером.
А line 236 не надо менять?
надо. поправил коммент.
На самом сайте тоже такая же ситуация.
В messages.js уже вроде как есть, но не работает.
Скорее всего у вас свой шаблон с необновленным файлом templates/modern/js/messages.js
Посмотрите коммит github.com/instantsoft/icms2/commit/d2275e1e3fbb4c3d68f7db9851bab619aa870d42#diff-3b7f942e6074e79f6a7dc31a6d87450d8e98f53221e7f4a45417d1443cccccd8
Там вроде везде проставлены csrf токены
Верно свой, но он использует templates/default/js/messages.js Своего файла в js не содержит. На default работает, на своем нет. Странная ситуация.
Вероятно, что проблема не тут messages.js. Берите файлы с шаблона модерн или дефаулт и по папке или по файлу заменяйте их в своём шаблоне, пока не найдете проблемный файл. Делайте бакап шаблона сначала.
Вернулся я с заезда и решил все таки понять суть моей проблемы.
Повторю что шаблон у меня boxed и тянет все с default, аналогичные шаблоны так же могут ловить ошибки с удалением с сайта уведомлений.
Решение простое не важно где лежат js исправление функции в core.js или messages.js
для core.js найти и заменить функцию:
на:
или
Альтернативный вариант в messages.js:
заменить на:
и начинает все работать. Могу скопировать что то из этих js к себе в шаблон чтобы в будущем знать что меняется, хотя можно и забыть...
Вопрос к разработчикам — а можно как то по дефолту включить исправленную функцию в сборку в какой то из этих js на выбор по усмотрению. И почему же boxed шаблон не получал токен корректно и возвращал «undefined»
icms.forms.getCsrfToken() возвращает undefined (хотя должен вернуть токен из мета-тега)
icms.messages.csrf_token тоже undefined
В темплейте прописана функция получения токена и все js получают его тоже
***
<link rel=«stylesheet» type=«text/css» href="/templates/default/controllers/neomessenger/css/styles.css?41">
<script src="/templates/default/js/jquery.js?41" nonce=«6f9da6a92d384468af05921dddd141b911a633dcc683c228»></script>
<script src="/templates/default/js/jquery-modal.js?41" nonce=«6f9da6a92d384468af05921dddd141b911a633dcc683c228»></script>
<script src="/templates/default/js/core.js?41" nonce=«6f9da6a92d384468af05921dddd141b911a633dcc683c228»></script>
<script src="/templates/default/js/modal.js?41" nonce=«6f9da6a92d384468af05921dddd141b911a633dcc683c228»></script>
<script src="/templates/default/js/messages.js?41" nonce=«6f9da6a92d384468af05921dddd141b911a633dcc683c228»></script>
<script src="/templates/boxed/js/hc-offcanvas-nav.js?41" nonce=«6f9da6a92d384468af05921dddd141b911a633dcc683c228»></script>
<script src="/templates/default/controllers/emojione/js/emojione.js?41" nonce=«6f9da6a92d384468af05921dddd141b911a633dcc683c228»></script>
<script src="/templates/boxed/js/jquery-cookie.js?41" nonce=«6f9da6a92d384468af05921dddd141b911a633dcc683c228»></script>
<script src="/templates/default/js/fields/string_input.js?41" nonce=«6f9da6a92d384468af05921dddd141b911a633dcc683c228»></script>
<script src="/templates/default/js/jquery-cookie.js?41" nonce=«6f9da6a92d384468af05921dddd141b911a633dcc683c228»></script>
<script src="/templates/default/widgets/alertcookie/alertcookie.js?41" nonce=«6f9da6a92d384468af05921dddd141b911a633dcc683c228»></script>
<script src="/templates/default/controllers/neomessenger/js/editor.js?41" nonce=«6f9da6a92d384468af05921dddd141b911a633dcc683c228»></script>
<script src="/wysiwyg/markitup/image_upload.js?41" nonce=«6f9da6a92d384468af05921dddd141b911a633dcc683c228»></script>
<script src="/wysiwyg/markitup/insert_smiles.js?41" nonce=«6f9da6a92d384468af05921dddd141b911a633dcc683c228»></script>
<script src="/wysiwyg/markitup/jquery.markitup.js?41" nonce=«6f9da6a92d384468af05921dddd141b911a633dcc683c228»></script>
<script src="/templates/default/controllers/neomessenger/js/libs.min.js?41" nonce=«6f9da6a92d384468af05921dddd141b911a633dcc683c228»></script>
<script src="/templates/default/controllers/neomessenger/js/neomessenger.js?41" nonce=«6f9da6a92d384468af05921dddd141b911a633dcc683c228»></script>
<script src="/templates/default/controllers/neomessenger/js/templates.min.js?41" nonce=«6f9da6a92d384468af05921dddd141b911a633dcc683c228»></script>
<meta name=«csrf-token» content=«ad4ccadeb310b0e6377b7e668403314ab9df4cf3ce5a327035ee326ee0362fdc» />
<link rel=«stylesheet» type=«text/css» href="/templates/boxed/css/styles.css?41">
***
Тот файл что меняли, ложите себе в шаблон. Если не хотите так, то создайте текстовый файл с листом ваших правок. (Это если уж совсем никак без правок)
Или переделывайте свой шаблон чтоб работал с оригинальными JS файлами инстант. Например: если кнопки отправки комментария не работают в Вашем шаблоне, то надо править не JS файлы инстант шаблона, а сам ВАШ шаблон отправки комментария. В дальнейшем обновляться будет легче.
Уважаемый pupsik я дождусь официального ответа от разработчиков )
Вы ране предполагали что дело не в js а в чем то ещё, но оказалось именно в том чем я начал ковыряться и мои правки помогут кому то ещё не блуждая в поисках. А вот про правки, может быть Fuze примет по умолчанию или же подскажет куда капнуть в шаблоне, чтобы работало по умолчанию.
Ведь кнопка удаления уведомления ни чем не отличается от того что в default шаблоне. Потому что она и есть с оригинала тянется.
Предпологал, Да. Исходя от дочерного шаблона Модерн в JS ошибок нет. А у вас дочерный шаблон Дефаулт (что Я не углядел). Увы. Верней углядел, а мысли О templates/modern/js/. Вот и сказал, что ТАМ ошибки нет.
Добавим подобную правку в шаблон default.
Спасибо
Обновился. Спасибо за работу.
А ткните носом плст, где найти отдельно компонент биллинг, а то мой выдрючивается с коробки, попробовать переустановить...
Конкретно проблема в конвертации валюты сайта в рубли, врёт, при правильно прописанных значениях....
Благодарю.
Отдельно его уже нет. Только в коробке.
Протестируйте ещё робокассу если есть возможность. У меня не работает. Возможно надо и другие варианты кроме кассы и юмани проверить, так как эти два варианта работают.
Обнаружил случайно сегодня такой баг. Если переходишь из поиска на страницу, в которой виджет выводиться не должен, так как в нем добавлен адрес страницы в опции «отрицательная маска», то виджет показывается, так как вероятно к концу страницы добавляется «хвост» яндекса ?ysclid=mnuc2s0dit
Есть варианты как побороть этот недуг?
Было что то похожее.
github.com/instantsoft/icms2/issues/1459
Да, протестил, спасибо. В доке не нашел, поэтому не сразу оказалось очевидным)
Что вообще происходит?
Поставил чистенькую, новую ЦМС и я просто......
Я просто В ШОКЕ!!!!!!!!!!!!!!!!!!
Она летает я даже не знаю как!!!!!!
Все четко, быстро, великолепно!!!!
РАКЕТАБОМБАПУШКАПЕТАРДА!!!
Обязательно сделаю донат через пару дней, такою БЕСПЛАТНУЮ ЦМС, с биллингом, Опен граф и на последней ПХП, ну я не знаю...
Шедевр просто! Спасибо большое! Инстант — Мощь!!!
Донат отправил, как и обещал!
Спасибо что делаете Инстант все лучше и лучше!!!
Спасибо!
На смартфоне кнопка в 2.18.1 не выпадает почему-то
Здравствуйте, подскажите пожалуйста где можно добавить новые директивы для Политики Защиты контента?
Оказалось оооооочень сложная настройка… Не могу понять вообще где эти директивы формируются...
$list[] = 'base-uri \'self\'';
$list[] = 'upgrade-insecure-requests';
$list[] = 'block-all-mixed-content';
$list[] = 'report-uri /csp-report';