XF 1.5 Свой столбец в базе и обновление через крон

Dialog

Проверенные
Сообщения
83
Реакции
15
Баллы
5,510
Чтоб в хлам не накосячить, хочу узнать у прошаренных, можно ли будет так сделать. Нужно, чтобы в боковой панели (не под аватаром в сообщениях, а на главной например) под ником отображалась информация, которая берется из соседней базы данных, есть ли какие-либо способы сделать это более просто чем собираюсь, ну или вообще правильный ли подход будет.
id - ну дефолтный столбец
xf_id - ид пользователя в базе ксена (не у всех в этой базе заполнено это поле, по дефолту 0)
worms - тут цифра, сколько червяков (вот ее надо будет выводить в сайдбаре)

Напишу по шагам то, что планирую сделать:
1. Вручную добавляю еще один столбец `worms` в таблицу 'xf_user'.
2. Создаю файл '/library/worms/cron.php' с содержимым:
PHP:
class worms_cron
{
  public static function addWorm()
  {
  //тут подключение к базе с червяками
  SELECT worms FROM база WHERE xf_id>0 ;

  //дальше циклом перемещаем инфу в массив какойнибудь
  while ($loop) {
     $chervyak[$xf_id] = $worms;
  };
  //отрубаемся от базы червяков и подключаемся к ксену
  foreach($cheryak as $id=>$worms) {
     UPDATE xf_user SET `worms`=$worms WHERE user_id=$id  LIMIT 1;
   //поидее все
   };
  }
}
3. Добавляю в крон ксена обработчик worms_cron::addWorm
4. Добавляю в шаблон sidebar_visitor_panel эту инфу:
Код:
<xen:hook name="sidebar_visitor_panel_stats">
   <dl class="pairsJustified"><dt>{xen:phrase messages}:</dt> <dd>{xen:number $visitor.message_count}</dd></dl>
   <dl class="pairsJustified"><dt>{xen:phrase likes}:</dt> <dd>{xen:number $visitor.like_count}</dd></dl>

   <dl class="pairsJustified"><dt>Червяков:</dt> <dd>{xen:number $visitor.worms}</dd></dl>

</xen:hook>


Примерно так планирую сделать. Есть соображения почему нельзя или не нужно таким образом переносить и отображать информацию из соседней базы ? Ну или возможно есть какая-либо оптимизация под эту задачу.

ps: хз почему червяки, просто что в голову пришло
 
Последнее редактирование:
Георгий Шевченко, как вариант разберите это дополнение. Оно показывает как работать с хуками.
И вставьте туда куда вам нужно по такому же методу.

Там я задел все места где выводятся сообщения , симпатии, баллы.
Просто идеально подойдет для вас :-)

[GX] NumberK
 
  • Мне нравится
Реакции: Hope
Dialog, не поверите, но то что я в дополнение сделал оно не делает вообще никакого обращения к базе данных.
Просто найдите нужный хук и всё.

А точнее вот этот.
sidebar_visitor_panel_stats

Ну и через Listener вставляйте в этот хук нужное вам поле. И всё.
 
  • Мне нравится
Реакции: Hope
Dialog, так сделайте там запрос к другой базе, поместите ее в переменную и передайте в $params

Вот вам пример

0) Включаем режим отладки. Ищем папку library и в ней файл config.php (в нем добавляем строчку $config['debug'] = true; )

1) Создаем дополнение к примеру gx_test

2) Создаем шаблон gx_test и привязываем его к дополнению gx_test

3) После вставляем такой код в шаблоне gx_test
Код:
<dl class="pairsJustified"><dt>Червяков:</dt> <dd>{xen:number $worms}</dd></dl>

4) Идём в FTP (ищем папку library -> в ней создаем к примеру папку GX -> а в ней папку Worms -> а в нутри потом создаем файл Listener.php)

5) Заполняем содержимое Listener.php
PHP:
<?php
class GX_Worms_Listener
{
public static function template_hook($hookName, &$contents, array $hookParams,
                                            XenForo_Template_Abstract $template)
    {
        switch ($hookName){
            case 'sidebar_visitor_panel_stats':
                $params = $template->getParams();
                $userId = $params['visitor']['user_id'];
                $mysqli = new mysqli("host", "name", "password", "database");
        
                $q1 = "SELECT message_count
                FROM xf_user
                WHERE user_id = '".$userId."';
                ";
                $r1 = $mysqli->query($q1);
                $r2 = $r1->fetch_assoc();
        
                $params['worms'] = array_shift($r2);
        
        
                $reTemplate = $template->create('gx_test', $params);   
                $contents .= $reTemplate->render();
                break;
        }

    }
}

6) Сохраняем, и закрываем.

7) Идем обратно в ПУ -> Разработка -> Обработчики событий
Добавляем своё, указывая GX_Worms_Listener :: template_hook
А так же не забыть указать дополнение gx_test .

8) Сохраняем и готово.
Осталось только запрос подогнать свой и всё.
В моем показывает сколько сообщений у того кто просматривает.
worms.png

P.S. Это как вариант реализации если вам нужно к другой базе получить доступ, если на уровне форума, то можно без подключений к
бд таким способом.

