2012-06-12 3 views
0

Это другой вопросCakePHP displayField .. больше, чем один в модели

Showing something other than ID in scaffold Cakephp

был дан ответ во многих местах здесь и в других местах и ​​сделок с ситуацией, когда я хочу отборный список, но текстовое поле, чтобы показать вместо id не называется «Name». По-видимому, торт может справиться с этим, если вы скажете, что это поле называется instaed из «Name», поставив следующий в его модели:

var $displayField = 'NonNameName'; 

Однако все примеры для одного выбора. Но у меня есть три списка выбора, так как я могу их добавить? Конечно, я не могу сделать так, как показывает следующий код (например, три строки «var $ displayField =« ... »;» .. не имеет смысла иметь три $ displayField.

<?php 
App::uses('AppModel', 'Model'); 
/** 
* Visit Model 
* 
* @property User $User 
* @property Referrer $Referrer 
* @property Company $Company 
*/ 
class Visit extends AppModel { 

    //The Associations below have been created with all possible keys, those that are not needed can be removed 

/** 
* belongsTo associations 
* 
* @var array 
*/ 

var $displayField = 'location'; 
var $displayField = 'referrer'; 
var $displayField = 'company'; 


    public $belongsTo = array(
     'User' => array(
      'className' => 'User', 
      'foreignKey' => 'user_id', 
      'conditions' => '', 
      'fields' => '', 
      'order' => '' 
     ), 
     'Referrer' => array(
      'className' => 'Referrer', 
      'foreignKey' => 'referrer_id', 
      'conditions' => '', 
      'fields' => '', 
      'order' => '' 
     ), 
     'Location' => array(
      'className' => 'Location', 
      'foreignKey' => 'location_id', 
      'conditions' => '', 
      'fields' => '', 
      'order' => '' 
     ),  
     'Company' => array(
      'className' => 'Company', 
      'foreignKey' => 'company_id', 
      'conditions' => '', 
      'fields' => '', 
      'order' => '' 
     ) 
    ); 
} 

в мой контроллер у меня есть

$companies= $this->Visit->Company->find('list'); 
$locations = $this->Visit->Location->find('list', array('conditions' => array('company_id' => $this->Auth->user('company_id')))); 
$referrers = $this->Visit->Referrer->find('list', array('conditions' => array('company_id' => $this->Auth->user('company_id')))); 
    $this->set(compact('locations','referrers','companies')); 

ответ

0

Я думаю, что вы имеете в виду, чтобы сделать это:

// controller/action 
$locations = $this->Visit->Location->find('list'); 
$referrers = $this->Visit->Referrer->find('list'); 
$companies = $this->Visit->Company->find('list'); 
$this->set(compact('locations', 'referrers', 'companies')); 

на ваш взгляд:

echo $this->Form->input('location_id'); 
echo $this->Form->input('referrer_id'); 
echo $this->Form->input('company_id'); 

Это (должно) произвести три выбора - имитировать поведение display-field.

Цитирую торт:

найти («список», $ PARAMS) возвращает индексированный массив, полезный для любого использования , где вы хотели бы список таких, как для заполнения входных полей выбора.

http://book.cakephp.org/1.3/view/1022/find-list

+0

Извините, но я полагался на предыдущее сообщение для передачи информации. Я уже сделал то, что вы предлагаете Росс.Cake зависит от текстовых полей, чтобы показывать вместо имени, называемого «Name», для автоматического отображения текста вместо id. Однако я не хочу называть их «Имя». Нет проблем, bc, очевидно, Cake покрывает это, позволяя мне помещать «var $ displayField = 'username"; " в модели, чтобы сказать Cake, поля «Name» - это «Location», «Referrer» и «Company». Тем не менее, все примеры, которые я могу найти, относятся только к одному не трем полям без имени. Что такое синтаксис и где я их размещаю? – curtisp

+1

Поместите '$ displayField =' Поле' в каждую модель. Поэтому поле отображения модели 'Location' -' location' - предполагается, что в вашей таблице есть поле, называемое 'location'. Или я вас не понимаю? – Ross

+0

А, ок! Это и есть. Благодаря! Мое замешательство было вокруг того, куда он пошел. Все его обсуждения сосредоточены на модели, в которой используется выбор. Но ни один (по крайней мере, я не предполагал) специально сказал, чтобы поставить var $ displayField = 'ModelNameName'; в модель, к которой она принадлежит, а не модель, которую вы хотите показать. Конечно, теперь это кажется совершенно очевидным. – curtisp

0

В CakePHP 3.x:

Откройте приложение/модели/Table/Your_Table.php

public function initialize(array $config) { 
    $this->displayField(['full_name', 'email']); 
} 

При получении списка:

TableRegistry::get('Your')->find('list'); 

Результат будет:

[ 
    [key => 'full_name;email'], 
    [key => 'full_name;email'], 
]; 
0

В CakePHP 3.x, лучший и документированы и элегантный способ:

https://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets. HTML # настроить ключ-значение-выход

можно использовать затворы для методов доступа сущностей доступа в списке находит, как это:

// In your Authors Entity create a virtual field to be used as the displayField: 
protected function _getLabel() 
{ 
    return $this->_properties['first_name'] . ' ' . $this->_properties['last_name'] 
     . '/' . __('User ID %s', $this->_properties['user_id']); 
} 

Затем вы можете получить метку в списке искателем непосредственно с помощью :

// In AuthorsTable::initialize(): 
$this->setDisplayField('label'); // Will utilize Author::_getLabel() 
// In your finders/controller: 
$query = $authors->find('list'); // Will utilize AuthorsTable::getDisplayField() 
// In your views: 
$author->label // will display : John Doe/User ID 123