Для разработчиков

Уже больше месяца плотно занимаюсь подгонкой движка до необходимых моему проекту возможностей. Написал около 15 плагинов (все очень индивидуальные, потому поделится с сообществом нечем). За это время получил как и море позитивных эмоций при разработке под LiveStreet, так и столкнулся с рядом не очень радостных моментов.

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

Пожалуй самым необходимым, по моему мнение, есть предложение создать отдельную таблицу в базе данных для настроек разных плагинов и объект для работы с этой таблице. Без этой таблицы очень тяжело делать нормальную админку для плагина прямо в CMS. Настройки в файлах это конечно быстро, но очень не удобно, особенно для пользователей, потому я принципиально ничего не храню в конфигурационных файлах, кроме имен таблиц и правил роутинга.

Для своих целей я создал плагин с аналогичным функционалом, в принципе меня этот вариант полностью устраивает, но минус в том, что если я создам какой-то полезный сообществу плагин с его использованием, то мне нужно будет объяснить пользователю, что нужно установить еще один плагин для его работы, а это как минимум не правильно.

Второй момент, который очень сильно не нравится, это то, что нельзя добавлять стили и ява-скрипты так, чтобы при включенных настройках объединения файлов они не добавлялись в общую группу и не создавали еще один, немного расширенный вариант скрипта/стиля.

Для лучшего понимая объясню когда это бывает нужно: делается админка для плагина, нужно добавить ява-скрипт для управления этим плагин, хотя бы тот же аякс. При использовании AppendScript этот скрипт добавляется в общий список и CMS создаёт новый вариант объединенного файла скриптов. В итоге имеем один вариант на 300 Кб без этого срипта и на 301 Кб с ним. Зачем мне перекачивать еще раз те 300 Кб, которые мы уже имели ради одной страницы. Можно конечно вызывать файл с шаблона, но это во-первых не удобно, а во-вторых CMS не обработает и не сожмет файл.

Варианты решения которые я вижу:
1. Отдельная функция, которая добавляет файл в список сжатия, но не объединения скриптов/стилей
2. Позволить создавать группы сжатых стилей и скриптов. Допустим для бэкенда это одни файлы, для фронтэнда это другие файлы.

Третье, что не нравится (а может не нашел) — это невозможность брать языковые константы из ява скриптов. Точнее есть какое-то ls.lang.get, но оно не берет ни з языковых файлов плагина, ни с файлов шаблона, а это значит что нормально диалог подтверждения не сделать. Этот момент на самом деле не критичный, так, мелкое неудобство, но всё равно решил написать.

Четвертое: сейчас как раз разбираюсь с кроном. В том виде, в котором оно реализовано сейчас не очень удобно работать. Опять таки нужно обьяснять каждому пользователю, который хочет установить ваш плагин, как добавить задание плагина в крон. Более гуманные вариант решения:

1. Псевдокрон: при открытии пользователем страницы LS проверяет нету ли висящих заданний в данный момент, которые нужно выполнить и если такие есть, то выполняет. Вариант так себе, минусов много, но от пользователя при установке CMS и плагинов вообще ничего не требуется

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

Так же это более секьюрно, чем оставлять файлы, которые запускает кронтаб, которые по сути можно и через браузер запускать. Если выполнение крона будет контролировать CMS, тогда в плагинах не нужно делать дополнительную проверку на «а не чаще ли нас запускают, чем нужно».

Пока что это всё что вспомнил. Если еще что-то вспомню — дополню статью. На самом деле пожеланий больше, но первые 2, по моему мнению, критические.

UPD: добавил 4 пункт.
UPD 2: дополнил 4 пункт.
Предлагаем новый инструмент продвижения — лендинг пейдж. Данный подход позволяет существенно увеличить продажи при низких затратах.

21 комментарий

avatar
отдельную таблицу в базе данных для настроек разных плагинов и объект для работы с этой таблице
Про это уже говорилось не один раз. но пока безрезультатно. Есть даже спец. плагины под это дело

