Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Проблема при обработке шаблона функции rpcf_search_users_new #11

Open
tshadrin opened this issue Sep 28, 2016 · 5 comments

Comments

@tshadrin
Copy link

tshadrin commented Sep 28, 2016

Версия api 53-003
При вызове с параметрами:
$data = $this->urfa->rpcf_search_users_new(['select_type' => 0, 'patterns_count' => [ 0 => [ 'what_id' => 3, 'criteria_id'=>3, 'pattern' => $account ], ],
Получаю ошибку:
Notice: Undefined index: j
На строке 318:
$count = (int) $result[$name];
Если убрать из api.xml последний цикл в котором идет куча необязательных параметров, функция начинает работать.

@MuVO
Copy link

MuVO commented Dec 20, 2016

достаточно в 318 строке добавить собачку после (int)
как вариант, я сделал

$count = (int)@$result[$name];

Друзья, как считаете, стоит оформить pull-request? :)

@tshadrin
Copy link
Author

tshadrin commented Jan 9, 2017

не стоит.

@MuVO
Copy link

MuVO commented Jan 9, 2017

@tshadrin я уважаю краткость, она — сестра таланта!
Но не могли бы Вы более развёрнуто пояснить свою позицию? Всё-таки баг есть и он неприятный. Что правка api.xml, что прямая правка исходников — варианты костыльные и хотелось бы чтобы кто-то (NetUP или @k-shym) всё же эту ситуацию разрешил.
Спасибо.

@k-shym
Copy link
Owner

k-shym commented Jan 10, 2017

Проблема заключается в самой функции. Она кардинально отличается своей реализацией, относительно других функций. Кратко поясню, функция rpcf_search_users_new содержит много циклов for, и вот последний цикл <for name="z" from="0" count="size(pole_code_array)"> не имеет счетчика integer, его нужно брать из раздела input параметра poles_count, что не реализовывалось в данной программе, и смысла в этом нет, т.к. адекватной структуры в api.xml нет.

@MuVO и @tshadrin у меня для Вас есть 3 варианта решения:

  1. самое верное, забудьте про эту ужасную функцию, составить SQL запрос намного проще, чем параметры для данной функции. И SQL работает в 10 раз быстрее, не нагружая ядро.
  2. самое простое, удалите последний for из api.xml и не заполняйте параметр poles_count. В данном случае Вы не получите дополнительных полей пользователя.
  3. этот вариант для принципиальных, нужно немного переписать api.xml и передавать параметры в строго определенном порядке. Вот пример, что бы доставать 5 дополнительных полей в каждом запросе:
<function name="rpcf_search_users_new" id="0x1206">
    <input>
        ...
    </input>
    <output>
        <integer name="user_data_size" />
        <for name="i" from="0" count="user_data_size">
            <integer name="user_id"  array_index="i" />
            <string name="login"  array_index="i" />
            <integer name="basic_account" array_index="i" />
            <string name="full_name"  array_index="i" />
            <integer name="is_blocked"  array_index="i" />
            <double name="balance"  array_index="i" />
            <integer name="ip_address_size" />
            <set dst="ip_address_size_array" src="ip_address_size" dst_index="i" />
            <for name="j" from="0" count="ip_address_size">
                <integer name="ip_group_size" />
                <set dst="ip_group_size_array" src="ip_group_size" dst_index="i,j" />
                <for name="x" from="0" count="ip_group_size">
                    <integer name="type" array_index="i,j,x" />
                    <ip_address name="ip" array_index="i,j,x" />
                    <integer name="mask" array_index="i,j,x" />
                </for>
            </for>
            <integer name="discount_period_id" />
            <integer name="create_date" />
            <integer name="last_change_date" />
            <integer name="who_create" />
            <integer name="who_change" />
        </for>
    </output>
</function>
$result = $urfa->rpcf_search_users_new(array(
  'poles_count' => array(
      array('pole_code_array' => 4),
      array('pole_code_array' => 6),
      array('pole_code_array' => 7),
      array('pole_code_array' => 8),
      array('pole_code_array' => 9),
  ),
  'select_type' => 1,
  'patterns_count' => array(
    array(
      'what_id' => 3,
      'criteria_id' => 3,
      'pattern' => '1262',
    ),
  ),
));

обратите внимание, что после таких изменений в api.xml, вам всегда нужно передавать определенный массив poles_count в котором порядок параметров должен строго соответствовать порядку параметров в api.xml. По аналогии допишите функцию с нужными Вам дополнительными параметрами пользователя. Удачи!

@MuVO
Copy link

MuVO commented Jan 10, 2017

Насчёт поиска по SQL мне самому идея нравится больше, однако, не хочется заморачиваться с SQL в случае когда нужен какой-либо «экзотический» вариант поиска… Например, когда нужно просто найти пользователя по IP — проще дёрнуть функцию чем проходить цепочку от IP-групп через сервисные связки, и т.д.

@k-shym Константин, спасибо за развёрнутый ответ!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants