XF 1.5 Дополнительные критерии в повышениях групп пользователей

Статус
В этой теме нельзя размещать новые ответы.

Appologies

Проверенные
Сообщения
145
Реакции
59
Баллы
3,325
Всем привет. Подскажите, как можно добавить дополнительные поля в критериях повышений групп пользователей.
На данный момент, у меня в таблице xf_user добавлен дополнительный столбец, в котором существует определенное значение (пусть это будет цифра)
Мне необходимо в зависимости от этого значения переводить пользователя в определенную группу, желательно через повышение групп.
Я понимаю, что задача индивидуальная но все же, возможно кому то это не создаст для особо труда это реализовать.

Изначально пытался сделать всё это дело через дополнительные поля, но проблема в том, что эти дополнительные поля так или иначе будут добавляться SQL запросом в базу на прямую, что не есть хорошо. По этому, решил отказаться от этой затеи. В общем если в кратце, необходимо добавлять пользователя в определенную группу в зависимости от значения, которое в дополнительном столбце xf_user
 
Ради интереса добавил в XenForo/Helper/Criteria.php
После:
Код:
Код:
case 'username_search':
                        if (self::_arrayStringSearch($data['needles'], $user['username']) === false)
                        {
                            return false;
                        }
                    break;
Добавил

Код:
case 'faction_search':
                        if (self::findNeedle($data['needles'], $user['faction']) === false)
                   
                        {
                            return false;
                        }
                    break;
И в шаблоне helper_criteria_user
После

Код:
<li><label>
        <input type="checkbox" name="user_criteria[username_search][rule]" value="username_search" class="Disabler" id="ucrit_username_search" {xen:checked $userCriteria.username_search} />
        {xen:phrase username_contains}:</label>
        <div class="criteriaQualifier" id="ucrit_username_search_Disabler">
            <xen:textbox name="user_criteria[username_search][data][needles]" value="{$userCriteria.username_search.needles}" size="50" rows="1" inputclass="Elastic" />
            <p class="explain">{xen:phrase username_search_criteria_explain}</p>
        </div>
    </li>
Добавил
Код:
<li><label>
        <input type="checkbox" name="user_criteria[faction_search][rule]" value="faction_search" class="Disabler" id="ucrit_faction_search" {xen:checked $userCriteria.faction_search} />
        {xen:phrase username_contains}:</label>
        <div class="criteriaQualifier" id="ucrit_faction_search_Disabler">
            <xen:textbox name="user_criteria[faction_search][data][needles]" value="{$userCriteria.faction_search.needles}" size="50" rows="1" inputclass="Elastic" />
            <p class="explain">{xen:phrase faction_search_criteria_explain}</p>
        </div>
    </li>
Но нихера не происходит)) Да, да, я понимаю что надо это все делать дополнением, но разве такой вариант не должен работать?
 
В папке Xenforo/Helper добавил фаил Faction.php с таким содержанием:
Код:
<?php

class XenForo_Helper_Faction
{
public static function criteriaUser($rule, array $data, array $user, &$returnValue)
{
switch ($rule)
{
case 'faction':
if (self::findNeedle($data['needles'], $user['faction']) === false)
{
return false;
}

}
}

/**
* Performs a case-insensitive search within $haystack for any of the $needles found in the comma-separated $needleList
*
* Example:
* haystack = '[email protected]'
* needleList = '@yahoo, @gmail, @hotmail'
*
* @param string $needleList
* @param string $haystack
*
* @return string|boolean Matched needle on success, false on failure
*/
protected static function findNeedle($needleList, $haystack)
{
$haystack = utf8_strtolower($haystack);

foreach (preg_split('/\s*,\s*/', utf8_strtolower($needleList), -1, PREG_SPLIT_NO_EMPTY) AS $needle)
{
if (strpos($haystack, $needle) !== false)
{
return $needle;
}
}

return false;
}
}