Второй момент, который очень сильно не нравится, это то, что нельзя добавлять стили и ява-скрипты так, чтобы при включенных настройках объединения файлов они не добавлялись в общую группу и не создавали еще один, немного расширенный вариант скрипта/стиля.
см $config['head']['default']['js'] в конфиге, а конкретно последнюю строчку:
«yandex.st/share/share.js» => array('merge'=>false),
avatar
Пожалуй самым необходимым, по моему мнение, есть предложение создать отдельную таблицу в базе данных для настроек разных плагинов и объект для работы с этой таблице. Без этой таблицы очень тяжело делать нормальную админку для плагина прямо в CMS. Настройки в файлах это конечно быстро, но очень не удобно, особенно для пользователей, потому я принципиально ничего не храню в конфигурационных файлах, кроме имен таблиц и правил роутинга.
Это давно уже реализовано в плагине-библиотеке Config Engine — хранилище «ключ=значение», а также сохранение конфигов плагинов в БД и их автоматический старт. Плагин использует

Второй момент, который очень сильно не нравится, это то, что нельзя добавлять стили и ява-скрипты так, чтобы при включенных настройках объединения файлов они не добавлялись в общую группу и не создавали еще один, немного расширенный вариант скрипта/стиля.
Можно. Нужно добавить второй параметр-массив в метод добавления ЖС или КСС с «merge» => false

Третье, что не нравится (а может не нашел) — это невозможность брать языковые константы из ява скриптов. Точнее есть какое-то ls.lang.get, но оно не берет ни з языковых файлов плагина, ни с файлов шаблона, а это значит что нормально диалог подтверждения не сделать. Этот момент на самом деле не критичный, так, мелкое неудобство, но всё равно решил написать.
Снова неверно. Все это уже реализовано. Чтобы получить текстовку из ls.lang.get нужно её сначала туда поместить:

в шаблоне:
ls.lang.load({lang_load name="blog_create_type_open_notice,blog_create_type_close_notice"});


из пхп:
$this->Lang_AddLangJs(array(
  'blog_join','blog_leave'
));


потом такие текстовки доступны через ls.lang.get.

Важно: следует помнить про префиксы для текстовок плагина.

З.Ы. Все Многое уже реализовано, вопрос только в том нашил ли вы это или нет)
avatar
Это давно уже реализовано в плагине-библиотеке Config Engine — хранилище «ключ=значение», а также сохранение конфигов плагинов в БД и их автоматический старт. Плагин использует 

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

З.Ы. Все Многое уже реализовано, вопрос только в том нашил ли вы это или нет) 


Ну тогда значит самый большой минус для разработчиков — это сложность поиска ответов на интересующие вопросы, потому что вкладка с документацией у меня не закрывается, а ответов от неё часто не добиться.
avatar
Такое решение, имхо, должно быть из коробки,
Я уже говорил на эту тему и Максим заинтересован.

Документация по ЛС — больная тема, некому её писать. В свободное время пишу — http://livestreetguide.com
avatar
Спасибо за ссылку, добавил в избранное, обязательно изучу.

Проблему ведения документации, я как разработчик, прекрасно понимаю. Но очень сложно расширять сообщество, когда разработчики должны методом тыка искать решения своих проблем, так что в любом случае, это не менее важный момент, чем развитие самой CMS.
avatar
Кстати, что скажите по поводу кроне, я опять промахнулся?
avatar
с кроном вы попали в точку)
предложенное вами решение вроде как у ВП релизовано.
avatar
предложенное вами решение вроде как у ВП релизовано.

Тоже что-то такое припоминаю, может этот вариант я оттуда и почерпнул.

