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

Непонятно как эта переменная передалась в шаблон?

Тема в разделе "Вопросы и ответы по XenForo Framework", создана пользователем edka, 03.05.2014.

Загрузка
  1. edka

    edka Активный пользователь

    Регистрация:
    23.06.13
    Сообщения:
    28
    Симпатии:
    2
    Привет всем!
    Помогите пожалуйста добрым советом :)
    Целый день копался в коде, но так и не смог понять где в коде передается переменная в шаблон.

    Есть код в шаблоне:

    Код:
    <xen:foreach loop="$MediaRecent" value="$media">
    Я проверил все файлы, но в них нигде нет упоминания переменной $MediaRecent

    А вот этот класс генерирует данные для этого шаблона:

    Код:
    class EWRporta_Block_MediaRecent extends XenForo_Model
    {
        public function getModule($options)
        {
            if ((!$addon = $this->getModelFromCache('XenForo_Model_AddOn')->getAddOnById('EWRmedio')) || empty($addon['active']))
            {
                return "killModule";
            }
    
            $recent = $this->getModelFromCache('EWRmedio_Model_Lists')->getMediaList(1, $options['limit']);
    
            return $recent;
        }
    }

    Единственная зацепка - это название файла этого класса: MediaRecent.php
    Т.е. оно совпадает с именем переменной.

    Может ли передаваться переменная в шаблон еще как-то, кроме явного определения ее в коде?

    Просто иначе мистика какая-то получается, код работает (проверял многократно). Но явного определения переменной нет в коде..
     
  2. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Судя по всему, название переменной берется из id блока, который записан в базе данных при инсталляции. Т.е. банально считываются все блоки в файле EWRporta/ControllerPublic/Portal.php:
    Код:
    ...
    $blocks = $this->getModelFromCache('EWRporta_Model_Blocks')->getBlocks(true, 'portal');
    ...
    Можете ради интереса сделать дамп блоков и убедиться.

    P.S. Плагин не устанавливал. Поэтому могу ошибаться с выводами.
     
    edka нравится это.
  3. edka

    edka Активный пользователь

    Регистрация:
    23.06.13
    Сообщения:
    28
    Симпатии:
    2
    Спасибо за помощь! Теперь хотя бы понятно стало в какую сторону нужно смотреть :)
     
  4. akinak

    akinak Местный

    Регистрация:
    12.02.13
    Сообщения:
    259
    Симпатии:
    243
    Версия XF:
    1.1.3
    Переменные в шаблоне это ключи в массиве viewParams. То есть поиск по коду типа $MediaRecent скорее всего не даст результата. А вот поиск по коду типа 'MediaRecent' наверняка найдет контроллер, в котором будет что-то вроде
    $viewParams = array(
    ....

    'MediaRecent' => //какой то код или переменная, заранее не знаешь

    ....
    );
    Плюс, можно поискать по имени шаблона, посмотреть в каком контролере этот шаблон вызывается.

    Ну это опять же общие советы, я тоже плагин не ставил и не смотрел конкретно по этому случаю.
     
    edka нравится это.
  5. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Я ему уже выше отписал, что такой переменной в коде нет и не должно быть. Переменная - это идентификатор блока. Т.е. считываются блоки в виде ассоциативного массива, который потом и используется в шаблонах. Таким образом переменную можно найти либо путем отладки, либо (как я искал) в xml коде блока, а затем анализом кода считывания блоков из базы. Естественно, в последнем случае не обязательно устанавливать плагин.
     
    edka нравится это.
  6. edka

    edka Активный пользователь

    Регистрация:
    23.06.13
    Сообщения:
    28
    Симпатии:
    2
    Нашлось только единственное упоминание MediaRecent в одном php файле :(


    Безымянный.png
    --- добавлено : May 11, 2014 3:53 AM ---
    Вот приложил еще код самого установочного XML файла этого блока для портала.
    Вот в нем упоминание MediaRecent есть )

    --- добавлено : May 11, 2014 3:55 AM ---
    Код:
    <?xml version="1.0" encoding="utf-8"?>
    <block block_id="MediaRecent" title="XenMedio: RecentMedia" version_string="1.0.0" version_id="1" url="http://8wayrun.com/" install_callback_class="" install_callback_method="" uninstall_callback_class="" uninstall_callback_method="" cache="+1 hours">
      <admin_templates/>
      <listeners/>
      <options>
        <option option_id="mediarecent_limit" edit_format="spinbox" data_type="unsigned_integer" display_order="1">
          <option_value>4</option_value>
          <edit_format_params></edit_format_params>
          <sub_options></sub_options>
          <title>Recent Media Limit</title>
          <explain><![CDATA[The maximum number of media to display on the recent media block.]]></explain>
        </option>
        <option option_id="mediarecent_search" edit_format="onoff" data_type="boolean" display_order="2">
          <option_value>1</option_value>
          <edit_format_params></edit_format_params>
          <sub_options></sub_options>
          <title>Show Media Search Bar</title>
          <explain><![CDATA[If selected, a search bar will be added at the bottom of the block.]]></explain>
        </option>
      </options>
      <phrases/>
      <route_prefixes/>
      <templates>
        <template title="EWRblock_MediaRecent"><![CDATA[<xen:require css="EWRmedio.css" />
    <xen:require css="member_list.css" />
    
    <div class="section">
        <div class="secondaryContent mediaSmall" id="mediaRecent">
            <h3><a href="{xen:link media}">{xen:phrase recent_media}</a></h3>
    
            <xen:if hascontent="true">
            <ul>
                <xen:contentcheck>
                <xen:foreach loop="$MediaRecent" value="$media">
                    <li>
                        <div class="mediaContent">
                            <div style="position: relative;">
    
                                <xen:if is="{$media.service_media} == 'gallery'">
                                    <div class="overlays" style="bottom: 7px; left: 5px;"><b>{xen:phrase x_images, 'count={$media.media_duration}'}</b></div>
                                <xen:else />
                                    <div class="overlays" style="bottom: 7px; right: 5px;"><b><xen:if is="{$media.media_hours}">{$media.media_hours}:</xen:if>{$media.media_minutes}:{$media.media_seconds}</b></div>
                                </xen:if>
    
                                <a href="{xen:link 'full:media', $media}"><img src="{xen:helper medio, $media}" border="0" style="width: 100%;" alt="{$media.media_title}" /></a>
                            </div>
                            <div style="height: 26px; overflow: hidden;">
                                <a href="{xen:link 'full:media', $media}">{$media.media_title}</a>
                            </div>
                        </div>
                    </li>
                </xen:foreach>
                </xen:contentcheck>
            </ul>
            </xen:if>
    
            <xen:if is="{$option.search}">
            <div class="findMember">
                <form action="{xen:link 'search/search'}" method="post" class="AutoValidator" data-optInOut="optIn" data-redirect="true">
                    <input type="search" name="keywords" class="textCtrl" placeholder="{xen:phrase search_media}..." results="0" title="{xen:phrase enter_your_search_and_hit_enter}" id="searchBar_keywords" value="{$search.keywords}" />
                    <input type="hidden" name="type" value="media" />
                    <input type="hidden" name="_xfToken" value="{$visitor.csrf_token_page}" />
                </form>
            </div>
            </xen:if>
        </div>
    </div>]]></template>
      </templates>
    </block>
    
     

    Вложения:

    Последнее редактирование модератором: 19.05.2014
  7. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    @edka, я разве не дал Вам достаточно информации, откуда берется эта переменная? Более того, я дал подробное объяснение, почему Вы ее не найдете в коде PHP.
    Я думал, что тема закрыта...
     

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