В документации класса [url=http://dev.1c-bitrix.ru/api_help/webservice/classes/cwebservicedesc/index.php]CWebServiceDesc[/url] рассказано, как использовать собственные типы данных и массивы состоящие из них, но, к сожалению, там нет ни одного примера, как использовать в исходящих данных массив, состоящий из элементов пользовательского типа. Как это правильно делать и можно ли вообще?
Попытался сделать так, как описано в документации, но выдается ошибка:
error on line 1 at column 59: StartTag: invalid element name
Вот код веб-сервиса целиком:
[CODE]<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
if(!CModule::IncludeModule("webservice") || !CModule::IncludeModule("iblock")) return;
// Наш новый класс наследуется от базового IWebService
class CGetInfoWS extends IWebService{
// Возвращает описание сервиса и его методов
function GetWebServiceDesc(){
$wsdesc = new CWebServiceDesc();
$wsdesc->wsname = "bitrix.webservice.getinfo"; // название сервиса
$wsdesc->wsclassname = "CGetInfoWS"; // название класса
$wsdesc->wsdlauto = true;
$wsdesc->wsendpoint = CWebService::GetDefaultEndpoint();
$wsdesc->wstargetns = CWebService::GetDefaultTargetNS();
$wsdesc->classTypes = array();
$wsdesc->structTypes["ItemData"] = array(
"name" => array("varType" => "string"),
"id" => array("varType" => "integer")
);
$wsdesc->structTypes["OutputData"] = array(
"items" => array(
"varType" => "ArrayOfItemData",
"arrType" => "ItemData"),
"amount" => array("varType" => "integer")
);
$wsdesc->classes = array(
"CGetInfoWS"=> array(
"GetInfo" => array(
"type" => "public",
"input" => array(),
"output" => array("info" => array("varType" => "OutputData")),
"httpauth" => "Y"
)
));
return $wsdesc;
}
function GetInfo(){
$iblock_permission = CIBlock::GetPermission(33);
if ($iblock_permission < "W"){
$GLOBALS["USER"]->RequiredHTTPAuthBasic();
return new CSOAPFault('Server Error', 'Unable to authorize user.');
}
$arFilter = Array(
"IBLOCK_ID" => 7 // инфоблок "Рецензии"
);
$arSelect = Array("ID", "IBLOCK_ID", "NAME");
$res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
$items = Array();
$amount = 0;
while ($obRes = $res->GetNextElement()){
$ar_res = $obRes->GetFields();
//$info = $info . $ar_res['NAME'] . "; ";
$itemData = Array();
$itemData["name"] = $ar_res['NAME'];
$itemData["id"] = $ar_res['ID'];
$items[$amount] = $itemData;
$amount++;
}
$info = Array();
$info["items"] = $items;
$info["amount"] = $amount;
return Array( "info" => $info );
}
}
$arParams["WEBSERVICE_NAME"] = "bitrix.webservice.getinfo";
$arParams["WEBSERVICE_CLASS"] = "CGetInfoWS";
$arParams["WEBSERVICE_MODULE"] = "";
// Передаем в компонент описание веб-сервиса
$APPLICATION->IncludeComponent("bitrix:webservice.server", "", $arParams);
die();
?>[/CODE]
Помогите, пожалуйста, понять, правильно ли описан массив в подтипе исходящих данных здесь:
[CODE] $wsdesc->structTypes["ItemData"] = array(
"name" => array("varType" => "string"),
"id" => array("varType" => "integer")
);
$wsdesc->structTypes["OutputData"] = array(
"items" => array(
"varType" => "ArrayOfItemData",
"arrType" => "ItemData"),
"amount" => array("varType" => "integer")
);
$wsdesc->classes = array(
"CGetInfoWS"=> array(
"GetInfo" => array(
"type" => "public",
"input" => array(),
"output" => array("info" => array("varType" => "OutputData")),
"httpauth" => "Y"
)
));
[/CODE]
И конкретно в строке
[CODE] "items" => array(
"varType" => "ArrayOfItemData",
"arrType" => "ItemData"),[/CODE]
И корректно ли так заполнять исходящие данные, как это сделано в кусочке кода ниже?
[CODE]$arFilter = Array(
"IBLOCK_ID" => 7 // инфоблок "Рецензии"
);
$arSelect = Array("ID", "IBLOCK_ID", "NAME");
$res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
$items = Array();
$amount = 0;
while ($obRes = $res->GetNextElement()){
$ar_res = $obRes->GetFields();
//$info = $info . $ar_res['NAME'] . "; ";
$itemData = Array();
$itemData["name"] = $ar_res['NAME'];
$itemData["id"] = $ar_res['ID'];
$items[$amount] = $itemData;
$amount++;
}
$info = Array();
$info["items"] = $items;
$info["amount"] = $amount;
return Array( "info" => $info );
[/CODE]