В обработчике событий добавил новый обработчик faction_update
Обрабатывать событие: faction_update
Выполнить обработчик: XenForo_Helper_Faction :: criteriaUser

Какие дальше должны быть мои действия? Добавить в задания планировщика выполнение XenForo_Helper_Faction :: criteriaUser ?
Мне главное понять в каком порядке все должно происходить
Спасибо Captain за помощь с кодом
 
Appologies, ну все правильно почти

Это я про выше участок это в дополнение обертывается только и делается модификация шаблонов, я же в вайбере вчера расписал всё
 
Последнее редактирование модератором:
  • Мне нравится
Реакции: Hope
Так, ладно, давайте по порядку я напишу что делал, а вы подправите меня.
1. Создал дополнение, назвал Example
2. Создал фаил в library/Example/Faction.php со следующим содержимым:
Код:
<?php

class Example_Faction
{
public static function criteriaUser($rule, array $data, array $user, &$returnValue)
{
switch ($rule)
{
case 'faction':
if (self::findNeedle($data['needles'], $user['faction']) === false)
{
return false;
}

}
}

protected static function findNeedle($needleList, $haystack)
{
$haystack = utf8_strtolower($haystack);

foreach (preg_split('/\s*,\s*/', utf8_strtolower($needleList), -1, PREG_SPLIT_NO_EMPTY) AS $needle)
{
if (strpos($haystack, $needle) !== false)
{
return $needle;
}
}

return false;
}
}
3. Создал обработчик событий faction_update
Выполнить обработчик: Example_Faction:: criteriaUser (выбрал дополнение Example)
4. Модификация шаблонов панели:
Шаблон helper_criteria_user, Простая замена
Найти:
Код:
<li><label>
        <input type="checkbox" name="user_criteria[username_search][rule]" value="username_search" class="Disabler" id="ucrit_username_search" {xen:checked $userCriteria.username_search} />
        {xen:phrase username_contains}:</label>
        <div class="criteriaQualifier" id="ucrit_username_search_Disabler">
            <xen:textbox name="user_criteria[username_search][data][needles]" value="{$userCriteria.username_search.needles}" size="50" rows="1" inputclass="Elastic" />
            <p class="explain">{xen:phrase username_search_criteria_explain}</p>
        </div>
    </li>
Заменить на:
Код:
$0
<li><label>
        <input type="checkbox" name="user_criteria[faction][rule]" value="faction" class="Disabler" id="ucrit_faction" {xen:checked $userCriteria.faction} />
        {xen:phrase faction}:</label>
        <div class="criteriaQualifier" id="ucrit_faction_Disabler">
            <xen:textbox name="user_criteria[faction][data][needles]" value="{$userCriteria.faction.needles}" size="50" rows="1" inputclass="Elastic" />
            <p class="explain">{xen:phrase faction_criteria_explain}</p>
        </div>
    </li>

По итогу ничего не работает
cover.jpg
 
Последнее редактирование:
Appologies, давайте начнем с самого простого, проверим, добавляются ли указанные критерии в базу данных.
Откройте таблицу xf_user_group_promotion, у нужного повышения нажмите на колонку user_criteria, скачается файл, его содержимое вставьте сюда и киньте результат ниже.
 
Appologies, давайте начнем с самого простого, проверим, добавляются ли указанные критерии в базу данных.
Откройте таблицу xf_user_group_promotion, у нужного повышения нажмите на колонку user_criteria, скачается файл, его содержимое вставьте сюда и киньте результат ниже.
Там все добавляется корректно:
Код:
Array
(
    [0] => Array
        (
            [rule] => faction
            [data] => Array
                (
                    [needles] => test
                )

        )

)

Более того, если в XenForo/Helper/Criteria.php добавить после
Код:
case 'username_search':
                        if (self::_arrayStringSearch($data['needles'], $user['username']) === false)
                        {
                            return false;
                        }
                    break;
Код
Код:
case 'faction':
                        //if (self::findNeedle($data['needles'], $user['faction']) === false)
                        if (self::_arrayStringSearch($data['needles'], $user['faction']) === false)
                    
                        {
                            return false;
                        }
                    break
