Jump to content

Featured Replies

Posted
comment_155709

Не понимаю как изменить customfields.
image.png.92b6541b70fcee29c26a6cd4be437aeb.png

$curl = curl_init($api_url . 'api' . $api_endpoint . '?key=' . $api_key);
								curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER => TRUE,	CURLOPT_POST => 1, ));
								curl_setopt($curl, CURLOPT_POSTFIELDS, $new_fields);
								$response = curl_exec($curl);

Как $new_fields объявить, чтобы записать текст в hpp reload harward id?

comment_155712

Что-то я не вижу api у customFieilds.

  Именно у дополнительных полей апи нету, изменить можно только значение дополнительного поле пользователя.

comment_155714

Это дополнительное поле пользователя. Его можно изменить. Настройки дополнительных полей через апи не меняются.

Я не очень разбираюсь что на скриншоте но на сколько понимаю это именно настройки

  • Author
comment_155715
1 минуту назад, siv1987 сказал:

Это дополнительное поле пользователя. Его можно изменить. Настройки дополнительных полей через апи не меняются.

Я не очень разбираюсь что на скриншоте но на сколько понимаю это именно настройки

ты вообще не шаришь

comment_155717

Возможно. Я просто недавно установил ипб. Возможно в РЕСТ апи и не шарю, но не трудно открыть сорсы апи и посмотреть какие методы там поддерживаются, тем более для такого профи как вы это как два пальца обсосать.

 

comment_155723

С самого начала конечно же спросить нормально "как изменить значение дополнительного поле у пользователя с %id" нельзя было, вместо этого приводить непонятный скриншот, а потом огрызаться на то, что не умеем правильно задавать вопросы. Учитесь спрашивать что вам нужно, а не показывать на тупом наборе данных еще и с скриншота "как сделать?". Откуда появилась это дебильная мода в программирование все приводить скриншотами. Школота их сует куда только можно, вместо того чтобы задать по человечески вопрос. Видимо такой нынче прогресс.

comment_155725
//Функция получения данных пользователя
    function member_get($url, $api, $member_id, $apiKey) {
        $curl = curl_init($url . $api . $member_id); //'api/core/members/'
        curl_setopt_array($curl, array(
            CURLOPT_RETURNTRANSFER => TRUE,
            //CURLOPT_HTTPGET => TRUE,
            CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
            CURLOPT_USERPWD => "{$apiKey}:",
             
        ));

        $curl_exec = curl_exec($curl);
        curl_close($curl);
        return $curl_exec;
    }
//Функция изменения 
    function member_put($url, $api, $member_id, $apiKey, $parameter, $value) {
        $curl = curl_init($url . $api . $member_id); //'api/core/members/'
        curl_setopt_array($curl, array(
            CURLOPT_RETURNTRANSFER => TRUE,
            CURLOPT_POST => true,
            CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
            CURLOPT_USERPWD => "{$apiKey}:",
            CURLOPT_POSTFIELDS => $parameter . "=" . $value

        ));
        $curl_exec = curl_exec($curl);
        curl_close($curl);
        return $curl_exec;
    }


$api = "api/core/members/";
$url = "http://mysite.ru"; 
$member_id = 25
$apiKey = "blablabla";

$customFields = member_get($url, $api, $member_id, $apiKey); //все данные пользователя в виде объекта
$customFieldsArr = json_decode($customFields, TRUE); //все данные пользователя в виде массива

member_put($url, $api, $member_id, $apiKey, "customFields[8]", 20); //поле с индексом 8 присваивается значение 20

 

comment_155727

aplayer Очень не удобно когда когда имена полей отдельно от значений. А если там несколько значений? Почему массивом не отправить.

<?php

function request($api, $post=false){
	global $url, $apiKey;
	
	$curl = curl_init($url . $api);
	curl_setopt_array($curl, array(
		CURLOPT_RETURNTRANSFER => TRUE,
		CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
		CURLOPT_USERPWD => "{$apiKey}:",
	));
	if($post){
		curl_setopt_array($curl, array(
			CURLOPT_POST => true,
			CURLOPT_POSTFIELDS => $parameter . "=" . $value,
		));
	}
	
	$curl_exec = curl_exec($curl);
	curl_close($curl);
	return $curl_exec;
}

function member_get($member_id) {
	return request('api/core/members/'.$member_id);
}

function member_put($member_id, $fields) {
	return request('api/core/members/'.$member_id, $fields);
}

$url = "http://mysite.ru"; 
$apiKey = "blablabla";
$member_id = 5;

member_get($member_id); //все данные пользователя в виде json
member_put($member_id, array('customFields' => array(8 => 20))); //поле с индексом 8 присваивается значение 20

код писался на коленке.

CURLOPT_POSTFIELDS => $post,

вместо CURLOPT_POSTFIELDS => $parameter . "=" . $value,

comment_155729

Еще добавлю комент к своим функциям

Надо проверять их значение на false. Оно должно возвратиться если сервер с rest api недоступен.

у меня скрипт выполнялся на одном сервере с форумом. Тоесть я считал, что если сервер с rest api недоступен то и скрипт не сможет выполниться. Сервер-то один. Однако оказалось что скрипт вполне может выполняться когда rest api недоступен. Не знаю как это происходит, но факт подтвержденный.

 

siv1987 я бы не стал выкладывать код слепленный на коленке. Информации по этим полям в интернете нет вообще. Я целый месяц ломал голову, как до этих полей добраться. Оно же имеет многоуровневую структуру. Однако ларчик просто открывался - надо в пост запросе указывать только последний элемент ветки.

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

 

