テーブルの形の入力フォーム

2016年01月30日 13:18

ViewにはHTMLヘルパーをつかって作成

 

   echo $this->Form->create('Table',array('type'=>'post','action'=>'index/table'));
   
 
    $table_headers = array( 1 => "用紙サイズ",
                            3 => "日本",
                            4 => "欧米");
    
    $header_list = $this->Html->tableHeaders(
        $table_headers
    );
   
    $paperSizeList = array(
        1 => 'A4',
        2 => 'B5',
        3 => 'A3'
    );    
    
    //CellsListの作成
    $cellsList = array();
    $itemList = array();
    
    $itemIndex = 0; //tableCellsを使用するには、Indexは0Start
    $paperSizeIndex = 0;//tableCellsを使用するには、Indexは0Start
    
    //$cellsList[用紙サイズの種類][項目の種類]
    //用紙サイズごとのループ
    foreach ($paperSizeList as $paperSizekey => $paperSize ):
        $itemIndex = 0;
        //横1行の項目ごとのループ
        foreach ( $table_headers as $trkey => $item ):
            if( 1 == $trkey ){
                //1行目は項目名
                $itemList[$itemIndex] = $paperSize;
            }
            else{
                $paperTypeModelName = sprintf( "paperSize.%d.%d" , $paperSizekey , $trkey );
                $itemList[$itemIndex] = $this->element( 'checkbox' , array( 'paperTypeModelName' => $paperTypeModelName ) );
            }
            $itemIndex++;
        endforeach;
        $cellsList[$paperSizeIndex] = $itemList;
        $paperSizeIndex++;
    endforeach;
    
    
    $cellsList = $this->Html->tableCells(
        $cellsList
    );
    
    echo $this->Html->tag('table' , $header_list . $cellsList );
   
   echo $this->Form->end('確認');
 
用紙サイズ 項目1 項目2
A4      □    □
B5      □    □
A3      □    □
 
の形で作成。
 
でも、2行ヘッダがあったり、項目を結合指定したりすると、
どうやっていいかがわからない。
Indexは0から指定しないと、うまくうごかないし。
 
ヘルパーを使わない場合は
   echo $this->Form->create('Table',array('type'=>'post','action'=>'index/table'));
   
   
   
   
   //テーブルヘッダの出力
   
   
   
    $tableHeaders = array( 'title' => 
                                array ( 1 => array( 'itemName' => "用紙サイズ" , 'colSpanCount' => 1 ),
                                        2 => array( 'itemName' => "日本" , 'colSpanCount' => 2 ),
                                        3 => array( 'itemName' => "日本" , 'colSpanCount' => 0 ),
                                        4 => array( 'itemName' => "欧米" , 'colSpanCount' => 2 ),
                                        5 => array( 'itemName' => "欧米" , 'colSpanCount' => 0 )
                                        ),
                            'detection' => 
                                array ( 1 => array( 'itemName' => "" , 'colSpanCount' => 1 ),
                                        2 => array( 'itemName' => "自動検知" , 'colSpanCount' => 2 ),
                                        3 => array( 'itemName' => "自動検知" , 'colSpanCount' => 0 ),
                                        4 => array( 'itemName' => "手動検知" , 'colSpanCount' => 2 ),
                                        5 => array( 'itemName' => "手動検知" , 'colSpanCount' => 0 )                                    
                                    )                            
                );
    
    
    
    $paperSizeList = array(
        1 => 'A4',
        2 => 'B5',
        3 => 'A3'
    ); 
   
    echo '<table border>';
    
   //テーブルヘッダの出力
   //縦のループ
    $saveColSpanCount = 0;
    foreach ( $tableHeaders as $category => $listOfEachCategory ):
        echo '<tr>';
            
        //横一列のループ
        foreach ( $listOfEachCategory as $key => $itemInfo ):
                    if( $itemInfo['colSpanCount'] == 0 ){
                        //N/A
                    }
                    else{
                        $tag= sprintf( '<th colspan="%d">' , $itemInfo['colSpanCount']);
                         echo $tag;
                         echo $itemInfo['itemName'];
                         echo '</th>';
                    }
        endforeach;
        
        echo '</tr>';
    endforeach;
    
    
    //テーブルセルの出力
   //縦のループ
    foreach ( $paperSizeList as $paperSizeNo => $PaperSizeName ):
        echo '<tr>';
        //横一列のループ
        foreach ( $tableHeaders['title'] as $key => $titleValue ):
                echo '<th>';
                    if( 1 == $key ){
                        //1列目は項目名
                        echo $PaperSizeName;
                    }
                    else{
                        $paperTypeModelName = sprintf( "paperSize.%d.%d" , $paperSizeNo , $key );
                        echo $this->element( 'checkbox' , array( 'paperTypeModelName' => $paperTypeModelName ) );
                    }
                echo '</th>';            
            
        endforeach;
        echo '</tr>';
    endforeach;
    echo '</table>';
    
   
   echo $this->Form->end('確認');