2

我正在构建一个函数,它将我的用户所做的事情的日志添加到我的数据库中,这样我就可以为其他用户的活动提要构建一个活动提要。

到目前为止我想象它的样子。

活动表

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;
    }

}
?>

有没有人看到任何改进的方法?

4

2 回答 2

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();
}

对于实现它的方法只是一个松散的想法。但正如另一位用户所说,有许多不同的方法可以做到这一点,具体取决于您的要求。您在问题中使用的方法可以正常工作

于 2012-04-08T18:59:54.513 回答
0

给猫剥皮的方法有很多种。同样,有许多方法可以达到您需要的相同结果。

“改进” IMO 的一些建议是——

1. 使用 AJAX 调用将此数据作为预生成的 HTML 获取。

加载页面后使用 AJAX 调用,您可以让服务器构建用户活动提要的 HTML 段。这将使您的页面加载速度更快,并且您的内容将在不久之后加载。

您甚至不必在服务器上构建 HTML - 您也可以从 AJAX 调用传回 JSON 对象并使用 JavaScript 构建您的 HTML。

2. 创建用户提要的缓存静态 HTML 文件,该文件简单地包含在标记中。

您可以让您的服务器以特定的时间间隔(例如每 30 分钟)生成用户提要所需的所有 HTML,然后将该 HTML 保存到一个文件中以包含在现有 HTML 中。您可以使用 PHP 的include()函数来执行此操作。

使用此方法,活动提要在刷新时会有延迟,因此它可能不是最佳选择 - 但如果您将间隔缩短 - 例如每 5 分钟一次,您将节省大量对数据库的调用。

查看cron 作业- 您可以使用它们来安排更新。

3. 在您的数据库中放置一个index字段user_id,因为您正在使用它来按用户搜索。

这是非常重要的,特别是如果您希望数据库中存在许多条目。在用于搜索表的字段上放置索引将大大提高查询的性能。


我敢肯定这里还有很多可以建议的东西。

于 2012-04-08T18:22:46.587 回答