То повышение прав проходит успешно, но тогда мне придется каждый раз после обновления файлов движка редактировать содержимое Criteria.php
 
Appologies, ну движок вы обновляете не так часто, если хотите сделать независимый плагин, то решение пока что вижу только одно:
Расширить модель UserGroupPromotion, в дочернем классе переопределить метод updatePromotionsForUser. Суть перезаписанного метода в том, что мы вызываем класс XenForo_Helper_Criteria динамически, это означает, что мы также можем расширить класс XenForo_Helper_Criteria, чтобы можно было расширить (переопределить) метод userMatchesCriteria.

PHP:
/**
     * @param array $user
     * @param array|null $promotionStates
     * @param array|null $promotions
     * @return int
     */
    public function updatePromotionsForUser(array $user, array $promotionStates = null, array $promotions = null)
    {
        $changes = 0;

        if ($promotions === null)
        {
            $promotions = $this->getPromotions(array(
                'active' => 1
            ));
        }
        if (!$promotions)
        {
            return 0;
        }

        if ($promotionStates === null)
        {
            $promotionStates = $this->getPromotionStatesByUserId($user['user_id']);
        }

        foreach ($promotions AS $promotionId => $promotion)
        {
            if (isset($promotionStates[$promotionId]))
            {
                $skip = false;
                switch ($promotionStates[$promotionId])
                {
                    case 'manual': // has it, don't take it away
                    case 'disabled': // never give it
                        $skip = true;
                }
                if ($skip)
                {
                    continue;
                }
                $hasPromotion = true;
            }
            else
            {
                $hasPromotion = false;
            }

            /* @var $criteriaClass XenForo_Helper_Criteria */
            $criteriaClass = XenForo_Application::resolveDynamicClass('XenForo_Helper_Criteria');

            if ($criteriaClass::userMatchesCriteria($promotion['user_criteria'], false, $user))
            {
                if (!$hasPromotion)
                {
                    $this->promoteUser($promotion, $user['user_id']);
                    $changes++;
                }
            }
            else if ($hasPromotion)
            {
                $this->demoteUser($promotion, $user['user_id']);
                $changes++;
            }
        }

        return $changes;
    }


Сначала вешаем listener на XenForo_Model_UserGroupPromotion, потом вешаем listener на XenForo_Helper_Criteria. Если не лень, можешь попробовать.
 
Да, теперь все работает но не так как надо. Проблема в шаблоне:
Код:
<li><label>
        <input type="checkbox" name="user_criteria[faction][rule]" value="faction" class="Disabler" id="ucrit_faction" {xen:checked $userCriteria.faction} />
        {xen:phrase faction}:</label>
        <div class="criteriaQualifier" id="ucrit_faction_Disabler">
            <xen:textbox name="user_criteria[faction][data][needles]" value="{$userCriteria.faction.needles}" size="50" rows="1" inputclass="Elastic" />
            <p class="explain">{xen:phrase faction_criteria_explain}</p>
        </div>
    </li>
Повышение применяется для всех пользователей вне зависимости, что указано в поле ввода (на совпадение из столбца faction)

Разобрался. Тему можно закрывать. Если кому интересно. Вот конечный результат Criteria.php
Дело было не в модификации шаблона
Код:
<?php

class MMO_FactionUpdate_Criteria
{
    public static function criteriaUser($rule, array $data, array $user, &$returnValue)
    {
        switch ($rule)
        {
            case 'faction':
                        $factions = preg_split('/\s*,\s*/', utf8_strtolower($data['needles']), -1, PREG_SPLIT_NO_EMPTY);
                        if (in_array(utf8_strtolower($user['faction']), $factions))
                        {
                             $returnValue = true;
                        }
            break;       
        }
    }
}
 
Последнее редактирование модератором:
Статус
В этой теме нельзя размещать новые ответы.
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу