ФорумПрограммированиеPHP для идиотов → Реализация личных сообщений

Реализация личных сообщений

  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 29 января 2010 г. 10:35, спустя 12 минут 19 секунд

    krasun, flags - прочитано или нет?
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 29 января 2010 г. 10:48, спустя 13 минут 9 секунд

    krasun, что будет если одна из сторон удалит сообщение?
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 29 января 2010 г. 10:51, спустя 2 минуты 49 секунд

    flags - там прочитано, там и удаление, там вообще любые флаги сообщения. Это просто tinyint, но я его обрабатываю, как двоичное число.

    К примеру, если удалил отправитель, то flags:
    00000001,
    если удалил получатель, то flags,
    00000010,
    если оба
    00000011
    если прочитано
    00000100

    и так далее
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 29 января 2010 г. 11:06, спустя 15 минут 16 секунд

    krasun, хм… а какой выигрыш использования двоичного числа перед перечнем из "1,2,3,4…." ?
    И ещё: а если оно прочитано, но удалено отправителем из папки "исходящие", но при этом сохранено у получателя? Выдумывать ещё какое-то двоичное число?
    Моё ИМХО, удобнее сделать два поля: статус (прочитано/не прочитано) и флаг (удалено/не удалено).

    п.с. И ещё не забывай, что одно ЛС может отправляться не одному, а двум-трём и т.д. людям.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 29 января 2010 г. 11:11, спустя 4 минуты 50 секунд

    ну да, тут чаще используют один ко многим …

    хот кто нить когда нить больше 1го пользователя посылал сообщение? я нет просто, интересно сколько будет сообщений исходящих в готовых реализациях форума
    Сапожник без сапог
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 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
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 29 января 2010 г. 12:01, спустя 35 минут 34 секунды

    ну добавь тогда еще функционал по read/unread
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 29 января 2010 г. 12:08, спустя 6 минут 56 секунд

    А меня тошнит от такого типа ЛС. Удобнее когда переписка разложена "по темам" как на форуме. Хорошие email сервисы тоже так подают инфу — цепочкой ответов.
    Для цепочек понадобится другая структура таблиц.
    ιιlllιlllι унц-унц
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 29 января 2010 г. 12:13, спустя 5 минут 57 секунд

    artoodetoo, ты не мог бы вкратце написать о другой структуре таблиц?
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 29 января 2010 г. 12:16, спустя 2 минуты 27 секунд

    в любо случае я бы юзал не tinyint, а enum
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 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ι унц-унц
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 29 января 2010 г. 13:23, спустя 23 часа 33 минуты 37 секунд

    У меня реализовано так:
    mail
    id title text user

    mailFOuser
    userID mailID look


    Писал давно, был глуп, так что не судите строго =)


    в mail мы сохраняем письма и помечаем там кто отправитель
    в mailFOuser мы помещаем получателей, и там же помечаем прочитано или нет.

    Тут сразу бросается в глаза тот ньюанс что отправитель не может удалить письмо. Но решается это добавлением еще 1 го поля.
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 30 января 2010 г. 4:14, спустя 14 часов 51 минуту 12 секунд

    artoodetoo, подумаю над этим

Пожалуйста, авторизуйтесь, чтобы написать комментарий!