2012-06-22 53 views
0

我在解决问题时遇到了麻烦,因此很难找到答案。希望你会知道如何提供帮助。将模型名称动态传递给CakePHP插件

我创建一个CakePHP的2.1插件,将有一系列自己的模型的互动: - 朋友 - 组 - 用户

朋友和集团是被用于插件专门创建的模型,他们通常在插件中起作用。但是,User模型实际上只是父应用程序中某个其他表的别名。因此,如果“我的真棒应用程序”决定使用“我的真棒插件”,它将不得不拥有自己的“用户”表(尽管它可能称为别的东西)。假设“我的真棒应用程序”有一个名为MyUser的模型。 “My Awesome Plugin”想动态地将其内部用户模型告诉$ useTable =“my_users”。

我的问题是,如何将该数据传递给插件?如何配置“My Awesome Plugin”来理解用户应该使用$ useTable“my_users”;

回答

2

据我所知,您希望PlugIn中的Model使用通常属于应用程序中的Model的表 - 按照惯例。你有没有试过静态设置:

public $useTable = "my_users"; 

在插件中?所有的插件通常在Cake启动时被初始化,所以所有的配置都应该被加载。你为什么需要这个 - 它确实限制了你很多?插件模型将使用该表更改运行时吗?

Model类也有一些东西,你可能会发现有用:

$this->User->table; 

适用于模型中的表名 - 当前正在使用的表,它是**。

您也可以与设定的源表的模型(一个控制器内):

$这 - >用户 - >的SetSource('TABLE_NAME);

**我不确定这是否适用于您使用Model::setSource()。在Model::setSource()调用之后检查什么$this->User->table;保持有效会很有趣。

+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); 
} 

这似乎为我工作。希望这可以帮助别人。