2012-04-08 3 views
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.

EDIT Что будет лучшим способом отображения различных типов фидов. Это то, что у меня сейчас есть, но это кажется немного.

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

Наиболее очевидным улучшением является _NOT_, чтобы использовать временную метку Unix, а скорее [соответствующий столбец DATETIME] (http://dev.mysql.com/doc/refman/5.0 /en/datetime.html). –

+0

У вас возникли проблемы до сих пор? – Lix

+0

@Micheal Зачем вам это советовать? – Harry

ответ

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

Так что, когда вы тянете запись, вы сможете создать визуализатор объект на лету в зависимости от вида устройства подачи:

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

Просто свободный идеал a для способа его реализации. Но, как заявил другой пользователь, есть много разных способов сделать это, в зависимости от ваших требований. Метод, который вы использовали в своем вопросе, будет работать очень хорошо

+0

Я ужасно новичок в классе и ООП, но я хорошо разбираюсь в понимании вашего кода, если вы не услышите от меня ответа, отправьте справку. Но серьезно им понадобится время, чтобы сломать это, поскольку это кажется идеальным! – Harry

+0

Можете ли вы привести мне пример того, как выглядят $ feedtypes, чтобы я мог попробовать код в тестовом режиме? – Harry

+0

Я исправил его так, чтобы он работал. http://fixee.org/paste/bdpnmso/ Спасибо! – Harry

0

Существует множество способов кожи кошки. Аналогичным образом существует множество способов достижения тех же результатов, которые вам нужны.

Некоторые предложения для «улучшения» IMO бы -

1. Получение этих данных в виде предварительно сгенерированные HTML с вызовом AJAX.

Используя вызов AJAX после загрузки страницы, вы можете создать свой сервер в HTML-сегментах вашего канала активности пользователей. Это позволит вашей странице загружаться намного быстрее, и ваш контент будет загружен вскоре после этого.

Вам даже не нужно создавать HTML-код на сервере - вы также можете передать объект JSON обратно из вызова AJAX и создать свой HTML-код с помощью JavaScript.

2. Создание кэшированного статического HTML-файла фида пользователей, который просто включен в разметку.

Возможно, ваш сервер сгенерировал весь HTML-код, необходимый для фида пользователей, через определенный интервал - например, каждые 30 минут - и затем сохраните этот HTML-файл в файл, который будет включен в существующий HTML-код. Вы можете сделать это, используя функцию PHP include().

Используя этот метод, фид активности будет иметь задержку при обновлении, поэтому это может быть не лучший вариант, но если вы сделаете интервал меньше - каждые 5 минут, например, вы будете экономить много вызовов на DB.

Отъезд cron jobs - вы можете использовать их для планирования обновлений.

3. Поместите index в поле user_id в вашей БД, так как вы используете его для поиска по пользователю.

Это очень важный вопрос, особенно если вы ожидаете, что в вашей базе данных будет много записей.Размещение индекса в полях, которые вы используете для поиска в таблице, значительно увеличит производительность ваших запросов.


Я уверен, что здесь есть много других вещей.

+0

Не возражаете ли вы объяснить первые два в глубине немного больше? Они кажутся интересными. – Harry

+0

:) – Lix

+0

Спасибо, Lix. Но они будут отличаться от того, как будут выглядеть последователи div по сравнению с photo_upload div, например http://gyazo.com/547240b6fd37ca8df7f2dbbfb3c4ff2e Посмотрите, как они выглядят по-другому? Когда я создаю страницу, как я могу сделать ее так, чтобы, если source = photo_upload, она отображается так же, и для нее она отображается как верхняя? – Harry

Смежные вопросы