Разделы

JSAM - Восходящая звезда!

Привет друзья!
Две недели назад разработка нового сайта на MODx меня в очередной раз заставила «обрезать» админку до нужного функционала для «простого» заказчика.

Уже на тот момент функционал ManagerManager меня не удовлетворял и приходилось использовать различные хаки для меню, дерева ресурсов, чанков и т. д.

Ну вот и я пустился в путь написания плагина…
Сначала был плагин исключительно для дерева ресурсов. С помощью него я успешно прятал нужные мне ресурсы.

Потом возникла необходимость в редактировании меню. Не долго думав(день), я бросил в топку первый плагин и стал писать полнофункциональный плагин для управления всей админкой.

Сейчас я исключительно не хочу рассказывать, что было дальше, т. к. это не вступительный туториал.

Я хочу просто показать, что мой плагин JSAM на данный момент умеет.

Настройка производится с помощью всеми любимых правил :)

Например меню можно настроить как-то так:


if( data.type == 'menu' ){
  this.link.rename( 'Просмотр', false, 'Просмотр сайта' );
  this.link.rename( 'Новый ресурс', false, 'Новый документ' );  
  this.link.add( 'Элементы', 'Редактировать футер', 'index.php?id=1&a=78' );
  this.link.add( 'Элементы', 'Редактировать шаблон', 'index.php?id=3&a=16' );
  if( data.manager.shortname == 'Administrator' ){
    this.link.remove( 'Новая ссылка' );
    this.tab.rename( 'Элементы', 'Детали' );
    this.link.remove( 'Управление элементами' );
    // Управление META-тегами и ключевыми словами
    this.link.remove( 2, 'Детали' );
    this.tab.remove( 'Модули' );
    this.tab.remove( 'Пользователи' );
    this.tab.remove( 'Отчеты' );
    this.link.remove( 'Импортировать сайт' );
    this.link.remove( 'Экспортировать сайт' );
    this.link.remove( 'Конфигурация' );
    this.link.move( 'Очистить кэш', false, false, 'Инструменты' );
    this.link.move( 'Управление файлами', false, false, 'Инструменты' );
  }
}

А выглядеть это будет вот так:


С помощью JSAM также можно настроить чанки, шаблоны, ресурсы и т. д.

Например с помощью следующих правил можно настроить определённый чанк:

if( data.id == 1 && data.type == 'chunk' ){
	this.get.page.header().html( 'Редактировать футер' );
	this.get.page.description().html( 'Здесь вы можете отредактировать информацию, которая находится внизу страницы на сайте' );
	this.hide.settings();
	this.hide.redactor();
	this.hide.textarea.descriptionBlock();
	this.hide.actions.stay();
	this.hide.actions.copy();
	this.hide.actions.remove();
}

И вид:


Насколько вы успели заметить, правила написаны на языке JavaScript, как и впрочем всё остальное(люблю JavaScript!).
Также использую библиотеку jQuery 1.4.2

JSAM также при загрузке фрейма рисует оверлей и уберает монотонный прелоадер при загрузке ресурса:


JSAM любит консоль FireBug и с удовольствием печатает там отчёты:


UPD-2. Законченный вариант:


Естественно JSAM работает в отдельном фрейме, если его отдельно запустить от админки.

В нём присутствуют ещё куча вкусных бубликов.

НО! На данный момент он ещё в разработке. И поэтому чуть позже будет выложен законченный продукт.

Теперь самое главное! Этим топиком я ищу интересные идеи на счёт нового плагина. Может они у вас есть?)

UPD-1: Обновил код примера настройки меню.
  • +7
  • 28 февраля 2010, 11:16
  • Regent

Комментарии (81)

RSS свернуть / развернуть
+1
Плагин шикарный, отличная альтернатива MM :) Автор молодец.
avatar

style-nes

  • 1 марта 2010, 07:43
+1
Спасибо!

На данный момент полностью закончена разработка API управления меню :)
Приступаю к чанкам и шаблонам)
avatar

Regent

  • 1 марта 2010, 08:14
+1
Тоже люблю скрывать все лишнее от заказчика, но при работе с MM возникают некоторые сложности.

Если действовать, как я описал в топике, то для того, чтобы скрылись необходимые и/или показались необходимые поля нужно сохранить документ и открыть его для редактирования. Т.к. mm не умеет знает какому родителю принадлежит вновь создаваемый документ.

Собственно вопрос, будет ли такая возможность в JSAM.

И да, как расшифровывается JSAM? )))
avatar

pitbull

  • 1 марта 2010, 08:56
+1
pitbull, спасибо!

JSAM такие вещи знает ещё как!
Родитель у вновь создаваемого документа легко узнаётся…

Вообщем при создании/редактировании ресурса всегда в переменной data.parent будет доступен ID родителя :)

Помимо этого в переменной data.parentParent будет доступен ID родителя родителя, т. к. это тоже важный критерий при настройке ресурса. Лично мной подобный параметр был активно использован при разработке 2-х сайтов.

JSAM — JavaScript-Manager for admin
@description: JavaScript-инструментарий менеджера MODx для настройки внешнего вида панели администратора
avatar

Regent

  • 1 марта 2010, 09:03
0
Отлично!

Желаю скорейшего релиза ;)
avatar

pitbull

  • 1 марта 2010, 09:56
+1
Помимо этого в переменной data.parentParent будет доступен ID родителя родителя, т. к. это тоже важный критерий при настройке ресурса.


А не лучше будет сделать, как в jQuery parent в виде элемента и parents в виде массива родителей?

Или конструкция data.parent.parent не будет работать?
avatar

pitbull

  • 1 марта 2010, 09:58
+1
Это запросто можно сделать, НО есть одно большое НО!:
Представьте сколько будет запросов к БД!

С другой стороны это(data.parent[.parent[.parent[...]]]) ПРОСТО ЧЕРТОВСКИ УДОБНО БУДЕТ для настройки ресурсов.

Вот и я думаю, что выбрать?
avatar

Regent

  • 1 марта 2010, 10:18
+1
Я думаю, что этот механизм стоит реализовать хотя бы по тому, что количество SQL запросов в админке ну никак не является критичным параметром. Хотя бы в силу того, что зачастую больше одного человека в админке онлайн не бывает…

А если бывает и бывает, то непродолжительно, я думаю это никак ощутимо на производительности не скажется.
avatar

pitbull

  • 1 марта 2010, 10:22
+1
Сейчас обмозговал массив jsam.parents
Если его вот под такой формат делать:

jsam.parents = {
 // idNumber: parentNumber
 1: 0,
 2: 1,
 3: 1,
 25: 6
 // И т. д.
}

И создать функцию

jsam.getParent = function( id ){
 return jsam.parents[ id ];
}
// Даже и не нужна она почти

То конструкцию data.parent[.parent[.parent[...]]] легко создавать уже с помощью JS!
Какие плюсы?
При желании с помощью JS можно получить вообще ID родителя любого документа :)

Вот код, как будут запрашиваться данные:

$modx -> db -> query (
"SELECT `id`, `parent` FROM {$modx -> db -> config[ 'table_prefix' ]}site_content"
);

Запрос лёгок :)

Вердикт: jsam.parents и data.parent[.parent[.parent[...]]] быть!

pitbull спасибо!
avatar

Regent

  • 1 марта 2010, 10:33
0
Да, это важная и нужная штука будет!
avatar

pitbull

  • 1 марта 2010, 10:45
+1
Нехилый тут массивчик может получиться однако… Да и получить его можно из кеша, чтобы лишний запрос не плодить. Надо поглубже глянуть этот момент. Понятно, что для небольших сайтов все летать будет, но я лично всегда о больших тоже помню :)
avatar

Carw

  • 4 марта 2010, 03:02
0
Тогда есть задумка повесить на события сохранения/удаления документов код, который будет создавать этот масивчик, и сохранять его в файл. Потом же просто этот файл инклюдить.
Вот тогда действительно быстро дело будет!

Но это оставим пока на следующую версию.
avatar

Regent

  • 4 марта 2010, 08:50
+1
Да :)

Массив parents всё-таки будет находится в data, т. к. будет при загрузке нового документа обновляться.

В связи с этим можно сделать функцию jsam.parents( id ), которая будет проверять, вообще ли есть такой родитель в цепочке родителей ресурса:

if( data.type == 'document' && jsam.parents( 25 ) ){
 // Настройка для ресурсов, у которых есть родитель с ID=25 в цепочке родителей
}

