我正在编写个人书签应用程序,并且正在寻找一种在子域之间具有完全不同内容的方法。
我编写了应用程序并且工作正常,但还没有实现多个集合。我有以下型号:
书签按主题分类,我打算将来允许标记,看看是否有助于我更轻松地管理书签。
我当前遇到的问题是我想将书签整体分开。我想使用像webdevelopment.bookmarks.local
,languages.bookmarks.local
,linux.bookmarks.local
这样的子域,它们可以使用一整套域和书签。
我正在考虑添加一个名为Set
的新模型(“书签集”的缩写),并根据子域定义集。
根据该计划,我必须在整个App中重写所有$this->...->find
- 查询以包含条件"set_id" = $SubdomainBasedSetid"
。
虽然它不会那么多工作,但我想知道它是否可以更聪明地完成,也许Cake只会看到每个子域的相关书签集。
答案 0 :(得分:1)
答案 1 :(得分:0)
根据该计划,我必须在整个应用程序中重写所有
$this->...->find
- 查询以包含条件"set_id" = $SubdomainBasedSetid"
。
由于所有模型都扩展了AppModel,因此可以在它们发生之前编辑所有查询(即DRY)。 :)
// app/app_model.php
class AppModel extends Model {
public function beforeFind($queryData) { // old query
// make changes
return $queryData; // new query
}
但是,如果您不希望所有型号都使用此功能(或者即使您现在都这样做),更好的地方可能是一种行为,因为这允许您选择加载的位置和时间:
// app/models/behaviors/subdomain.php
class SubdomainBehavior extends ModelBehavior {
protected $_defaults = array('field' => 'Site.subdomain');
public function setup(&$model, $config = array()) {
$this->settings[$model->alias] = array_merge($this->_defaults, $config);
}
public function beforeFind(&$model, $queryData) {
$domain = $_SERVER['SERVER_NAME'];
$subdomain = substr($domain, 0, strpos($domain, "."));
$queryData['conditions'][$this->settings['field']] = $subdomain;
return $queryData;
}
}
// app/app_model.php
class AppModel extends Model {
$actsAs = array('Subdomain' => array('field' => 'Set.slug'));
}
- 标签(目前尚未使用)
为了节省重新发明的轮子,您可能需要查看CakeDC的tags和utils插件(后者包含SluggableBehavior,这有助于生成友好的网址部分,例如子域)。