Форум → Программирование → PHP для идиотов → Реализация личных сообщений
Реализация личных сообщений
Страницы: ← Предыдущая страница →
-
-
29 января 2010 г. 10:48, спустя 13 минут 9 секунд
krasun, что будет если одна из сторон удалит сообщение?https://smappi.org/ - платформа по созданию API на все случаи жизни -
29 января 2010 г. 10:51, спустя 2 минуты 49 секунд
flags - там прочитано, там и удаление, там вообще любые флаги сообщения. Это просто tinyint, но я его обрабатываю, как двоичное число.
К примеру, если удалил отправитель, то flags:
00000001,
если удалил получатель, то flags,
00000010,
если оба
00000011
если прочитано
00000100
и так далее -
29 января 2010 г. 11:06, спустя 15 минут 16 секунд
krasun, хм… а какой выигрыш использования двоичного числа перед перечнем из "1,2,3,4…." ?
И ещё: а если оно прочитано, но удалено отправителем из папки "исходящие", но при этом сохранено у получателя? Выдумывать ещё какое-то двоичное число?
Моё ИМХО, удобнее сделать два поля: статус (прочитано/не прочитано) и флаг (удалено/не удалено).
п.с. И ещё не забывай, что одно ЛС может отправляться не одному, а двум-трём и т.д. людям. -
29 января 2010 г. 11:11, спустя 4 минуты 50 секунд
ну да, тут чаще используют один ко многим …
хот кто нить когда нить больше 1го пользователя посылал сообщение? я нет просто, интересно сколько будет сообщений исходящих в готовых реализациях форумаСапожник без сапог -
29 января 2010 г. 11:25, спустя 14 минут 15 секунд
Givi, возможно я тебя не много не понял.
krasun а если оно прочитано, но удалено отправителем из папки "исходящие", но при этом сохранено у получателя? Выдумывать ещё какое-то двоичное число?
Зачем выдумывать: 00000001 (dec: 1) - это удалено у отправителя, а 00000010 (dec: 2) удалено у получателя. И вместо флагов и полей, очень красиво(мб мне показалось) получается, когда удаляют оба: 00000011(dec: 3),
Так же само и про прочитано, просто это будет уже 00000111, и если сообщение удалено и прочитано, то это 00000111. Помоему одного как раз числа и хватает.
п.с. И ещё не забывай, что одно ЛС может отправляться не одному, а двум-трём и т.д. людям.
О, вот спасибо, не подумал об этом.
И кстати реализация, очень простая. Не что вроде:
class Users_Model_Messages extends Zend_Db_Table_Abstract
{
protected $_name = 'users_messages';
const DELETED_FROM = 1; // 00000001
const DELETED_TO = 2; // 00000010
const OPENED = 4; // 00000100
// …
/*
* Помечает сообщение прочтенным.
*/
public function setOpened($messageId)
{
// получаем флаги для сообщения
$flags = $this->getFlags($messageId);
// если уже было открыто, то флаг открытия
// устанавливать не надо
$flags = ($this->isOpened($flags)) ? $flags :
$flags |= self::OPENED;
parent::update(array('flags' => $flags),
"`{$this->_name}`.`id` = {$messageId}");
}
/*
* Проверяет на наличие флага открытия.
*/
private function isOpened($flags)
{
return (bool)($flags & self::OPENED);
}
это так вырезкаСпустя 107 сек.здесь $flags - это все тоже одно число tinyint -
-
29 января 2010 г. 12:08, спустя 6 минут 56 секунд
А меня тошнит от такого типа ЛС. Удобнее когда переписка разложена "по темам" как на форуме. Хорошие email сервисы тоже так подают инфу — цепочкой ответов.
Для цепочек понадобится другая структура таблиц.ιιlllιlllι унц-унц -
29 января 2010 г. 12:13, спустя 5 минут 57 секунд
artoodetoo, ты не мог бы вкратце написать о другой структуре таблиц? -
29 января 2010 г. 12:16, спустя 2 минуты 27 секунд
в любо случае я бы юзал не tinyint, а enumhttps://smappi.org/ - платформа по созданию API на все случаи жизни -
29 января 2010 г. 13:49, спустя 1 час 33 минуты 32 секунды
krasun, это может выглядеть подобно теме форума но "темы" будут храниться не в разделах, а в пользовательских ящиках:
table topics (box_id, topic_id, poster_id, posted, subject, linked_id)
table posts (post_id, topic_id, poster_id, posted, message)
Это упрощенно. Всё, что писали про признак прочтения и удаления применимо и к этой структуре.
Цепочку сообщений можно хранить в одном экземпляре — в ящике отправителя, сколько бы ни было адресатов. А у читателей будет какбы "редирект". На форумах подобным образом делается перенос темы.
box_id — ссылка на ящик.
linked_id is null у "реальной темы" в ящике отправителя
в ящиках адресатов хранятся "отражения" где linked_id == topic_id реальной темы
P.S. Если делать на каждого пользователя по одному почтовому ящику, то можно считать box_id == user_id. Если делать дополнительные ящики для какого-то упорядочивания, то понадобится еще таблица ящиков.ιιlllιlllι унц-унц -
29 января 2010 г. 13:23, спустя 23 часа 33 минуты 37 секунд
У меня реализовано так:
mail
id title text user
mailFOuser
userID mailID look
Писал давно, был глуп, так что не судите строго =)
в mail мы сохраняем письма и помечаем там кто отправитель
в mailFOuser мы помещаем получателей, и там же помечаем прочитано или нет.
Тут сразу бросается в глаза тот ньюанс что отправитель не может удалить письмо. Но решается это добавлением еще 1 го поля. -
Страницы: ← Предыдущая страница →
Пожалуйста, авторизуйтесь, чтобы написать комментарий!