А так да. Можно любым образом оптимизировать код.

мои функции сделаны с расчетом на одиночные удары.

 

 

comment_155736

aplayer а я бы не стал выкладывать такой унылый код, ведь примеров в интернете очень мало. Скрипт слепленный на коленке по вашему примеру, и все там правильно. Просто есть небольшие синтаксические ошибки которые я заметил глазом после отправки сообщения. Для обычного программиста это не составит никаких проблем. Вы, я надеюсь, не предполагаете как ТС что я не знаком с REST api, и в частности с структурой IPS занимаясь разработкой модификаций еще с древней версии 2.3?..

Какая многоуровневая структура у обычного массива? Какой информации в интернете нет вообще? Достаточно открыть документацию, хотя бы на том же сркиншоте у ТСа есть вся необхадмая информация, из которой он не понял что customFieilds  это обычный массив в виде ид поле => значение. Вы считаете это сложной проблемой? Не понятно описание, можно открыть первоисточник - код апи, и наглядно посмотреть как работает функция, а конкретно эта переменная. Неужели это вы искали целый месяц?

Полно, ребята, перестаньте изучать php по видеоурокам Попова, а если что-то не понятно, лучше спросить у компетентных людей чем искать это месяцами. Я понимаю что вы хотели "*****" своими знаниями в предметной области, пологая что если вы ней копались целый месяц то это нечто сложное и известное только вам одному, но имею ничего против, но тут затронуто моя профессиональная честь. Я же потеряю уважение среди корешей разработчиков, надеюсь я еще не зашкварился здесь.

comment_155737
48 минут назад, siv1987 сказал:

а если что-то не понятно, лучше спросить у компетентных людей чем искать это месяцами.

Как правило такие люди всегда в работе.

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

PS: планируешь обновить плагин авторизации через ВК для 4.4?

comment_155739
2 минуты назад, Respected сказал:

PS: планируешь обновить плагин авторизации через ВК для 4.4?

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

12 минут назад, Respected сказал:

Как правило такие люди всегда в работе. 

Но подсказать советом всегда смогут. Да и пару строчек кода накинут если требуется.

comment_155748
2 часа назад, siv1987 сказал:

Какая многоуровневая структура у обычного массива? Какой информации в интернете нет вообще? Достаточно открыть документацию, хотя бы на том же сркиншоте у ТСа есть вся необхадмая информация, из которой он не понял что customFieilds  это обычный массив в виде ид поле => значение.

Я тоже по началу въехать не мог. Когда мы делаем гет-запрос нам приходит json типа

customfields

___2

_____fields

__________2

_______________name

_______________value

__________3

_______________name

_______________value

 

Это массив элементами которого являются массивы. Не знаю как у вас называется эта структура, я называю его многоуровневый массив, может ошибаюсь.

А вот в пост-запросе нам надо отправить одномерный массив customfields[id]=value

Тоесть мы должны отправить не ту структуру данных которая к нам пришла. При отсутсвивии документации, точнее от ее скудности, понимание ситуации приходит не сразу.

Что там написано в документации? Array of custom fields as fieldId => fieldValue. Ну и как мне из этой строки понять, что массив должен иметь имя customfields и никак иначе?

 

comment_155751

Документация в этом случае является первоисточником, не стоит полагаться на ответе от другого запроса. Там есть названия полей для запроса и описание их структуры. Все очень просто, name это string, group это id, а customFields это массив fieldId => fieldValue . Есть сомнения в описание типа запроса, всегда можно посмотреть в коде, при одном взгляде все становится предельно ясно.

            foreach ( \IPS\Request::i()->customFields as $k => $v )
            {
                $profileFields[ 'field_' . $k ] = $v;
            }


В случае "get" запроса возвращаются все дополнительные поля пользователя сгруппированные по ид группе полей. Да, в виде многомерного массива. Понятно что такая структура для запроса на запись лишняя. Такой ответ подходит только для GET запроса.

comment_155761
18 часов назад, siv1987 сказал:

непонятный скриншот

Для понимания ситуации.

На этом скриншоте часть данных полученных при get-запросе к rest api:  api/core/members/$member_id

Скорее всего это страница исходного кода браузера на которой выведен результат print_r или var_dump  функции member_get();, которая приведена выше.

comment_155801

zxcoikio rest api предназначены для удаленного управления форумом. Для локальных плагинов эти данные хранятся в таблице core_pfields_content

comment_155803
В 01.03.2019 в 09:08, aplayer сказал:

Для понимания ситуации

Спасибо кэп, ты как всегда вовремя нас выручаешь.

comment_155810

siv1987 слушай. Ты случайно не знаешь как поменять customFieilds через локальные api, которые не REST?

Через вызов типа \IPS\Member::i()->Set_customFields($member_id, customFields[id], $field_value) или что-то в этом роде?

А то мне кажется, что обращаться через curl к rest api на локальном сервере это моветон.

Как пользоваться \IPS\Db я уже разобрался, но вдруг получится так, что я буду трясти базу в то время как есть готовые api для решения моих задач.

 

 

comment_155811

Форум использует запрос к бд для дополнительных полей. Отдельных методов нету.

$profileFields = ['member_id' => %member_id, 'field_%id' => 'new_value'];
\IPS\Db::i()->replace( 'core_pfields_content', $profileFields );

 

При большем желании можно написать плагин который добавит новый метод к \IPS\Member для обновления дополнительных полей.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.


Guest
Ответить в этой теме...

Последние посетители 0

  • No registered users viewing this page.