ExtJS взаимодействие с PHP на Ajax

scorpion-ds

Новичок
ExtJS взаимодействие с PHP на Ajax

Суть такая, работаю с элементом Ext.Toolbar, там через параметр items, передается структура меню и его события, такого вида:

Код:
items:[{
			text:'Добавить',
			icon: 'images/icons/fam/add.png',
			handler:function(){
				alert('Добавить');	
			}
		},{
			text:'Удалить',
			icon: 'images/icons/fam/delete.gif',
			handler:function(){
				alert('Удалить');	
			}
		}]
(у меня немного сложней, но суть такая)

так вот, эту структуру я хочу получать, не встраивая все это в код JS, а при помощи ajax, с учетом уровня доступа пользователя.

Для этого я эту структуру возвращаю с сервера в виде JSON, чем по сути и является эта структура, все получалось, пока я не дошел до реализации событий (параметр handler), передавая сформированный на PHP код, JS его виде как строку, а не функцию, это то вполне логично, но можно ли как-то обойти это?

Сейчас я делаю отдельную обработку на JS полученного результата от сервера, но тут столкнулся с проблемой, что не могу передать параметры в:
"handler:function(){
*сюда*
}"
внешние переменные JS там не видны, вернее, видна последняя переданная в цикле переменная, вот код:

Код:
function InitTopMenu(response)	{
				
		var tm = Ext.util.JSON.decode(response.responseText);
		var menu = new Array();
				
		for(var i=0;i<=(tm.length-1);i++)	{
			
			var sub_menu = new Array();		
			var p = '';
			for(var j=0; j<=(tm[i].menu.length - 1); j++)	{
			
				if(tm[i].menu[j].handler != undefined)	{
					p = tm[i].menu[j].handler;
					//alert(p);
					sub_menu[j] = {"text" : tm[i].menu[j].text, "handler" : function() { alert(p); }};
				}
				else
					sub_menu[j] = {"text" : tm[i].menu[j].text, "disabled" : true};
				
			}
			menu[i] = {"text" : tm[i].text, "menu" : sub_menu};
			
		}
				
		var toptoolbar = new Ext.Toolbar({
			renderTo: 'top_menu',
			items: menu
		});
	
	}
Ни как не разберусь, как нормально реализовать генерацию этого меню.
 

zerkms

TDD infected
Команда форума
так вот, эту структуру я хочу получать, не встраивая все это в код JS, а при помощи ajax, с учетом уровня доступа пользователя.
т.е. с учётом прав доступа во время генерации страницы и без ajax этого сделать нельзя?
 

dr-sm

Новичок
мда, чета код какой-то запутанный, для начала разберись как вобще передаются переменные, что-такое scope, createDelegate, и тп. ajax тут непричем. непонятно еще зачем одно в другое копировать. приведи пример исходных данных.
 

scorpion-ds

Новичок
Автор оригинала: dr-sm
мда, чета код какой-то запутанный, для начала разберись как вобще передаются переменные, что-такое scope, createDelegate, и тп. ajax тут непричем. непонятно еще зачем одно в другое копировать. приведи пример исходных данных.
извините долго не отвечал, тогда в отпуск ушел, а потом много работы было.

Код действительно запутанный, так как я очень плохо знаю ExtJS, нормальной документации на русской я по нему не нашел, а с английским у меня туго.

Что бы было более понятно, я оптимизировал немного код:

Код:
Ext.onReady(function(){
		
	var toptoolbar_items;
	
	//делаю запрос к серверу, в ответ должен получить структуру меню
	Ext.Ajax.request({
		   url: '/admin/ajax/',
		   success: function(response) { InitTopMenu(response); },
		   failure: function() { alert('failure'); },
		   params: { com: 'workspace', el: 'topmenu' }
		});
	
	
	function InitTopMenu(response)	{
		
		var tm = Ext.util.JSON.decode(response.responseText);
		
		function AddHandler(param)
		{	//событие клика по пункту меню
			alert(param.text);
		}
		
		//прохожусь по меню и добавляю на втором уровне вложености, "событие клика по пункту меню"
		for(var i=0;i<=(tm.length-1);i++)	{
			for(var j=0; j<=(tm[i].menu.length - 1); j++)	
				tm[i].menu[j]["handler"] = AddHandler;	
					
		}
		
		//создаю объект меню
		var toptoolbar = new Ext.Toolbar({
			renderTo: 'top_menu',
			items: tm
		});		
		
	}	
	
});
Данный получаемые от сервера:
Код:
Array
(
    [0] => Array
        (
            [text] => Менеджер сайта
            [menu] => Array
                (
                    [0] => Array
                        (
                            [text] => Главная страница
                        )

                    [1] => Array
                        (
                            [text] => Структура сайта
                        )

                    [2] => Array
                        (
                            [text] => Макеты страниц
                        )

                )

        )

    [1] => Array
        (
            [text] => Модули системы
            [menu] => Array
                (
                    [0] => Array
                        (
                            [text] => Новости
                        )

                    [1] => Array
                        (
                            [text] => Тестовая площадка 1
                        )

                    [2] => Array
                        (
                            [text] => Тестовая площадка 2
                        )

                    [3] => Array
                        (
                            [text] => Тестовая площадка 3
                        )

                    [4] => Array
                        (
                            [text] => Тестовая площадка 4
                        )

                )

        )

    [2] => Array
        (
            [text] => Настройка системы
            [menu] => Array
                (
                    [0] => Array
                        (
                            [text] => Сайты системы
                        )

                    [1] => Array
                        (
                            [text] => Параметры системы
                        )

                    [2] => Array
                        (
                            [text] => Шаблоны E-mail
                        )

                    [3] => Array
                        (
                            [text] => Почтовые рассылки
                        )

                )

        )

    [3] => Array
        (
            [text] => Менеджер пользователей
            [menu] => Array
                (
                    [0] => Array
                        (
                            [text] => Пользователи
                        )

                    [1] => Array
                        (
                            [text] => Группы
                        )

                )

        )

)
данные передаются в json, но для наглядности вывел их через print_r

В общем-то, то о чем я спрашивал я теперь решаю, то есть прохожусь по меню и добавляю событие клика:
Код:
for(var i=0;i<=(tm.length-1);i++)	{
			for(var j=0; j<=(tm[i].menu.length - 1); j++)	
				tm[i].menu[j]["handler"] = AddHandler;	
					
		}
идея рабочая, но кажется мне не особо "правильной", и это у меня пока еще нет вложенности более двух уровней.

Если я правильно понял описание createDelegate, то в общем-то оно делает, то же что я тупым присвоением "tm.menu[j]["handler"] = AddHandler;", только более продвинуто.
 
Сверху