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

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

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

Загрузка
  1. Rasalom

    Rasalom Местный

    Регистрация:
    06.12.12
    Сообщения:
    19
    Симпатии:
    0
    Ну если эти поля начнут появляться вот здесь $user_id = $hookParams['user']...
    То есть вот у меня кастомное поле rank и если его можно получить через $user_id = $hookParams['user']['rank']; то это то что нужно. наделаю обработчиков, чуток повожусь в шаблонах. Это в сто раз лучше чем писать мои адские быдлокоды вытаскивания значений из нештатных таблиц.
     
  2. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    С пользовательскими полями все несколько сложнее. Поэтому просто создайте поле, разрешите его отображать в стиле и в настройках самого поля. Ну а дальше смотрите, где и как оно выводится. Можете сразу изучить штатные шаблоны, где выводятся такие поля. Тогда получите представление о структуре передаваемого массива.
     
    Rasalom нравится это.
  3. nmn

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

    Регистрация:
    11.04.13
    Сообщения:
    163
    Симпатии:
    70
    Версия XF:
    1.1.3
    Если поля подгружаются, то добраться до них можно так: $user.customFields.имяполя (из шаблона, конечно, для кода это обычный массив с ключами-строками);
     
    Rasalom и Oleg-2012 нравится это.
  4. Rasalom

    Rasalom Местный

    Регистрация:
    06.12.12
    Сообщения:
    19
    Симпатии:
    0
    Точно. Так и сделаю. Спасибо.

    Это было бы просто замечательно. Просто после мороки с phpbb3 я с трудом верю в простоту всяких форумных модификаций :) А в Xenforo сделано, что называется, "все для людей".
     
  5. Rasalom

    Rasalom Местный

    Регистрация:
    06.12.12
    Сообщения:
    19
    Симпатии:
    0
    А не подскажете для кода это как? Я смог получить только название поля, а сам текст кастомного поля не могу понять как достать.
    --- добавлено : Apr 25, 2013 9:01 AM ---
    Решил чуть иначе, через шаблон

    PHP:
    TEST:{xen:helper userFieldValue$userFieldsInfo.rank$user, {$user.customFields.rank}}
    Но ругается вот так

    PHP:
    Template ErrorsraRank
    Argument 2 passed to XenForo_Template_Helper_Core
    ::helperUserFieldValue() must be an array, null given in /var/www/forum/library/XenForo/Template/Helper/Core.phpline 1984
    Я так понимаю он не получает какой-то массив данных. Наверное нет вот этого $userFieldsInfo
     
  6. nmn

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

    Регистрация:
    11.04.13
    Сообщения:
    163
    Симпатии:
    70
    Версия XF:
    1.1.3
    Вы лучше в своем хуке сделайте для отладки
    PHP:
    echo("<pre>"); print_r($hookParams['user']); die("</pre>");
    и посмотрите, что в этой переменной вообще есть. Так будет нагляднее любого объяснения :)
     
  7. Rasalom

    Rasalom Местный

    Регистрация:
    06.12.12
    Сообщения:
    19
    Симпатии:
    0
    Цены вам нет. Спасибо большое. Я пытался уже сделать print_r этому массиву, но сделал это как-то так коряво, что у меня писало что памяти не хватает :)
    --- добавлено : 25 апр 2013 в 14:29 ---
    В общем, все получается вполне логично, но я всеравно получаю вместо "рядовой первого класса" имя поля "ryadovoy_pervogo_klassa". Это поле является ниспадающим списком. Я своим недалеким программистским умуо понимаю, что оно вот здесь в базе данных
    rank personal 0 select [BLOB - 1.0 KiB] none
    Но как этот BLOB вытаскивать я не представляю. И еще я нашел вроде бы какие-то штатные функции в модели UserField.php
    PHP:
    public function getUserFieldChoices($fieldId$choices$master false)
    Но не могу эту функцию вызвать... сильно уж нуб в пхп и ооп :) И я не уверен что это та самая функция. Может нужна эта getUserFieldChoicePhraseName.

    В общем, я получил нужное мне значение поля, но теперь нужен текст этого самого поля.
     
  8. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Ох. Я же предупреждал, что вытащить данные пользовательских полей не так уж и просто :)
    И я говорил Вам, что хорошо бы подсмотреть, как выводятся такие данные. Для этого можно посмотреть шаблон message_user_info и найти там следующий кусок:
    Код:
                    <xen:foreach loop="$userFieldsInfo" key="$fieldId" value="$fieldInfo">
                        <xen:if is="{$fieldInfo.viewable_message}">
                            <xen:if hascontent="true">
                                <dl class="pairsInline userField_{$fieldId}">
                                    <dt>{xen:helper userFieldTitle, $fieldId}:</dt>
                                    <dd><xen:contentcheck>{xen:helper userFieldValue, $fieldInfo, $user, {$user.customFields.{$fieldId}}}</xen:contentcheck></dd>
                                </dl>
                            </xen:if>
                        </xen:if>
                    </xen:foreach>
    
    Дальше сами разберетесь?
     
  9. Rasalom

    Rasalom Местный

    Регистрация:
    06.12.12
    Сообщения:
    19
    Симпатии:
    0
    Я этот кусок как только не ковырял :) Ничего путнего кроме ошибок. Но я лучше сейчас какое-то время сам поразбираюсь для приличия :) Нашел сейчас в массиве hookparams такую штуку как phrase_cache где есть нужные мне текстовые значения. Попробую получить к ней доступ.
    --- добавлено : 25 апр 2013 в 14:50 ---
    Что такое
    PHP:
    <xen:contentcheck>{xen:helper userFieldValue$fieldInfo$user, {$user.customFields.{$fieldId}}}</xen:contentcheck>
    Я понимаю. Это, типа, функция, которая перебирает массив $fieldInfo, находит соответствие значения и выдает текст.
    Но откуда взять $fieldInfo я пока смутно понимаю. В моем шаблоне его нет... То есть своим хуком\обработчиком я его найти не могу. Шаблон тоже его не находит. Я думаю, нужно найти какой-то php файл, который шлет эту переменную с массивом в шаблон. Но пока ничего нигде не нашел.
     
  10. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    В хуке у Вас уже должен быть массив с пользовательскими полями. Вам нужно лишь добраться до нужного значения и подставить эти значения в определенные места. Все. Суть и реализация на самом деле очень проста. Попробуйте все же самостоятельно разобраться с этим. И еще. Рекомендую использовать IDE с отладчиками. Очень помогает разобраться, как работает.
    Кстати, в самом шаблоне можно получить дамп переменной. Делается это, например, так:
    Код:
    {xen:helper dump, $user.customFields}
     
    Rasalom нравится это.
  11. Rasalom

    Rasalom Местный

    Регистрация:
    06.12.12
    Сообщения:
    19
    Симпатии:
    0
    Спасибо. Пока что успешно ковыряюсь. Но до решения пока не дошел :)
     
  12. nmn

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

    Регистрация:
    11.04.13
    Сообщения:
    163
    Симпатии:
    70
    Версия XF:
    1.1.3
    infis, лучше так дамп не делать. Он, в отличие от print_r, часто выдает телеги на десятки мегабайт с кучей повторов :)
     
  13. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Т.е. Вы предлагаете править какой-нибудь оригинальный файл ксена, чтобы понять, что же попадает в шаблон? Не всегда нужно вообще хук использовать. Да и даже плагин не всегда нужен. Иногда достаточно модификации шаблона.
    Так дамп делать всегда проще и быстрее, чем вставлять print_r. Тем более, что в этом случае не будет прекращен вывод. Просто в это место вставится дамп, а затем дальше пойдет обработка. А вот как Вы посоветовали вывести переменную, уж точно лучше не делать. Ведь в этом случае прервется работа скрипта. А это порою не нужно, особенно для циклов ;)

    А для того, чтобы видеть объект в нормальном виде и без телег, лучше использовать отладчики. И да, в любом случае отлаживать сайт лучше на локалке. Хотя я и не парюсь с удаленными (отладка через туннель без проблем работает).
     
  14. nmn

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

    Регистрация:
    11.04.13
    Сообщения:
    163
    Симпатии:
    70
    Версия XF:
    1.1.3
    Я к тому, что при всех достоинствах, этот хелпер в данном случае имеет существенный недостаток - он для исследования больших массивов бесполезен, т.к. будет работать несколько минут =)

    А тот код, что я привел, нужен только чтобы показать структуру массива. Если бы он не завершил скрипт, в выводе была бы куча повторов, которые в этом случае не нужны. Я вообще многое пишу, думая, что это всем очевидно, а вот поди ж ты, приходится разжевывать.
     
  15. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Я-то понимаю, о чем речь. А вот новичек начнет потом на грабли наступать. Либо нужно советовать безопасный вариант, либо объяснять, где могут быть грабли. Это раз. А во-вторых, я через этот хелпер и на больших массивах получал все, что мне было нужно. При этом отловить в хуке было сложнее. Все зависит от ситуации. Хелпер дампа ведь не зря сделали. Именно для отладки в шаблонах.

    Теперь о том, почему далеко не все так просто с дополнительными полями. У этих полей есть флаг, выводить его или нет. Соответственно, в шаблоне мы его банально не получим, если его вывод отключен. Хорошо. Допустим, флаг вывода есть. Тогда мы его получим, но он нам будет мешаться, если мы захотим его вывести в другом месте. Ведь нужно как-то исключить его дублирование. Не правда ли? Теперь идем дальше. А не задумывались ли, почему до значения поля добраться не так просто? А все дело в том, что его вывод может сильно отличаться от самого значения. Ведь у поля есть "HTML для вывода значения", которое может быть произвольным. Соответственно, получить именно значение поля и получить вывод поля - это разные вещи.

    Теперь об изначально поставленном в топике вопросе. Использовать дополнительные поля возможно, но нежелательно, так как будет много велосипедостроения. Хотя вроде как кажется, что их проще всего будет использовать. Ан нет :)
    В то же время использовать свои поля в таблице пользователей, либо вообще отдельную таблицу и джойнить ее - вполне реально. И вывод этих данных вполне тривиален. Плагин будет несложным. На производительности при наличии правильных индексов это почти не скажется, так как данные все равно кешируются практически на всех этапах, а количество пользователей - не миллионы, поэтому джойн будет летать. Те же доп.поля практически не сказываются на производительности, хотя они в отдельной таблице находятся. Ведь так? :)
    Конечно, тут нужно учитывать различные факторы. Соответственно, нужно принять решение, где же выгоднее размещать данные: в таблице пользователей и перегружать модель или в отдельной таблице и затем джойнить ее там, где нужно.
     
  16. Yoskaldyr

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

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Тут пошли такие обсуждения как лучше сделать, хотя ТС точно не написал что за данные надо выводить и в каком виде (именно конкретно - есть то-то выводить там-то в таком-то виде, править изменять может тот-то) - от этого же будет зависеть оптимальная реализация :)

    Например, надо брать существующие данные или можно заново их вбить/импортировать для пользователей 1 раз и т.д. Где и как отображать надо и т.д.

    Т.е. в зависимости от этого оптимально будет или использовать дополнительные поля пользователя или джойнить отдельную таблицу с данными.

    А то очень похоже на собрание телепатов и экстрасенсов :))
     
  17. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Ну вот... Только я начал умничать, как ты пришел и все убил :(
     
  18. Yoskaldyr

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

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Да почему-же убил, просто подумал что лучше узнать у ТС, что именно ему надо в деталях, т.к. оба варианта правильные, но какой оптимальнее будет зависеть от деталей задачи :)
     
  19. nmn

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

    Регистрация:
    11.04.13
    Сообщения:
    163
    Симпатии:
    70
    Версия XF:
    1.1.3
    Забавно, как раз ваш вариант проблемный. Попробуйте этим хелпером сделать дамп хотя бы $user и поймёте причину. Что до новичков - ну не может быть, что человек сделает listener, но не поймет, что делает тот клочок кода, что я предложил использовать для отладки.

    Дальнейшую телегу по частям комментировать не буду, скажу лишь, что вы просто не знаете, как поля работают.

    Во-первых, в шаблон если поля и выводятся, то все вместе, вне зависимости от настроек, так как лежат все вместе в кэше и подключаются при джойне xf_user_profile. Решение о том, отображать их или нет, принимается в шаблоне на основе данных из глобального кэша userFieldsInfo, а html-код легко формируется хелперами userfieldtitle и userfieldvalue. Здесь я просто подразумеваю, что оформление поля будет определяться целиком в шаблоне.

    Во-вторых, поле - самый удобный вариант для таких вещей, т.к. оно уже выводится чуть ли не везде, где надо, и его можно настроить, чтобы стандартными средствами оно отображалось только при редактировании пользователя в админке - то, что Хаус прописал. А вы - джойны, индексы, сапёрная лопата, каменный топор.

    Так что умничать не надо, надо разбираться.
     
  20. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Блин. Я-то думал, что написание плагина доп.полей для тем и вообще любого контента позволяет мне заявить, что я таки полностью разобрался, как эти самые поля работают. Ан нет... Печаль, однако...

    Будьте благоразумны. Не нужно заявлять то, о чем Вы даже представления не имеете. Я в свое время писал плагин, который полностью копировал функционал дополнительных полей пользователя, но уже для работы с любым контентом (поля, ноды и т.д.), что дает мне некоторую долю уверенности в знании работы дополнительных полей пользователя. Я могу в некоторых нюансах ошибаться, но не в этом конкретном случае. Внимательно изучите 70-73 строчки файла library/XenForo/Model/UserField.php.
     

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