Получается просто прекрасная и гибкая штука!

Сейчас уже могу сказать, что первая релизная версия будет 0.0.2rc1. С помощью неё можно будет настраивать: меню, дерево ресурсов, чанки, документы и главную страницу(именно сейчас её API в разработке). Будет поддержка ru и en языков в отчётах Firebug`a

Также будет создан сайт с доками по API и исчерпывающим опсианием :)
avatar

Regent

  • 1 марта 2010, 11:08
+1
Также будет создан сайт с доками по API


Я тоже любитель создавать сайты, но подумайте сможете ли вы в обозримые N лет оплачивать хостинг и доменное имя ;)

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

// мысли в слух )
avatar

pitbull

  • 1 марта 2010, 15:03
+1
Смогу. И уверен в этом.

Если что-то непредвиденное случится, есть люди, которые смогут об этом позаботиться ;)

// Сначала надо сделать, а там разберёмся :)
avatar

Regent

  • 1 марта 2010, 17:49
+2
Если потребуется, то могу оказать помощь с хостингом тоже. Для хорошего дела ничего не жалко.
avatar

Carw

  • 4 марта 2010, 03:04
0
Мне бы помощь с дизайном оказать попозже =)

А за предложение спасибо, но не надо. Денежка на это есть)
avatar

Regent

  • 4 марта 2010, 08:52
+1
Вот эта вот фича — с настройкой страниц в зависимости от родителя, это очень вкусно… Я бы даже сказал прорыв. Постоянно приходится идти на компромиссы между логикой построения дерева в каталоге и понятности интерфейса для секретарши.

А можно будет сделать так чтобы конкретные чанки открывались сразу с визуальным редактором а не просто как код? Как это реализовано с отдельными страницами?
avatar

banev

  • 2 марта 2010, 13:53
+1
Запросто!
+1 функция превращения textarea в TinyMCE
Я об этом кстати ещё не додумался :)

И естественно +1 хорошее предложение в копилку)
avatar

Regent

  • 2 марта 2010, 18:10
+2
Сказка. Ну… если пошла такая пьянка… :)

— Запрет на удаление документа с определенным ID (не на редактирование а именно на удаление).

— Запрет на создание дочерних документов ниже определенного уровня вложенности.
avatar

banev

  • 3 марта 2010, 00:42
+1
— Запрет на удаление документа с определенным ID (не на редактирование а именно на удаление) — это конечно возможно на стороне клиента, но придётся удалять кнопки удаления из редактирования самого документа, из дерева ресурсов и вообще в тех местах, где это можно сделать. Мне кажется, что это лучше сделать на сервере после нажатия кнопки «Удалить» — просто выдавать сообщение, что удалять нельзя. А вот как это делать, это уже подумать надо.

— Запрет на создание дочерних документов ниже определенного уровня вложенности. — вот это уже реальная задача и легко осуществимая! Можно ещё также сделать запрет на создания дочерних документов у определённого ID(в том числе и в корне — его ID=0). Теперь надо придумать ихнее API
avatar

Regent

  • 3 марта 2010, 08:47
+1
Полностью согласен с доводами.

По поводу второго предложения — есть ли вариант привязывать запрет не только к ID документа, но и к ID шаблона документа? Получится вообще идеальная схема каталога, где его структура будет утверждена клиентом на стадии составления техзадания, и у клиента не будет технической возможности нарушить логику создания новых веток и подпунктов. Это облегчит понимание клиентом возможностей структуры, а разработчиков избавит от необходимости верстки многоуровневых выпадающих меню, ну или от объяснений типа: «хоть вы и создали эту страницу — в меню она отображаться не будет, создайте на уровень повыше» :)

Исходя из моего опыта — абсолютное большинство информации можно структурировать обходясь двумя-тремя уровнями вложенности. Копая глубже клиент усложняет жизнь и себе и мне и посетителям. Бывают исключения — но редко…
avatar

banev

  • 3 марта 2010, 11:18
0
Да, по ID шаблона можно будет также сделать запрет!
Вообще можно будет сделать запрет по:
1. Если есть определённый ID в цепочке родителей
2. ID шаблона по умолчанию в этом новом документе
3. Ещё какие-то некоторые детали нового документа(если они есть)

Собственно такая гибкость самой настройки сможет дать полностью удовлетворяющую админку без головной боли!
avatar

Regent

  • 3 марта 2010, 17:18
+1
Шикарно… Пойду подумаю над новыми предложениями :))))))
avatar

banev

  • 3 марта 2010, 18:02
+1
Сюда же в копилку можно сделать выбор шаблона для конкретного родителя. Наконец-то секретарши не перепутают страницу с контентом и список статей. И смену запретить! :)
avatar

Carw

  • 4 марта 2010, 03:11
+1
Отличная идея!
+1 в копилку =)
avatar

Regent

  • 4 марта 2010, 08:52
+1
Насколько я понимаю, запрет смены можно реализовать как это сделано в MM — ненужные шаблоны, просто не отображаются в выпадающем списке. Довольно удобно.
avatar

banev

  • 4 марта 2010, 10:38
+1
надо еще не просто сделать жесткую привязку шаблона к родителю, но сделать возможность ограничивать шаблоны несколькими (скажем в разделе «Продукция» можно создать «Категорию», или «Карточку товара»).

ну и совсем круто было бы в дереве сайта: меню->дочерний ресурс->список шаблонов :)
avatar

antonkuzmin

  • 4 марта 2010, 21:55
+2
На счёт первого — делается с помощью логики както так:

if( jsam.isParents( data.id, 52/*ID раздела продукции*/ ) ){
  this.template.hide()
  this.template.show( 'Категория' )
  this.template.show( 'Карточка товара' )
}


На счёт второго не понял =)
avatar

Regent

  • 4 марта 2010, 22:15
+1
Насколько я понял, Антон хочет чтобы по правому клику в дереве в место ссылки СОЗДАТЬ ДОЧЕРНИЙ ДОКУМЕНТ появлялись несколько ссылок с шаблонами документов которые можно создавать в этом родителе СОЗДАТЬ ТОВАР
СОЗДАТЬ ИНФОРМАЦИОННУЮ СТРАНИЦУ
СОЗДАТЬ ФОТОГАЛЕРЕЮ

Мысль шикарная, но реализуемо ли?

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

banev

  • 5 марта 2010, 12:49
0
Думаю, это реализуемо!
Только перед этим нужно будет хорошо покопаться в API текущего дерева ресурсов. Ещё не разбирал его по косточкам)

Да, первый вариант шикарнее второго)
avatar

Regent

  • 5 марта 2010, 18:01
0
Точно реализуемо. Я плотно работал с деревом, так что, если что — могу помочь :)
Изменить / добавить пункты можно легко.
avatar

burik

  • 21 марта 2010, 12:19
+1
banev, спасибо, подняли настроение)

Итак, почти дописал объект(-набор функций) для управления табами в правом нижнем фрейме(Главная страница, ресурсы, чанки и т. д.).

Конечно там табы организовавыются не так, как хотелось бы — и из-за этого много мороки. Табы организовываются с помощью виджета Tab Pane 1.02(For WebFX (http://webfx.eae.net/)) — 2003 года выпуска

Мной на данынй момент написаны функции:
1. Получение всех/определённого таба, как jQuery объектов
2. «Клика», т. е. отображения определённого таба по умолчанию
3. Скрытия/Показывания определённого таба
4. ДОБАВЛЕНИЯ нового таба
5. Перемещения определённого таба в определённую позицию среди табов
6. Переименования таба

Хочу спросить, может ещё какие функции нужны?
avatar

Regent

  • 3 марта 2010, 18:25
+1
Закончил «языковые войны» :)
Теперь JSAM поддерживает два языка: русский и английский.
По умолчанию стоит английский язык.
Язык определяется не из userAgent браузера, а именно из переменной в конфиге, т. е. $modx -> config[ 'manager_language' ]

Вот вкусная картинка примеров отчёта в Firebug`e на двух языках:
avatar

