2012-06-22 4 views
0

У меня возникли проблемы с формулировкой моей проблемы, поэтому было трудно найти ответ. Надеюсь, вы будете знать, как помочь.Динамическое прохождение имени модели к плагину CakePHP

Я создаю CakePHP 2.1 плагин, который будет взаимодействовать с серией своих собственных моделей: - Друг - Группа - Пользователь

Друг и Группа модели, которые созданы специально для плагинов, и они функции внутри плагина. Однако модель User - это просто псевдоним для другой таблицы в родительском приложении.

Итак, если «My Awesome Application» решает использовать «My Awesome Plugin», он должен будет иметь свою собственную таблицу «пользователей» (хотя он может назвать что-то еще). Скажем, «My Awesome Application» имеет модель под названием MyUser. «My Awesome Plugin» хочет динамически рассказать своей внутренней модели пользователя $ useTable = «my_users».

Вопрос в том, как передать эти данные в плагин? Как настроить «My Awesome Plugin», чтобы понять, что пользователь должен использовать $ useTable «my_users»;

ответ

2

Как я понимаю, вы хотели бы, чтобы модель в подключаемом модуле использовала таблицу, которая, как правило, относится к модели в вашем приложении - соглашениями. Пробовали ли вы статически:

public $useTable = "my_users"; 

в плагине? Все плагины обычно инициализируются при запуске Cake, поэтому все конфигурации должны быть загружены. Зачем вам это нужно - это действительно сильно ограничивает вас? Будет ли таблица, используемая моделью плагина, изменять время выполнения?

Model класс также имеет некоторые лакомства могут оказаться полезными:

$this->User->table; 

содержит имя таблицы для модели - таблицу, которая в настоящее время используется, которое **.

Также вы можете установить исходную таблицу для модели (внутри контроллера) с:

$ this-> User-> setSource ('table_name);

** Я не уверен, что это применимо, если вы используете Model::setSource(). Было бы интересно проверить, что $this->User->table; имеет место после вызова Model::setSource().

+0

Спасибо за это.В итоге я нашел функциональность Model-> setSource(), и, объединив ее с моим другим ответом (см. Ниже), я смог заставить его работать. Проблема заключалась в том, как установить таблицу для модели, которая была в плагине из-за пределов плагина. Спасибо за помощь. – Dustin

0

Я выяснил, как это сделать, но это может не работать во всех сценариях для всех людей.

Я создал компонент в своем плагине, а затем я вызываю компонент в своем контроллере. Я передаю имя модели пользователей через компонент. Таким образом, я могу получить информацию о модели пользователей, и я могу установить ее как useTable для моего плагина для использования в плагине.

Конечно, этот метод ограничивает меня использованием Компонента для использования Плагина, но это, вероятно, самое лучшее.

Вот пример того, как я сделал это:

// in the AppController 
public $components = array(
'MyPlugin.MyPluginComponent' => array('userModel'=>'UserModelName') 
); 

// in the Plugin's Component 
class MyPluginComponent extends Component { 

function initialize($controller) { 

    //get the base user model 
    $this->UserModel = ClassRegistry::init($this->settings['userModel']); 

    //set the useTable for our plugin's user model 
    $this->PluginUser = ClassRegistry::init('MyPlugin.PluginUser'); 
    //set the useTable value for this model 
    $this->PleaseUser->setSource($this->UserModel->useTable); 
} 

Это, кажется, работает для меня. Надеюсь, это помогает кому-то другому.

Смежные вопросы