我正在构建一个函数,它会将我的用户所做的事情的日志添加到我的数据库中,以便我可以为其他用户的活动源构建活动源。
到目前为止,我的想象相似。
活动表
id | user_id | source | source_id | timestamp
示例输入
1 | 1 | photo_upload | 54 | 1333906150 //54 being the ID of the photo in my DB
2 | 1 | follow | 2 | 1333906159 // 2 being the id of a user
通过这种方式,我可以轻松地从数据库中为用户活动提取信息,"user_id = {$followers}
然后根据其来源显示它们,例如显示photo_upload的图像。
修改 什么是显示不同类型的饲料的最佳方式。 这就是我现在所拥有的,但似乎有点多。
<?php
$grab = mysql_query("SELECT * FROM `activity` WHERE `user_id` IN (".$following.") ORDER BY `id` DESC");
while($row = mysql_fetch_array($grab)){
switch ($row['source']) {
case "photoupload":
// Display photo upload layout
break;
case "follow":
// Display follow layout
break;
}
}
?>
有没有人看到任何改进方法?
答案 0 :(得分:2)
创建描述feeditem类型的抽象类:
abstract class Application_Feed_Item_Abstract {
protected $_item;
public function __construct($itemData) {
$this->_item = $itemData;
}
abstract public function render();
}
为不同类型的内容实现此类:
class Application_Feed_Item_Photo extends Application_Feed_Item_Abstract {
public function render() {
//Custom rendering logic for a Photo
return '<div>Watch my <a href="photo.php?id=' . $this->_item['source_id'] . '">photo</a></div>';
}
}
class Application_Feed_Item_Follow extends Application_Feed_Item_Abstract {
public function render() {
//Custom rendering logic for a Follower
return '<div>I got a new <a href="photo.php?id=' . $this->_item['source_id'] . '">follower</a></div>';
}
}
因此,当您拉取记录时,您可以根据Feeditem的类型动态创建渲染器对象:
//Pull items from database and store them as an Array or other iterable object.
//Here i assume we call this collection of rows from the database $feeditems
//Mapping of source to renderer classes
$types = array(
"photoupload" => "Application_Feed_Item_Photo",
"follow" => "Application_Feed_Item_Request",
"somethingelse" => "Application_Feed_Item_Somethingelse"
);
//Process every item
foreach($feeditems as $item) {
$type = $item['source'];
if(!array_key_exists($type, $types)) {
throw new Exception("Unsupported feeditem type.");
}
$type = $types[$type];
$renderer = new $type($item);
echo $renderer->render();
}
实现它的方法只是一个宽松的想法。但正如另一位用户所说,根据您的要求,有许多不同的方法可以做到这一点。您在问题中使用的方法可以正常使用
答案 1 :(得分:0)
有许多方法可以给猫皮肤。同样,有很多方法可以达到您所需的相同结果。
“改善”IMO的一些建议是 -
<强> 1。使用AJAX调用将此数据作为预生成的HTML获取。
加载页面后使用AJAX调用,您可以让服务器构建用户活动供稿的HTML段。这将使您的页面加载速度更快,您的内容将在不久之后加载。
您甚至不必在服务器上构建HTML - 您也可以从AJAX调用中传回JSON对象并使用JavaScript构建HTML。
<强> 2。创建用户Feed的缓存静态HTML文件,该文件只包含在标记中。
您可以让服务器以特定间隔(例如每30分钟)生成用户Feed所需的所有HTML,然后将该HTML保存到文件中以包含在现有HTML中。您可以使用PHP的include()
函数执行此操作。
使用此方法,活动源在刷新时会有延迟,因此它可能不是最佳选择 - 但如果您将间隔设置得更小 - 例如每5分钟一次,您将节省大量对数据库的调用
查看cron jobs - 您可以使用它们来安排更新。
第3。在您的数据库中的index
字段上放置user_id
,因为您使用它来按用户进行搜索。
这是非常重要的一项,特别是如果您希望数据库中存在许多条目。在用于搜索表的字段上放置索引将极大地提高查询的性能。
我确信这里可以提出更多的建议。