1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - коммерческий форумный движок от бывших создателей vBulletin, написанный на PHP.

Помогите допилить BBcodeManager

Тема в разделе "Основные вопросы по XenForo", создана пользователем adder, 11.10.2010.

Загрузка
  1. adder

    adder Местный

    Регистрация:
    08.10.10
    Сообщения:
    1 164
    Симпатии:
    846
    Версия XF:
    1.3.4
    Приветствую всех. Прошу помощи в редактировании хака BB code Manager. А точнее спойлера из данного хака. Я уже сделал стиль у кнопок, как у XenForo (Создать тему и т.д.) и старался сделать так, чтобы при нажатии на Hide, появлялось снова название спойлера, а не Show Spoiler.
    Вот код того файла, который отвечает за это
    PHP:
    <?php

    class BbCodeManager_BbCode_Formatter_Base extends XFCP_BbCodeManager_BbCode_Formatter_Base
    {
        protected 
    $_tags;
        
        public function 
    getTags()
        {
            
    $this->_tags parent::getTags();
            
    $this->_tags['spoiler'] = array(
                    
    'hasOption' => true,
                    
    'replace' => array('<div class="spoiler"><div class="quotetitle"><input class="button primary" type="button" value="%s" style="font-size:11px;margin:0px;padding:0px;" onclick="if (this.parentNode.parentNode.getElementsByTagName(\'div\')[1].getElementsByTagName(\'div\')[0].style.display != \'\') { this.parentNode.parentNode.getElementsByTagName(\'div\')[1].getElementsByTagName(\'div\')[0].style.display = \'\';        this.innerText = \'\'; this.value = \'Скрыть\'; } else { this.parentNode.parentNode.getElementsByTagName(\'div\')[1].getElementsByTagName(\'div\')[0].style.display = \'none\'; this.innerText = \'\'; this.value = \'Показать спойлер\'; }" /></div><div class="quotecontent"><div style="display: none;">''</div></div></div>')
                );
            
    $this->_tags['flash'] = array(
                    
    'parseCallback' => array($this'parseValidatePlainIfNoOption'),
                    
    'callback' => array($this'renderTagFlash'),
                    );
            
    $this->_tags['user'] = array(
                    
    'parseCallback' => array($this'parseValidatePlainIfNoOption'),
                    
    'callback' => array($this'renderTagUserLink'),
                    );
            return 
    $this->_tags;
        }
        
        function 
    renderTagFlash(array $tag, array $rendererStates)
        {
            if (!empty(
    $tag['option']))
            {
                
    $wh $tag['option'];
                
    $attributes split(', '$wh);
                
    $attributes['width'] = $attributes[0];
                
    $attributes['height'] = $attributes[1];
                
                
    $src $tag['children'][0];
            }
            else
            {
                
    $attributes['width'] = '550';
                
    $attributes['height'] = '400';
                
    $src $tag['children'][0];
            }
            if(
    XenForo_Application::get('options')->enableFlashBbCode == 1)
            {
                return 
    '<object width="' $attributes['width'] . '" height="' $attributes['height'] . '">
                            <param name="movie" value="' 
    $src '">
                                <embed src="' 
    $src '" width="' $attributes['width'] . '" height="' $attributes['height'] . '">
                                </embed>
                        </object>'
    ;
            }
            else
            {
                return 
    '';
            }
        }
        
        function 
    renderTagUserLink(array $tag, array $rendererStates)
        {
            
    $userModel XenForo_Model::create('XenForo_Model_User');
            
            if (
    $tag['option'] != NULL)
            {
                
    $userid $tag['option'];
            }
            else
            {
                
    $userid XenForo_Model_User::getUserIdFromUser($userModel->getUserByName($tag['children'][0]));
            }
            
    $url XenForo_Link::buildPublicLink('members', array('user_id' => $userid'username' => $tag['children'][0]));

            list(
    $class$target) = XenForo_Helper_String::getLinkClassTarget($url);
            
    $class $class " class=\"$class\"" '';
            
    $target $target " target=\"$target\"" '';
            
    $noFollow = (empty($rendererStates['noFollowDefault']) ? '' ' rel="nofollow"');

            return 
    '<a href="' htmlspecialchars($url) . '"' $target $class $noFollow '>' $tag['children'][0] . '</a>';
        }
    }
    Помогите пожалуйста профиксить данный недочёт.

    Заранее спасибо
     
    CyberAP нравится это.
  2. CyberAP

    CyberAP Местный

    Регистрация:
    05.10.10
    Сообщения:
    2 604
    Симпатии:
    1 660
    Версия XF:
    1.5.10
    Не знаю. Я помню что раньше было что-то подобное, но сейчас проверил - при нажатии на спойлер у него остаётся то же название. Это если у спойлера стоит параметр. Без параметра спойлер вообще не отображает.
    Кстати загрузи пожалуйста версию со стилем у спойлера, не хватает как раз этого.
     
  3. CyberAP

    CyberAP Местный

    Регистрация:
    05.10.10
    Сообщения:
    2 604
    Симпатии:
    1 660
    Версия XF:
    1.5.10
    Ага, похоже что название у кнопки не меняется в хроме. В опере же баг остаётся.
     
  4. CyberAP

    CyberAP Местный

    Регистрация:
    05.10.10
    Сообщения:
    2 604
    Симпатии:
    1 660
    Версия XF:
    1.5.10
    Вот так выглядит у меня кнопка спойлера:
    HTML:
    input type="button" value="Hide" style="font-size:11px;margin:0px;padding:0px;" onclick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = 'Hide'; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = 'Show Spoiler'; }"
    Тут нужно чтобы заместо this.value = 'Show Spoiler' было this.value = 'Название спойлера'
     
  5. adder

    adder Местный

    Регистрация:
    08.10.10
    Сообщения:
    1 164
    Симпатии:
    846
    Версия XF:
    1.3.4
    Тот код, что в первом посту со стилем уже) Просто в файле Base.php удали всё и вставь мой код :)
    Я уже пробовал вместо this.value = /'Show Spoiler/' ставить this.value = '%s'
    Не помогло, только съехал стиль от этого...
     
    CyberAP нравится это.
  6. CyberAP

    CyberAP Местный

    Регистрация:
    05.10.10
    Сообщения:
    2 604
    Симпатии:
    1 660
    Версия XF:
    1.5.10
    Попробуй this.value = "%s"
     
  7. adder

    adder Местный

    Регистрация:
    08.10.10
    Сообщения:
    1 164
    Симпатии:
    846
    Версия XF:
    1.3.4
    Попробовал, не помогло. Так же самое съехало :(
    Написал автору данного хака, чтобы пофиксил... пока он в сети :D
     
  8. CyberAP

    CyberAP Местный

    Регистрация:
    05.10.10
    Сообщения:
    2 604
    Симпатии:
    1 660
    Версия XF:
    1.5.10
    Пытался понять его код, но так и не понял как исправить.
     
  9. CyberAP

    CyberAP Местный

    Регистрация:
    05.10.10
    Сообщения:
    2 604
    Симпатии:
    1 660
    Версия XF:
    1.5.10
    Нужно понять как дублировать %s. В параметре спойлера всего один параметр, поэтому когда мы вставляем в код ещё один %s то возникает ошибка. Возможно стоит переписать код таким образом чтобы параметр спойлера записывался в какую-нибудь переменную, либо javascript переписать.
     
  10. adder

    adder Местный

    Регистрация:
    08.10.10
    Сообщения:
    1 164
    Симпатии:
    846
    Версия XF:
    1.3.4
    GiveMeABreak, как мне и обещал профиксил данный баг.
    В файле /ваш_форум/library/BbCodeManager/BbCode/Formatter/Base.php нужно заменить всё содержимое на:
    PHP:
    <?php

    class BbCodeManager_BbCode_Formatter_Base extends XFCP_BbCodeManager_BbCode_Formatter_Base
    {
        protected 
    $_tags;
        public function 
    getTags()
        {
            
    $this->_tags parent::getTags();
            
    $this->_tags['spoiler'] = array(
                    
    'hasOption' => true,
                    
    'replace' => array('<div class="spoiler"><div class="quotetitle"><input class="button primary" type="button" value="%s" style="font-size:11px;margin:0px;padding:0px;" onclick="if (this.parentNode.parentNode.getElementsByTagName(\'div\')[1].getElementsByTagName(\'div\')[0].style.display != \'\') { this.parentNode.parentNode.getElementsByTagName(\'div\')[1].getElementsByTagName(\'span\')[0].innerHTML = this.value;  this.parentNode.parentNode.getElementsByTagName(\'div\')[1].getElementsByTagName(\'div\')[0].style.display = \'\';        this.innerText = \'\'; this.value = \'Скрыть\'; } else { this.parentNode.parentNode.getElementsByTagName(\'div\')[1].getElementsByTagName(\'div\')[0].style.display = \'none\'; this.innerText = \'\'; this.value = this.parentNode.parentNode.getElementsByTagName(\'div\')[1].getElementsByTagName(\'span\')[0].innerHTML; }" /></div><div class="quotecontent"><span id="saver" style="display:none;"></span><div style="display: none;">''</div></div></div>')
                );
            
    $this->_tags['flash'] = array(
                    
    'parseCallback' => array($this'parseValidatePlainIfNoOption'),
                    
    'callback' => array($this'renderTagFlash'),
                    );
            
    $this->_tags['user'] = array(
                    
    'parseCallback' => array($this'parseValidatePlainIfNoOption'),
                    
    'callback' => array($this'renderTagUserLink'),
                    );
            return 
    $this->_tags;
        }
        function 
    renderTagFlash(array $tag, array $rendererStates)
        {
            if (!empty(
    $tag['option']))
            {
                
    $wh $tag['option'];
                
    $attributes split(', '$wh);
                
    $attributes['width'] = $attributes[0];
                
    $attributes['height'] = $attributes[1];
                
    $src $tag['children'][0];
            }
            else
            {
                
    $attributes['width'] = '550';
                
    $attributes['height'] = '400';
                
    $src $tag['children'][0];
            }
            if(
    XenForo_Application::get('options')->enableFlashBbCode == 1)
            {
                return 
    '<object width="' $attributes['width'] . '" height="' $attributes['height'] . '">
                            <param name="movie" value="' 
    $src '">
                                <embed src="' 
    $src '" width="' $attributes['width'] . '" height="' $attributes['height'] . '">
                                </embed>
                        </object>'
    ;
            }
            else
            {
                return 
    '';
            }
        }
        function 
    renderTagUserLink(array $tag, array $rendererStates)
        {
            
    $userModel XenForo_Model::create('XenForo_Model_User');
            if (
    $tag['option'] != NULL)
            {
                
    $userid $tag['option'];
            }
            else
            {
                
    $userid XenForo_Model_User::getUserIdFromUser($userModel->getUserByName($tag['children'][0]));
            }
            
    $url XenForo_Link::buildPublicLink('members', array('user_id' => $userid'username' => $tag['children'][0]));

            list(
    $class$target) = XenForo_Helper_String::getLinkClassTarget($url);
            
    $class $class " class=\"$class\"" '';
            
    $target $target " target=\"$target\"" '';
            
    $noFollow = (empty($rendererStates['noFollowDefault']) ? '' ' rel="nofollow"');

            return 
    '<a href="' htmlspecialchars($url) . '"' $target $class $noFollow '>' $tag['children'][0] . '</a>';
        }
    }
     
  11. FractalizeR

    FractalizeR XenForo Addicted

    Регистрация:
    27.09.10
    Сообщения:
    1 085
    Симпатии:
    832
    Версия XF:
    1.3.2
    Оригинальному автору-то сообщили, что русские - крутые ребята, умеют фиксить аддоны быстрее, чем авторы поймут, что баг вообще был? :)
     
    Pavel нравится это.
  12. adder

    adder Местный

    Регистрация:
    08.10.10
    Сообщения:
    1 164
    Симпатии:
    846
    Версия XF:
    1.3.4
    Сказали... ещё 3-5 дней назад. Он ответил, что скоро сделает... но видимо не скоро))
     
    FractalizeR нравится это.

Поделиться этой страницей