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

1.1.x Как извлечь user_id из поста и передать в свой хук аддона?

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

Загрузка
  1. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1.919
    Симпатии:
    1.153
    Версия XF:
    1.0.4
    [offtop]Запасся попкорном... :)[/offtop]
     
    Pepelac нравится это.
  2. Pepelac

    Pepelac Продам луц в бутылках Команда форума

    Регистрация:
    28.09.10
    Сообщения:
    1.794
    Симпатии:
    1.348
    Присоединюсь, пожалуй :)
     
  3. infis

    infis Местный Команда форума

    Регистрация:
    27.06.11
    Сообщения:
    5.448
    Симпатии:
    3.271
    Версия XF:
    1.5.9
    Да можно не запасаться. Я, конечно, тоже могу протупить, но не увидеть в шаблоне отсутствие проверки видимости поля невозможно. А там простейший перебор идет. Т.е. даже без отладки достаточно легко можно определить, что попадает в шаблон, а что нет.
    А вообще все равно весело. Может быть тоже потроллить :)
     
  4. nmn

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

    Регистрация:
    11.04.13
    Сообщения:
    163
    Симпатии:
    71
    Версия XF:
    1.1.3
    Ну по крайней мере понятен теперь источник вашей ошибки. Если посмотрите внимательнее, то увидите, что я предлагал добираться до полей через $user, где getUserFields не используется. Самое смешное, что почти везде, где поля получают отдельно через эту функцию, они просто _не_нужны_, т.к. уже есть в $user :)

    В message_user_info действительно идёт перебор, только не по полям, а по их спецификации из глобального кэша ^_^
     
  5. infis

    infis Местный Команда форума

    Регистрация:
    27.06.11
    Сообщения:
    5.448
    Симпатии:
    3.271
    Версия XF:
    1.5.9
    Если брать данные из $user в хуке, тогда да, там они будут доступны через $user.customFields.
    Посмотрел я внимательно и до меня наконец-то дошло, почему я был уверен в своей правоте :)
    Я утверждал, что в шаблон они не попадают. Я исходил из того, попадают ли поля в шаблон в виде объектов. Ок, объектов нет, но значения действительно туда попадают. В данном конкретном случае этого будет, наверное, достаточно.
    В моем случае нужна была полная обработка. Поэтому признаю, что в простом случае достаточно использовать массив значений.

    Кстати, хуки в 1.2 должны будут убрать. Поэтому лучше уже сейчас делать все не через хуки.
     
    nmn нравится это.
  6. nmn

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

    Регистрация:
    11.04.13
    Сообщения:
    163
    Симпатии:
    71
    Версия XF:
    1.1.3
    Имеются ввиду template hooks? Спасибо за отличную новость, давно пора.
     
  7. infis

    infis Местный Команда форума

    Регистрация:
    27.06.11
    Сообщения:
    5.448
    Симпатии:
    3.271
    Версия XF:
    1.5.9
    Да. Они. Будет встроенная TMS, которая сейчас в виде плагина существует.
    Я так понимаю, что они расширят перечень обработчиков в связи с этим. Хотя можно будет и без этого обойтись.
     
  8. Romchik®

    Romchik® The Power of Dreams Команда форума

    Регистрация:
    26.09.10
    Сообщения:
    5.736
    Симпатии:
    5.263
    Версия XF:
    1.5.10
    Хуки в 1.2 никуда не денутся. Просто их не будут больше добавлять и они будут считаться как устаревшей частью.
    Во всяком случае, я так понял :)
     
    Oleg-2012 нравится это.
  9. infis

    infis Местный Команда форума

    Регистрация:
    27.06.11
    Сообщения:
    5.448
    Симпатии:
    3.271
    Версия XF:
    1.5.9
    Они будут объявлены устаревшими. Да. А использование устаревших функций везде считается плохим тоном :)
    С другой стороны, в каких-то новых шаблонах (для нового функционала), возможно, их и не добавят даже. Поэтому смысла продолжать их использовать уже не остается.
     
    Oleg-2012 нравится это.
  10. Rasalom

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

    Регистрация:
    06.12.12
    Сообщения:
    19
    Симпатии:
    0
    В идеале нужно, чтобы были дополнительные поля "звание" (симуляция воинских званий), "должность" (сфера ответственности, например, дежурный по призывному пункту), "отделение" (солдаты, офицеры, курсанты, командование и т.п.), "игровой ID" (цифровое значение уникального идентификатора), "статус в составе" (активен, в увольнении, в бессрочном отпуске, исключен и т.п.). Поля заполняются и редактируются только администраторами (или юзерами с соответствующими правами) и желательно в админке для надежности. Звание, должность и статус выводятся своим шаблоном под аватарой. Звание идет префиксом к имени пользователя. Это нужно показывать в постах пользователей и в профиле. Это как минимум, большее не очень существенно.

    Удобнее всего именно юзать кастомные поля движка и не нужно лезть в модель. Однако, возникает какая-то нубская проблема, очень по виду банальная, но решить не смог. Я из customfields могу получить поле, но не его текстовое значение.

    и получается

    вместо

    Никак не могу сконвертить в текстовое значение, потому что ниспадающий список, созданный в custom fields в админке, как-то хитро через BLOB в базе зашит и я не представляю как к нему обратиться за соответствием.
     
  11. Rasalom

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

    Регистрация:
    06.12.12
    Сообщения:
    19
    Симпатии:
    0
    Подскажите пожалуйста еще вот такой момент.
    Делаю явно, литералом, все работает
    PHP:
     {xen:phrase user_field_rank_choice_general}
    если подставляю переменную, не пашет, ругается что нужен литерал, а как переменную сделать литералом чтобы работало вот так как ниже?
    PHP:
    {xen:phrase $userRank}
    --- добавлено : May 6, 2013 6:00 AM ---
    Ура! Решил.

    Помогло вот это.
    В обработчике сделал так
    PHP:
    class raRanks_Listener
    {
    public static function 
    templateHook($hookName, &$contents, array $hookParamsXenForo_Template_Abstract $template)
    {
    switch (
    $hookName)
    {
    case 
    'message_user_info_text';
    {
    $delim ='<h3 class="userText">';
    $pos strpos($contents$delim);
    $contents_parts explode($delim$contents);
    if (
    $pos !== false)
    {
    $xenforo_user_id $hookParams['user']['user_id'];
    $received XenForo_Application::getDb()->fetchRow('SELECT * FROM xf_ra_levels WHERE xf_forum_id = ?'$xenforo_user_id);
    $rank_id $received['rank'];
    $received2 XenForo_Application::getDb()->fetchRow('SELECT * FROM xf_ra_ranks WHERE id = ?'$rank_id);
    $params $template->getParams();
    $xenforo_user_rank_u $hookParams['user']['customFields']['rank'];
    $xenforo_user_rank = new XenForo_Phrase('user_field_rank_choice_'.$xenforo_user_rank_u); // ВОТ КЛЮЧЕВАЯ БЫЛА ПРОБЛЕМА С ПОЛУЧЕНИЕМ ТЕКСТА
    $params += array('userRank' => $xenforo_user_rank);
    $theRank $template->create('raRank'$params);
    $contents $contents_parts[0] . $delim$theRank $contents_parts[1];
    }
    break;
    }
    }
    }
    }
    А в шаблоне вот так

    PHP:
    {$userRank}
     
  12. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1.919
    Симпатии:
    1.153
    Версия XF:
    1.0.4
    Создаете юзерфилды, тип селект или радиобаттон, для звания и должности, юзерфилд, который пользователь не может выбирать или менять и туда забиваете все необходимые звания и должности. Т.е. в один юзерфилд - все звания, в другой все должности (включая оформление). И не надо городить велосипеды из фраз.
    Как раз и для таких задач в том числе создавались дополнительные поля.
     
  13. Rasalom

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

    Регистрация:
    06.12.12
    Сообщения:
    19
    Симпатии:
    0
    Мне перед выводом в шаблон нужно еще все проверить по своей логике. Например если одно из полей пустое, не выводить блок информации. Если не пустое, то выводить соответствующую иконку отделения и погон, соответствующий званию... Там все сложнее, но как я выше написал, все решил через фразы и все работает. Теперь плодотворная разработка и расширение.

    Спасибо всем :)
     
  14. infis

    infis Местный Команда форума

    Регистрация:
    27.06.11
    Сообщения:
    5.448
    Симпатии:
    3.271
    Версия XF:
    1.5.9
    Такие вещи легко проверяются через contentcheck. Например в шаблоне custom_field_view применяется такая конструкция:
    HTML:
    <xen:if hascontent="true">
    	<dl>
    		<dt>{$field.title}:</dt> 
    		<dd><xen:contentcheck>
    			<xen:if is="is_array({$field.fieldValueHtml})">
    				<ul>
    				<xen:foreach loop="$field.fieldValueHtml" value="$_fieldValueHtml">
    					<li>{xen:raw $_fieldValueHtml}</li>
    				</xen:foreach>
    				</ul>
    			<xen:else />
    				{xen:raw $field.fieldValueHtml}
    			</xen:if>
    		</xen:contentcheck></dd>
    	</dl>
    </xen:if>
    То есть идет проверка, а будет ли в выводе что-либо. Если будет выведен блок contentcheck (а там либо значение, либо набор значений, либо ничего), то выведется весь блок между if hascontent="true". Если не выведется, то не будет выведено вообще ничего.
    Таким образом легко и просто можно исключить из вывода ненужное оформление и целые куски html, если в проверяемом блоке отсутствуют данные.
     
  15. Rasalom

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

    Регистрация:
    06.12.12
    Сообщения:
    19
    Симпатии:
    0
    Ну одно дело спрятать один блок по отсутсвию контента, а мне нужно чтобы при одном варианте контента выдавалась определенная иконка погона. И условий там всяких много и довольно сложные. Я лучше сделаю их на знакомом PHP в гибкой форме, чем такие сложные и громоздкие конструкции в шаблоне создавать. К тому же это нужно шаблонный этот язык осваивать, а времени пока нет. Может в другом более простом случае (в другом моде) я и сделаю что-то в шаблонах простое... Но здесь случай не простой, уверяю. Только PHP.
     
  16. infis

    infis Местный Команда форума

    Регистрация:
    27.06.11
    Сообщения:
    5.448
    Симпатии:
    3.271
    Версия XF:
    1.5.9
    Ну я лишь обратил внимание на богатые возможности шаблонов. В некоторых случаях будет достаточно использовать их, а не строить свой велосипед на PHP. Вполне возможно, в Вашем случае как раз нужно было свое строить, ибо слишком сложное или с привлечением дополнительных данных, которые в шаблоне могли быть и недоступны.
     
  17. Rasalom

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

    Регистрация:
    06.12.12
    Сообщения:
    19
    Симпатии:
    0
    Да, разумеется. Спасибо. Там мудреная система с кучей условий, так что я однозначно не стал отвлекаться. Возможности шаблонов я осознаю и они еще не раз мне пригодятся.

    Все таки Xenforo это для людей, все как надо и удобно. Все больше восхищаюсь им.
     

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