За последние 24 часа нас посетил 22081 программист и 1125 роботов. Сейчас ищут 795 программистов ...

Строим проект на ExtJS

Тема в разделе "Решения, алгоритмы", создана пользователем Ensiferum, 23 авг 2010.

  1. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Данный пост посвящен двум типам пользователей с разными целями:
    Гуру - скажите, что стоит улучшить в данном подходе (по части JS и PHP атак же со стороны реализации, может нужно по другому всё организовать),
    Новичкам - демонстрация возможностей ExtJS

    Предыстория:
    Почитав пост 440hz об игре, в которой админка основана на ExtJS, решил освоить сие творение и начал с орагнизации админки.

    Сам проект:
    Строим такую структуру файлов и папок:
    /ext
    /index.html
    /ajax.php
    /scripts/info.php
    /scripts/info3.php

    Каталог "ext" содержит фреймворк ExtJS

    index.html
    HTML:
    1.     <link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css">
    2.     <style>
    3. #menu .x-panel {
    4.     margin-bottom:3px;
    5.     margin-right:0;
    6. }
    7. #menu .x-panel-body {
    8.     border:0 none;
    9. }
    10. #menu .x-panel-body li {
    11.     margin:3px;    
    12. }
    13.  
    14. #menu .x-panel-body li a {
    15.     text-decoration:none;
    16.     color:#3764A0;
    17. }
    18. #menu .x-plain-body {
    19.     padding: 3px 0 0 5px;
    20. }
    21. #data {padding:15px;}
    22.     <script type="text/javascript" src="/ext/adapter/ext/ext-base.js"></script>
    23.     <script type="text/javascript" src="/ext/ext-all-debug.js"></script>
    24.     <script>
    25.    
    26.     var obj = "data";
    27.    
    28.     function DOM(obj) {
    29.         return document.getElementById(obj);
    30.     }
    31.  
    32.     function loadContent(url,postdata) {
    33.         var r = Ext.get(obj);
    34.         p = postdata? postdata : '';
    35.         r.load ({
    36.             url: url,
    37.             params: p,
    38.             method: "POST",
    39.             text: "работаем...",
    40.             callback:function(el, success, response){
    41.                 DOM(obj).innerHTML = '';
    42.                 var answer = Ext.util.JSON.decode(response.responseText);
    43.                 // Если получаем текст
    44.                 if (answer.text !== undefined && answer.text !== null)
    45.                     DOM(obj).innerHTML = answer.text;
    46.                 // Если получаем сообщения
    47.                 if (answer.window !== undefined && answer.window !== null)
    48.                     createMsg(answer.window.msg,answer.window.title);
    49.                 // Если есть код
    50.                 if (answer.code !== undefined && answer.code !== null)
    51.                     eval(answer.code);
    52.             }
    53.         });
    54.     }
    55.    
    56.     function createMsg(msg,title) {
    57.         Ext.Msg.show({
    58.             title: title,
    59.             modal: true,
    60.             msg: msg,
    61.             width: 300,
    62.             animEl: obj,
    63.             buttons: Ext.Msg.OK
    64.         });
    65.     }
    66.  
    67.     Ext.onReady(function(){    
    68.         var viewport = new Ext.Viewport({
    69.             layout: "border",
    70.             renderTo: Ext.getBody(),
    71.             items: [{
    72.                 id:'menu',
    73.                 region: 'west',
    74.                 xtype: 'panel',
    75.                 split:true,
    76.                 width:200, 
    77.                 collapseMode:'mini',
    78.                 baseCls: 'x-plain',
    79.                 margins:'5 0 5 5',             
    80.                 items:[{
    81.                     xtype:'panel',
    82.                     frame:true,
    83.                     title:'Общее',
    84.                     collapsible:true,                  
    85.                     titleCollapse:true,
    86.                     contentEl:'main'
    87.                 },{
    88.                     xtype:'',
    89.                     frame:true,
    90.                     title:'Модули',
    91.                     collapsible:true,
    92.                     titleCollapse:true,
    93.                     contentEl:'modules'
    94.                 }]
    95.             },{
    96.                 region: 'center',
    97.                 xtype: 'panel',
    98.                 html: '<div id="data"></div>'          
    99.             }]
    100.         });
    101.        
    102.        
    103.     });
    104.     </script>
    105. </head>
    106. <ul id="main" class="x-hidden">
    107.     <li>
    108.     <a href="#" onclick='loadContent("/ajax.php")'>Главная</a>
    109.     </li>
    110. </ul>
    111.  
    112. <ul id="modules" class="x-hidden">
    113.  
    114.     <li><a href="#" onclick='loadContent("/ajax.php?section=info")'>Info</a></li>
    115.     <li><a href="#" onclick='loadContent("/ajax.php?section=info2")'>Info2</a></li>
    116.     <li><a href="#" onclick='loadContent("/ajax.php?section=info3")'>Info3</a></li>
    117. </ul>
    118. </body>
    119.  
    120. </html>
    ajax.php
    PHP:
    1. <?
    2. error_reporting(E_ALL & ~E_NOTICE);
    3. header('Content-Type: text/html; charset=windows-1251');
    4.  
    5. DEFINE('INDEX',1);
    6.  
    7. function json_encode_safe($var) {
    8.     return json_encode(json_fix_cyr($var));
    9. }
    10.  
    11. function json_fix_cyr($var) {
    12.     if (is_array($var)) {
    13.         $new = array();
    14.         foreach ($var as $k => $v) {
    15.             $new[json_fix_cyr($k)] = json_fix_cyr($v);
    16.         }
    17.         return $new;
    18.     }
    19.     if (is_string($var)) {
    20.         return iconv('cp1251', 'utf-8', $var);
    21.     }
    22.     return $var;
    23. }
    24.  
    25. if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'){
    26.    
    27.     $result = array();
    28.    
    29.     if (isset($_GET['section']) and !empty($_GET['section'])) {
    30.         if (file_exists('scripts'.DIRECTORY_SEPARATOR.$_GET['section'].'.php'))
    31.             require_once('scripts'.DIRECTORY_SEPARATOR.$_GET['section'].'.php');
    32.         else {
    33.             $msg    = 'Нет такого модуля';
    34.             $title  = 'Ошибка';
    35.         }
    36.     }
    37.     else {
    38.         $text = '<p>Добро пожаловать в администраторскую панель</p>';
    39.     }  
    40.    
    41.     if (!empty($text))
    42.         $result['text']             = $text;
    43.     if (!empty($msg)) {
    44.         $result['window']['title']  = $title;
    45.         $result['window']['msg']    = $msg;
    46.     }
    47.     if (!empty($code))
    48.         $result['code']             = $code;
    49.    
    50.     echo json_encode_safe($result);
    51.     exit();
    52. }      
    53. else
    54.     die('Only AJAX');
    55. ?>
    info.php
    PHP:
    1. <?
    2. if (!DEFINED('INDEX')) DIE('Any hacking attempt');
    3.  
    4. $text = '<a href="#" onclick=\'loadContent("/ajax.php")\'>Ссылка</a><br/>
    5. Логин: <input id="login" type="text" name="login"><br/>
    6. Пароль: <input id="pass" type="text" name="pass"><br/>
    7. <button onclick=\'loadContent("/ajax.php?section=info","login="+Ext.get("login").getValue()+"&pass="+Ext.get("pass").getValue());\'>Го!</button>
    8. ';
    9. if (isset($_POST['login']) or isset($_POST['pass'])) {
    10.     $text = 'Ваши данные: ' . iconv('utf-8', 'cp1251', $_POST['login']) . '/' . $_POST['pass'];
    11. }
    info3.php
    PHP:
    1. <?
    2. if (!DEFINED('INDEX')) DIE('Any hacking attempt');
    3.  
    4. $code = 'alert("any JS code");';
    Немного поясню код:

    Данные передаются в JSON. Дабы не было проблем с русскими буквами, написал функцию json_encode_safe (в ajax.php). Через переменную "section" подгружаются модули из папки scripts (при условии, что они там есть). После выполнения работы модулей формируются 3 типа ответов обработчиком: текст, окно и код. Текст выводится в div с заданным ID, окно выводится средствами ExtJS, а код выполняется через eval(). В файле info.php пример использования ссылок и отправка данных текстовых полей
    в ajax.php
     
  2. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Скрины:

    [​IMG]
    [​IMG]
     
  3. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    ну ExtJS тут вообще как бы просто, это всё можно и без либы сделать...
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    А в чем приемущество перед jQuery?
     
  5. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Преимущества есть, но в этом примере ты их не найдешь =)
     
  6. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    конечно, здесь не показано все, на что способен ExtJS, но постепенно думаю получится освоить. в ближайшее время хочу приделать гриды
     
  7. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    пойду лучше дальше читать "jQuery в действии" :)
     
  8. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Я сам любитель jQuery, но тут захотелось освоить ExtJS ))