1. Важное и срочное обновление IPB 3.4.5 - https://nulled.cc/threads/243375/

[Мод] MOD Спасибо на Ajax (от smash_TeAm™)

Тема в разделе "IPB", создана пользователем XUC, 15 авг 2008.

Статус темы:
Закрыта.
Модераторы: Maybe
  1. XUC

    XUC Ушел в небытие

    Регистр.:
    3 сен 2006
    Сообщения:
    809
    Симпатии:
    505
    для тех у кого стоит thx_advanced :;)

    Правка шаблонов.
    Admin CP -> LOOK & FEEL -> * -> Edit Template HTML
    Админцентр -> ВНЕШНИЙ ВИД -> * -> Изменить HTML фрагменты
    ======================================================================
    skin_topic (Просмотр темы/Topic View) -> RenderRow
    ----------------------------------------------------------------------
    Найти:
    ----------------------------------------------------------------------
    {$post['who_thanks']}
    ----------------------------------------------------------------------
    Заменить:
    ----------------------------------------------------------------------
    <span id="list_{$post['pid']}">{$post['who_thanks']}</span>
    ----------------------------------------------------------------------
    Найти:
    ----------------------------------------------------------------------
    {$post['thanks_button']}
    ----------------------------------------------------------------------
    Заменить:
    ----------------------------------------------------------------------
    <span id="button_{$post['pid']}">{$post['thanks_button']}</span>
    ----------------------------------------------------------------------

    Шаблон: skin_topic -> button_thanks
    ----------------------------------------------------------------------
    Заменить содержимое на:
    ----------------------------------------------------------------------
    <a href="javascript:add_thx_ajax('{$this->ipsclass->input['f']}', '{$this->ipsclass->input['t']}','{$post}')"><img src='style_images/<#IMG_DIR#>/thanks.gif' border='0' alt='Спасибо' /></a>
    ----------------------------------------------------------------------
    Входящие переменные теже :)
    /jscripts/ipb_topic.js
    в самый конец добавить:

    function add_thx_ajax(fid, tid, pid)
    {
    //----------------------------------
    // Using fancy js?
    //----------------------------------

    if ( !use_enhanced_js )
    {
    return;
    }

    //----------------------------------
    // Make data for request
    //----------------------------------

    var url = ipb_var_base_url+'act=xmlout&do=add-thx-ajax&fid=' + fid + '&tid=' + tid + '&pid=' + pid;

    //----------------------------------
    // Request done function
    //----------------------------------

    do_request_function = function()
    {
    document.getElementById('button_' + pid).innerHTML = '';
    if (!xmlobj.readystate_ready_and_ok())
    {
    xmlobj.show_loading();
    return;
    }

    xmlobj.hide_loading();
    var ret_str = xmlobj.xmlhandler.responseText;

    if( ret_str != 'error')
    {
    var ret_arr = PHP_Unserialize(ret_str);
    document.getElementById('list_' + pid).innerHTML = ret_arr['list'];
    }
    }

    xmlobj = new ajax_request();
    xmlobj.onreadystatechange(do_request_function);
    var xmlreturn = xmlobj.process(url, 'GET');

    return;
    }

    /**
    * This file is part of the PHP_Unserialize package (http://www.phpguru.org/)
    *
    * PHP_Unserialize is free software; you can redistribute it and/or modify
    * it under the terms of the GNU General Public License as published by
    * the Free Software Foundation; either version 2 of the License, or
    * (at your option) any later version.
    *
    * PHP_Unserialize is distributed in the hope that it will be useful,
    * but WITHOUT ANY WARRANTY; without even the implied warranty of
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    * GNU General Public License for more details.
    *
    * You should have received a copy of the GNU General Public License
    * along with PHP_Unserialize; if not, write to the Free Software
    * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    *
    * © Copyright 2005 Richard Heyes
    * http://www.phpguru.org/
    */

    /**
    * Unserializes a PHP serialized data type. Currently handles:
    * o Strings
    * o Integers
    * o Doubles
    * o Arrays
    * o Booleans
    * o NULL
    * o Objects
    *
    * alert()s will be thrown if the function is passed something it
    * can't handle or incorrect data.
    *
    * @param string input The serialized PHP data
    * @return mixed The resulting datatype
    */
    function PHP_Unserialize(input)
    {
    var result = PHP_Unserialize_(input);
    return result[0];
    }


    /**
    * Function which performs the actual unserializing
    *
    * @param string input Input to parse
    */
    function PHP_Unserialize_(input)
    {
    var length = 0;

    switch (input.charAt(0)) {
    /**
    * Array
    */
    case 'a':
    length = PHP_Unserialize_GetLength(input);
    input = input.substr(String(length).length + 4);

    var arr = new Array();
    var key = null;
    var value = null;

    for (var i=0; i<length; ++i) {
    key = PHP_Unserialize_(input);
    input = key[1];

    value = PHP_Unserialize_(input);
    input = value[1];

    arr[key[0]] = value[0];
    }

    input = input.substr(1);
    return [arr, input];
    break;

    /**
    * Objects
    */
    case 'O':
    length = PHP_Unserialize_GetLength(input);
    var classname = String(input.substr(String(length).length + 4, length));

    input = input.substr(String(length).length + 6 + length);
    var numProperties = Number(input.substring(0, input.indexOf(':')))
    input = input.substr(String(numProperties).length + 2);

    var obj = new Object();
    var property = null;
    var value = null;

    for (var i=0; i<numProperties; ++i) {
    key = PHP_Unserialize_(input);
    input = key[1];

    // Handle private/protected
    key[0] = key[0].replace(new RegExp('^\x00' + classname + '\x00'), '');
    key[0] = key[0].replace(new RegExp('^\x00\\*\x00'), '');

    value = PHP_Unserialize_(input);
    input = value[1];

    obj[key[0]] = value[0];
    }

    input = input.substr(1);
    return [obj, input];
    break;

    /**
    * Strings
    */
    case 's':
    length = PHP_Unserialize_GetLength(input);
    return [String(input.substr(String(length).length + 4, length)), input.substr(String(length).length + 6 + length)];
    break;

    /**
    * Integers and doubles
    */
    case 'i':
    case 'd':
    var num = Number(input.substring(2, input.indexOf(';')));
    return [num, input.substr(String(num).length + 3)];
    break;

    /**
    * Booleans
    */
    case 'b':
    var bool = (input.substr(2, 1) == 1);
    return [bool, input.substr(4)];
    break;

    /**
    * Null
    */
    case 'N':
    return [null, input.substr(2)];
    break;

    /**
    * Unsupported
    */
    case 'o':
    case 'r':
    case 'C':
    case 'R':
    case 'U':
    alert('Error: Unsupported PHP data type found!');

    /**
    * Error
    */
    default:
    return [null, null];
    break;
    }
    }


    /**
    * Returns length of strings/arrays etc
    *
    * @param string input Input to parse
    */
    function PHP_Unserialize_GetLength(input)
    {
    input = input.substring(2);
    var length = Number(input.substr(0, input.indexOf(':')));
    return length;
    }

    Сохранить.

    /sources/action_public/xmlout.php
    Найти:
    case 'post-editorswitch':
    $this->post_editorswitch();
    break;
    добавить после:
    case 'add-thx-ajax':
    $this->add_thx_ajax();
    break;
    Найти:
    /*-------------------------------------------------------------------------*/
    // Save profile settings
    /*-------------------------------------------------------------------------*/
    Добавить выше:
    function add_thx_ajax()
    {
    $post_id = intval($this->ipsclass->input['pid']);
    $topic_id = intval($this->ipsclass->input['tid']);
    $forum_id = intval($this->ipsclass->input['fid']);

    if ( (!$post_id) or (!$topic_id) or (!$forum_id) )
    {
    $this->class_ajax->print_nocache_headers();
    $this->class_ajax->return_string('error');
    }

    // Read post's thanks and author's id
    $post = $this->ipsclass->DB->simple_exec_query( array( 'select' => '`post_thanks`, `topic_id`, `author_id`', 'from' => 'posts', 'where' => '`pid` = ' . $post_id ) );
    if ($post['author_id'])
    {
    // If author not guest, read thanks points and group
    $author = $this->ipsclass->DB->simple_exec_query( array( 'select' => '`mgroup`, `thanks_point`', 'from' => 'members', 'where' => '`id` = ' . $post['author_id'] ) );
    }
    else
    {
    // Author's group is "Guest"
    $author['mgroup'] = $this->ipsclass->vars['guest_group'];
    $author['thanks_point'] = 0;
    }

    // Check topic id
    if ( (!$post['topic_id']) or ($post['topic_id'] != $topic_id) )
    {
    $this->class_ajax->print_nocache_headers();
    $this->class_ajax->return_string('error');
    }

    // Check permissions
    if ( ( ($this->ipsclass->vars['thanks_forum_lim']) and (!in_array($forum_id, explode(',',$this->ipsclass->vars['thanks_forums']))) )
    or ( ($this->ipsclass->vars['thanks_from_grp_lim']) and (!in_array($this->ipsclass->member['mgroup'], explode(',',$this->ipsclass->vars['thanks_from_groups']))) )
    or ( ($this->ipsclass->vars['thanks_to_grp_lim']) and (!in_array($author['mgroup'], explode(',',$this->ipsclass->vars['thanks_to_groups']))) )
    or (!$this->ipsclass->member['id']) )
    {
    $this->ipsclass->print->redirect_screen( $this->ipsclass->lang['thx_out_of_permissions'], "s=&showtopic={$topic_id}&view=findpost&p={$post_id}" );
    }

    // If current member is author of this post
    if ( $this->ipsclass->member['id'] == $post['author_id'] )
    {
    $this->ipsclass->print->redirect_screen( $this->ipsclass->lang['thx_thanks_itself'], "s=&showtopic={$topic_id}&view=findpost&p={$post_id}" );
    }

    // Create array of members who told "Thanks"
    $member_thanks = explode( ',', $post['post_thanks'] );

    // If current member already has told "Thanks"
    if ( in_array($this->ipsclass->member['id'], $member_thanks) )
    {
    $this->ipsclass->print->redirect_screen( $this->ipsclass->lang['thx_already_included'], "s=&showtopic={$topic_id}&view=findpost&p={$post_id}" );
    }

    // Add currend member to "post_thanks"
    $insert_thanks = ( $post['post_thanks'] == "" ) ? ( $this->ipsclass->member['id'] ) : ( $post['post_thanks'] . "," . $this->ipsclass->member['id'] );

    $this->ipsclass->DB->do_update( 'posts', array( 'post_thanks' => $insert_thanks), 'pid = ' . $post_id );

    if ($post['author_id'])
    {
    // If author not guest, +1 to "thanks_point"
    $this->ipsclass->DB->do_update( 'members', array( 'thanks_point' => $author['thanks_point']+1 ), 'id = ' . $post['author_id'] );
    }
    $this->ipsclass->load_language( 'lang_topic' );

    $this->ipsclass->DB->simple_construct( array( 'select' => '`id`, `members_display_name`', 'from' => 'members', 'where' => '`id` IN (' . $insert_thanks . ')', 'order' => '`members_display_name` ASC') );
    $this->ipsclass->DB->simple_exec();

    while($who_thanks = $this->ipsclass->DB->fetch_row())
    {
    $show_thanks .= "<a href='{$this->ipsclass->base_url}showuser={$who_thanks['id']}' target='_blank'>" . $who_thanks['members_display_name'] . "</a>" . ', ';
    }
    $list = "<br /><br /><div class=\"thin\"><I>{$this->ipsclass->lang['thx_thanks_told']}:</I><div class=\"signature\">" . $show_thanks . "</div></div>";

    $count = "{$this->ipsclass->lang['thx_thanks_told']}: " . $author['thanks_point']+1 . " {$this->ipsclass->lang['thx_thanks_told_suf']}<br />";
    $thx_count[$post['author_id']] = $count;

    $ret = array( 'list' => $list, 'thx_count' => $thx_count );

    $this->class_ajax->print_nocache_headers();
    $this->class_ajax->return_string(serialize($ret));

    }
    Сохранить. всё :) настройки теже, всё тоже, история и остальное как и прежде. тока само добавление спасибы из темы типа аякесом чичас будет.
    Сразу говорю - это на скорую руку накидано, но работает :)
    будут ошибки - пишите сюда, авось отвечу), как отдельный мод с поддержкой - делать не буду. просто не интересно.
     
    newbigmir, DARGO_Ural, we_are_hakers и 3 другим нравится это.
  2. we_are_hakers

    we_are_hakers

    Регистр.:
    10 апр 2008
    Сообщения:
    650
    Симпатии:
    178
    чет не пойму, это дополнение к thx_advanced или отдельный мод?:) тут нету такого прокола, что можно ставить несколько спасибок одновременно?
     
  3. smash_TeAm™

    smash_TeAm™

    Регистр.:
    28 авг 2007
    Сообщения:
    268
    Симпатии:
    81
    1. дополнение.
    2. ну по идее кнопка пропадает после первого же нажатия... если с двух разных окошек нажать спасибку по условие // If current member already has told "Thanks" не добавит ещё раз :)
     
    we_are_hakers нравится это.
  4. Mikebot

    Mikebot Создатель

    Регистр.:
    19 июл 2008
    Сообщения:
    37
    Симпатии:
    0
    ни у кого не наблюдалось, что юзер может сам себе наставить спасибок?
     
  5. smash_TeAm™

    smash_TeAm™

    Регистр.:
    28 авг 2007
    Сообщения:
    268
    Симпатии:
    81
    // If current member is author of this post
    if ( $this->ipsclass->member['id'] == $post['author_id'] )
    это для того чтобы автор сам себе не нафтыкал спасибок
     
    coden и mylipetsk нравится это.
  6. OH.UA

    OH.UA Создатель

    Регистр.:
    12 мар 2008
    Сообщения:
    49
    Симпатии:
    28
    У кого-то есть рабочий линк на thx_advanced?
     
    mylipetsk нравится это.
  7. Kane

    Kane

    Регистр.:
    12 окт 2007
    Сообщения:
    155
    Симпатии:
    143
    OH.UA
    Держи
    http://www.ibresource.ru/forums/index.php?showtopic=33721
     
    OH.UA нравится это.
  8. OH.UA

    OH.UA Создатель

    Регистр.:
    12 мар 2008
    Сообщения:
    49
    Симпатии:
    28
    Странно, не работает. Жму кнопку а спасибка недобавляеться. В браузере показывает ошибки ява скрипта.

    Просто когда зайти в тему:

    Код:
    строка: 168
    Символ: 2
    Ошибка: 'hljs' - определение отсутствует
    Код: 0
    URL-адрес: http://...
    
    После нажатие на кнопку:

    Код:
    строка: 1158
    Символ: 1
    Ошибка: 'list' - есть null или не является обьектом
    Код: 0
    URL-адрес: http://...
    
    Кто-то может помочь?
     
  9. кот-обормот

    кот-обормот Постоялец

    Регистр.:
    20 сен 2008
    Сообщения:
    132
    Симпатии:
    6
    а эти спасибы будут работать с приватным текстом третьим WildRAID'а?
     
  10. smash_TeAm™

    smash_TeAm™

    Регистр.:
    28 авг 2007
    Сообщения:
    268
    Симпатии:
    81
    будут. только открываться скрытый текст будет после перезагрузки страницы...
     
Статус темы:
Закрыта.