Хак ПМ как на Однокласниках

Тема в разделе "DLE", создана пользователем bumer3, 31 мар 2008.

Информация :
Актуальная версия DataLife Engine 11.2
( Final Release v.11.2 | Скачать DataLife Engine | Скачать 11.2 demo )
Нужно ли обновляться | Как обновиться | Изменения в шаблонах
> Нет русских символов <
[Приватная тема DLE (Все подробности в ЛС к модератору раздела)]

Версии 10.0 и ниже - уязвимы!

Локализации | F.A.Q. | Внешний вид
Правила раздела | Правила форума
Обсуждение хайда карается баном!
В каждом сообщении указывайте версию DLE, которого они касаются!
Статус темы:
Закрыта.
Модераторы: killoff
  1. bumer3

    bumer3

    Регистр.:
    10 янв 2008
    Сообщения:
    291
    Симпатии:
    154
    Хак позволяет выводить сообщение в меню пользователя и при просмотре ПМ пишет само сообщение.

    [​IMG]
    [​IMG]

    Открываем файл шаблона login.tpl
    И в место куда хотим выводить последний ПМ вставляем
    {$new_post_tpl}

    Отрываем файл engine/init.php
    Коментируем строку
    PHP:
    // include_once ENGINE_DIR.'/modules/pm_alert.php'; 
    Если не хотим всплывающего окна....

    Ищем
    PHP:
    include_once $tpl->dir.'/login.tpl';
    Над ним ставляем
    PHP:
    if ($member_id['pm_unread'] > 0)
    {
        
    $row $db->super_query("SELECT subj, text, user_from FROM " USERPREFIX "_pm WHERE user = '$member_id[user_id]' AND folder = 'inbox' ORDER BY pm_read ASC, date DESC LIMIT 0,1");
        
    $row['subj'] = substr(stripslashes($row['subj']),0,45)." ...";
        
    $row['text'] = substr(strip_tags (stripslashes($row['text']), '<br>'),0,340)." ...";
        
    $row1 $db->super_query("SELECT * FROM " USERPREFIX "_users where name = '{$row['user_from']}'");
        if (
    $row1['foto'] AND (file_exists(ROOT_DIR."/uploads/fotos/".$row1['foto'])))  
        
    $avatar $config['http_home_url']."uploads/fotos/".$row1['foto'];
        else 
    $avatar "{THEME}/images/noavatar.png";

    $new_post_tpl = <<<HTML
    <tr>
     <td style="padding:2px;">
     Вам пришло личных сообщение: <b>
    {$member_id['pm_unread']}</b><br>
     <b>Последнее:</b><br>
    {$lang['pm_asub']}: <b>{$row['subj']}</b><br /><img src="{$avatar}"><br>
    {$lang['pm_from']}: <b>{$row['user_from']}</b><br /><div>{$row['text']}</div>
    <div align="left"><a href="
    {$PHP_SELF}?do=pm"><b>Читать остальные</b></a>
    </td>
    <tr>
    HTML;
    }
    $new_post_tpl содержит шаблон вывода. Правим по вкусу и шаблону.

    Открываем файл engine/modules/pm.php
    Находим
    PHP:
    $pmlist .= "<table class=\"pm\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\"><tr><td width=\"20\">&nbsp;</td><td class=\"pm_head\">".$lang['pm_subj']."</td><td width=\"150\" class=\"pm_head\">".$lang['pm_from']."</td><td width=\"150\" class=\"pm_head\" align=\"center\">".$lang['pm_date']."</td><td width=\"50\" class=\"pm_head\" align=\"center\"><input type=\"checkbox\" name=\"master_box\" title=\"{$lang['pm_selall']}\" onclick=\"javascript:ckeck_uncheck_all()\"></td>";


        
    $db->query($sql);

        while(
    $row $db->get_row()){
    Добавляем дальше
    PHP:
    $row1 $db->super_query("SELECT * FROM " USERPREFIX "_users where name = '{$row['user_from']}'");
        if (
    $row1['foto'] AND (file_exists(ROOT_DIR."/uploads/fotos/".$row1['foto'])))  
        
    $avatar $config['http_home_url']."uploads/fotos/".$row1['foto'];
        else 
    $avatar "{THEME}/images/noavatar.png";
    Находим:
    PHP:
    if ($doaction == "outbox"
        {
            
    $lang['pm_from'] = $lang['pm_to'];
            
    $sql "SELECT id, subj, name as user_from, date, pm_read FROM " USERPREFIX "_pm LEFT JOIN " USERPREFIX "_users ON " USERPREFIX "_pm.user=" USERPREFIX "_users.user_id WHERE user_from = '{$member_id['name']}' AND folder = 'outbox' order by date desc";
        } 
        else 
    $sql "SELECT id, subj, user_from, date, pm_read, reply FROM " USERPREFIX "_pm where user = '{$member_id['user_id']}' AND folder = 'inbox' order by date desc";
    после
    PHP:
    subj,
    дописываем
    PHP:
    text,
    для обоих запросов

    В конце файла есть

    PHP:
    if ($row['reply']) $icon "{THEME}/dleimages/send.gif";

        
    $pmlist .= {код};

        }

        
    $db->free();
    Переменная $pmlist имеет список сообщение там в ее значение можно добавить само сообщение
    PHP:
    {$row[text]}
    или аватарку автора.
    Для получение результата как на картинке
    PHP:
    $pmlist .= "<tr><td><img src=\"{$icon}\" border=\"0\"></td><td class=\"pm_list\">{$subj}<br />{$row[text]}</td><td class=\"pm_list\"><img src=\"{$avatar}\" /><br /><center>{$user_from}</center></td><td class=\"pm_list\" align=\"center\">".langdate("j.m.Y H:i"$row['date'])."</td><td class=\"pm_list\" align=\"center\"><input name=\"selected_pm[]\" value=\"{$row['id']}\" type=\"checkbox\"></td></tr>";
     
    Padonok №1, antiterror, shoma и 5 другим нравится это.
  2. gruppastimul

    gruppastimul Ваш

    Регистр.:
    22 окт 2006
    Сообщения:
    802
    Симпатии:
    130
    а мона не в login.tpl а в main.tpl ? если нет, то как переделать ? просто хочу чтобы это всплывало не там, где логин а в другом месте шаблона )
     
  3. gruppastimul

    gruppastimul Ваш

    Регистр.:
    22 окт 2006
    Сообщения:
    802
    Симпатии:
    130
    и в своей теме про реализацию данного хака я приводил скриншот

    [​IMG]

    и там видно что есть возможность закрыть сообщение или переход в ответ на это сообщение ))
     
  4. bumer3

    bumer3

    Регистр.:
    10 янв 2008
    Сообщения:
    291
    Симпатии:
    154
    Я думаю дальше сам справишся.... из login.tpl убери $new_post_tpl и добавь в main.tpl допустим {new_pm} и потом в index.php поставь замену {new_pm} на $new_post_tpl

    Как сделать кнопочку закрыть я потом придумаю:)
     
  5. PoMaH

    PoMaH

    Регистр.:
    8 июн 2006
    Сообщения:
    753
    Симпатии:
    142
    s vstrojennym JS show_hide
     
  6. domeni

    domeni

    Регистр.:
    5 июн 2006
    Сообщения:
    217
    Симпатии:
    10
    замени
    на
    и
    на
    и будет при нажатии на "прочитать" открываться именно это сообщение.

    а что бы было в main.tpl
    пропиши в index.php

    а чтобы кнопку "закрыть" сделать, можно это сообщение в див спрятать и скрипт highslide-html.js использовать.

    А в двиге есть глюк, когда открываешь личку для просмотра - счетчик непрочтенных сообщений остается прежним, а должен по логике на 1 стать меньше..
     
    antiterror, gruppastimul, emuka и ещё 1-му нравится это.
  7. emuka

    emuka Создатель

    Регистр.:
    31 окт 2006
    Сообщения:
    12
    Симпатии:
    0
    Всё расписанно достаточно подробно. лучше тетируй на денвере, пробуй. обязательно получится!
    Спасибо за хороший мод!:ay:
     
  8. gruppastimul

    gruppastimul Ваш

    Регистр.:
    22 окт 2006
    Сообщения:
    802
    Симпатии:
    130
    все хорошо, все работает тоько при заходе в index.php?do=pm

    сверху ошибка высвечивается

    Warning: mysql_fetch_assoc(:( 30 is not a valid MySQL result resource in /public_html/engine/classes/mysql.class.php on line 100

    и в index.php?do=pm выводится только 1 сообщение

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

    domeni

    Регистр.:
    5 июн 2006
    Сообщения:
    217
    Симпатии:
    10
    1. проверяй что намудрил в pm.php (или у тебя действительно только 1 личка)
    2. Этот вопрос задавали на поддержке, ответа нет. Только самостоятельно ручками доделывать :)
     
  10. gruppastimul

    gruppastimul Ваш

    Регистр.:
    22 окт 2006
    Сообщения:
    802
    Симпатии:
    130

    это я как понял про

    а помочь с этим реально ? )

    неее - делал, как все описано в первом посте, несколько раз повторял - не спеша ))

    по моему

    PHP:
    $row $db->super_query("SELECT subj, text, user_from FROM " USERPREFIX "_pm WHERE user = '$member_id[user_id]' AND folder = 'inbox' ORDER BY pm_read ASC, date DESC LIMIT 0,1");
    LIMIT 0,1 как раз ограничивает вывод одного последнего сообщения ) но тогда и в самом пм (index.php?do=pm) выводится 1 сообщение

    Редактируй сообщения, а не флуди.
     
Статус темы:
Закрыта.