3 день пишу модуль для админки по уроку с хабра. Пришлось её всю перелопатить т.к на 2.3.1 сразу не взлетело. Еще и с Extjs знаком практически никак. В общем есть код: /* home.js */ brual.page.Home = function(config) {
config = config || {};
Ext.applyIf(config,{
components: [{
xtype: 'brual-panel-home',
renderTo: 'brual-main-div',
frame: true
}]
});
brual.page.Home.superclass.constructor.call(this,config);
};
Ext.extend(brual.page.Home, MODx.Component);
Ext.reg('brual-page-home', brual.page.Home);
Ext.onReady(function() {
MODx.load({ xtype: 'brual-page-home'});
}); /* panel.js */ brual.panel.Home = function(config) {
config = config || {};
Ext.apply(config,{
border: false,
baseCls: 'modx-formpanel',
frame : true,
items: [{
html: '',
border: false,
cls: 'modx-page-header'
},{
xtype: 'modx-tabs',
bodyStyle: 'padding: 10px',
defaults: { border: false, autoHeight: true },
border: true,
stateful: true,
stateId: 'brual-tabpanel',
stateEvents: ['tabchange'],
getState:function() {
return { activeTab:this.items.indexOf(this.getActiveTab()) };
},
items: [
{
title: 'Титл',
defaults: { autoHeight: true },
items: [
{
html: '',
border: false
},
{
xtype: 'brual-grid-users',
preventRender: true
}
]
}
]
}
]
});
brual.panel.Home.superclass.constructor.call(this,config);
};
/* Регистрируем панель, чтобы ее мог потом вызвать предыдущий скрипт */
Ext.extend(brual.panel.Home, MODx.Panel);
Ext.reg('brual-panel-home', brual.panel.Home); /* users.grid.js */ brual.grid.users = function(config) {
config = config || {};
Ext.applyIf(config, {
id: 'brual-grid-users',
url: brual.config.connector_url,
baseParams: { action: 'mgr/users.grid' },
fields: [
{ name: 'daily', type: 'bool' },
{ name: 'specialreview', type: 'bool' },
{ name: 'tradingideas', type: 'bool' },
{ name: 'active', type: 'bool',}
],
columns: [
{
header: "Daily",
dataIndex: 'daily',
width: 'auto',
sortable: true,
editor: {
xtype: 'xcheckbox',
}
},
{
header: "Special Review",
dataIndex: 'specialreview',
width: 'auto',
sortable: true,
editor: {
xtype: 'checkbox',
}
},
{
header: "Trading Ideas",
dataIndex: 'tradingideas',
width: 'auto',
sortable: true,
editor: {
xtype: 'checkbox',
}
},
{
header: "Активен",
dataIndex: 'active',
editor: {
xtype: 'checkbox',
}
},
],
autoHeight: true,
loadMask: true,
paging: true,
autosave: false,
remoteSort: true,
anchor: '97%',
});
brual.grid.users.superclass.constructor.call(this, config);
};
Ext.extend(brual.grid.users, MODx.grid.Grid, {
});
Ext.reg('brual-grid-users', brual.grid.users); И всё то хорошо, данные из бд вывелись в таблицу. Но мне нужно сделать её редактируемой, и застрял я на том, что не могу сделать checkbox Он то тоже работает, но выглядит это примерно так: table\table\table false\true\false Как заставить его вывести сам чекбокс, а не true\false? Чекбокс появляется при клике по таблице, когда его надо переключить, и после опять пропадает. Причем появляется тоже кривовато (не полностью перекрывает таблицу) Прошу помощи!
так, с этим разобрался, теперь не понимаю как вызвать экшн при изменении чекбокса. (сейчас он выглядит как в админке параметры с "Да\Нет".
Ждем Сергея Прохорова, он должен помочь. Он как раз не так давно делал грид с чекбоксами. Я ему уже маякнул. Правда он сейчас на море серфит, но в течении дня должен появиться :)
Большое спасибо! Пока отлично двигаюсь сам, думаю скоро возникнет вопрос о том как по кнопочке вызвать поп_ап, ну и собственно как сверстать его с помощью extjs :) Т.к на данный момент вопросов по extjs нет, оффтоп: как то можно вывести анонсы из категорий, которые "protected" для не авторизованных ?
В Эксте попап вызвать вообще не проблема: var w = new Ext.Window({});
w.show(); Т.к на данный момент вопросов по extjs нет, оффтоп: как то можно вывести анонсы из категорий, которые "protected" для не авторизованных ? Если вы попытаетесь получить список объектов документов, то недоступные для этого пользователя туда конечно же не попадут. Но это распространяется только на объекты, но не распространяется на SQL-запросы. То есть вы можете сделать простую выборку типа $q = $modx->newQuery('modResource');
$q->select(array(
"modResource.*",
));
$s = $q->prepare();
$s->execute();
$data = $s->fetchAll(PDO::FETCH_ASSOC);
foreach($data as $doc){
print_r($doc);
return;
} Таким образом у вас будут данные нужных вам документов (условия запроса подставите сами, какие нужно). Так же можете делать выборку data-процессором site/web/resources, он так же не проверяет права, ибо получает данные, а не объекты.
В ExtJs выглядит всё достаточно просто, но когда хочешь сделать админку как часть большого целого, то начинаешь падать всё глубже, при этом ударяясь о камни =) Столкнулся даже с тем, что не все примеры корректно работали(пользовался докой 3.4, вроде такой сейчас extjs в модх) В итоге пользовался примерами Василия Наумкина, у него кстати много полезных вещей, без которых я бы не сделал задуманное. В итоге получилось как то так: brual.combo.Snippet = function(config) {
config = config || {};
Ext.applyIf(config,{
name: 'snippet'
,hiddenName: 'snippet'
,displayField: 'name'
,valueField: 'id'
,fields: ['id','name']
,pageSize: 10
,hideMode: 'offsets'
,url: MODx.config.connectors_url + 'element/snippet.php'
,baseParams: {
action: 'getlist'
}
});
brual.combo.Snippet.superclass.constructor.call(this,config);
};
Ext.extend(brual.combo.Snippet,MODx.combo.ComboBox);
Ext.reg('brual-combo-snippet',brual.combo.Snippet);
brual.window.CreateNewUser = function(config) {
config = config || {};
this.ident = config.ident || 'mecnewsletter'+Ext.id();
Ext.applyIf(config,{
title: 'Добавить нового подписчика'
,id: this.ident
,url: brual.config.connector_url
,action: 'mgr/users.create'
,fields: [
{xtype: 'textfield', fieldLabel: 'E-mail',name: 'login',anchor: '99%'},
{xtype: 'checkbox', boxLabel: 'Доступ к разделу1', name: 'name1'},
{xtype: 'checkbox', boxLabel: 'Доступ к разделу2', name: 'name2'},
{xtype: 'checkbox', boxLabel: 'Доступ к разделу3', name: 'name3'},
],
items: [
{
html: 'Логин и пароль будут отправлены сразу после добавления нового пользователя.',
border: false,
cls: 'modx-page-header'
}]
,keys: [{key: Ext.EventObject.ENTER,shift: true,fn: function() {this.submit() },scope: this}]
});
brual.window.CreateNewUser.superclass.constructor.call(this,config);
};
Ext.extend(brual.window.CreateNewUser,MODx.Window);
Ext.reg('brual-window-newsletter-create',brual.window.CreateNewUser); Вот оно "вообще не проблема" :) Не хочется создавать новую тему, теперь встал вопрос как решить вот такую задачу: Добавляем новый ресурс, и в этот момент надо решить, отправить Анонсы для подписавшихся пользователей или нет. Что почитать\куда копать на эту тему? Спасибо.
Смотрите в сторону плагинов.