CakePHP kerede birden kayıtlarını düzenleyebilirsiniz

1 Cevap php

Onlara katılmak için items_locations tablosunu kullanarak, items ve locations: iki tablo arasında bir HABTM ilişki var.

items_locations de biraz daha bilgi saklar. İşte şema bulunuyor

items_locations(id, location_id, item_id, quantity)

Ben tek bir yerde tüm öğeleri gösterir ve kullanım sağlar, bir datagrid tarzı bir arabirim ile, bir kerede birden fazla alanlarını düzenlemek bir sayfa oluşturmak için çalışıyorum:

Location: Factory XYZ
 ___________________________
|___Item____|___Quantity___|
| Widget    |          3   |
| Sprocket  |          1   |
| Doohickey |         15   |
----------------------------

Bu yardım için, ben InventoryController sahip adında bir denetleyici var:

var $uses = array('Item', 'Location');  // should I add 'ItemsLocation' ?

Nasıl bu verileri düzenlemek için çok yönlü bir form oluşturmak mı?


Edit:

Ben Deceze aşağıda açıklanan ne gibi bakmak benim veri almaya çalışıyorum ama yine sorunlar yaşıyorum ...

// inventory_controller.php
function edit($locationId) {

    $this->data = $this->Item->ItemsLocation->find(
        'all',
        array(
            "conditions" => array("location_id" => $locationId)
        )
    );

Bunu yaparken, $this->data böyle çıkıyor:

Array (
    [0] => Array (
        [ItemsLocation] => Array (
            [id] => 16
            [location_id] => 1
            [item_id] => 1
            [quantity] => 5
        )
    )
    [1] => Array (
        [ItemsLocation] => Array (/* .. etc .. */)
    )
)

1 Cevap

Eğer Item modelindeki veri düzenlemek için gidiyoruz değil, muhtemelen sadece birleşim modeli üzerinde çalışmak için en mantıklı. Gibi, her bir iş kaleminin miktarı düzenlemek için form aşağıdaki gibi olacaktır:

echo $form->create('ItemsLocation');

// foreach Item at Location:

echo $form->input('ItemsLocation.0.id'); // automatically hidden
echo $form->input('ItemsLocation.0.quantity');

(..., .0., .1.) sayacını artırmak her kayıt için. Eğer kontrolörleri aldıktan gerekir ne $this->data bu gibi görünmelidir:

array(
    'ItemsLocation' => array(
        0 => array(
            'id' => 1,
            'quantity' => 42
        ),
        1 => array(
            ...

Daha sonra sadece başka bir model plak gibi bu kaydedebilirsiniz: $this->Item->ItemsLocation->saveAll($this->data). Bir Location Öğe eklemek çok farklı değildir, sadece id kapalı bırakın ve kullanıcı item_id seçmenizi sağlar.

array(
    'location_id' => 42,  // prepopulated by hidden field
    'item_id' => 1        // user selected
    'quantity' => 242
)

Eğer Öğe modelin verileri düzenlemek ve aynı zamanda karşılık gelen ItemsLocation rekor, Saving Related Model Data (HABTM) bölüm içine dalış ile kaydetmek istiyorum. Bu dikkatli olun:

Bir HasAndBelongsToMany ilişki kaydederken varsayılan olarak, Cake yenilerini kaydetmeden önce katılmak tablodaki tüm satırları silecektir. Eğer ilişkili 10 Çocuklar olan bir kulüp varsa Örneğin. Daha sonra 2 çocuklu Kulübü güncelleyin. Kulüp, sadece 2 Çocuklar, değil 12 olacak.

Ve:

3.7.6.5 hasAndBelongsToMany (HABTM)

unique: true (varsayılan değer) kek ilk kaydı güncelleyerek zaman, yenilerini takmadan önce yabancı anahtarlar tablo mevcut ilişki kayıtlarını silmek olacaktır. Yani mevcut dernekler güncelleyerek zaman daha geçti gerekir.


Re: Comments/Edit

FormHelper bir [0][Model][field] yapılandırılmış diziden Model.0.field alanları otomatik doldurmak için yeterince akıllı ise ben kafamın üst kapalı bilmiyorum. If not, kolayca sonuçlar kendiniz manipüle olabilir:

foreach ($this->data as &$data) {
    $data = $data['ItemsLocation'];
}
$this->data = array('ItemsLocation' => $this->data);

Bu size doğru yapıyı verecekti, ama kuşkusuz çok güzel değil. Herkes bunu yapmak için daha Cakey yolu varsa, ben bütün kulaklar değilim. :)