\n"; $content .= " \n"; $content .= " \n"; $content .= " \n"; $content .= " \n"; $content .= " \n\n"; $content .= " \n"; $content .= " \n"; $content .= "\n"; $content .= "\n"; $content .= "\n"; return file_put_contents($compile_path . str_replace('/', DIRECTORY_SEPARATOR, 'addon/components/diy/group/index.vue'), $content); } /** * 编译 pages.json 页面路由代码文件,// {{PAGE}} * @param $compile_path * @return bool|int|void */ public function installPageCode($compile_path, $addon = '') { if (!file_exists($this->geAddonPackagePath($this->addon) . 'uni-app-pages.php')) return; $uniapp_pages = require $this->geAddonPackagePath($this->addon) . 'uni-app-pages.php'; if (empty($uniapp_pages[ 'pages' ])) { return; } $pages = []; $addon_service = new CoreAddonService(); $addon_list = $addon_service->getInstallAddonList(); $addon_arr = []; if (!empty($addon_list)) { foreach ($addon_list as $k => $v) { $addon_arr[] = $v[ 'key' ]; } } if (!empty($addon)) { // 追加新装插件 if (is_array($addon)) { $addon_arr = array_merge($addon_arr, $addon); } else if (is_string($addon)) { $addon_arr[] = $addon; } } $addon_arr = array_unique($addon_arr); foreach ($addon_arr as $addon) { if (!file_exists($this->geAddonPackagePath($addon) . 'uni-app-pages.php')) continue; $uniapp_pages = require $this->geAddonPackagePath($addon) . 'uni-app-pages.php'; if (empty($uniapp_pages[ 'pages' ])) continue; $page_begin = strtoupper($addon) . '_PAGE_BEGIN'; $page_end = strtoupper($addon) . '_PAGE_END'; // 对0.2.0之前的版本做处理 $uniapp_pages[ 'pages' ] = preg_replace_callback('/(.*)(\\r\\n.*\/\/ PAGE_END.*)/s', function ($match) { return $match[ 1 ] . ( substr($match[ 1 ], -1) == ',' ? '' : ',' ) . $match[ 2 ]; }, $uniapp_pages[ 'pages' ]); $uniapp_pages[ 'pages' ] = str_replace('PAGE_BEGIN', $page_begin, $uniapp_pages[ 'pages' ]); $uniapp_pages[ 'pages' ] = str_replace('PAGE_END', $page_end, $uniapp_pages[ 'pages' ]); $uniapp_pages[ 'pages' ] = str_replace('{{addon_name}}', $addon, $uniapp_pages[ 'pages' ]); $pages[] = $uniapp_pages[ 'pages' ]; } $content = @file_get_contents($compile_path . "pages.json"); $content = preg_replace_callback('/(.*\/\/ \{\{ PAGE_BEGAIN \}\})(.*)(\/\/ \{\{ PAGE_END \}\}.*)/s', function ($match) use ($pages) { return $match[ 1 ] . PHP_EOL . implode(PHP_EOL, $pages) . PHP_EOL . $match[ 3 ]; }, $content); // 找到页面路由文件 pages.json,写入内容 return file_put_contents($compile_path . "pages.json", $content); } /** * 编译 pages.json 页面路由代码文件 * @param $compile_path * @return bool|int|void */ public function uninstallPageCode($compile_path) { if (!file_exists($this->geAddonPackagePath($this->addon) . 'uni-app-pages.php')) return; $uniapp_pages = require $this->geAddonPackagePath($this->addon) . 'uni-app-pages.php'; if (empty($uniapp_pages[ 'pages' ])) { return; } $pages = []; $addon_arr = array_diff(array_column(( new CoreAddonService() )->getInstallAddonList(), 'key'), [ $this->addon ]); foreach ($addon_arr as $addon) { if (!file_exists($this->geAddonPackagePath($addon) . 'uni-app-pages.php')) continue; $uniapp_pages = require $this->geAddonPackagePath($addon) . 'uni-app-pages.php'; if (empty($uniapp_pages[ 'pages' ])) continue; $page_begin = strtoupper($addon) . '_PAGE_BEGIN'; $page_end = strtoupper($addon) . '_PAGE_END'; $uniapp_pages[ 'pages' ] = str_replace('PAGE_BEGIN', $page_begin, $uniapp_pages[ 'pages' ]); $uniapp_pages[ 'pages' ] = str_replace('PAGE_END', $page_end, $uniapp_pages[ 'pages' ]); $uniapp_pages[ 'pages' ] = str_replace('{{addon_name}}', $addon, $uniapp_pages[ 'pages' ]); $pages[] = $uniapp_pages[ 'pages' ]; } $content = @file_get_contents($compile_path . "pages.json"); $content = preg_replace_callback('/(.*\/\/ \{\{ PAGE_BEGAIN \}\})(.*)(\/\/ \{\{ PAGE_END \}\}.*)/s', function ($match) use ($pages) { return $match[ 1 ] . PHP_EOL . implode(PHP_EOL, $pages) . PHP_EOL . $match[ 3 ]; }, $content); // 找到页面路由文件 pages.json,写入内容 return file_put_contents($compile_path . "pages.json", $content); } /** * 编译 加载插件标题语言包 * @param $compile_path * @param $addon */ public function compileLocale($compile_path, $addon) { $locale_data = []; $root_path = $compile_path . str_replace('/', DIRECTORY_SEPARATOR, 'locale'); // 系统语言包根目录 $file_arr = getFileMap($root_path, []); if (!empty($file_arr)) { foreach ($file_arr as $ck => $cv) { if (str_contains($cv, '.json')) { $app_json = @file_get_contents($ck); $json = json_decode($app_json, true); // 清空当前安装/卸载的插件语言包 foreach ($json as $jk => $jc) { if (is_array($addon)) { foreach ($addon as $key) { if (strpos($jk, $key) !== false) { unset($json[ $jk ]); } } } else { if (strpos($jk, $addon) !== false) { unset($json[ $jk ]); } } } $locale_data[ $cv ] = [ 'path' => $ck, 'json' => $json ]; } } } // 查询已安装的插件 $addon_service = new CoreAddonService(); $addon_list = $addon_service->getInstallAddonList(); $addon_arr = []; if (!empty($addon_list)) { foreach ($addon_list as $k => $v) { $addon_arr[] = $v[ 'key' ]; } } if (!empty($addon)) { // 追加新装插件 if (is_array($addon)) { $addon_arr = array_merge($addon_arr, $addon); } else if (is_string($addon)) { $addon_arr[] = $addon; } } $addon_arr = array_unique($addon_arr); foreach ($addon_arr as $k => $v) { $addon_path = $compile_path . str_replace('/', DIRECTORY_SEPARATOR, 'addon/' . $v . '/locale'); // 插件语言包根目录 $addon_file_arr = getFileMap($addon_path, []); if (!empty($addon_file_arr)) { foreach ($addon_file_arr as $ck => $cv) { if (str_contains($cv, '.json')) { $json = @file_get_contents($ck); $json = json_decode($json, true); $addon_json = []; foreach ($json as $jk => $jv) { $addon_json[ $v . '.' . $jk ] = $jv; } if (isset($locale_data[ $cv ])) $locale_data[ $cv ][ 'json' ] = array_merge($locale_data[ $cv ][ 'json' ], $addon_json); } } } } foreach ($locale_data as $k => $v) { file_put_contents($v[ 'path' ], json_encode($v[ 'json' ], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)); } } /** * 合并manifest.json * @param string $compile_path * @param array $merge_data * @return void */ public function mergeManifestJson(string $compile_path, array $merge_data) { $manifest_json = str_replace('/', DIRECTORY_SEPARATOR, $compile_path . 'src/manifest.json'); $manifest_content = $this->jsonStringToArray(file_get_contents($manifest_json)); ( new CoreAddonBaseService() )->writeArrayToJsonFile(array_merge2($manifest_content, $merge_data), $manifest_json); } /** * json 字符串解析成数组 * @param $string * @return array */ private function jsonStringToArray($string) { $list = explode("\n", $string); $json_array = []; foreach ($list as $index => $item) { if (strpos($item, '/*') === false) { $json_array[] = $item; } } return json_decode(implode(PHP_EOL, $json_array), true); } }