0

所以,我不太确定我应该如何在 CakePHP 中构建它以在正确的 MVC 形式中正常工作。

让我们为了论证起见,假设我有以下以各种方式相关的数据结构:

  • 团队
  • 任务
  • 设备

这通常是网站的样子,并且在 Cake 中很容易构建和制作。例如,我将拥有每个项目集的模型、控制器和视图。

我的问题(我相信无数其他人已经拥有它并且已经解决了它)是我的级别高于项目集。因此,例如:

  • 部门
    • 团队
    • 任务
    • 设备
  • 部门
    • 团队
    • 任务
    • 设备
  • 部门
    • 团队
    • 任务
    • 设备

在我的站点中,我需要有人能够在单个组级别查看站点以及移动到一起查看所有站点(即忽略组)。

所以,我有 Depart、Team、Task 和 Equipment 的模型、视图和控件。

如何构建我的站点,以便从部门视图中,有人可以选择一个部门,然后在站点周围移动到团队/任务/设备的不同视图,仅显示属于该特定部门的视图。

在这种相同的格式中,有没有办法也可以忽略部门协会?

希望以下示例 URL 可以澄清任何不清楚的地方:

// 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

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

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

4

3 回答 3

1

会议

由于 Web 是无状态的,因此您需要使用会话(或 cookie)。您需要问自己的问题是如何反映特定部门的选择(或不选择)。它可以像在右上角放置一个反映 ALL、HR、Sales 等的下拉选择一样简单。当下拉更改时,它将设置(或清除)组会话变量。

至于控制器中的功能,您只需检查 Session。如果它在那里,您可以通过选择组来限制数据。因此,您将使用相同的 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,PHONE NUMBER< 和 BILLING INFO 是项目集。

没有会话

另一种选择是将组过滤器放在每个页面上。因此,例如在团队/索引视图中,您将有一个组下拉列表来过滤数据。它无需设置和清除会话变量即可完成相同的操作。

结论是,要记住的关键是功能不会改变,URL 也不会改变。唯一改变的是您将使用过滤后的数据集。

那有意义吗?

于 2010-08-20T02:39:04.123 回答
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

于 2010-08-20T03:35:21.767 回答
1

我想我知道你想做什么。如我错了请纠正我:

我为自己建立了一个项目经理,我希望 URL 更符合逻辑,而不是使用类似的东西

http://domain.com/project/milestones/add/MyProjectName 我可以使用 http://domain.com/project/MyProjectName/milestones/add

我在路线的末尾(!重要)添加了一条自定义路线,以便它捕获任何还不是路线的东西并将其视为“可变路线”。

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 路由,您只有一个选项。

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

于 2010-09-06T03:14:03.640 回答