prefix(); $table = 'xoonips_item_basic'; if (!MyDumpTool::tableExists($table)) { exit('xoonips module not found'.PHP_EOL); } MyDumpTool::makeDirectory('src/xoonips'); MyDumpTool::makeDirectory('src/xoonips/assets'); MyDumpTool::makeDirectory('public/modules/xoonips'); MyDumpTool::makeDirectory('public/modules/xoonips/file'); // xoonips config $sql = <<< SQL SELECT * FROM `${prefix}_xoonips_config` SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } $xoonipsConfigs = []; while ($row = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($row); MyDumpTool::convertToInt($row, ['item_id', 'last_update_date']); $xoonipsConfigs[$row['name']] = $row['value']; } $xoopsDB->freeRecordSet($res); // Recent Contents $ranking = []; $limit = $xoonipsConfigs['ranking_new_num_rows']; $sql = <<< SQL SELECT `ib`.`item_id`, `ib`.`doi`, `ib`.`last_update_date`, GROUP_CONCAT(DISTINCT `it`.`title` ORDER BY `it`.`title_id` ASC SEPARATOR '\n') AS `title` FROM `${prefix}_xoonips_ranking_new_item` AS `ri` INNER JOIN `${prefix}_xoonips_item_basic` AS `ib` ON `ri`.`item_id`=`ib`.`item_id` INNER JOIN `${prefix}_xoonips_index_item_link` AS `iil` ON `ib`.`item_id`=`iil`.`item_id` INNER JOIN `${prefix}_xoonips_item_title` AS `it` ON `ib`.`item_id`=`it`.`item_id` WHERE `iil`.`certify_state`=2 GROUP BY `ib`.`item_id` ORDER BY `ib`.`last_update_date` DESC LIMIT $limit SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } while ($row = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($row); MyDumpTool::convertToInt($row, ['item_id', 'last_update_date']); $ranking[] = $row; } $xoopsDB->freeRecordSet($res); MyDumpTool::saveJson('public/modules/xoonips/recent-contents.json', $ranking); unset($ranking); // Rankings $ranking = []; $limit = $xoonipsConfigs['ranking_num_rows']; $rankingOrder = array_map('trim', explode(',', $xoonipsConfigs['ranking_order'])); $rankingVisible = array_map('trim', explode(',', $xoonipsConfigs['ranking_visible'])); $rankingKey2Index = [ 'accessed' => 0, 'downloaded' => 1, 'contributed' => 2, 'searched' => 3, 'groups' => 4, ]; function rankingSortFunc($a, $b) { global $rankingOrder; global $rankingKey2Index; $na = $rankingOrder[$rankingKey2Index[$a]]; $nb = $rankingOrder[$rankingKey2Index[$b]]; return $na === $nb ? 0 : $na > $nb; } $limit = $xoonipsConfigs['ranking_num_rows']; // - most accessed items $ranking['accessed'] = []; if ($rankingVisible[$rankingKey2Index['accessed']]) { $sql = <<< SQL SELECT `ib`.`item_id`, `ib`.`doi`, GROUP_CONCAT(DISTINCT `it`.`title` ORDER BY `it`.`title_id` ASC SEPARATOR '\n') AS `title`, `vi`.`count` FROM `${prefix}_xoonips_ranking_viewed_item` AS `vi` INNER JOIN `${prefix}_xoonips_item_basic` AS `ib` ON `vi`.`item_id`=`ib`.`item_id` INNER JOIN `${prefix}_xoonips_item_title` AS `it` ON `ib`.`item_id`=`it`.`item_id` INNER JOIN `${prefix}_xoonips_index_item_link` AS `iil` ON `ib`.`item_id`=`iil`.`item_id` WHERE `iil`.`certify_state`=2 GROUP BY `ib`.`item_id` ORDER BY `vi`.`count` DESC LIMIT $limit SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } while ($row = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($row); MyDumpTool::convertToInt($row, ['item_id', 'count']); $ranking['accessed'][] = $row; } $xoopsDB->freeRecordSet($res); } // - most accessed items $ranking['downloaded'] = []; if ($rankingVisible[$rankingKey2Index['downloaded']]) { $sql = <<< SQL SELECT `ib`.`item_id`, `ib`.`doi`, GROUP_CONCAT(DISTINCT `it`.`title` ORDER BY `it`.`title_id` ASC SEPARATOR '\n') AS `title`, `di`.`count` FROM `${prefix}_xoonips_ranking_downloaded_item` AS `di` INNER JOIN `${prefix}_xoonips_item_basic` AS `ib` ON `di`.`item_id`=`ib`.`item_id` INNER JOIN `${prefix}_xoonips_item_title` AS `it` ON `ib`.`item_id`=`it`.`item_id` INNER JOIN `${prefix}_xoonips_index_item_link` AS `iil` ON `ib`.`item_id`=`iil`.`item_id` WHERE `iil`.`certify_state`=2 GROUP BY `ib`.`item_id` ORDER BY `di`.`count` DESC LIMIT $limit SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } while ($row = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($row); MyDumpTool::convertToInt($row, ['item_id', 'count']); $ranking['downloaded'][] = $row; } $xoopsDB->freeRecordSet($res); } // - most contributed users $ranking['contributed'] = []; if ($rankingVisible[$rankingKey2Index['contributed']]) { $sql = <<< SQL SELECT `u`.`uid`, `u`.`uname`, `u`.`name`, COUNT(`cu`.`item_id`) AS `count` FROM `${prefix}_xoonips_ranking_contributing_user` AS `cu` INNER JOIN `${prefix}_users` AS `u` ON `cu`.`uid`=`u`.`uid` GROUP BY `u`.`uid` ORDER BY `count` DESC LIMIT $limit SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } while ($row = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($row); MyDumpTool::convertToInt($row, ['uid', 'count']); $ranking['contributed'][] = $row; } $xoopsDB->freeRecordSet($res); } // - most searched keywords $ranking['searched'] = []; if ($rankingVisible[$rankingKey2Index['searched']]) { $sql = <<< SQL SELECT `sk`.`keyword`, `sk`.`count` FROM `${prefix}_xoonips_ranking_searched_keyword` AS `sk` ORDER BY `sk`.`count` DESC LIMIT $limit SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } while ($row = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($row); MyDumpTool::convertToInt($row, ['count']); $ranking['searched'][] = $row; } $xoopsDB->freeRecordSet($res); } uksort($ranking, 'rankingSortFunc'); MyDumpTool::saveJson('public/modules/xoonips/rankings.json', $ranking); unset($ranking); // get public index with certified item count $sql = <<< SQL SELECT `idx`.*, `it`.`title`, (SELECT COUNT(*) FROM `${prefix}_xoonips_index_item_link` AS `iil` INNER JOIN `${prefix}_xoonips_item_basic` AS `ib` ON `iil`.`item_id`=`ib`.`item_id` WHERE `iil`.`index_id`=`idx`.`index_id` AND `iil`.`certify_state`=2 ) AS `num_items` FROM `${prefix}_xoonips_index` AS `idx` INNER JOIN `${prefix}_xoonips_item_title` AS `it` ON `idx`.`index_id`=`it`.`item_id` WHERE `it`.`title_id`=0 AND `idx`.`open_level`=1 SQL; $limitItems = []; $limitFiles = []; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } $tree = []; $root = []; while ($row = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($row); $tree[$row['index_id']] = $row; $root[$row['parent_index_id']][$row['sort_number']] = $row['index_id']; } $xoopsDB->freeRecordSet($res); foreach ($root as &$node) { ksort($node); } unset($node); $data[] = getTreeNode($tree, $root, 3); MyDumpTool::saveJson('src/xoonips/assets/tree.json', $data); unset($data, $root); // get simpf link data $simpflink = parseSimPFLinkFile(); $simpfurls = []; // get public items $sql = <<< SQL SELECT `ib`.*, GROUP_CONCAT(DISTINCT `it`.`title` ORDER BY `it`.`title_id` ASC SEPARATOR '\n') AS `title`, `ity`.`display_name` AS `item_type_display_name`, `ity`.`name` AS `item_type_name`, `u`.`uname`, `u`.`name`, `u`.`email` FROM `${prefix}_xoonips_item_basic` AS `ib` INNER JOIN `${prefix}_xoonips_item_title` AS `it` ON `ib`.`item_id`=`it`.`item_id` INNER JOIN `${prefix}_xoonips_item_type` AS `ity` ON `ib`.`item_type_id`=`ity`.`item_type_id` INNER JOIN `${prefix}_xoonips_index_item_link` AS `iil` ON `ib`.`item_id`=`iil`.`item_id` INNER JOIN `${prefix}_xoonips_index` AS `idx` ON `iil`.`index_id`=`idx`.`index_id` LEFT JOIN `${prefix}_users` AS `u` ON `ib`.`uid`=`u`.`uid` WHERE `ity`.`display_name` != 'Index' AND `iil`.`certify_state`=2 AND `idx`.`open_level`=1 GROUP BY `ib`.`item_id` ORDER BY `ib`.`item_id` ASC SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } $items = []; $itemIds = []; $baseItemIds = []; while ($row = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($row); MyDumpTool::convertToInt($row, ['item_id', 'item_type_id', 'uid', 'last_update_date', 'creation_date', 'publication_year', 'publication_month', 'publication_mday']); $row['index'] = getIndexes($tree, $row['item_id']); if (0 === count($row['index'])) { // no public indexes found. continue; } $row['changelog'] = getChangeLogs($row['item_id']); $row['related_to'] = getRelatedTo($row['item_id']); $row['keyword'] = getKeyword($row['item_id']); $row['file'] = getFile($row['item_id']); switch ($row['item_type_name']) { case 'xnpbinder': appendBinderInfo($row); break; case 'xnpbook': appendBookInfo($row); break; case 'xnpconference': appendConferenceInfo($row); break; case 'xnpdata': appendDataInfo($row); break; case 'xnpfiles': appendFilesInfo($row); break; case 'xnpmemo': appendMemoInfo($row); break; case 'xnpmodel': appendModelInfo($row); break; case 'xnppaper': appendPaperInfo($row); break; case 'xnppresentation': appendPresentationInfo($row); break; case 'xnpsimulator': appendSimulatorInfo($row); break; case 'xnpstimulus': appendStimulusInfo($row); break; case 'xnptool': appendToolInfo($row); break; case 'xnpurl': appendUrlInfo($row); break; case 'xnpnimgcenter': appendNimgcenterInfo($row); break; default: exit('Unsupported item type: '.$row['item_type_name']); } if (isset($row['attachment_dl_limit']) && $row['attachment_dl_limit']) { $found = false; foreach ($row['file'] as $file) { if ('preview' !== $file['file_type_name']) { $limitFiles[] = $file['file_id']; $found = true; } } if ($found) { $limitItems[] = [ 'uname' => $row['uname'], 'name' => $row['name'], 'email' => $row['email'], 'item_id' => $row['item_id'], 'doi' => $row['doi'], ]; } } MyDumpTool::dropColumn($row, ['email', 'item_type_id']); if (isset($row['rights']) && isset($row['use_cc']) && isset($row['cc_commercial_use']) && isset($row['cc_modification']) && 1 == $row['use_cc']) { $label = 'Creative Commons Attribution'; if (0 == $row['cc_commercial_use']) { $label .= '-NonCommercial'; } switch ($row['cc_modification']) { case 0: $label .= '-NoDerivatives'; break; case 1: $label .= '-ShareAlike'; break; } $label .= ' 4.0 International License.'; $row['rights'] = $label; } $items[] = $row; $simpfurl = ''; if ('' != $row['doi'] && isset($simpflink['id'][$row['doi']])) { $simpfurl = $simpflink['id'][$row['doi']]; } elseif (isset($simpflink['item_id'][$row['item_id']])) { $simpfurl = $simpflink['item_id'][$row['item_id']]; } if ('' !== $simpfurl) { $simpfurls[] = [ 'id' => $row['item_id'], 'url' => $simpfurl, ]; } $itemIds[] = $row['item_id']; } $xoopsDB->freeRecordSet($res); MyDumpTool::saveJson('public/modules/xoonips/items.json', $items); MyDumpTool::saveJson('src/xoonips/assets/simpf-links.json', $simpfurls); foreach ($baseItemIds as $bid) { if (!in_array($bid, $itemIds)) { echo 'Warning: baseitem_id('.$bid.') not found'.PHP_EOL; } } $fp = fopen(MYDUMPTOOL_OUTPUTDIR.'/dl-limit-items.csv', 'w'); foreach ($limitItems as $row) { $data = [ $row['item_id'], $row['uname'], $row['name'], $row['email'], getItemUrl($row), ]; fputcsv($fp, $data); } fclose($fp); // get files $fileutil = xoonips_getutility('file'); $basePath = $xoonipsConfigs['upload_dir']; $sql = <<< SQL SELECT `f`.`file_id`, `f`.`item_id`, `f`.`original_file_name`, `ft`.`name` AS `file_type_name` FROM `${prefix}_xoonips_file` AS `f` INNER JOIN `${prefix}_xoonips_file_type` AS `ft` ON `f`.`file_type_id`=`ft`.`file_type_id` INNER JOIN `${prefix}_xoonips_index_item_link` AS `iil` ON `f`.`item_id`=`iil`.`item_id` INNER JOIN `${prefix}_xoonips_index` AS `idx` ON `iil`.`index_id`=`idx`.`index_id` WHERE `f`.`is_deleted`=0 AND `ft`.`name` NOT IN('readme' , 'license', 'rights') AND `iil`.`certify_state`=2 AND `idx`.`open_level`=1 GROUP BY `f`.`file_id` ORDER BY `f`.`file_id` ASC SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } $filesDir = MYDUMPTOOL_OUTPUTDIR.'/public/modules/xoonips/file'; while ($row = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($row); MyDumpTool::convertToInt($row, ['file_id', 'item_id']); $file_id = $row['file_id']; $item_id = $row['item_id']; $file_name = $row['original_file_name']; $file_type = $row['file_type_name']; if (in_array($file_id, $limitFiles)) { echo "download limit file found.. skip to copy.. item_id:$item_id, file_id:$file_id".PHP_EOL; continue; } $file_dir = $filesDir.'/'.$file_id; $src_file = $basePath.'/'.$file_id; if (!is_dir($file_dir)) { @mkdir($file_dir); } //if (!file_exists($file_dir.'/'.$file_name)) { if (!MyDumpTool::fileCopy($src_file, $file_dir.'/'.$file_name)) { echo 'failed to copy file: '.$basePath.'/'.$file_id.PHP_EOL; } $htaccess = $file_dir.'/.htaccess'; $xfilename = str_replace(' ', '\\ ', $file_name); $data = "RewriteEngine On\nRewriteBase /database/file/$file_id\nRewriteCond %{REQUEST_FILENAME} !-f\nRewriteRule .* $xfilename [R=301,L]\n"; file_put_contents($htaccess, $data); //} if ('preview' == $file_type) { $thumbnail_file = $file_dir.'.png'; if (!file_exists($thumbnail_file)) { $mimetype = $fileutil->get_mimetype($src_file, $file_name); $thumbnail = $fileutil->get_thumbnail($src_file, $mimetype); if (null !== $thumbnail) { file_put_contents($thumbnail_file, $thumbnail); } else { createThumbnail($src_file, $mimetype, $thumbnail_file); } } } } $xoopsDB->freeRecordSet($res); // functions function getItemUrl($row) { $url = XOONIPS_URL.'/detail.php?'; if ('' != $row['doi']) { $url .= XNP_CONFIG_DOI_FIELD_PARAM_NAME.'='.$row['doi']; } else { $url .= 'item_id='.$row['item_id']; } return $url; } function getTreeNode($tree, $root, $index_id) { $children = []; if (isset($root[$index_id])) { foreach ($root[$index_id] as $child_index_id) { $children[] = getTreeNode($tree, $root, $child_index_id); } } return [ 'id' => (int) $tree[$index_id]['index_id'], 'title' => $tree[$index_id]['title'], 'num_of_items' => (int) $tree[$index_id]['num_items'], 'children' => $children, ]; } function getIndexes($tree, $item_id) { global $xoopsDB; $prefix = $xoopsDB->prefix(); $sql = <<< SQL SELECT `iil`.`index_id` FROM `${prefix}_xoonips_index_item_link` AS `iil` WHERE `iil`.`item_id`=$item_id ORDER BY `iil`.`index_id` SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } $indexes = []; while ($row = $xoopsDB->fetchArray($res)) { $index_id = $row['index_id']; if (isset($tree[$index_id])) { $idxes = []; $idxes[] = $tree[$index_id]['title']; $parent_id = $tree[$index_id]['parent_index_id']; while (1 != $parent_id) { $idxes[] = $tree[$parent_id]['title']; $parent_id = $tree[$parent_id]['parent_index_id']; } $idxes[] = ''; $indexes[] = [ 'index_id' => (int) $index_id, 'title' => trim(implode(' / ', array_reverse($idxes))), ]; } } $xoopsDB->freeRecordSet($res); return $indexes; } function getChangeLogs($item_id) { global $xoopsDB; $prefix = $xoopsDB->prefix(); $sql = <<< SQL SELECT `log_date`, `log` FROM `${prefix}_xoonips_changelog` WHERE `item_id`=$item_id ORDER BY `log_date` DESC SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } $ret = []; while ($row = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($row); MyDumpTool::convertToInt($row, ['log_date']); $ret[] = $row; } $xoopsDB->freeRecordSet($res); return $ret; } function getRelatedTo($item_id) { global $xoopsDB; $prefix = $xoopsDB->prefix(); $sql = <<< SQL SELECT `item_id` FROM `${prefix}_xoonips_related_to` WHERE `parent_id`=$item_id SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } $ret = []; while ($row = $xoopsDB->fetchArray($res)) { $ret[] = (int) $row['item_id']; } $xoopsDB->freeRecordSet($res); return $ret; } function getKeyword($item_id) { global $xoopsDB; $prefix = $xoopsDB->prefix(); $sql = <<< SQL SELECT * FROM `${prefix}_xoonips_item_keyword` WHERE `item_id`=$item_id ORDER BY `keyword_id` ASC SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } $ret = []; while ($row = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($row); $ret[] = $row['keyword']; } $xoopsDB->freeRecordSet($res); return $ret; } function getFile($item_id) { global $xoopsDB; $prefix = $xoopsDB->prefix(); $sql = <<< SQL SELECT `f`.`file_id`, `f`.`original_file_name`, `f`.`mime_type`, `f`.`file_size`, `f`.`caption`, `f`.`timestamp`, `ft`.`name` AS `file_type_name`, `ft`.`display_name` AS `file_type_display_name` FROM `${prefix}_xoonips_file` AS `f` INNER JOIN `${prefix}_xoonips_file_type` AS `ft` ON `f`.`file_type_id`=`ft`.`file_type_id` WHERE `item_id`=$item_id AND `is_deleted`=0 ORDER BY `ft`.`name` ASC SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } $ret = []; while ($row = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($row); MyDumpTool::convertToInt($row, ['file_id', 'file_size']); $ret[] = $row; } $xoopsDB->freeRecordSet($res); return $ret; } function appendBinderInfo(&$row) { global $xoopsDB; $prefix = $xoopsDB->prefix(); $item_id = $row['item_id']; $sql = <<< SQL SELECT * FROM `${prefix}_xnpbinder_item_detail` WHERE `binder_id`=$item_id SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } while ($detail = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($detail); MyDumpTool::convertToInt($detail, ['binder_id']); MyDumpTool::dropColumn($detail, ['binder_id']); $row += $detail; } $xoopsDB->freeRecordSet($res); $sql = <<< SQL SELECT * FROM `${prefix}_xnpbinder_binder_item_link` WHERE `binder_id`=$item_id ORDER BY `item_id` ASC SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } $row['item_link'] = []; while ($row2 = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($row2); $row['item_link'][] = (int) $row2['item_id']; } $xoopsDB->freeRecordSet($res); } function appendBookInfo(&$row) { global $xoopsDB; $prefix = $xoopsDB->prefix(); $item_id = $row['item_id']; $sql = <<< SQL SELECT * FROM `${prefix}_xnpbook_item_detail` WHERE `book_id`=$item_id SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } while ($detail = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($detail); MyDumpTool::convertToInt($detail, ['book_id', 'attachment_dl_limit', 'attachment_dl_notify']); MyDumpTool::convertToInt($detail, ['volume', 'number']); // for CBSN MyDumpTool::dropColumn($detail, ['book_id']); $row += $detail; } $xoopsDB->freeRecordSet($res); $sql = <<< SQL SELECT * FROM `${prefix}_xnpbook_author` WHERE `book_id`=$item_id ORDER BY `author_order` ASC SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } $row['author'] = []; while ($author = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($author); $row['author'][] = $author['author']; } $xoopsDB->freeRecordSet($res); } function appendConferenceInfo(&$row) { global $xoopsDB; $prefix = $xoopsDB->prefix(); $item_id = $row['item_id']; $sql = <<< SQL SELECT * FROM `${prefix}_xnpconference_item_detail` WHERE `conference_id`=$item_id SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } while ($detail = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($detail); MyDumpTool::convertToInt($detail, ['conference_id', 'conference_from_year', 'conference_from_month', 'conference_from_mday', 'conference_to_year', 'conference_to_month', 'conference_to_mday', 'attachment_dl_limit', 'attachment_dl_notify']); MyDumpTool::dropColumn($detail, ['conference_id']); $row += $detail; } $xoopsDB->freeRecordSet($res); $sql = <<< SQL SELECT * FROM `${prefix}_xnpconference_author` WHERE `conference_id`=$item_id ORDER BY `author_order` ASC SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } $row['author'] = []; while ($author = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($author); $row['author'][] = $author['author']; } $xoopsDB->freeRecordSet($res); } function appendDataInfo(&$row) { global $xoopsDB; $prefix = $xoopsDB->prefix(); $item_id = $row['item_id']; $sql = <<< SQL SELECT * FROM `${prefix}_xnpdata_item_detail` WHERE `data_id`=$item_id SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } while ($detail = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($detail); MyDumpTool::convertToInt($detail, ['data_id', 'use_cc', 'cc_commercial_use', 'cc_modification', 'attachment_dl_limit', 'attachment_dl_notify']); MyDumpTool::dropColumn($detail, ['data_id']); $row += $detail; } $xoopsDB->freeRecordSet($res); $sql = <<< SQL SELECT * FROM `${prefix}_xnpdata_experimenter` WHERE `data_id`=$item_id ORDER BY `experimenter_order` ASC SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } $row['experimenter'] = []; while ($author = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($author); $row['experimenter'][] = $author['experimenter']; } $xoopsDB->freeRecordSet($res); } function appendFilesInfo(&$row) { global $xoopsDB; $prefix = $xoopsDB->prefix(); $item_id = $row['item_id']; $sql = <<< SQL SELECT * FROM `${prefix}_xnpfiles_item_detail` WHERE `files_id`=$item_id SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } while ($detail = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($detail); MyDumpTool::convertToInt($detail, ['files_id']); MyDumpTool::dropColumn($detail, ['files_id']); $row += $detail; } $xoopsDB->freeRecordSet($res); } function appendMemoInfo(&$row) { global $xoopsDB; $prefix = $xoopsDB->prefix(); $item_id = $row['item_id']; $sql = <<< SQL SELECT * FROM `${prefix}_xnpmemo_item_detail` WHERE `memo_id`=$item_id SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } while ($detail = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($detail); MyDumpTool::convertToInt($detail, ['memo_id']); MyDumpTool::dropColumn($detail, ['memo_id']); $row += $detail; } $xoopsDB->freeRecordSet($res); } function appendModelInfo(&$row) { global $xoopsDB; $prefix = $xoopsDB->prefix(); $item_id = $row['item_id']; $sql = <<< SQL SELECT * FROM `${prefix}_xnpmodel_item_detail` WHERE `model_id`=$item_id SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } while ($detail = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($detail); MyDumpTool::convertToInt($detail, ['model_id', 'use_cc', 'cc_commercial_use', 'cc_modification', 'attachment_dl_limit', 'attachment_dl_notify']); MyDumpTool::dropColumn($detail, ['model_id']); $row += $detail; } $xoopsDB->freeRecordSet($res); $sql = <<< SQL SELECT * FROM `${prefix}_xnpmodel_creator` WHERE `model_id`=$item_id ORDER BY `creator_order` ASC SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } $row['creator'] = []; while ($author = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($author); $row['creator'][] = $author['creator']; } $xoopsDB->freeRecordSet($res); } function appendPaperInfo(&$row) { global $xoopsDB; $prefix = $xoopsDB->prefix(); $item_id = $row['item_id']; $sql = <<< SQL SELECT * FROM `${prefix}_xnppaper_item_detail` WHERE `paper_id`=$item_id SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } while ($detail = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($detail); MyDumpTool::convertToInt($detail, ['paper_id', 'volume', 'number']); MyDumpTool::dropColumn($detail, ['paper_id']); $row += $detail; } $xoopsDB->freeRecordSet($res); $sql = <<< SQL SELECT * FROM `${prefix}_xnppaper_author` WHERE `paper_id`=$item_id ORDER BY `author_order` ASC SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } $row['author'] = []; while ($author = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($author); $row['author'][] = $author['author']; } $xoopsDB->freeRecordSet($res); } function appendPresentationInfo(&$row) { global $xoopsDB; $prefix = $xoopsDB->prefix(); $item_id = $row['item_id']; $sql = <<< SQL SELECT * FROM `${prefix}_xnppresentation_item_detail` WHERE `presentation_id`=$item_id SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } while ($detail = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($detail); MyDumpTool::convertToInt($detail, ['presentation_id', 'use_cc', 'cc_commercial_use', 'cc_modification', 'attachment_dl_limit', 'attachment_dl_notify']); MyDumpTool::dropColumn($detail, ['presentation_id']); $row += $detail; } $xoopsDB->freeRecordSet($res); $sql = <<< SQL SELECT * FROM `${prefix}_xnppresentation_creator` WHERE `presentation_id`=$item_id ORDER BY `creator_order` ASC SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } $row['creator'] = []; while ($author = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($author); $row['creator'][] = $author['creator']; } $xoopsDB->freeRecordSet($res); } function appendSimulatorInfo(&$row) { global $xoopsDB; $prefix = $xoopsDB->prefix(); $item_id = $row['item_id']; $sql = <<< SQL SELECT * FROM `${prefix}_xnpsimulator_item_detail` WHERE `simulator_id`=$item_id SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } while ($detail = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($detail); MyDumpTool::convertToInt($detail, ['simulator_id', 'use_cc', 'cc_commercial_use', 'cc_modification', 'attachment_dl_limit', 'attachment_dl_notify']); MyDumpTool::dropColumn($detail, ['simulator_id']); $row += $detail; } $xoopsDB->freeRecordSet($res); $sql = <<< SQL SELECT * FROM `${prefix}_xnpsimulator_developer` WHERE `simulator_id`=$item_id ORDER BY `developer_order` ASC SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } $row['developer'] = []; while ($author = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($author); $row['developer'][] = $author['developer']; } $xoopsDB->freeRecordSet($res); } function appendStimulusInfo(&$row) { global $xoopsDB; $prefix = $xoopsDB->prefix(); $item_id = $row['item_id']; $sql = <<< SQL SELECT * FROM `${prefix}_xnpstimulus_item_detail` WHERE `stimulus_id`=$item_id SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } while ($detail = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($detail); MyDumpTool::convertToInt($detail, ['stimulus_id', 'use_cc', 'cc_commercial_use', 'cc_modification', 'attachment_dl_limit', 'attachment_dl_notify']); MyDumpTool::dropColumn($detail, ['stimulus_id']); $row += $detail; } $xoopsDB->freeRecordSet($res); $sql = <<< SQL SELECT * FROM `${prefix}_xnpstimulus_developer` WHERE `stimulus_id`=$item_id ORDER BY `developer_order` ASC SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } $row['developer'] = []; while ($author = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($author); $row['developer'][] = $author['developer']; } $xoopsDB->freeRecordSet($res); } function appendToolInfo(&$row) { global $xoopsDB; $prefix = $xoopsDB->prefix(); $item_id = $row['item_id']; $sql = <<< SQL SELECT * FROM `${prefix}_xnptool_item_detail` WHERE `tool_id`=$item_id SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } while ($detail = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($detail); MyDumpTool::convertToInt($detail, ['tool_id', 'use_cc', 'cc_commercial_use', 'cc_modification', 'attachment_dl_limit', 'attachment_dl_notify']); MyDumpTool::dropColumn($detail, ['tool_id']); $row += $detail; } $xoopsDB->freeRecordSet($res); $sql = <<< SQL SELECT * FROM `${prefix}_xnptool_developer` WHERE `tool_id`=$item_id ORDER BY `developer_order` ASC SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } $row['developer'] = []; while ($author = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($author); $row['developer'][] = $author['developer']; } $xoopsDB->freeRecordSet($res); } function appendUrlInfo(&$row) { global $xoopsDB; $prefix = $xoopsDB->prefix(); $item_id = $row['item_id']; $sql = <<< SQL SELECT * FROM `${prefix}_xnpurl_item_detail` WHERE `url_id`=$item_id SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } while ($detail = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($detail); MyDumpTool::convertToInt($detail, ['url_id', 'url_count']); MyDumpTool::dropColumn($detail, ['url_id']); $row += $detail; } $xoopsDB->freeRecordSet($res); } function appendNimgcenterInfo(&$row) { global $xoopsDB; $prefix = $xoopsDB->prefix(); $coord_type_names = [ 0 => 'Talairach', 1 => 'NMI', 2 => 'Unclear', ]; $item_id = $row['item_id']; $sql = <<< SQL SELECT `id`.*, `ity`.`display_name` AS `base_type_display_name` FROM `${prefix}_xnpnimgcenter_item_detail` AS `id` INNER JOIN `${prefix}_xoonips_item_type` AS `ity` ON `id`.`base_type_name`=`ity`.`name` WHERE `id`.`nimgcenter_id`=$item_id SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } while ($detail = $xoopsDB->fetchArray($res)) { MyDumpTool::decode($detail); MyDumpTool::convertToInt($detail, ['baseitem_id', 'coord_type']); $detail['coord_type_name'] = $coord_type_names[$detail['coord_type']]; MyDumpTool::dropColumn($detail, ['nimgcenter_id']); $row += $detail; } $xoopsDB->freeRecordSet($res); $sql = <<< SQL SELECT * FROM `${prefix}_xnpnimgcenter_talairach_list` WHERE `nimgcenter_id`=$item_id SQL; if (!($res = $xoopsDB->query($sql))) { var_dump($xoopsDB); exit(); } $row['coordinate'] = []; while ($t = $xoopsDB->fetchArray($res)) { MyDumpTool::dropColumn($t, ['nimgcenter_id']); MyDumpTool::convertToInt($t, ['x', 'y', 'z']); $row['coordinate'][] = $t; } $xoopsDB->freeRecordSet($res); global $baseItemIds; $baseItemIds[$row['item_id']] = $row['baseitem_id']; } function createThumbnail($inputFile, $mime_type, $outputFile) { $finfo = finfo_open(FILEINFO_NONE); $label = finfo_file($finfo, $inputFile); finfo_close($finfo); if (preg_match('/^([^\\/]*)\\/(.*)$/', $mime_type, $matches)) { if ('audio' == $matches[1]) { $img_type = 'audio'; } elseif ('image' == $matches[1]) { $img_type = 'image'; } elseif ('video' == $matches[1]) { $img_type = 'video'; } elseif ('text' == $matches[1]) { $img_type = 'text'; } elseif ('application' == $matches[1]) { $text_types = ['pdf', 'xml', 'msword', 'vnd.ms-excel']; $image_types = ['vnd.ms-powerpoint', 'postscript']; $audio_types = ['vnd.rn-realmedia']; if (in_array($matches[2], $text_types)) { $img_type = 'text'; } elseif (in_array($matches[2], $audio_types)) { $img_type = 'audio'; } elseif (in_array($matches[2], $image_types)) { $img_type = 'image'; } else { $img_type = 'application'; } } else { $img_type = 'unknown'; } } else { $img_type = 'unknown'; } $img_file = XOOPS_ROOT_PATH.'/modules/xoonips/images/thumbnail_'.$img_type.'.png'; // create image resource $w = 100; $h = 100; $im = imagecreatetruecolor($w, $h); // label setting $f = 2; // font number $lp = 5; // label padding $fw = imagefontwidth($f); // font width $fh = imagefontheight($f); // font height $fmaxlen = ($w - $lp * 2) / $fw; // max label length $labels = explode(',', $label); $label = $labels[0]; $llen = strlen($label); if ($llen > $fmaxlen) { $label = substr($label, 0, $fmaxlen - 3); $label .= '...'; $llen = strlen($label); } $lx = ($w - $llen * $fw) / 2; $ly = $h - $fh - $lp; // change alpha attributes and create transparent color imageantialias($im, true); imagealphablending($im, false); imagesavealpha($im, true); $transparent = imagecolorallocatealpha($im, 255, 255, 255, 0); $col_white = imagecolorallocate($im, 255, 255, 255); $col_gray = imagecolorallocate($im, 127, 127, 127); $col_black = imagecolorallocate($im, 0, 0, 0); // fill all area with transparent color imagefill($im, 0, 0, $col_white); imagealphablending($im, true); $imicon = imagecreatefrompng($img_file); imagecopy($im, $imicon, $w / 2 - 48 / 2, $h / 2 - 48 / 2, 0, 0, 48, 48); imagepolygon($im, [0, 0, $w - 1, 0, $w - 1, $h - 1, 0, $h - 1], 4, $col_gray); if (0 != strlen($label)) { imagestring($im, $f, $lx, $ly, $label, $col_black); } imagepng($im, $outputFile); imagedestroy($imicon); imagedestroy($im); return true; } function parseSimPFLinkFile() { global $XOONIPS_SIMPF_LINKFILE; $xoops_url_path = parse_url(XOOPS_URL, PHP_URL_PATH); $ret = []; if (isset($XOONIPS_SIMPF_LINKFILE) && file_exists($XOONIPS_SIMPF_LINKFILE)) { $lines = file($XOONIPS_SIMPF_LINKFILE); foreach ($lines as $line) { list($pfname, $pfurl, $simpfurl) = explode(',', $line); if (preg_match('/^'.preg_quote(XOOPS_URL, '/').'/', $pfurl)) { $pUrl = parse_url($pfurl); if ($pUrl['path'] != $xoops_url_path.'/modules/xoonips/detail.php') { echo 'not xoonips url found in simpf link file. URL:'.$pfurl.PHP_EOL; continue; } if (preg_match('/(?:^|&)(id|item_id)=([^$&]+)/', $pUrl['query'], $matches)) { $key = $matches[1]; $value = $matches[2]; $ret[$key][$value] = trim($simpfurl); } } } } return $ret; }