CakePHP - 使用元素与ajax呈现视图

时间:2014-10-28 09:52:53

标签: ajax cakephp view controller element

如果来自不同控制器的视图使用相同的元素,需要不同的控制器将相同的数据(因此可能进行相同的处理)传递给视图,那么对单个控制器进行AJAX调用会不会更好? / p>

假设我们有这个:

  • 型号/ post.php中
  • 型号/ user.php的
  • 型号/ Service.php
  • 控制器/ UsersController.php
  • 控制器/ ServicesController.php
  • 查看/用户/ view.ctp
  • 浏览/服务/ view.ctp
  • 浏览/元件/ list_users_post.ctp

用户属于某项服务,用户拥有多个帖子。 在Views/Services/view.ctp中,我想显示特定服务的每个用户的列表,并为每个用户显示一些相关的信息以及他最近10个帖子的列表。 在Views/Users/view.ctp中,我想显示用户的相关信息以及他的10个帖子的列表。 元素Views/Elements/list_users_post.ctp允许我将代码显示为显示用户帖子的表格。它需要设置var $userPostList,并且结构与$this->Post->find('all', array('conditions' => array('user_id' => $userId)))的结果相同。 因此,在我的UsersController::view($userId)ServicesController::view($serviceId)操作中,我最终会找到一些重复的代码来检索用户的帖子。

我想重构代码,以便操作ServicesController::view($serviceId)不会在Post模型上进行任何查找,相反,视图Services/index.ctp会对每个操作UsersController::view($userId)进行AJAX调用用户。这样,不再有重复的代码,而是AJAX调用的开销。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

避免重复代码的好方法是将其移动到模型层。所以在控制器中没有这个:

$this->Post->find('all', array('conditions' => array('user_id' => $userId)))

你可以在控制器中使用它:

$this->Post->getUserPosts($userId);

这是帖子模型:

function getUserPosts($userId){
    return $this->find('all', array('conditions' => array('user_id' => $userId)));
}

AJAX调用也是一个很好的解决方案,但即使使用它们,最好在可能的情况下将业务逻辑保留在模型中。

避免重复代码的其他方法包括(但不限于): 在视图中使用助手 在控制器中使用组件 在模型中使用行为

这应该让你开始将你的代码保持干净。