ExtJS + TreePanel => реализация check дерева с пред параметрами

http://docs.sencha.com/ext-js/4-0/#!/example/tree/check-tree.html - По примеру пишу своё дерево.
Данные подружаются аяксом (в json обёртке).
Соответственно при открытии кого-либо узла - он разворачивается и подгружает данные.

так вот есть список узлов, которые необходимо отметить сразу (сразу подготовленные данные с корня до низшего узла ). Как можно их сразу выделить и соответственно раскрыть необходимые узлы.

Есть ли встроенные возможности? (искал в доках, но не увидел)

Код: /** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .javascript.geshi_code {font-family:monospace;} .javascript.geshi_code .imp {font-weight: bold; color: red;} .javascript.geshi_code .kw1 {color: #000066; font-weight: bold;} .javascript.geshi_code .kw2 {color: #003366; font-weight: bold;} .javascript.geshi_code .kw3 {color: #000066;} .javascript.geshi_code .co1 {color: #006600; font-style: italic;} .javascript.geshi_code .co2 {color: #009966; font-style: italic;} .javascript.geshi_code .coMULTI {color: #006600; font-style: italic;} .javascript.geshi_code .es0 {color: #000099; font-weight: bold;} .javascript.geshi_code .br0 {color: #009900;} .javascript.geshi_code .sy0 {color: #339933;} .javascript.geshi_code .st0 {color: #3366CC;} .javascript.geshi_code .nu0 {color: #CC0000;} .javascript.geshi_code .me1 {color: #660066;} .javascript.geshi_code span.xtra { display:block; }

Ext.require([
    'Ext.tree.*',
    'Ext.data.*',
    'Ext.window.MessageBox'
]);

Ext.onReady(function() {
    var storeq = Ext.create('Ext.data.TreeStore', {
        proxy: {
            type: 'ajax',
            url: 'index.php?action=ad_preset&mod=4'
        },
        sorters: [{
            property: 'leaf',
            direction: 'ASC'
        }, {
            property: 'text',
            direction: 'ASC'
        }]
    });
 
    var tree = Ext.create('Ext.tree.Panel', {
        store: storeq,
        rootVisible: false,
        useArrows: true,
        frame: false,
        renderTo: 'basic_json2',
        width: 350,
        height: 190,
        root: {
          nodeType: 'async',
          text: 'Мир',
          id: 'geo',
          expanded :true
        },
        dockedItems: [{
            xtype: 'toolbar',
            items: {
                text: 'Get checked nodes',
                handler: function(){
                    var records = tree.getView().getChecked(),
                        names = [];
                   
                    Ext.Array.each(records, function(rec){
                        names.push(rec.get('text'));
                    });
                   
                    Ext.MessageBox.show({
                        title: 'Selected Nodes',
                        msg: names.join('
'
),
                        icon: Ext.MessageBox.INFO
                    });
                }
            }
        }]
    });
   
    storeq.load();
   

});
 


Генерация: /** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .php.geshi_code {font-family:monospace;} .php.geshi_code .imp {font-weight: bold; color: red;} .php.geshi_code .kw1 {color: #b1b100;} .php.geshi_code .kw2 {color: #000000; font-weight: bold;} .php.geshi_code .kw3 {color: #990000;} .php.geshi_code .co1 {color: #666666; font-style: italic;} .php.geshi_code .co2 {color: #666666; font-style: italic;} .php.geshi_code .co3 {color: #0000cc; font-style: italic;} .php.geshi_code .co4 {color: #009933; font-style: italic;} .php.geshi_code .coMULTI {color: #666666; font-style: italic;} .php.geshi_code .es0 {color: #000099; font-weight: bold;} .php.geshi_code .es1 {color: #000099; font-weight: bold;} .php.geshi_code .es2 {color: #660099; font-weight: bold;} .php.geshi_code .es3 {color: #660099; font-weight: bold;} .php.geshi_code .es4 {color: #006699; font-weight: bold;} .php.geshi_code .es5 {color: #006699; font-weight: bold; font-style: italic;} .php.geshi_code .es6 {color: #009933; font-weight: bold;} .php.geshi_code .es_h {color: #000099; font-weight: bold;} .php.geshi_code .br0 {color: #009900;} .php.geshi_code .sy0 {color: #339933;} .php.geshi_code .sy1 {color: #000000; font-weight: bold;} .php.geshi_code .st0 {color: #0000ff;} .php.geshi_code .st_h {color: #0000ff;} .php.geshi_code .nu0 {color: #cc66cc;} .php.geshi_code .nu8 {color: #208080;} .php.geshi_code .nu12 {color: #208080;} .php.geshi_code .nu19 {color:#800080;} .php.geshi_code .me1 {color: #004000;} .php.geshi_code .me2 {color: #004000;} .php.geshi_code .re0 {color: #000088;} .php.geshi_code span.xtra { display:block; }

public function getGeoTree(){
    global $CCSIS_NS;
    if(!$sNode = CCSIS::input('_GET','node')){
        $sNode = CCSIS::input('_POST','node');
    }
    if (!empty($sNode)){
      if ($sNode == "geo"){
      echo json_encode($this->getRegionsForExtJs());
      exit;  
      } elseif(preg_match("/region/i",$sNode)){
        $aName = explode('_',$sNode);
        echo json_encode($this->getCountriesForExtJs($aName[1]));exit;
      } elseif(preg_match("/country/i",$sNode)){
        $aName = explode('_',$sNode);
        echo json_encode($this->getCitiesForExtJs($aName[1]));exit;
      }
     
     
     
      else {
        exit;
      }
    }
   
   
  }
 


Пример генерации массивов (которые уходят в json): /** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ ..geshi_code {font-family:monospace;} ..geshi_code .imp {font-weight: bold; color: red;} ..geshi_code span.xtra { display:block; }
 

1 ответов


Да, это возможно. Причем вам даже не нужно ничего менять в ExtJs. Надо только специальным образом подготовить данные для загрузки в дерево. Так как у вас данные приходят через json, значит этим должна заняться серверная сторона. Рулить можно используя свойсвтва дерева: leaf (если есть потомки, то leaf=false), expanded (если надо отрисовать узел открытым expanded=true), expandable (если пользователь может свернуть узел, то expandable=true).
В итоге в json надо превращать примерно такой массив со вложенными массивами для потомков:


array(
  'text' => 'Мир',
  'id' => 'geo',
  'cls' => 'folder',
  'leaf' => false,
  'expanded' => true,
  'expandable' => true,
  'children'[0] => array(
    'text'=>'Южное полушарие',
    'id'=>'geo1',
    'cls'=>'file',
    'leaf'=>true
  ),
  'children'[1] => array(
    'text'=>'Северное полушарие',
    'id'=>'geo2',
    'cls'=>'file',
    'leaf'=>true
  )
);
 
Естественно, формировать массив и заполнять потомков надо будет в цикле. Ручной лапшекод тут только для примера.