180 lines
4.4 KiB
PHP
180 lines
4.4 KiB
PHP
<?php
|
||
|
||
namespace core\plugin\traits;
|
||
|
||
/**
|
||
* 模板资源操作 Trait
|
||
*/
|
||
trait TemplateTrait
|
||
{
|
||
/**
|
||
* 复制模板资源到目标目录
|
||
*/
|
||
protected function copyTemplates(): void
|
||
{
|
||
$templateDir = $this->pluginPath . '/resource/template';
|
||
|
||
if (!is_dir($templateDir)) {
|
||
$this->output("📂 No template directory found, skipping...");
|
||
return;
|
||
}
|
||
|
||
$this->output("📂 Copying templates from {$templateDir}...");
|
||
|
||
$this->copyTemplateDir('admin');
|
||
$this->copyTemplateDir('web');
|
||
}
|
||
|
||
/**
|
||
* 复制单个端的模板
|
||
*/
|
||
protected function copyTemplateDir(string $endpoint): void
|
||
{
|
||
$resourceDir = $this->getConfig('resource.template', 'template');
|
||
$targetBase = $this->getConfig("template.{$endpoint}");
|
||
|
||
$sourceDir = $this->pluginPath . '/resource/' . $resourceDir . '/' . $endpoint;
|
||
$targetDir = $this->getProjectRoot() . '/' . $targetBase . '/' . $this->pluginName;
|
||
|
||
if (!is_dir($sourceDir)) {
|
||
$this->output(" ⚠️ {$endpoint}: Template source not found");
|
||
return;
|
||
}
|
||
|
||
if (!is_dir(dirname($targetDir))) {
|
||
mkdir(dirname($targetDir), 0755, true);
|
||
}
|
||
|
||
$this->recurseCopy($sourceDir, $targetDir);
|
||
|
||
$this->output(" ✅ {$endpoint}: Templates copied to {$targetDir}");
|
||
}
|
||
|
||
/**
|
||
* 递归复制目录
|
||
*/
|
||
protected function recurseCopy(string $source, string $target): void
|
||
{
|
||
if (!is_dir($source)) {
|
||
return;
|
||
}
|
||
|
||
if (!is_dir($target)) {
|
||
mkdir($target, 0755, true);
|
||
}
|
||
|
||
$files = scandir($source);
|
||
foreach ($files as $file) {
|
||
if ($file === '.' || $file === '..') {
|
||
continue;
|
||
}
|
||
|
||
$sourcePath = $source . '/' . $file;
|
||
$targetPath = $target . '/' . $file;
|
||
|
||
if (is_dir($sourcePath)) {
|
||
$this->recurseCopy($sourcePath, $targetPath);
|
||
} else {
|
||
copy($sourcePath, $targetPath);
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 删除插件模板资源
|
||
*/
|
||
protected function deleteTemplates(): void
|
||
{
|
||
if ($this->preserveTemplatesDuringUninstall) {
|
||
$this->output('📦 Template resources are preserved during uninstall.');
|
||
return;
|
||
}
|
||
|
||
$this->output("🗑️ Deleting plugin templates...");
|
||
|
||
$this->deleteTemplateDir('admin');
|
||
$this->deleteTemplateDir('web');
|
||
}
|
||
|
||
/**
|
||
* 删除单个端模板
|
||
*/
|
||
protected function deleteTemplateDir(string $endpoint): void
|
||
{
|
||
$targetBase = $this->getConfig("template.{$endpoint}");
|
||
|
||
$targetDir = $this->getProjectRoot() . '/' . $targetBase . '/' . $this->pluginName;
|
||
|
||
if (!is_dir($targetDir)) {
|
||
$this->output(" ⚠️ {$endpoint}: Template directory not found");
|
||
return;
|
||
}
|
||
|
||
$this->recurseDelete($targetDir);
|
||
|
||
$this->output(" ✅ {$endpoint}: Templates deleted");
|
||
}
|
||
|
||
/**
|
||
* 递归删除目录
|
||
*/
|
||
protected function recurseDelete(string $dir): void
|
||
{
|
||
if (!is_dir($dir)) {
|
||
return;
|
||
}
|
||
|
||
$files = scandir($dir);
|
||
foreach ($files as $file) {
|
||
if ($file === '.' || $file === '..') {
|
||
continue;
|
||
}
|
||
|
||
$path = $dir . '/' . $file;
|
||
if (is_dir($path)) {
|
||
$this->recurseDelete($path);
|
||
} else {
|
||
unlink($path);
|
||
}
|
||
}
|
||
|
||
rmdir($dir);
|
||
}
|
||
|
||
/**
|
||
* 导入模板(子类可重写)
|
||
*/
|
||
protected function importTemplates(): void
|
||
{
|
||
$this->copyTemplates();
|
||
}
|
||
|
||
/**
|
||
* 获取项目根目录
|
||
*/
|
||
protected function getProjectRoot(): string
|
||
{
|
||
return dirname(base_path());
|
||
}
|
||
|
||
/**
|
||
* 获取前端基础目录
|
||
* 前端代码统一在 frontend 目录下
|
||
*/
|
||
protected function getFrontendPath(): string
|
||
{
|
||
return $this->getProjectRoot() . DIRECTORY_SEPARATOR . 'frontend';
|
||
}
|
||
|
||
/**
|
||
* 获取前端指定项目目录
|
||
*
|
||
* @param string $frontendType 前端类型(admin/web/uni-app)
|
||
* @return string 前端项目目录
|
||
*/
|
||
protected function getFrontendProjectPath(string $frontendType): string
|
||
{
|
||
return $this->getFrontendPath() . DIRECTORY_SEPARATOR . $frontendType;
|
||
}
|
||
}
|