Regent

  • 3 марта 2010, 22:24
+1
Вообще замысел шикарный!

У меня вот мысль еще появилась, а не влить ли сюда еще мой эксперимент? Направления по-сути близки и дополнительные плюсы для разработчика получатся, особенно если это дело еще расширить до шаблонов / плагинов / модулей.
avatar

Carw

  • 4 марта 2010, 03:21
+1
Хорошая мысль

Но одно но! Чуть позже и в виде модуля

Да да, модуля :)

Т. е. впереди абсолютная безграничность настройки админки
avatar

Regent

  • 4 марта 2010, 08:55
+1
А что именно в виде модуля? Там настройка правил будет?
avatar

Carw

  • 4 марта 2010, 22:49
+1
Это пока задумывается, как в MM.
Т. е. в папке плагина jsam будет папка, например extensions, *.inc.php файлы в которой будут выполнятся после ввода в фрейм jsam`а, но до выполнения правил.
Собственно так можно будет создать что угодно
avatar

Regent

  • 4 марта 2010, 22:55
+5
Почти дописал API управления главной страницей

Вот небольшой примерчик настройки главной страницы для редактора:

switch( data.type ){
  case 'menu':
    // Правила для настройки меню...
    break;
  case 'home':
    this.tab.hide( 'Новости MODx', 'Уведомления безопасности', 'Онлайн' );
    this.tab.rename( 'Информация', 'Информация о вас' );
    this.tab.add( 'Инструкция', '<h2>Привет!</h2>Вверху находится меню и то сё...<br><br>Слева находится дерево ресурсов.<br>Кликните...', 2/* Позиция*/ );
    this.message.hide();
    this.button.hide( 'Менеджеры', 'Веб-пользователи' );
    this.button.add( 'Создать документ', '?a=4', 'circlerightarrow'/* Иконка */, 1/* Позиция*/ );
    this.button.rename( 'Модули', 'Редактировать шаблон', '?id=3&a=16' );
    this.button.rename( 'Элементы', 'Редактировать футер', '?id=1&a=78' );
  default:
    break;
}


А вот результат:

И вторая вкладка:
avatar

Regent

  • 4 марта 2010, 10:23
+1
Как раз думал предложить такую мысль. А тут уже на опережение.

Еще сегодня такая мысль пришла интересная. Как насчет расширенных виджетов? Стандартный список не всегда дает нужные возможности, а при желании допустим можно привязать совершенно новый вид виджета. Изначально скажем использовать стандартное текстовое поле, а затем менять его на нужный вид. Это позволит и множественную привязку файлов сделать или некую галерею, или управление тегами, как в ММ.
avatar

Carw

  • 4 марта 2010, 22:55
+3
Так понял, это для редактирования ресурса?

В предыдущем комментарии я выразился «модуль». А имел ввиду виджет :)

Да, конечно таких виджетов можно будет написать приличное множество!

Вот такие виджеты задумывались с неделю назад:
1. Виджет мини-галереи изображений — аналог поля «добавить изображение», только с предпросмотром и множественным добавлением изображений в одно поле
2. Виджет «Пара-значение». Полностью настраиваемый виджет текстовых полей. Например вида:
Имя:input, Название:inpiut
Имя:input, Название:inpiut
И всё это с помощью одной функции, которая превращает обычный input во всё это.

Наверно из моих слов ничего не понятно :)
avatar

Regent

  • 4 марта 2010, 23:05
+1
Отлично! Как раз об этом я и говорил. Хотя лучше наверное не инпут, а текстовое поле… но это уже не принципиально.

Но если выше действительно под модулем на самом деле подразумевался виджет, то тогда я не понимаю как мой эксперимент можно в виде модуля тем более, если расширить на плагины / шаблоны. :)
avatar

Carw

  • 4 марта 2010, 23:12
+2
А всё-таки можно будет :)

Ведь JSAM работает на самом самом самом событии OnManagerPageInit, с помощью которого всё можно :)

А также легко можно добавить искусственно события OnSnipFormPrerender и OnBeforeSnipFormSave(это я щас так думаю)…
avatar

Regent

  • 5 марта 2010, 08:56
+1
Ну тогда дело за малым :-)
avatar

Carw

  • 6 марта 2010, 01:23
+2
Реализовал ассоциативный массив jsam.map, который имеет примерный вид:
jsam.map = {
  // documentID: parentID
  1: 0,
  2: 0,
  3: 1,
  ......,
  25: 6
  length: 18,
  max: 25
}


С помощью этого массива вытекают красивые способы логической настройки! А на данный момент функции:
1. jsam.isParents( documentID, parentID ) — проверяет, есть ли у документа documentID родитель в цепочке родителей с ID равном parentID
2. jsam.getParents( documentID ) — возвращает список родителей документа
3. jsam.level( documentID ) — возвращает уровень вложенности документа! С помощью этой функции можно например запретить создание документов ниже определённого уровня вложенности и т. д.!

Пока придумываю ещё функции…
avatar

Regent

  • 5 марта 2010, 18:18
+1
Вот-это да! Это прорыв и фантастика! Два дня не читал комменты, а тут просто бомба =)

Regent, вы, этот — молодец!!! ;)
avatar

pitbull

  • 5 марта 2010, 20:40
0
Просто спасибо!)

Меня такие комментарии всё больше поддалкивают на работу)
avatar

Regent

  • 5 марта 2010, 21:24
+1
Теперь не нужно запоминать инглиш названия полей для их манипулирования)

Выборка полей происходит по их текущему имени!
Например:

this.field( 'Заголовок' ) // Получить TR элемент таблицы - поле Заголовок, как jQuery объект
this.field.hide( 'Шаблон' ) // Скрыть поле "Шаблон"
this.field.hide( 'Изображение' ) // Скрыть TV-параметр Изображение :)
this.field.rename( 'Описание', 'Аннотация' ) // Переименовать поле 'Описание'


Просто?)
avatar

Regent

  • 5 марта 2010, 22:45
+1
Это отлично! А пересечений не может возникнуть? Например:

Заголовок
Расширенный заголовок
avatar

Carw

  • 6 марта 2010, 01:27
+1
В том то и дело, что нет)
Проверяется на полное соответствие)

Если вдаваться в подробности, то я использую всевдо-селектор :contains

Вот код:
function( name ){
  var selector = ':contains("' + name.replace( /"/g, '\\"' ) + '")';
  return $( 'tr:has( > td > span[class="warning"]' + selector + '), .sectionHeader' + selector + ' + .sectionBody' );
}
avatar

Regent

  • 6 марта 2010, 12:03
+4
Создал замечательную функцию регулирования ширины названия поля или его содержимого
this.field.width( nameWidth, inputWidth )

Например вот результат такого кода:
this.field.width( 200 )



Больше названия полей не будут сжиматься до ужаса)
avatar

Regent

  • 7 марта 2010, 15:33
+1
Блестяще! Я постоянно лезу в мутэйт динамик, чтобы принудительно расширить место для названий ТВ параметров и комментариев к ним.
avatar

banev

  • 7 марта 2010, 22:53
0
Спасибо!

Закрытое тестирование приближается =)

В этой релизной версии будет возможность управления отображением ресурсов,
, чанков, меню и деревом. На большее пока меня не хватит(
avatar

Regent

  • 8 марта 2010, 10:58
0
Добавь меня в список бетатестеров! :)
avatar

banev

  • 8 марта 2010, 14:45
0
Замётано =)
avatar

Regent

  • 8 марта 2010, 17:00
0
+1 ;)
avatar

pitbull

  • 9 марта 2010, 08:53
+5
И вот двухдневный матч с tinyMCE закончился моей победой =)

Всё началось с того, что любое манипулирование с tinyMCE в перемещениях по DOM заканчивалось крахом самого tinyMCE. Ну после этого удара tinyMCE отнял у меня 50% стимула к дальнейшему развитию этой ветки. Остальные 50% ушли в глубокие раздумья на сутки.

Сегодня утром мозг сконструировал гениальное решение и теперь манипулирование с DOM-окружением tinyMCE происходит идеально :)

Более того tinyMCE в качестве контрибуции согласился на функцию быстрого переключения его в textarea и обратно(Результат — около 0,7ms времени). Также теперь любое поле можно будет превратить в tinyMCE :)

На данный момент полностью дописаны API управления меню и главной страницей. Сейчас ведётся работа над страничкой редактирования/создания ресурса. После будет быстро пересоздано API управления страничкой редактирования/создания чанка. Ну а в конце будет закинуто пару функций в API управления деревом ресурсов!

Также в бета-версии будут доступны два вшитых виджета:
1. Превращает поле в файл-менеджер
2. Превращает поле в картинко-менеджер

Вот такие дела =)
avatar

Regent

  • 17 марта 2010, 20:03
+3
Еще раз хочу сказать спасибо за ваши труды! С нетерпением ждем JSAM :)
avatar

style-nes

  • 17 марта 2010, 22:54
+3
В рамках разработки SBShop появились кое-какие интересные идеи. Отписал в личку ;-)
avatar

Carw

  • 18 марта 2010, 10:06
+2
Встречайте первый виджет — vFls — интерактивный менеджер файлов:

Пока по его функционалу планируется приделать управление максимальным количеством файлов и вариант для одного файла.
А вот как его вызывать:
this.field.vFls( 'Long title', {max:0}/*options*/ );

Есть какие нибудь пожелания по его функционалу?

П. С. Кто-нибудь знает что-нибудь про исчезание содержимого тега td в IE7 при наведении?
Уже день борюсь с этим недоразумением(
Причём происходит следующее: страничка загрузилась, виджет создался. Наведение на виджет мышкой и содержимое перестаёт отображаться(
avatar

Regent

  • 19 марта 2010, 17:06
0
Возможно какое-то наложение срабатывает или какой-то тег незакрытый. Проверь тщательно весь код виджета и попробуй без скриптов его открыть.
avatar

Carw

  • 20 марта 2010, 12:31
0
JSAM тут не причём, это точно. Ещё давно, когда я писал один виджет для MM, то такая штука тоже происходила. И причём это было на первой вкладке(Общие). Помог перенос того поля в другую вкладку.

Сейчас попробовал создать виджет во второй вкладке. Тоже самое — при наведении исчезает. Но когда я нажимаю на первую вкладку, а потом опять на вторую, где расположен виджет — виджет появляется, при наведении исчезает. Такое чувство, что это MooTools или TabPane сума сходят. Попробую проанализировать полностью код странички и скриптов
avatar

Regent

  • 20 марта 2010, 15:01
+1
Я и говорю — надо разбирать по косточкам. В этом случае только эксперименты приведут к истине.
avatar

Carw

  • 20 марта 2010, 17:08
0
Решил эту задачку.
Ответ: проделки виджета TabPane. Ну а точнее это проделки IE6/7. При динамической вставке контента происходит конфликт z-index`ов и ячейка проваливается под саму таблицу.
Вот такой фикс я использую:
.dynamic-tab-pane-control .tab-page div, .dynamic-tab-pane-control .tab-page table {
  position: relative;
  z-index: 3;
}

И на это я убил последних 2,5 дня + недоумение в прошлом. Как досадно, удар в спину :(
avatar

Regent

  • 21 марта 2010, 00:49
+1
Да уж… IE умеет увеличивать объем работы.
avatar

Carw

  • 21 марта 2010, 08:42
0
На вид клевый виджет получился :) А как использовать полученный список файлов во фронтенде, скажем сделать список ссылок для скачивания этих файлов?
avatar

antonkuzmin

  • 21 марта 2010, 10:06
+1
Там всё очень просто — разделителем является запятая!
$files = explode( ',' $modx -> documentObject( 'objName' ) );
avatar

Regent

  • 21 марта 2010, 10:50
0
Предлагаю использовать более классический для MODx разделитель "||", так как запятая может использоваться в содержимом разных виджетов, да и нестандартность не есть хорошо.
avatar

Carw

  • 21 марта 2010, 11:10
+1
Взял на вооружение, спасибо
avatar

Regent

  • 21 марта 2010, 11:50
0
Потрясающе. А возможен ли виджет, добавляющий автокомплит для текстового поля?
avatar

Leadmonkey

  • 24 марта 2010, 01:26
0
Можно всё, что угодно. Только надо сначало подумать, откуда базу слов брать для автокомплита. Самое простое решение — писать их при инициализации виджета в файле правил
avatar

Regent

  • 24 марта 2010, 18:18
0
Я несколько иное имел в виду — вытаскивать аяксом значения поля у уже введеных докуметов. Было бы очень здорово для тегов и других случаев, когда информация может повторятся, а тв со списком использовать неудобно.
avatar

Leadmonkey

  • 24 марта 2010, 18:42
0
Да, так можно будет сделать. Всего лишь один запрос на сервер и база значений будет готова
avatar

Regent

  • 24 марта 2010, 19:16
+4
Отличная вещь будет! С ходу не могу предложить дельных идей, но то, что уже есть — это колоссальные возможности! Спасибо автору! :)
avatar

burik

  • 21 марта 2010, 12:20
+3
Оптимизировал работу с оверлеем — теперь оверлей растягивается на всю страницу, в отличии от MM, в котором он растягивался только на видимую область документа.

Написал функцию для искусственного добавления кода на события:
$jsam -> event( $eventName, $code );

Пример:
$jsam -> event( 'OnPluginFormRender', 'echo "Полезная информация"; myFunction();' );


Также добавил собственные события в плагин:
1. OnJsamCreated — запускается после создания класса JSAM
2. OnJsamBeforeExecution — запускается до начала работы по созданию основного кода JSAM
3. OnJsamAftereExecution — запускается после работы по созданию основного кода JSAM
4. OnJsamBeforeLoadExtension — запускается до начала подключения расширений/виджетов
5. OnJsamExtension — запускается во время подключения расширений/виджета
6. OnJsamLoadExtension — запускается после подключения всех расширений
7. OnJsamPrintCode — запускается до вывода окончательного кода JSAM

Сейчас ищу способ искусственного добавления на страничку редактирования плагина этих событий. Но ничего хорошего и прозрачного пока не придумал. Видимо придётся регистрировать их в табличке site_system_eventnames при первом запуске плагина.

Теперь на стороне клиента(т. е. в JS интерфейсе) доступна полная информация по родителю ресурса — по адресу jsam.parentInfo.
Сейчас встраиваю в JSAM альтернативу плагину Inherit Parent Template, который наследует шаблон родителя. JSAM уже будет заменять два плагина.

П. С. вам реально нужно подобие функции mm_inherit?
avatar

Regent

  • 21 марта 2010, 17:10
+3
Скорее бы уже релиз! Мне хочется это потрогать ;)
avatar

pitbull

  • 24 марта 2010, 07:52
+3
Я тоже грежу этой мечтой, но личная жизнь ставит свои условия.

К тому же просто совесть не позволяет выпустить абсолютно сырой продукт…

В мыслях уже проследил путь к релизу, т. е. что надо доделать. Постараюсь в течении недели всё доделать)
avatar

Regent

  • 24 марта 2010, 18:16
+3
Окончательно убив плагин Inherit Parent Template я организовал его функционал тремя строчками и вшил в core :)

if( $jsam -> type == 'document' && $jsam -> action == 4 && $jsam -> parentInfo[ 'id' ] != 0 ){
  $jsam -> event( 'OnDocFormPrerender', 'global $content; $content[ "template" ] = ' .  $jsam -> parentInfo[ 'template' ] . ';' );
}


П. С. Закрытое тестирование возможно будет на этой недели, если я успею доки спарсить с комментариев в JS-core файле.
Плагин на момент тестирования будет сыроват, но стабилен!
avatar

Regent

  • 26 марта 2010, 20:30
0
До!!! Готов к тесту
avatar

pitbull

  • 26 марта 2010, 23:35
0
Regent, я туп, безграмотен и криворук. Короче говоря, я — бесценный бетатестер.
avatar

banev

  • 27 марта 2010, 14:21
+3
Да я с превеликой радостью :)

Сейчас уже вроде закончил косметическую причёску основного JS файла. Он вышел на 2493 строки и весом в 103 КБ. Исключил небезопасные и недоделанные функции. В общем причесал.

Осталось доки из этого файла спарсить и скомпилировать в достойный вид. И конечно написать инструкцию и выложить на блог.

Доки по методам в файле имеют примерно такой вид:

/*
** @name:
**   vFls
** @path:
**   jsam => document => vFls
** @api:
**   jsam.document.vFls( id );
** @description:
**   Применить к полю виджет vFls
** @param "id":
**   Название поля или массив названий полей. Пример: "Title" или [ "Description", "Resource content" ]
** @returns:
**   jQuery Object - поля, к которым применён виджет vFls
** @example:
**   jsam.document.vFls( [ "Расширенный заголовок", "Содержимое ресурса" ] ); // Применить виджет к полям "Расширенный заголовок" и "Содержимое ресурса"
*/


Думаемс =)
avatar

Regent

  • 27 марта 2010, 18:45
0
Спасибо всем!
Дальнейшее обсуждение переносится в топик JSAM 0.0.2beta1 — Релиз!
avatar

Regent

  • 28 марта 2010, 22:24

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.