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

Добавление функционала к модели thread

Тема в разделе "Вопросы и ответы по XenForo Framework", создана пользователем infis, 5 дек 2011.

Загрузка
  1. infis

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

    Регистрация:
    27.06.11
    Сообщения:
    5.525
    Симпатии:
    3.321
    Версия XF:
    1.5.9
    Господа!

    Я хреново разбираюсь в MVC, а потому возник нубский вопрос.

    Допустим, у меня есть какая-то модель. Пусть она будет полностью своя. Модель сама по себе работает без проблем. В админке она отображается и работает с данными. Теперь мне нужно некий функционал запихать в создание/редактирование/удаление/отображение темы.
    Я не могу понять, как заставить ее работать внутри темы. Т.е. мне нужна подсказка, как сделать аналог Poll, например. Только не сама модель (она уже есть), а только работа во фронтэнде.
    Я вроде вдоль и поперек излазил и админку и исходники, но так и не понял, как в тему подгружаются опросы.

    P.S. Если можно, объясните это в стиле "для одаренных".
     
  2. Pepelac

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

    Регистрация:
    28.09.10
    Сообщения:
    1.794
    Симпатии:
    1.349
    Хм. Они подгружаются в контроллере. К примеру, в XenForo_ControllerPublic_Thread::actionIndex() подгружается уже созданный опрос для отображения, в XenForo_ControllerPublic_Forum::actionAddThread() происходит сохранение опроса при создании темы.

    Для подключения своей модели к существущему контроллеру надо цепляться к событию load_class_controller и расширять нужны класс своим. Только не забывать в своем классе выполнять код расширяемого класса.
     
    edka и Yoskaldyr нравится это.
  3. Yoskaldyr

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

    Регистрация:
    27.09.10
    Сообщения:
    1.921
    Симпатии:
    1.160
    Версия XF:
    1.0.4
    От себя добавлю не просто не забывать выполнять, а по возможности передавать выполнение в родительский класс контроллера через parent (по возможности, т.к. не всегда это возможно). Необходимо для того чтобы не было проблем с обновлением и проблем с другими хаками которые будут расширять этот же класс.
     
    Pepelac нравится это.
  4. infis

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

    Регистрация:
    27.06.11
    Сообщения:
    5.525
    Симпатии:
    3.321
    Версия XF:
    1.5.9
    Всем спасибо. С этим я разобрался.

    А вообще я вот, что пытаюсь сделать (красной линией подчеркнуто, на что следует обратить внимание):

    1. Дополнительные поля (форк с пользовательских полей) для работы их с любыми моделями, а не только с user.

    2. Для этого я в админку уже добавил менеджер таких полей.

    screen-1.png

    3. Работа с полями ничем не отличается от работы с полями пользователей.

    screen-2.png

    Как видим, в месте отображения добавляется название модели (в данном случае thread), в которой затем можно будет использовать эти поля.

    4. В самой модели это должно работать либо, как опросы (тупо добавление информации сверху), либо - фантазируем. Например, это можно использовать в первом посте, автоматически добавляя данные. Вот с первым постом я еще не разбирался. Не хочется менять шаблон, поэтому нужно подумать, как правильно туда это встроить. А данные сами будут доступны через стандартный массив params.

    screen-3.png

    5. С редактирование данных, вероятно, проблем не будет, но я уже запарился вытаскивать разбросанные по library/XenForo куски кода от полей пользователей. Вот нахрена, спрашивается, было жестко вшивать код пользовательских полей в модель User и контроллер Account?? Лучше бы сделали все в модели UserField и отдельным контроллером, а затем подгружали и использовали, как надо... Так что пока я лишь саму форму редактирования сделал и начал возиться с обработкой данных при сохранении формы.

    screen-4.png

    Чуть не забыл. Я сделал полностью свою модель, которая нужна для работы в админке. Часть функционала придется переложить в другие аддоны, так как неизвестно, кому и куда нужно будет добавлять этот функционал. В настоящее время я как раз и делаю такой аддон для работы в темах.
    Соответственно, будет отдельный аддон CustomFields, а к нему будут дополнительные аддоны типа CustomThreadFields. Я пока не знаю, смогу ли я по максимуму в аддоне CustomFields обеспечить всю работу, чтобы дополнительным аддонам не нужно было слишком много дописывать при расширении модели и в контроллере.
    И еще. Так как таблицы xf_user_field и xf_user_field_value не способы вместить что либо дополнительное (там используются enum и primarykey соответствующие), пришлось создавать свои таблицы по аналогии.
    Ну и напоследок. Фразами я пока не заморачивался, поэтому в некоторых местах вместо текста имена переменных для фраз :)

    Есть замечания и пожелания? Может, хотите поучаствовать? Код я могу предоставить :)
     
    Desperado и CyberAP нравится это.
  5. CyberAP

    CyberAP Местный

    Регистрация:
    05.10.10
    Сообщения:
    2.577
    Симпатии:
    1.614
    Версия XF:
    1.5.10
    Поучаствовать хочу, что требуется?
     
  6. infis

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

    Регистрация:
    27.06.11
    Сообщения:
    5.525
    Симпатии:
    3.321
    Версия XF:
    1.5.9
    Давай согласуем, где будет лежать код, и как с ним работать. Ну и план действий нужно определить. Более, чем уверен, что есть масса замечаний к тому, что я уже сделал.
    Кстати, будем тут обсуждать?

    Я бы не хотел пока выкладывать код в паблик, так как он слишком грязный. Это даже к черновику имеет очень далекое отношение. В общем, от стыда иначе сгорю :)
     
  7. Desperado

    Desperado Местный

    Регистрация:
    23.10.10
    Сообщения:
    270
    Симпатии:
    98
    Версия XF:
    1.1.3
    Я бы на код админской части тоже поглядел с удовольствием :)
     
  8. CyberAP

    CyberAP Местный

    Регистрация:
    05.10.10
    Сообщения:
    2.577
    Симпатии:
    1.614
    Версия XF:
    1.5.10
    Я так понимаю должно быть что-то типа SVN или git для php. А для работы с шаблонами должен быть форум с доступом, на этом же форуме должна быть тема где вёлся бы лог разработки, куда может писать любой у кого есть доступ. Так можно отслеживать кто что изменил.
     
  9. infis

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

    Регистрация:
    27.06.11
    Сообщения:
    5.525
    Симпатии:
    3.321
    Версия XF:
    1.5.9
    Там проще всего было. Практически только названия поменял. Ведь пользовательские поля под админку и были заточены.
    Ок. Тогда перейдем в приват и там обсудим. У меня есть машинка в облаке в запасе. Могу ее поднять, если нужно. Правда, придется платить за нее (не много, рублей 10-15 в сутки где-то), но ради благого дела - надо, значит, надо.
     
  10. Desperado

    Desperado Местный

    Регистрация:
    23.10.10
    Сообщения:
    270
    Симпатии:
    98
    Версия XF:
    1.1.3
    Есть хост и бесхозный домен, если что.
    Только, думаю, понятно, что всем подряд фтп логин не скину.
    1 кому-то выдать и всё.

    репозиторий - битбукет, гитхаб. Ну тут всё понятно по сути.
     
  11. infis

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

    Регистрация:
    27.06.11
    Сообщения:
    5.525
    Симпатии:
    3.321
    Версия XF:
    1.5.9
    Нифига не понимаю. Не могу найти место в шаблонах и в ControllerPublic, где формируется информация из пользовательских полей под аватарами в постах.

    Поможет кто-нибудь?
     
  12. Yoskaldyr

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

    Регистрация:
    27.09.10
    Сообщения:
    1.921
    Симпатии:
    1.160
    Версия XF:
    1.0.4
    Так, по порядку.
    В actionIndex() из контроллере XenForo_ControllerPublic_Thread:
    PHP:
            $postFetchOptions $postModel->getPermissionBasedPostFetchOptions($thread$forum) + array(
                
    'perPage' => $postsPerPage,
                
    'page' => $page,
                
    'join' => XenForo_Model_Post::FETCH_USER XenForo_Model_Post::FETCH_USER_PROFILE,
                
    'likeUserId' => $visitor['user_id']
            );
            if (!empty(
    $postFetchOptions['deleted']))
            {
                
    $postFetchOptions['join'] |= XenForo_Model_Post::FETCH_DELETION_LOG;
            }

            
    $posts $postModel->getPostsInThread($threadId$postFetchOptions);
    Дальше смотрим модель XenForo_Model_Post по цепочке выполнения от метода getPostsInThread до метода preparePostJoinOptions, в котором будет это:
    PHP:
                if ($fetchOptions['join'] & self::FETCH_USER_PROFILE)
                {
                    
    $selectFields .= ',
                        user_profile.*'
    ;
                    
    $joinTables .= '
                        LEFT JOIN xf_user_profile AS user_profile ON
                            (user_profile.user_id = post.user_id)'
    ;
                }
    Это только направление куда копать, но общий принцип работы должен быть понятен
     
  13. infis

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

    Регистрация:
    27.06.11
    Сообщения:
    5.525
    Симпатии:
    3.321
    Версия XF:
    1.5.9
    Эм. Я про UserField вообще-то :)
    Проще на коде объяснять. Я сегодня-завтра в репозитории проекта выложу, с чем борюсь сейчас. Тогда будет проще объяснять.
     
  14. Yoskaldyr

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

    Регистрация:
    27.09.10
    Сообщения:
    1.921
    Симпатии:
    1.160
    Версия XF:
    1.0.4
    Ну насколько я вижу все кастомные поля, как предопределенные, так и user_field-ы хранятся в таблице xf_user_profile в поле custom_fields (в сериализованном виде). Т.е. мой пример кода как раз имеет прямое отношение к UserField-ам :)

    P.S. UserField-ы также хранятся в более удобном варианте в xf_user_field_value, но дергать их оттуда при выборке постов - мазохизм (не зря ксен хранит сериализированную копию)
     
  15. infis

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

    Регистрация:
    27.06.11
    Сообщения:
    5.525
    Симпатии:
    3.321
    Версия XF:
    1.5.9
    Хм. Что-то я не подумал о том, что данные дублируются. Ок. Посмотрим там.
     

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