2012-03-02 12 views
2

私はCakePHPビューのhtmlテーブルに行を追加し、必要に応じてIDの/名前を増やそうとしています。テーブルを生成するために使用されるコードである:私は同じ形式でなくてテーブルに追加行を希望リンク/ボタンをクリックするとCakePHP 2.0 htmlテーブル行を追加

<tbody> 
    <tr> 
    <td><div class="input text"><input name="data[OrderDetail][0][product_code]" maxlength="100" type="text"/></div></td> 
    <td><div class="input text"><input name="data[OrderDetail][0][product_name]" maxlength="255" type="text"/></div></td> 
    <td><div class="input number"><input name="data[OrderDetail][0][product_qty]" step="any" type="number"/></div></td> 
    <td><div class="input number"><input name="data[OrderDetail][0][product_price]" step="any" maxlength="24" type="number"/></div></td> 
    </tr> 
</tbody> 

<tbody> 
    <tr> 
    <td><?php echo $this->Form->input('OrderDetail.0.product_code'); ?></td> 
    <td><?php echo $this->Form->input('OrderDetail.0.product_name'); ?></td> 
    <td><?php echo $this->Form->input('OrderDetail.0.product_qty'); ?></td> 
    <td><?php echo $this->Form->input('OrderDetail.0.product_price'); ?></td> 
    </tr> 
</tbody> 

CakePHPは次のHTMLを出力します。以下のような1つインクリメント配列:

<tbody> 
    <tr> 
    <td><div class="input text"><input name="data[OrderDetail][0][product_code]" maxlength="100" type="text"/></div></td> 
    <td><div class="input text"><input name="data[OrderDetail][0][product_name]" maxlength="255" type="text"/></div></td> 
    <td><div class="input number"><input name="data[OrderDetail][0][product_qty]" step="any" type="number"/></div></td> 
    <td><div class="input number"><input name="data[OrderDetail][0][product_price]" step="any" maxlength="24" type="number"/></div></td> 
    </tr> 
    <tr> 
    <td><div class="input text"><input name="data[OrderDetail][1][product_code]" maxlength="100" type="text"/></div></td> 
    <td><div class="input text"><input name="data[OrderDetail][1][product_name]" maxlength="255" type="text"/></div></td> 
    <td><div class="input number"><input name="data[OrderDetail][1][product_qty]" step="any" type="number"/></div></td> 
    <td><div class="input number"><input name="data[OrderDetail][1][product_price]" step="any" maxlength="24" type="number"/></div></td> 
    </tr> 
</tbody> 

私は昔ながらのJavascriptを使用して、所望の結果を得ることができますが、私はよりエレガントな解決策を探しています。私はjQueryとJSHelperを読み込んでいます。

答えて

1

私の解決策は、この

$(":button").click(function() { 
    $("tr:last-child").clone().appendTo('tbody'); //clone the last row 
    $("tr:last-child input").each(function() { //for each input in the last row, do the following 
     var nameAttr = $(this).attr('name'); //get the whole value of attribute 'name' 
     var newIndex = parseInt(nameAttr.replace(/[^\d]/g, ''))+1; //get the digit and add one 
     $(this).attr('name',nameAttr.replace(/\d/,newIndex)); //replace the old digit with new 

    }); 
}); 

デモのようになります。このためhttp://jsfiddle.net/CKxLh/

+0

おかげで、それがとてもうまくいきました。特定の要素idを参照するように$( ":button")、$( "tr:last-child")、$( "tr:last-child input")を変更する必要がありました提供されている例より)。 – DavidMC1982

0

はこのjQueryのコードを確認してください:

$('#add_element').click(function(){ 
    var next_id = $('table tr').length; 
    var clone_tr = $('table tr:first').clone(); 
    clone_tr.find('input').val(''); 

    clone_tr.find('input:eq(0)').attr('name', 'data[OrderDetail][' + next_id + '][product_code]'); 
    clone_tr.find('input:eq(1)').attr('name', 'data[OrderDetail][' + next_id + '][product_name]'); 
    clone_tr.find('input:eq(2)').attr('name', 'data[OrderDetail][' + next_id + '][product_qty]'); 
    clone_tr.find('input:eq(3)').attr('name', 'data[OrderDetail][' + next_id + '][product_price]'); 

    $('table tbody').append(clone_tr); 

    return false; 
}); 

を私はあなたがあまりにもid属性のためにこれを行う必要があると思います。

これをチェックするjsFiddle私はそれが助けて欲しい

関連する問題