2012-06-18 16 views
6

Mam model, który nie zawiera żadnych tytułów. Wszystkie interesujące informacje znajdują się w pokrewnym modelu.Użyj pola z pokrewnego modelu jako pola wyświetlania w CakePHP

ja już przeczytać o virtualfields, z którym można połączyć pola tak:

public $virtualFields = array("full_name"=>"CONCAT(event_id, ' ' ,begin)"); 
public $displayField = 'full_name'; 

Ale to daje mi z prostym identyfikatorem i datą. Potrzebuję tego identyfikatora jako nazwy z innego modelu.

Odpowiedz

6

To naprawdę brzmi jak zadanie dla Set::combine(). Twoje pole wyświetlania nie powinno odwoływać się do innego modelu, ponieważ nie zawsze jest gwarantowane, że zostanie połączone. Jeśli więc połączenie nie doprowadziło do przesłania danych, spowodowałoby to błąd.

Zamiast tego, używając Set::combine(), możesz utworzyć tablicę klucz-wartość z dowolną potrzebą. Chociaż jest to mniej "magiczne", spowoduje to mniejsze możliwości błędów.

Dla przykładu UsersController, załóżmy, że masz profil "jedyny" i chcesz, aby użytkownik wybrał użytkownika za pomocą automatycznie wypełnianego menu rozwijanego (tzn. Przy użyciu formularza), które pokazuje pełne nazwy użytkowników z ich profilu. Użyjemy Containable do wprowadzenia danych profilu.

class AppModel extends Model { 
    $actsAs = array(
    'Containable' 
); 
} 

Następnie w UsersController:

function choose($id = null) { 
    // regular view code here 
    $users = $this->User->find('all', array(
    'contain' => array(
     'Profile' 
    ) 
)); 
    // create a key-value that the FormHelper recognizes 
    $users = Set::combine($users , '{n}.User.id', '{n}.Profile.full_name'); 
} 

Zauważysz, że full_name jest teraz na modelu profilu, ponieważ używa pól z tego modelu. Sposób łączenia tworzy tablicę jak

array(
    1 => 'skerit', 
    2 => 'jeremy harris' 
); 

Która zostanie automatycznie używane podczas korzystania z FormHelper Aby utworzyć listę rozwijaną

echo $this->Form->input('user_id'); 
+1

Dzięki, to pomogło mi zrozumieć połączyć(). Nie zapominaj, że w twoim przykładzie będzie trzeba dodać do dodania. – 472084

+0

Fajnie, cieszę się, że pomógł komuś. Dodałem możliwość dodania do przykładu, aby odpowiedź była bardziej kompletna. – jeremyharris

Powiązane problemy