Кстати только что понял, что вариант псевдокрона легко реализовывается и внутри плагина, ведь всё что нужно уже есть. Но минусы этого подхода остаются: всё таки не очень хорошо, при загрузке каждой страницы проверять «а не нужно ли нам что-то сделать», особенно это будет проектах с большой посещалкой. Да и чем больше плагинов используют этот подход, тем больше мы нагружаем сервер, так что моё мнение не изменилось — этим должно заниматься ядро CMS и желательно в виде варианта с центральным кроном.
avatar
Но минусы этого подхода остаются: всё таки не очень хорошо, при загрузке каждой страницы проверять «а не нужно ли нам что-то сделать», особенно это будет проектах с большой посещалкой.
Я у себя реализовывал и «псевдокрон» и «центральный крон» — могу сказать, что потеря в псевдокроне совершенно не критична — один наипростейший SQL-запрос это ерунда — если проект хоть сколь-нибудь посещаем, то его результат практически постоянно висит в кэше самого mysql, да еще и кэширование самого ЛС есть, если mysql сильно загружен. Так, что для посещаемых проектов это как раз нормальное решение — другое дело, что надо сами операции разбивать на кусочки, чтобы субъективно не сильно увеличивать время отдачи страниц. А тут ряд подводных камней может быть. Например, как раз, у не сильно посещаемых проектов между выполнениями двух «кусочков» может пройти какое-то время, что может быть критичным.

А вариант с центральным кроном всем хорош, но да — надо как-то объяснять пользователям, что это дело требуется настроить на их хостинге, а для некоторых это просто беда.
avatar
Может поделитесь реализацией центрального крона? Честно говоря сам уже хотел писать, но если есть готовое решение — то было бы просто замечательно.

Что касается нагрузки, то я не специалист в этой области, возможно вы и правы, спорить не буду. Мои высказывания базируются всего лишь на догадках.
avatar
Это все никак не в виде плагина, а как часть чего-то большего, поэтому…
avatar
Третье, что не нравится (а может не нашел) — это невозможность брать языковые константы из ява скриптов. Точнее есть какое-то ls.lang.get, но оно не берет ни з языковых файлов плагина, ни с файлов шаблона, а это значит что нормально диалог подтверждения не сделать. Этот момент на самом деле не критичный, так, мелкое неудобство, но всё равно решил написать.
Для этого их сначала надо подгрузить в скрипты:
    jQuery(document).ready(function($){
        ls.lang.load({lang_load name="plugin.event.willgo"});
    });
avatar
Всем, кто дал подсказки по решению интересующих меня проблем — большое спасибо, обязательно возьму на заметку. Жаль только, что так поздно узнал об этом
avatar
Жаль только, что так поздно узнал об этом
Может стоит задавать вопросы почаще :)
avatar
Возможно. Но на вопросы нужно ждать ответ, а время на ожидание не всегда есть. Да и как-то привык искать ответы сам, лучше в памяти откладывается.
avatar
В итоге имеем один вариант на 300 Кб без этого срипта и на 301 Кб с ним. Зачем мне перекачивать еще раз те 300 Кб, которые мы уже имели ради одной страницы
В конечном итоге лучше использовать объединенный вариант, так как будет меньше запросов, а у пользователей файлы закешируются браузером. Для разработки не должно быть жалко 300кб трффика. Пусть и каждое обновление.
avatar
На один запрос больше — это не критично ни для пользователей, ни для сервера. Всё равно браузеры потом закешируют файл.
avatar
Запросы как раз таки критичны. Лучше один файл в 300кб, чем 3 по 100.
avatar
Давайте разберемся: есть страница, на которой используется один дополнительный ява скрипт. Используется он только на этой странице. На остальном сайте он используется стандартный набор скриптов, которую CMS объединяет в один файл в 300 Кб. Итого, при заходе на главную страницу сайт клиент скачивает этот 300 Кб файл, при переходе на страницу, он скачивает объединенный с этим скриптом файл в 301 Кб, а значит имеем 2 запроса файла — первый при открытии любой страницы файла и второй, при открытии страницы файла с дополнительным скриптом. Суммарно клиент скачал 601 Кб и сделал 2 запроса.

В моём вариант клиент качает те же 300 Кб при открытии страниц сайта и еще 1 Кб при открытии страницы с дополнительным файлом. В результате те же 2 запроса, но трафика ушло почти в раза меньше.

Теперь объясните мне преимущество вашего варианта.
комментарий был удален
комментарий был удален
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.