所以,我不太确定我应该如何在CakePHP中构建它以在正确的MVC格式中正常工作。
为了论证,让我们说我有以下数据结构,它们以各种方式相关:
这通常是网站在Cake中如何构建和制作的方式。例如,我会为每个项目集设置模型,控制器和视图。
我的问题(而且我确定无数其他人已经拥有它并且已经解决了它)是我有一个高于项目集的级别。所以,例如:
在我的网站中,我需要有人能够在单个组级别查看网站,并且可以一起查看所有网站(即忽略这些组)。
所以,我有Depart,Team,Task和Equipment的模型,视图和控件。
如何构建我的网站,以便从部门视图中,有人可以选择部门,然后在网站上移动到团队/任务/设备的不同视图,仅显示属于该特定部门的那些视图。 /强>
在同样的格式中,是否还有一种方法可以忽略部门协会?
希望以下示例网址能够澄清任何不清楚的内容:
// View items while disregarding which group-set record they belong to
http://www.example.com/Team/action/id
http://www.example.com/Task/action/id
http://www.example.com/Equipment/action/id
http://www.example.com/Departments
// View items as if only those associated with the selected group-set record exist
http://www.example.com/Department/HR/Team/action/id
http://www.example.com/Department/HR/Task/action/id
http://www.example.com/Department/HR/Equipment/action/id
我可以让控制器以这种方式运行吗?是否有人阅读,所以我可以解决这个问题?
感谢那些阅读了所有这些内容的人:)
答案 0 :(得分:1)
会话
由于Web是无状态的,因此您需要使用会话(或cookie)。您需要问自己的问题是如何反映特定部门的选择(或不反映)。它可以像在右上角放置一个反映ALL,HR,Sales等的下拉选项一样简单。当下拉列表更改时,它将设置(或清除)组会话变量。
至于控制器中的功能,您只需检查会话。如果存在,则通过选择组限制数据。因此,您将使用相同的URL,但控制器或模型将管理数据的显示方式。
// for all functionality use:
http://www.example.com/Team/action/id
http://www.example.com/Task/action/id
http://www.example.com/Equipment/action/id
您不会更改URL以适应功能。这就像为每个希望查看其地址,电话号码或结算信息的用户使用不同的URL。如果USER是组和ADDRESS,则电话号码<和BILLING INFO将是项目集。
没有会话
另一种选择是在每个页面上放置组过滤器。因此,例如在团队/索引视图上,您将有一个组下拉来过滤数据。无需设置和清除会话变量即可完成相同的操作。
结论是,要记住的关键是功能不会改变URL也不会改变。唯一改变的是您将使用过滤数据集。
这有意义吗?
答案 1 :(得分:1)
如果这是一个公共站点,您可能需要考虑使用命名变量。这样您就可以在URL上定义组,但不需要额外的功能要求。
http://example.com/team/group:hr http://example.com/team/action/group:hr/other:var
它可能也需要自定义路线......但它应该可以完成这项工作。
http://book.cakephp.org/view/541/Named-parameters http://book.cakephp.org/view/542/Defining-Routes
答案 2 :(得分:1)
我想我知道你在做什么。如果我错了,请纠正我:
我为自己建立了一个项目经理,我希望URL更合乎逻辑,所以不要使用像
这样的东西http://domain.com/project/milestones/add/MyProjectName我可以使用 http://domain.com/project/MyProjectName/milestones/add
我在路线的末尾(!important)添加了一条自定义路线,以便捕获任何尚未成为路线的路线,并将其视为“可变路线”。
Router::connect('/project/:project/:controller/:action/*', array(), array('project' => '[a-zA-Z0-9\-]+'));
你输入的路线意味着你不能(或曾经)拥有该名称的控制器,因此我认为使用单数词而不是复数是一个好习惯。 (我有一个项目控制器,所以我使用“项目”来避免与它发生冲突。)
现在,要在我的应用程序中的任何位置访问:project参数,我在AppController中使用此函数:
function __currentProject(){
// Finding the current Project's Info
if(isset($this->params['project'])){
App::import('Model', 'Project');
$projectNames = new Project;
$projectNames->contain();
$projectInfo = $projectNames->find('first', array('conditions' => array('Project.slug' => $this->params['project'])));
$project_id = $projectInfo['Project']['id'];
$this->set('project_name_for_layout', $projectInfo['Project']['name']);
return $project_id;
}
}
我在其他控制器中使用它:
function overview(){
$this->layout = 'project';
// Getting currentProject id from App Controller
$project_id = parent::__currentProject();
// Finding out what time it is and performing queries based on time.
$nowStamp = time();
$nowDate = date('Y-m-d H:i:s' , $nowStamp);
$twoWeeksFromNow = $nowDate + 1209600;
$lateMilestones = $this->Project->Milestone->find('all', array('conditions'=>array('Milestone.project_id' => $project_id, 'Milestone.complete'=> 0, 'Milestone.duedate <'=> $nowDate)));
$this->set(compact('lateMilestones'));
$currentProject = $this->Project->find('all', array('conditions'=>array('Project.slug' => $this->params['project'])));
$this->set(compact('currentProject'));
}
对于您的项目,您可以尝试在routes.php文件的末尾使用这样的路线:
Router::connect('/:groupname/:controller/:action/*', array(), array('groupname' => '[a-zA-Z0-9\-]+'));
//注意我从头开始删除了“/ project”。如果您首先放置:groupname,就像我在上一个示例中所做的那样,那么您只有一个选项可用于这些自定义URL路由。
然后根据您的需要修改其他代码。