CakePHP,围绕群组组织网站结构

时间:2010-08-19 08:47:50

标签: model-view-controller organization cakephp-1.3

所以,我不太确定我应该如何在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

我可以让控制器以这种方式运行吗?是否有人阅读,所以我可以解决这个问题?

感谢那些阅读了所有这些内容的人:)

3 个答案:

答案 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路由。

然后根据您的需要修改其他代码。