Я и несколько друзей пытаются использовать WHMCS для предоставления услуг в виртуальном мире. Проблема заключается в том, что WHMCS не предоставляет простой способ поиска конкретной клиентской записи без уже имеющегося идентификатора клиента, который не хранится нигде, кроме базы данных WHMCS. функция api getclients возвращает результаты в формате XML, проблема заключается в том, что при поиске клиента с помощью этого метода вы можете искать только имя, фамилию или адрес электронной почты. Теперь мы попытались передать переменные для firstname и lastname (они должны быть переданы отдельно). Это, к сожалению, возвращает клиентские записи для всех клиентов, что X firstname ИЛИ Y Lastname, вместо сужения одного клиента как с X, так и с Y.Результаты поиска WHMCS getclients
Я хочу знать, как искать PHP-массив, полученный из результата XML, чтобы попытаться захватить записи клиента только для клиента, которого мы ищем.
Результаты размещены так:
Array ([WHMCSAPI] => Array ([ACTION] => getclients [РЕЗУЛЬТАТ] => успех [TOTALRESULTS] => 2 [STARTNUMBER] => 0 [NUMRETURNED ] => 2 [КЛИЕНТЫ] => Массив ([КЛИЕНТ] => Массив ([ID] => 9 [FIRSTNAME] => Test1 [LASTNAME] => Test2 [COMPANYNAME] => [EMAIL] => test1 @ test. com [DATECREATED] => 2013-04-24 [GROUPID] => 1 [STATUS] => Active) [CLIENT1] => Array ([ID] => 20 [FIRSTNAME] => Test3 [LASTNAME] => Test2 [ COMPANYNAME] => [EMAIL] => [email protected] [DATECREATED] => 2014-01-20 [GROUPID] => 0 [STATUS] => Active))))
Код, который мы пытаемся использовать для поиск:
$postfields["action"] = "getclients";
$postfields["search"] = $firstname;
$postfields["search"] = $lastname;
$postfields["responsetype"] = "xml";
$query_string = "";
foreach ($postfields AS $k=>$v) $query_string .= "$k=".urlencode($v)."&";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $query_string);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$xml = curl_exec($ch);
if (curl_error($ch) || !$xml) $xml = '<whmcsapi><result>error</result>'.
'<message>Connection Error</message><curlerror>'.
curl_errno($ch).' - '.curl_error($ch).'</curlerror></whmcsapi>';
curl_close($ch);
$arr = whmcsapi_xml_parser($xml); # Parse XML
$client = searchClient($firstname, $lastname, $arr);
print_r($client); # Output XML Response as Array
/*
Debug Output - Uncomment if needed to troubleshoot problems
echo "<textarea rows=50 cols=100>Request: ".print_r($postfields,true);
echo "\nResponse: ".htmlentities($xml)."\n\nArray: ".print_r($arr,true);
echo "</textarea>";
*/
function whmcsapi_xml_parser($rawxml) {
$xml_parser = xml_parser_create();
xml_parse_into_struct($xml_parser, $rawxml, $vals, $index);
xml_parser_free($xml_parser);
$params = array();
$level = array();
$alreadyused = array();
$x=0;
foreach ($vals as $xml_elem) {
if ($xml_elem['type'] == 'open') {
if (in_array($xml_elem['tag'],$alreadyused)) {
$x++;
$xml_elem['tag'] = $xml_elem['tag'].$x;
}
$level[$xml_elem['level']] = $xml_elem['tag'];
$alreadyused[] = $xml_elem['tag'];
}
if ($xml_elem['type'] == 'complete') {
$start_level = 1;
$php_stmt = '$params';
while($start_level < $xml_elem['level']) {
$php_stmt .= '[$level['.$start_level.']]';
$start_level++;
}
$php_stmt .= '[$xml_elem[\'tag\']] = $xml_elem[\'value\'];';
@eval($php_stmt);
}
}
return($params);
}
function searchClient($first, $last, $array)
{
foreach ($array as $key => $val)
{
if($val['FIRSTNAME'] == $first && $val['LASTNAME'] == $last)
{
return $key;
}
}
return null;
}
?>
Это возвращает пустой результат. Я признаю, что не совсем уверен, как это сделать, поэтому любые указатели помогут.