Ext.Viewportでレイアウトがもっと簡単に

symfonyのプラグインもちょくちょく出始めて、本格的に使われるようになってきたExt。
2.0になっていろいろ変更されたけど、全コンポーネント、コンティナにユニークIDでアクセスできるようになったりと、
かなり使い勝手が良くなってます。レイアウトもJson形式でより手軽にレイアウトが可能になりました。

とりあえず以下のhtmlをベースに、どんどん着飾っていきます。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
 
<?php include_http_metas() ?>
<?php include_metas() ?>
 
<?php include_title() ?>
 
<link rel="shortcut icon" href="/favicon.ico" />
 
</head>
<body>
 
	<div id="north"></div>
	<div id="south"></div>
	<div id="west"></div>
	<div id="east"></div>
	<div id="center"><?php echo $sf_data->getRaw('sf_content') ?></div>
 
</body>
</html>
 
 

単に各パーツを区切ってポジショニングしただけの、何もないレイアウト。

Ext.onReady(function(){
 
  var viewport = new Ext.Viewport({
    layout: 'border',//レイアウトの形式を指定
    items:[
   //上部
    {
      region:'north',
      contentEl: 'north',
      height:35
    },
    //下部
    {
      region:'south',
      contentEl: 'south',
      height:100
    },
    //右部
    {
      region:'east',
      contentEl: 'east',
      width:200
    },
    //左部
    {
      region:'west',
      contentEl: 'west',
      width:150
    },
    //中央
    {
      region:'center',
      contentEl: 'center'
    }
 
 
    ]
  });
 
 
 
});

右、左、下にtitle属性を追加

Ext.onReady(function(){
 
  var viewport = new Ext.Viewport({
    layout: 'border',//レイアウトの形式を指定
    items:[
   //上部
    {
      region:'north',
      contentEl: 'north',
      height:35
    },
    //下部
    {
      region:'south',
      contentEl: 'south',
      height:100,
      title: "Footer"
    },
    //右部
    {
      region:'east',
      contentEl: 'east',
      width:200,
      title: "Right"
    },
    //左部
    {
      region:'west',
      contentEl: 'west',
      width:150,
      title: "Left"
    },
    //中央
    {
      region:'center',
      contentEl: 'center'
    }
    ]
  });
 
 
 
});

さらにsplit属性でサイズ変更可能にしてみる。

Ext.onReady(function(){
 
  var viewport = new Ext.Viewport({
    layout: 'border',//レイアウトの形式を指定
    items:[
   //上部
    {
      region:'north',
      contentEl: 'north',
      height:35
    },
    //下部
    {
      region:'south',
      contentEl: 'south',
      height:100,
      title: "Footer",
      split: true
    },
    //右部
    {
      region:'east',
      contentEl: 'east',
      width:200,
      title: "Right",
      split: true
    },
    //左部
    {
      region:'west',
      contentEl: 'west',
      width:150,
      title: "Left",
      split: true
    },
    //中央
    {
      region:'center',
      contentEl: 'center'
    }
    ]
  });
 
 
 
});

minSizemaxSizeで変更サイズに制限を持たせる

Ext.onReady(function(){
 
  var viewport = new Ext.Viewport({
    layout: 'border',//レイアウトの形式を指定
    items:[
   //上部
    {
      region:'north',
      contentEl: 'north',
      height:35
    },
    //下部
    {
      region:'south',
      contentEl: 'south',
      height:100,
      title: "Footer",
      split: true,
      minSize:80,
      maxSize:200
    },
    //右部
    {
      region:'east',
      contentEl: 'east',
      width:200,
      title: "Right",
      split: true,
      minSize:80,
      maxSize:200
    },
    //左部
    {
      region:'west',
      contentEl: 'west',
      width:150,
      title: "Left",
      split: true,
      minSize:80,
      maxSize:200
    },
    //中央
    {
      region:'center',
      contentEl: 'center'
    }
    ]
  });
 
 
 
});

collapsible属性でクリックで収納できるようにする

Ext.onReady(function(){
 
  var viewport = new Ext.Viewport({
    layout: 'border',//レイアウトの形式を指定
    items:[
   //上部
    {
      region:'north',
      contentEl: 'north',
      height:35
    },
    //下部
    {
      region:'south',
      contentEl: 'south',
      height:100,
      title: "Footer",
      split: true,
      minSize:80,
      maxSize:200,
      collapsible:true
    },
    //右部
    {
      region:'east',
      contentEl: 'east',
      width:200,
      title: "Right",
      split: true,
      minSize:80,
      maxSize:200,
      collapsible:true
    },
    //左部
    {
      region:'west',
      contentEl: 'west',
      width:150,
      title: "Left",
      split: true,
      minSize:80,
      maxSize:200,
      collapsible:true
    },
    //中央
    {
      region:'center',
      contentEl: 'center'
    }
    ]
  });
 
 
 
});