/** * Read list * * @param object $data $limitStart, $limit, $filterSearch, * $filters, $ordering, $orderingDirection, $language * * @return array */ public function readList($data) { // We are setting the operation of the webservice to Read $this->setOperation('read'); $dataGet = $this->webservice->options->get('dataGet', array()); if (is_object($dataGet)) { $dataGet = JArrayHelper::fromObject($dataGet); } $dataGet['list']['limitstart'] = isset($data->limitStart) ? (int) $data->limitStart : 0; $dataGet['list']['limit'] = isset($data->limit) ? (int) $data->limit : 20; $dataGet['filter']['search'] = isset($data->filterSearch) ? (string) $data->filterSearch : ''; $filters = RApiHalHelper::getFilterFields($this->webservice->configuration->operations->read->list, true); foreach ($filters as $filter) { $dataGet['filter'][$filter] = isset($data->filters->{$filter}) ? $data->filters->{$filter} : ''; } $dataGet['list']['ordering'] = isset($data->ordering) ? (string) $data->ordering : ''; $dataGet['list']['direction'] = isset($data->orderingDirection) ? (string) $data->orderingDirection : ''; // Handle different language switch $this->setLanguage(isset($data->language) ? (string) $data->language : ''); $this->webservice->options->set('dataGet', $dataGet); $this->webservice->options->set('task', ''); $this->webservice->options->set('filterOutResourcesGroups', array('_links', '_messages')); $this->webservice->options->set('filterResourcesSpecific', 'listItem'); $this->webservice->execute(); $arr = $this->webservice->hal->toArray(); $outputResources = RApiSoapHelper::getOutputResources($this->webservice->configuration->operations->read->list, 'listItem', true); if ($arr['_embedded'] && $arr['_embedded']['item']) { $response = RApiSoapHelper::selectListResources($outputResources, $arr['_embedded']['item']); } else { $response = array(); } $final = new stdClass(); $final->list = $response; return $final; }
/** * Returns generated WSDL file for the webservice * * @param string $wsdlPath Path of WSDL file * * @return SimpleXMLElement */ public function generateWsdl($wsdlPath) { $wsdlFullPath = JUri::root() . $wsdlPath; $client = RApiHalHelper::attributeToString($this->webserviceXml, 'client', 'site'); $version = !empty($this->webserviceXml->config->version) ? $this->webserviceXml->config->version : '1.0.0'; $this->webserviceFullName = $client . '.' . $this->webserviceXml->config->name . '.' . $version; $this->webserviceUrl = RApiHalHelper::buildWebserviceFullUrl($client, $this->webserviceXml->config->name, $version, 'soap'); // Root of the document $this->wsdl = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8" ?><wsdl:definitions' . ' xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"' . ' xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"' . ' xmlns:tns="' . $wsdlFullPath . '"' . ' xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap12/"' . ' xmlns:s="http://www.w3.org/2001/XMLSchema"' . ' xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"' . ' targetNamespace="' . $wsdlFullPath . '"' . ' xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"' . ' ></wsdl:definitions>', 0, false, 'wsdl', true); $types = $this->wsdl->addChild('types'); $this->typeSchema = $types->addChild('schema', null, 'http://www.w3.org/2001/XMLSchema'); $this->typeSchema->addAttribute('targetNamespace', $wsdlFullPath); $this->typeSchema->addAttribute('elementFormDefault', 'unqualified'); $this->addGlobalTypes($this->typeSchema); // Adding service $this->wsdlServices = $this->wsdl->addChild('service'); $this->wsdlServices->addAttribute('name', $this->webserviceFullName); $this->wsdlServices->addChild('documentation', $this->webserviceXml->description); // Add new port binding $port = $this->wsdlServices->addChild('port'); $port->addAttribute('name', $this->webserviceFullName . '_Soap'); $port->addAttribute('binding', 'tns:' . $this->webserviceFullName); // Add soap addresses $soapAddress = $port->addChild('soap:address', null, 'http://schemas.xmlsoap.org/wsdl/soap12/'); $soapAddress->addAttribute('location', $this->webserviceUrl); // Add webservice operations if (isset($this->webserviceXml->operations)) { // Read list if (isset($this->webserviceXml->operations->read->list)) { $filters = RApiHalHelper::getFilterFields($this->webserviceXml->operations->read->list, true, true); if (empty($filters)) { $filtersDef = array('name' => 'filters', 'transform' => 'array'); } else { $filtersDef = array('name' => 'filters', 'transform' => 'arraydefined', 'fields' => $filters); } // Add read list messages $inputFields = array(array('name' => 'limitStart', 'transform' => 'int'), array('name' => 'limit', 'transform' => 'int'), array('name' => 'filterSearch', 'transform' => 'string'), $filtersDef, array('name' => 'ordering', 'transform' => 'string'), array('name' => 'orderingDirection', 'transform' => 'string'), array('name' => 'language', 'transform' => 'string')); // Add read list response messages $outputFields = array(array('name' => 'list', 'transform' => 'arrayrequired', 'fields' => array(array('name' => 'item', 'maxOccurs' => 'unbounded', 'transform' => 'arrayrequired', 'fields' => RApiSoapHelper::getOutputResources($this->webserviceXml->operations->read->list, 'listItem'))))); $this->addOperation($this->wsdl, 'readList', $inputFields, $outputFields, true, true); } // Read item if (isset($this->webserviceXml->operations->read->item)) { // Add read item messages $inputFields = array_merge(RApiHalHelper::getFieldsArray($this->webserviceXml->operations->read->item, true), array(array('name' => 'language', 'transform' => 'string'))); // Add read item response messages $outputFields = array(array('name' => 'item', 'typeName' => 'item', 'transform' => 'arrayrequired', 'fields' => RApiSoapHelper::getOutputResources($this->webserviceXml->operations->read->item))); $this->addOperation($this->wsdl, 'readItem', $inputFields, $outputFields, false, true); } // Create operation if (isset($this->webserviceXml->operations->create)) { // Add create messages $inputFields = RApiHalHelper::getFieldsArray($this->webserviceXml->operations->create); // Add create response messages $outputFields = array(RApiSoapHelper::getResultResource($this->webserviceXml->operations->create)); $this->addOperation($this->wsdl, 'create', $inputFields, $outputFields, true); } // Update operation if (isset($this->webserviceXml->operations->update)) { // Add update messages $inputFields = RApiHalHelper::getFieldsArray($this->webserviceXml->operations->update); // Add update response messages $outputFields = array(RApiSoapHelper::getResultResource($this->webserviceXml->operations->update)); $this->addOperation($this->wsdl, 'update', $inputFields, $outputFields, true); } // Delete operation if (isset($this->webserviceXml->operations->delete)) { // Add delete messages $inputFields = RApiHalHelper::getFieldsArray($this->webserviceXml->operations->delete, true); // Add delete response messages $outputFields = array(RApiSoapHelper::getResultResource($this->webserviceXml->operations->delete)); $this->addOperation($this->wsdl, 'delete', $inputFields, $outputFields); } // Task operation if (isset($this->webserviceXml->operations->task)) { foreach ($this->webserviceXml->operations->task->children() as $taskName => $task) { // Add task messages $inputFields = RApiHalHelper::getFieldsArray($task); // Add task response messages $outputFields = array(RApiSoapHelper::getResultResource($task)); $this->addOperation($this->wsdl, 'task_' . $taskName, $inputFields, $outputFields, true); } } } return $this->wsdl; }
/** * Gets instance of dynamic model object class (for table bind) * * @param SimpleXMLElement $configuration Configuration for current action * * @return mixed It will return Api dynamic model class * * @throws Exception * @since 1.3 */ public function getDynamicModelObject($configuration) { if (!empty($this->apiDynamicModelClass)) { return $this->apiDynamicModelClass; } $tableName = RApiHalHelper::attributeToString($configuration, 'tableName', ''); if (empty($tableName)) { throw new Exception(JText::_('LIB_REDCORE_API_HAL_WEBSERVICE_TABLE_NAME_NOT_SET')); } $context = $this->webserviceName . '.' . $this->webserviceVersion; // We are not using prefix like str_replace(array('.', '-'), array('_', '_'), $context) . '_'; $paginationPrefix = ''; $filterFields = RApiHalHelper::getFilterFields($configuration); $primaryFields = $this->getPrimaryFields($configuration); $fields = $this->getAllFields($configuration); $config = array('tableName' => $tableName, 'context' => $context, 'paginationPrefix' => $paginationPrefix, 'filterFields' => $filterFields, 'primaryFields' => $primaryFields, 'fields' => $fields); $apiDynamicModelClassName = $this->apiDynamicModelClassName; if (class_exists($apiDynamicModelClassName)) { $this->apiDynamicModelClass = new $apiDynamicModelClassName($config); } return $this->apiDynamicModelClass; }