Свинцовый Пепелац

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

20 января 2015

Общее

Являясь поклонником WYSIWYG редактора NicEdit, я написал для него несколько новых плагинов, доработал некоторые имеющиеся плагины и ядро самого редактора. Свои наработки я решил опубликовать, выпустив расширенную версию NicEdit, которой, и посвящена данная заметка.

В настоящий момент дальнейшая доработка NicEdit автором завершена, о чём имеется уведомление на сайте проекта. Получилось так, что дописывая новый функционал для данного редактора, я фактически стал заниматься его дальнейшим развитием и поддержкой (смотри подборку публикация на эту тему в моём блоге).

Расскажу подробнее о доработках, которые включены в представленную здесь расширенную версию NicEdit.

Работа с изображениями

Начал я с того, что добавил в NicEdit функционал для более комфортной работы с изображениями (просмотр директорий на сервере в поисках файлов изображений для вставки их на страницу, а так же кроссбраузерная загрузка изображений на сервер с последующей вставкой на страницу). Результатом эволюции этого функционала стал плагин «Менеджер изображений» (версия 2.0).

Пример запуска NicEdit с «Менеджером изображений».

В тэге <head> вашего HTML документа добавить следующие строки:

<script type="text/javascript" src="nicEdit/nicEdit.js"></script>
<script type="text/javascript">
    bkLib.onDomLoaded(function() {
        new nicEditor({
            imanagerURI: 'index.php?q=imgr',
            iconsPath: 'nicEdit/nicEditorIcons.gif'
        }).panelInstance('test');
    });
</script>

Все настройки и прочую информацию по NicEdit Вы можете найти на сайте проекта - http://nicedit.com/, здесь же Вам нужно обратить внимание только на параметр «imanagerURI». Без правильного указания этого параметра, «Менеджер изображений» работать не будет.

На самой странице должно иметься текстовое поле с соответствующим id:

<textarea cols="60" id="test"></textarea>

Работу «Менеджера изображений» на стороне сервера обеспечивает PHP-класс NicEdit (файл nicedit.lib.php). Этот класс можно легко интегрировать в нужную Вам систему (с проверкой доступа пользователя к просмотру содержимого директорий и загрузки файлов). При необходимости Вы можете переопределить имеющиеся в нём методы и свойства. Список некоторых свойств, которые Вам, возможно, понадобиться переопределить:

  • $maxDimension – максимальный размер ширины/высоты изображения, при превышении которого будет создана уменьшенная копия изображения для вставки на страницу (по умолчанию установлено 500 пикселей).
  • $memoryLimit - максимальный объем оперативной памяти сервера, который разрешается использовать скрипту при масштабировании изображений в байтах (по умолчанию установлено 128M).
  • $maxUploadSize – максимальный размер файла, разрешённого для загрузки (по умолчанию установлено 10 МБ, при значении 0 параметр игнорируется).
  • $uploadErr – массив содержащий список текстов ошибок возвращаемых классом в случае возникновения оных.

Следует иметь в виду, что при масштабировании анимированных GIF анимация игнорируется, чтобы не «раздувать» код класса. При желании этот недостаток можно устранить, переопределив метод miniatures() соответствующей реализацией.

В приложенном к статье архиве имеется скрипт «script.php», в котором представлен пример использования класса NicEdit.

Также я доработал имеющийся функционал для управления параметрами изображения (добавил управление такими атрибутами картинки как: ширина (width), высота (height), горизонтальные отступы (hspace), вертикальные отступы (vspace), класс (class) и стиль (style)).

Работа с таблицами

Добавлен функционал, позволяющий пользователям не искушённым в HTML легко создавать и редактировать таблицы (включая добавление/удаление строк и столбцов, объединение/разбиение ячеек по вертикали и горизонтали, управление атрибутами таблиц, строк и ячеек). Огромное спасибо форуму сайта JavaScript.ru и конкретно пользователю с ником «Дзен-трансгуманист», опубликовавшему в теме посвящённой работе с таблицами некоторые идеи, которые мне помогли в создании описываемого функционала.

Функция обратного вызова

Теперь при инициализации редактора можно указать функцию обратного вызова, передав её параметром «instance_callback». Эта функция будет вызвана по завершении инициализации редактора.

Данная доработка оказалась очень полезной для решения имеющейся в WebKit браузерах (Google Chrome, Opera 15+ и прочие...) проблемы ресайза изображений и элементов таблиц простым потягивание их мышкой за уголок. Для этого теперь можно использовать JQuery плагин «Webkit Resize» от EditorBoost.

Пример использования NicEdit с плагином «Webkit Resize»:

<!-- Подключаем библиотеку JQuery -->
<script type="text/javascript" src="jquery-1.11.2.min.js"></script>

<!-- Для JQuery версии 1.9 и выше подключаем jquery.mb.browser.min.js
     (из-за отсутствия у этих версий JQuery свойства $.browser) -->
<script type="text/javascript" src="jquery.mb.browser.min.js"></script>

<!-- Подключаем плагин Webkit Resize -->
<script type="text/javascript" src="jquery.webkitresize.nonifrm.js"></script>

<!-- Подключаем NicEdit -->
<script type="text/javascript" src="nicEdit/nicEdit.js"></script>

<!-- Инициализация NicEdit -->
<script type="text/javascript">
  bkLib.onDomLoaded(function() {
    new nicEditor({
      iconsPath: 'nicEdit/nicEditorIcons.gif',
      instance_callback: function() {
        $(".nicEdit-main").webkitimageresize().webkittableresize().webkittdresize();
      }
    }).panelInstance('test');
  });
</script>

Читай подробности на сайте проекта EditorBoost.

По поводу плагина «Webkit Resize» хочу ещё заметить, что у таблиц он работает только с элементами TD и игнорирует элементы TH. Чтобы исправить это досадное упущение разработчиков нужно в файле jquery.webkitresize.nonifrm.js в строке 673 сделать небольшое изменение:

Было:

context.$container.find("td").each(function (i, v) {

Стало:

context.$container.find("td, th").each(function (i, v) {

Прочие доработки

Кроме перечисленных доработок я ещё поменял в NicEdit набор цветов в таблицах управления цветом шрифта и фона, от чего управление цветом стало удобнее.


Смотреть демо


Дополнительная информация

За основу я взял NicEdit версии 0.9 r24 (релиз от 7 июня 2012).

Итого

К данной заметке приложен архив, содержащий в себе расширенную версию NicEdit. Если Вы обнаружили в опубликованной здесь версии NicEdit ошибки или у Вас возникли какие-нибудь вопросы или предложения по части дальнейших доработок, сообщите об этом в комментариях к данной странице. Все исправления и новые доработки в дальнейшем будут публиковаться на этой странице (читайте комментарии к статье и описания приложенных файлов).

Обновление до версии 1.2 (4 марта 2015)

В соответствии с пожеланиями пользователей менеджеру изображений добавлен параметр `imanagerPath` - путь к каталогу с которого менеджер изображений начинает свою работу. Если параметр не указан, открывается корневая директория (как раньше). Демо обновил - теперь в нём для демонстрации по умолчанию открывается директория `images`.

Обновление до версии 1.3 (16 марта 2015)

  • Добавлена регистронезависимая сортировка папок и файлов по имени.
  • Ссылка "Перейти на уровень выше" теперь всегда идёт первым пунктом в списке директорий и файлов.

Обновление до версии 1.4 (18 июля 2016)

  • Добавлен функционал позволяющий удалять изображения на сервере через менеджер изображений (в демо версию 1.4 не выставлял).

Прикреплённые файлы:

    nicEdit-extended-ver.1.4-[ru].zip

    Версия 1.4 локализованная на русский язык.
    Изменения:
    - Добавлена возможность удаления файлов изображений с помощью менеджера изображений

    Обновление от 31.01.2023:
    - Исправлена проблема переопределения ф-ции `imagecreatefrombmp`
    - В инициализации nicEditor в HTML добавлен необязательный параметр `host` для указания корня сайта относительно которого должны подставляться пути к превьюхам картинок
    Дата публикации: 18 июля 2016
    Расширение: ZIP
    Размер файла: 523.12 Кб
    Сканиваний: 293

Комментарии посетителей (68):

27 июля 2016 14:46
> У меня не загружается изображение, если это делать не через менеджер.

Ну, мне нужны подробности :) Какой у Вас браузер, что вы делаете и что после своих действий видите в редакторе?
Dmitrij
28 декабря 2016 23:58
для выбора цветов я бы прикрутил такой Color Picker
http://jscolor.com/examples/
на мой взгляд он самый удобный
Дмитрий
28 июня 2017 11:44
Здравствуйте,исправьте пожалуйста ссылку на скачивание,вместо файла скачивается страница
28 июня 2017 13:56
Всё нормально скачивается, только надо иметь ввиду, что для скачивания сначала попадаешь на страницу с где капчу надо ввести.
Будьте внимательнее.
Дмитрий
28 июня 2017 16:49
Да действительно скачивает,только через браузер,а вот через DownloadMaster ссылке добавляется .htm и качает страницу с каптчей
Дмитрий
28 июня 2017 18:25
Ошибка в менеджере об некорректном ответе сервера.
Вот такое выдает в отладчике браузера
br />
<b>Warning</b>: include(D:\OpenServer\domains\umicro.test\user_cms\themes\default_admin\redactor/user_cms/themes/default_admin/redactor/nicedit.lib.php) [<a href='function.include'>function.include</a>]: failed to open stream: No such file or directory in <b>D:\OpenServer\domains\umicro.test\user_cms\themes\default_admin\redactor\script.php</b> on line <b>3</b><br />
<br />
<b>Warning</b>: include() [<a href='function.include'>function.include</a>]: Failed opening 'D:\OpenServer\domains\umicro.test\user_cms\themes\default_admin\redactor/user_cms/themes/default_admin/redactor/nicedit.lib.php' for inclusion (include_path='.;d:/openserver/modules/php/PHP-5.3;d:/openserver/modules/php/PHP-5.3/PEAR/pear') in <b>D:\OpenServer\domains\umicro.test\user_cms\themes\default_admin\redactor\script.php</b> on line <b>3</b><br />
<br />
<b>Fatal error</b>: Class 'NicEdit' not found in <b>D:\OpenServer\domains\umicro.test\user_cms\themes\default_admin\redactor\script.php</b> on line <b>4</b><br />

nicEdit.js:1709 SyntaxError: Unexpected token <
at XMLHttpRequest.xmlhttp.onreadystatechange (nicEdit.js:1696)

Подскажите пожалуйста как исправить!
Денис
30 декабря 2017 02:15
Спасибо, и с наступающим новым годом. Как мало таких добрых людей, это не легко написать библиотеку на 300 строк
Art
12 мая 2019 15:48
Здравствуйте, Lead Pepelats!
Хороший скрипт вы написали, спасибо. Работает как надо. Хотел его применить на своём сайте (сайт пока в проекте), но вот папку для картинок не получается задать в корне сайта. Желательно чтобы менеджер видел только эту папку и подпапки в ней. Подскажите, пожалуйста, как это сделать. Спасибо!
14 мая 2019 10:00
Приветствую, Art!
Давно не трогал эту скриптину (работает в проектах и не требует внимания :)), так что не очень помню нюансов. По поводу указания директории с картинками - а при создании экземпляра класса NicEdit Вы пробовали указать эту директорию (см. картинку)?
Art
18 мая 2019 11:26
Да, пробовал, не получается. Знаний про адресацию у меня маловато. Буду осваивать.
18 мая 2019 21:31
Art, вот Вы пишите "не получается", а что конкретно Вы указали в этом параметре? Давайте попробуем разобраться вместе.
Art
5 июля 2019 00:43
Здравствуйте, Lead Pepelats!
После вынужденного перерыва возвращаюсь к своей проблеме.
Вот структура сайта:
index.ext
page1.ext
pageN.ext
article/
- article1.ext
- articleN.ext
modules/
- pagesedit.ext
- pagesedit/
- - nicEdit.js
- - nicedit.lib.php
- - nicEditorIcons.gif
- - script.php
images/
- img1.ext
- imgN.ext

Ссылки на страницы такие: ?page = pageN.ext или ?page = article/article1.ext и есть возможность чпу.
Сейчас в файле script.php строки:
if (@$_GET['q'] == 'imgr') {
include(dirname(__FILE__) . '/nicedit.lib.php');
chdir('../../');
$p = new NicEdit(getcwd());
$p->imanager();
}
В редактируемых страницах есть нужные js-строки, в том числе:
iconsPath: 'modules/pagesedit/nicEditorIcons.gif',
imanagerURI: 'modules/pagesedit/script.php?q=imgr',
imanagerPath: 'images'

Если положить весь сайт в папку, то работает нормально, но можно выйти на уровень выше и перейти в любые папки и туда качать и там удалять.
Если положить сайт в корень, то тоже работает, но в менеджере если кликнуть на папке Вверх (две точки), получаем окно с сообщением красным "Не удалось получить список файлов с сервера" без списка картинок и вложенных папок.

Надеюсь, понятно изложил, что есть, а хотелось бы не пускать за пределы images не зависимо от того, где лежит сайт.
Возможно ли это?
Konstantin
14 января 2020 10:44
не получается запустить нормально, выкидывает ошибку
Fatal error: Cannot redeclare imagecreatefrombmp() in /var/www/html/test/edit/nicEdit/nicedit.lib.php on line 329
пробовал v 1.3 и 1.4, результат тот же, при чем если смотреть файл nicedit.lib.php то ошибка расположена на закрывающей скобке функции imagecreatefrombmp()
14 января 2020 11:57
Константин, попробуйте добавить такие строки чтобы избежать "редиклара" ф-ции imagecreatefrombmp
Константин
14 января 2020 12:26
ну это то я понимаю, не понимаю только откуда она еще инклюдится? уже весь код просмотрел, она случайно не из интернета тянется?
14 января 2020 12:51
Константин, "из интернета"? — шаманите :))))

у меня вроде такой ошибки не возникало. используйте везде include_once на всякий случай
Константин
14 января 2020 13:00
[quote]Lead Pepelats 14 января 2020 / 12:51#44 (229)
Константин, "из интернета"? — шаманите :))))

у меня вроде такой ошибки не возникало. используйте везде include_once на всякий случай[/quote]
))) есть немного, вот думаю как в свой проект подключить )))
Константин
14 января 2020 13:41
кстати стоит заменить split() на explode() тем кто использует на бек php > 7.0
14 января 2020 14:01
по поводу explode — велком :) всё что вашей душе угодно :) можете потом о результатах здесь отписать. удачи
Константин
14 января 2020 14:13
я конечно же split() заменил, у меня на бек стоит php v7.2 и я получал ошибку о неизвестной функции, т.к. split на сколько я знаю с версии 7.0 уже не включается )))
так что смело можно менять у кого версия 7.0 и выше

еще вот задумываюсь XMLHttpRequest на fetch, у меня в проекте на нем запросы используются