Tự động rút gọn link trong bài viết cho xenforo

Thảo luận trong 'Development Tutorials' bắt đầu bởi minhlaobao, 3/8/13.

1votes
5/5, 1 vote

  1. minhlaobao

    minhlaobao Member

    Bài viết:
    83
    Likes :
    33
    Rãnh rỗi ngồi viết cho các bạn bài hướng dẫn tạo link rút gọn cho xenforo, có thể dùng api của adf.ly để tăng thêm thu nhập cho diễn đàn của các bạn.

    UPDATE CHO XENFORO 1.2

    Đầu tiên các bạn vào library/XenForo/BbCode/Formatter/BbCode/AutoLink.php
    Edit file này và thay toàn bộ code trong đó bằng:
    PHP:
    <?php

    /**
    * BB code to BB code formatter that automatically links URLs and emails using
    * [url] and [email] tags.
    *
    * @package XenForo_BbCode
    */
    class XenForo_BbCode_Formatter_BbCode_AutoLink extends XenForo_BbCode_Formatter_BbCode_Abstract
    {
        
    /**
        * Callback for all tags.
        *
        * @var callback
        */
        
    protected $_generalTagCallback = array('$this''autoLinkTag');

        
    /**
        * The tags that disable autolinking.
        *
        * @var array
        */
        
    protected $_disableAutoLink = array('url''email''img''code''php''html''plain''media');

        
    /**
        * Auto embed media settings.
        *
        * @var array
        */
        
    protected $_autoEmbed = array();

        
    /**
        * Amount of media embeds that can be automatically applied.
        *
        * @var integer 0 will disable auto embed
        */
        
    protected $_autoEmbedRemaining 0;

        protected 
    $_enableAutoEmbed true;

        public function 
    __construct()
        {
            
    parent::__construct();

            
    $options XenForo_Application::get('options');

            
    // TODO: end-user ability to disable auto-embedding on a per-post basis
            
    $this->_autoEmbed $options->autoEmbedMedia;
            
    $this->_autoEmbedRemaining = ($options->messageMaxMedia $options->messageMaxMedia PHP_INT_MAX);
        }

        public function 
    renderTree(array $tree, array $extraStates = array())
        {
            
    $this->_subtractMediaTagsRemaining($tree);
            return 
    parent::renderTree($tree$extraStates);
        }

        public function 
    setAutoEmbed($enable)
        {
            
    $this->_enableAutoEmbed $enable;
        }

        protected function 
    _subtractMediaTagsRemaining(array $tree)
        {
            foreach (
    $tree AS $element)
            {
                if (
    is_array($element))
                {
                    
    // tag
                    
    if (strtolower($element['tag']) == 'media')
                    {
                        
    $this->_autoEmbedRemaining--;
                    }
                    
    $this->_subtractMediaTagsRemaining($element['children']);
                }
            }
        }

        
    /**
        * Callback that all tags with go through. Changes the rendering state to disable
        * URL parsing if necessary.
        *
        * @param array $tag
        * @param array $rendererStates

        * @return string
        */
        
    public function autoLinkTag(array $tag, array $rendererStates)
        {
            if (
    in_array($tag['tag'], $this->_disableAutoLink))
            {
                
    $rendererStates['stopAutoLink'] = true;
            }

            if (
    $tag['tag'] == 'url'
                
    && $this->_autoEmbed['embedType'] != XenForo_Helper_Media::AUTO_EMBED_MEDIA_DISABLED
                
    && $this->_enableAutoEmbed
            
    )
            {
                
    $childText $this->stringifyTree($tag['children'], $rendererStates);
                if (empty(
    $tag['option']) || $tag['option'] == $childText)
                {
                    return 
    $this->_autoLinkUrl($childText);
                }
            }

            
    $text $this->renderSubTree($tag['children'], $rendererStates);

            if (!empty(
    $tag['original']) && is_array($tag['original']))
            {
                list(
    $prepend$append) = $tag['original'];
            }
            else
            {
                
    $prepend '';
                
    $append '';
            }

            
    // note: necessary to return prepend/append unfiltered to keep them unchanged
            
    return $prepend $text $append;
        }

        
    /**
        * String filter that does link parsing if not disabled.
        *
        * @param string $string
        * @param array $rendererStates List of states the renderer may be in
        *
        * @return string Filtered/escaped string
        */
        
    public function filterString($string, array $rendererStates)
        {
            if (empty(
    $rendererStates['stopAutoLink']))
            {
                
    $string preg_replace_callback(
                    
    '#(?<=[^a-z0-9@-]|^)(https?://|ftp://|www\.)[^\s"]+#i',
                    array(
    $this'_autoLinkUrlCallback'),
                    
    $string
                
    );

                if (
    strpos($string'@') !== false)
                {
                    
    // assertion to prevent matching email in url matched above (user:pass@example.com)
                    
    $string preg_replace(
                        
    '#[a-z0-9.+_-]+@[a-z0-9-]+(\.[a-z]+)+(?![^\s"]*\[/url\])#i',
                        
    '[email]$0[/email]',
                        
    $string
                    
    );
                }
            }

            return 
    $string;
        }

        
    /**
        * Callback for the auto-linker regex.
        *
        * @param array $match
        *
        * @return string
        */
        
    protected function _autoLinkUrlCallback(array $match)
        {
            return 
    $this->_autoLinkUrl($match[0]);
        }

        
    /**
        * Handles autolinking the given URL.
        *
        * @param string $url
        *
        * @return string
        */
        
    protected function _autoLinkUrl($url)
        {   
            
    $link XenForo_Helper_String::prepareAutoLinkedUrl($url);
            
    $shortlink '';
         
            
    //Tùy chọn rút gọn url.begood.vn hoặc adf.ly (0 = url.begood.vn, 1 = adf.ly)
            
    $short_type 0;
         
            
    /*
                API ADF.LY
                Truy cập vào https://adf.ly/publisher/tools#tools-api để lấy api
                Lưu ý: phải xóa đoạn http://somewebsite.com tức là chỉ lấy như dưới đây:
                http://api.adf.ly/api.php?key=cf4076fb11d708343abeb9f34959f494&uid=294219&advert_type=int&domain=adf.ly&url=
            */
            
    $api "http://api.adf.ly/api.php?key=cf4076fb11d708343abeb9f34959f494&uid=294219&advert_type=int&domain=link.begood.vn&url=";
         
            
    //Kiểm tra các url không cần rút gọn
            
    $check strpos($link['url'], "url.begood.vn");
            
    $check2 strpos($link['url'], "file.begood.vn");
            if(
    $check == true || $check2 == true)
            {
                
    $shortlink $link['url'];
            }else{
                if(
    $short_type == 0){
                    
    $newlink base64_encode($link['url']);
                    
    $key md5('begood.vn-minh');
                    
    $shortlink file_get_contents("http://api.begood.vn/main/url/$key/$newlink");
                }elseif(
    $short_type 1){
                    
    $shortlink file_get_contents($api.$link['url']);
                } 
            }
            if (
    $link['url'] === $link['linkText'])
            {
                if (
    $this->_autoEmbed['embedType'] != XenForo_Helper_Media::AUTO_EMBED_MEDIA_DISABLED
                    
    && $this->_autoEmbedRemaining 0
                    
    && $this->_enableAutoEmbed
                    
    && ($mediaTag XenForo_Helper_Media::convertMediaLinkToEmbedHtml($link['url'], $this->_autoEmbed))
                )
                {
                    
    $tag $mediaTag;
                    
    $this->_autoEmbedRemaining--;
                }
                else
                {
                    
    $tag '[url]' $shortlink '[/url]';
                }
            }
            else
            {
                
    $tag '[url="' $shortlink '"]' $link['linkText'] . '[/url]';
            }

            return 
    $tag $link['suffixText'];
        }
    }
    Chú ý:
    PHP:
    $short_type
    Có 2 giá trị để chọn, nếu bạn sử dụng rút gọn của url.begood.vn thì dữ nguyên giá trị là 0 nếu chọn adf.ly thì sửa thành 1

    Khi sử dụng adf.ly bạn cần vào https://adf.ly/publisher/tools#tools-api để lấy api và thay đoạn code bạn lấy được bằng cái API của mình đã để mặc định trên, Lưu ý chỉ lấy từ dấu = cuối cùng tức là phải bỏ http://somewebsite.com đi,
    Ví dụ:
    Mã:
    http://api.adf.ly/api.php?key=cf4076fb11d708343abeb9f34959f494&uid=294219&advert_type=int&domain=adf.ly&url=
    PHP:
    $check strpos($link['url'], "url.begood.vn");
    $check2 strpos($link['url'], "file.begood.vn");
    Là các url mà bạn không muốn bị rút gọn nhé!

    Chúc các bạn thành công
     
    Last edited: 12/9/13
    Đang tải...
  2. sonhatq

    sonhatq Member

    Bài viết:
    157
    Likes :
    5
    cái này dùng thì rút gon link cho toàn bộ diễn đàn dúng không nhỉ
    nghĩa là bất cứ ai post link vào diễn đàn, thì khi click bào đều chuyển qua adf.ly?
     
  3. thanhmaikmt

    thanhmaikmt Member

    Bài viết:
    210
    Likes :
    36
    có cách nào mà post linh vào nó chỉ hiển thị nội dung tiêu đề không vậy nhỉ, giống vbb ở 5 giây, đó
     
  4. sonhatq

    sonhatq Member

    Bài viết:
    157
    Likes :
    5
    lỗi rồi sau khi sử dụng code trên
    mình vào test thử thì không thể tạo bài viết mới và cũng không thể reply bài mới
    báo lỗi như sau:
    kiem tra server log
    Mã:
    ErrorException: Fatal Error: Call to undefined method XenForo_BbCode_Formatter_BbCode_AutoLink::setAutoEmbed() - library/XenForo/Helper/String.php:219
    Generated By: sonhatq, 2 minutes ago
    Stack Trace
    
    #0 [internal function]: XenForo_Application::handleFatalError()
    #1 {main}
    
    Request State
    
    array(3) {
      ["url"] => string(64) "http://chovo.vn/index.php?threads/claim-for-subforum.8/add-reply"
      ["_GET"] => array(1) {
        ["threads/claim-for-subforum_8/add-reply"] => string(0) ""
      }
      ["_POST"] => array(9) {
        ["message_html"] => string(113) "<p>sndasd</p><p>asdakjdas</p><p>dasdas</p><p>dasdad</p><p><br></p><p><br></p><p>http://webhostdomain.info<br></p>"
        ["_xfRelativeResolver"] => string(55) "http://chovo.vn/index.php?threads/claim-for-subforum.8/"
        ["attachment_hash"] => string(32) "1f047d6cd970610339a068802d1d6feb"
        ["last_date"] => string(10) "1377311869"
        ["last_known_date"] => string(10) "1377311869"
        ["_xfToken"] => string(8) "********"
        ["_xfRequestUri"] => string(40) "/index.php?threads/claim-for-subforum.8/"
        ["_xfNoRedirect"] => string(1) "1"
        ["_xfResponseType"] => string(4) "json"
      }
    }
    
    
     
  5. minhlaobao

    minhlaobao Member

    Bài viết:
    83
    Likes :
    33
    Bạn kiểm tra lại xem có thiếu ; hay ghi nhầm thêm gì vào ko hoặc để lại yahoo mình giúp cho
     
  6. yeuem5phut

    yeuem5phut Member

    Bài viết:
    108
    Likes :
    6
    yahoo mình nè ye_5p mình dùng trên localhost lỗi tương tự như bạn trên ko thể tạo bài viết mới
     
  7. Character_Boy

    Character_Boy Member

    Bài viết:
    316
    Likes :
    54
    Cách này mình thấy không hiệu quả lắm
     
  8. yeuem5phut

    yeuem5phut Member

    Bài viết:
    108
    Likes :
    6
    bác chủ top đâu sao không thấy vào giúp nhỉ?
     
  9. yeuem5phut

    yeuem5phut Member

    Bài viết:
    108
    Likes :
    6
  10. yeuem5phut

    yeuem5phut Member

    Bài viết:
    108
    Likes :
    6
  11. minhlaobao

    minhlaobao Member

    Bài viết:
    83
    Likes :
    33
    Xen 1.2 đang lỗi tối mình fix up lại cho bạn nhé
     
  12. yeuem5phut

    yeuem5phut Member

    Bài viết:
    108
    Likes :
    6
    ok bạn :)
     
  13. yeuem5phut

    yeuem5phut Member

    Bài viết:
    108
    Likes :
    6
  14. minhlaobao

    minhlaobao Member

    Bài viết:
    83
    Likes :
    33
    Ok rồi đó bạn

    Cập nhật cho xenforo 1.2 nhé
     
  15. yeuem5phut

    yeuem5phut Member

    Bài viết:
    108
    Likes :
    6
    ok thanks chủ thớt cho 100 like :)
     
  16. tuanthaolove05

    tuanthaolove05 New Member

    Bài viết:
    11
    Likes :
    0
    Các bác cho em hỏi, khi em copy.link 1 bài viết và dán vào bài viết khác thì nó ra link dài.ngoằng khác link ban đầu.bấm vào thofli vẫn dẫn toei bài viết.phải làm thế nào ạ.tks
     
  17. minhlaobao

    minhlaobao Member

    Bài viết:
    83
    Likes :
    33
    Mình chẳng hiểu bạn đang muốn nói gì :)
     
  18. tuanthaolove05

    tuanthaolove05 New Member

    Bài viết:
    11
    Likes :
    0
  19. minhlaobao

    minhlaobao Member

    Bài viết:
    83
    Likes :
    33
    À vấn để này bạn chịu khó search loại bỏ dấu ở url đi nhé!
     
  20. tuanthaolove05

    tuanthaolove05 New Member

    Bài viết:
    11
    Likes :
    0
    ok thanks bạn đã nhờ người làm rồi
     
comments powered by Disqus

Chia sẻ trang này

Đang tải...