* @package api * @link https://www.zentao.net */ namespace zin; $apiHeader = $apiQuery = $apiParams = $apiResponse = array(); $parseTree = function($data, $typeList, $level = 0) use(&$parseTree) { global $lang; $field = ''; for($i = 0; $i < $level; $i++) $field .= '  '. ($i == $level-1 ? '∟' : ' ') . '  '; $field .= $data['field']; $tbody[] = h::tr ( h::td(html($field)), h::td(zget($typeList, (string)$data['paramsType'], '')), h::td(zget($lang->api->boolList, (string)$data['required'], '')), h::td($data['desc']) ); if(isset($data['children']) && count($data['children']) > 0) { $level++; foreach($data['children'] as $item) $tbody[] = $parseTree($item, $typeList, $level); } return $tbody; }; if(!empty($api->params['header'])) { $tbody = array(); foreach($api->params['header'] as $param) { $tbody[] = h::tr ( h::td($param['field']), h::td('String'), h::td(zget($lang->api->boolList, (string)$param['required'])), h::td($param['desc']) ); } $apiHeader[] = h3($lang->api->header); $apiHeader[] = h::table ( setClass('table condensed bordered'), h::tr ( h::th($lang->api->req->name), h::th($lang->api->req->type), h::th($lang->api->req->required), h::th($lang->api->req->desc) ), $tbody ); } if(!empty($api->params['query'])) { $tbody = array(); foreach($api->params['query'] as $param) { $tbody[] = h::tr ( h::td($param['field']), h::td('String'), h::td(zget($lang->api->boolList, (string)$param['required'])), h::td($param['desc']) ); } $apiQuery[] = h3($lang->api->query); $apiQuery[] = h::table ( setClass('table condensed bordered'), h::tr ( h::th($lang->api->req->name), h::th($lang->api->req->type), h::th($lang->api->req->required), h::th($lang->api->req->desc) ), $tbody ); } if(!empty($api->params['params'])) { $tbody = array(); foreach($api->params['params'] as $param) $tbody = array_merge($tbody, $parseTree($param, $typeList)); $apiParams[] = h3($lang->api->params); $apiParams[] = h::table ( setClass('table condensed bordered'), h::tr ( h::th($lang->api->req->name), h::th($lang->api->req->type), h::th($lang->api->req->required), h::th($lang->api->req->desc) ), $tbody ); } if($api->response) { $tbody = array(); foreach($api->response as $response) $tbody = array_merge($tbody, $parseTree($response, $typeList)); $apiResponse[] = h3($lang->api->response); $apiResponse[] = h::table ( setClass('table condensed bordered'), h::tr ( h::th($lang->api->req->name), h::th($lang->api->req->type), h::th($lang->api->req->required), h::th($lang->api->req->desc) ), $tbody ); } $unsetProps = array('commonParams', 'params', 'paramsExample', 'response', 'responseExample'); $apiData = (array)$api; foreach($unsetProps as $prop) unset($apiData[$prop]); $apiData['api'] = true; $apiData['title'] = "$api->method $api->path $api->title"; $apiData['desc'] = htmlspecialchars_decode($apiData['desc']); div ( setID('api-content'), setClass('article pb-6'), div ( setClass("api-list-item row items-center mb-1 gap-2 flex-auto is-$api->method rounded"), div(setClass('font-mono w-14 text-center api-method py-1 rounded rounded-r-none'), $api->method), div(setClass('font-mono font-bold text-md api-path'), $api->path) ), div ( setClass('flex gap-2 items-center'), h2(setClass('flex-none min-w-0 max-w-full'), $api->title), (isset($api->deleted) && $api->deleted) ? span(setClass('label danger flex-none'), $lang->deleted) : null ), div(setClass('desc'), html(htmlspecialchars_decode($api->desc))), $apiHeader, $apiQuery, $apiParams, $api->paramsExample ? h3($lang->api->paramsExample) : null, $api->paramsExample ? html("
" . $api->paramsExample . "
") : null, $apiResponse, $api->responseExample ? h3($lang->api->responseExample) : null, $api->responseExample ? html("
" . $api->responseExample . "
") : null, on::init()->do( 'const docApp = zui.DocApp.query("#api-content");', 'if(!docApp) return;', 'const apiData = ' . json_encode($apiData) . ';', 'docApp.$.update("doc", docApp.$.formatDataItem("doc", apiData));' ) );