Важно: Я вас не принуждаю использовать данный вариант этой реализации.
 
А не проще использовать дополнительные поля профиля с запретом пользователю редактировать их и стандартными дата врайтерами обновлять , а выводить как любое доп поле профиля? Городить в стандартной таблице не есть хорошо и мало ли какие это последствия в будущем может принести при обновлениях
 
Если поле worms уже есть в xf_user.
Как вариант если без запроса к другой БД и вообще без запросов на форуме.
То просто на сайте при любом изменений или начисление этих червичков.
Апдейтить это значение на форуме по ID.

И выводить уже так примерно в Listener.php
PHP:
<?php
class GX_Worms_Listener
{
public static function template_hook($hookName, &$contents, array $hookParams,
XenForo_Template_Abstract $template)
{
switch ($hookName){
case 'sidebar_visitor_panel_stats':
$params = $template->getParams();
$worms = $params['visitor']['worms'];

$params['worms'] = $worms;

$reTemplate = $template->create('gx_test', $params);
$contents .= $reTemplate->render();
break;
}
}
}
 
Как все сложно :cry: особенно когда не умеешь в ооп и движок ксена.

А не проще использовать дополнительные поля профиля с запретом пользователю редактировать их и стандартными дата врайтерами обновлять , а выводить как любое доп поле профиля? Городить в стандартной таблице не есть хорошо и мало ли какие это последствия в будущем может принести при обновлениях
Отображение доп.полей отключено на форуме, да и выводиться ведь будет только под аватарами на форуме, а не в сайдбаре.

я так понимаю переменную он берет как ключ из $params['worms'] ?

Вобщем надо видимо базу с червяками переносить как еще одну таблицу ксена.
 
Dialog,
я так понимаю переменную он берет как ключ из $params['worms'] ?
Верно понимаете.

Ну или как я говорил создаете поле Червяки в базе форума.
И на сайте от любого действиями Червкяков, апедейтите на форуме. И всё , тогда можно вообще модификацией обычной обойтись. :-)

1) [TMS] Система модификации шаблонов

2) И в шаблоне gx_test
Уже выводить так тогда. в Пункте №3
Код:
<dl class="pairsJustified"><dt>Червяков:</dt> <dd>{xen:number $visitor.worms}</dd></dl>
worms - это поле в базе данных (таблицы xf_user).

3) А с модификацией вот так
Шаблон sidebar_visitor_panel

Найти:
Код:
<xen:if is="{$xenOptions.enableTrophies}">

Заменить:
Код:
<xen:include template="gx_test" />
<xen:if is="{$xenOptions.enableTrophies}">

И всё.
 
Георгий Шевченко а разве это не тоже самое что и в первом посте, только опущено осуществление способа переноса червяков ?

Тут еще такой вопрос возник, после операций с пользователем без доступа к ксену
Код:
$mysqli = new mysqli("host", "name", "password", "database");
нужно ли закрывать соединение и менять пользователя ?
 
Dialog, не нужно. А то будет косяк.
И нет, это не одно и тоже, если делать модификацию и брать поле с форума. То запросов к базе данных 0.

А тот что в первом посту делается через хук, то есть еще с запросом к базе , но и можно без доступа как в другом посте показал.
В общем я просто показал несколько вариантов, сами решайте :)
Вас никто не заставляет использовать это всё.
 
  • Мне нравится
Реакции: Hope
Ну тогда вывод примерно следующий:
1. Создаем доп.поле worms, без вывода в сообщениях и возможности изменения вручную. Чтоб не хламить user таблицу
2. Через крон синхронизируем информацию с базой.
3. Добавляем в шаблон сайдбара
Код:
<dl class="pairsJustified"><dt>Червяков:</dt> <dd>{xen:number [полюбому должна быть переменная для считываение инфы из доп.поля]}</dd></dl>
Вот вопрос в том, как эта переменная будет называться ?

Георгий Шевченко для меня сложновато пока использовать всякие listener.php и автоматические прикрепления к элементам на странице :unsure:
 
Вобщем разобрался немного как использовать события в аддонах. Теперь возник вопрос по части производительности. Надо будет засунуть в базу с форумом несколько объемных таблиц, это скажется каким либо образом на, хз как назвать, совместимости? движка с имеющимися таблицами. Я смотрел установку других аддонов, там вроде также просто запросом создаются таблицы и на этом все, либо же они как-то сообщают движку, что в базе есть еще таблицы.
Для большинства проектов, использую обычный include пхп шаблона и чтоб не переключать базы в mysqli, хочу юзать того же пользователя из конфига, и вот отсюда и вопросы:
1. Будет ли движок их видеть и можно ли будет использовать XenForo_Application::get('db');
2. Будут ли они каким-либо образом конфликтовать ? Сам я причин для этого не вижу, но вдруг.
3. Каким образом это может повлиять на производительность, в сравнении, если бы тоже самое сделал на другой базе и с другим подключением ?

В таблицы форума ничего записываться не будет, только сравниваться, сессии\ид\ники\группы и тд.

ps: я понимаю что врятле кто-то делал такие замеры, но хотяб теоретически.
 
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу