diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b33f03..69df81c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,10 @@ -pacKman 2023.07.29 +pacKman 2023.10.06 +=========================================================== +* Require Dotclear 2.27 +* Require PHP 8.1+ +* Update to Dotclear 2.28-dev + +pacKman 2023.08.06 =========================================================== * Require Dotclear 2.27 * Require PHP 8.1+ diff --git a/README.md b/README.md index 29c81c0..49576cd 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # README -[![Release](https://img.shields.io/badge/release-2023.08.06-a2cbe9.svg)](https://git.dotclear.watch/JcDenis/pacKman/releases) -[![Date](https://img.shields.io/badge/date-2023.08.06-c44d58.svg)](https://git.dotclear.watch/JcDenis/pacKman/releases) -[![Dotclear](https://img.shields.io/badge/dotclear-v2.27-137bbb.svg)](https://fr.dotclear.org/download) +[![Release](https://img.shields.io/badge/release-2023.10.06-a2cbe9.svg)](https://git.dotclear.watch/JcDenis/pacKman/releases) +[![Date](https://img.shields.io/badge/date-2023.10.07-c44d58.svg)](https://git.dotclear.watch/JcDenis/pacKman/releases) +[![Dotclear](https://img.shields.io/badge/dotclear-v2.28-137bbb.svg)](https://fr.dotclear.org/download) [![Dotaddict](https://img.shields.io/badge/dotaddict-official-9ac123.svg)](https://plugins.dotaddict.org/dc2/details/pacKman) [![License](https://img.shields.io/github/license/JcDenis/pacKman)](https://git.dotclear.watch/JcDenis/pacKman/blob/master/LICENSE) @@ -19,7 +19,7 @@ themes and plugins from Dotclear administration pages. _pacKman_ requires: * Super administrator permissions -* Dotclear 2.27 +* Dotclear 2.28 * PHP 8.1+ * A writable cache directory * A writable directory to put packages. (can be VAR dir) diff --git a/_define.php b/_define.php index e07843f..878db8b 100644 --- a/_define.php +++ b/_define.php @@ -20,11 +20,11 @@ $this->registerModule( 'Packages repository', 'Manage your Dotclear packages', 'Jean-Christian Denis', - '2023.08.06', + '2023.10.06', [ 'requires' => [ ['php', '8.1'], - ['core', '2.27'], + ['core', '2.28'], ], 'permissions' => null, 'type' => 'plugin', diff --git a/dcstore.xml b/dcstore.xml index 9caebde..e699751 100644 --- a/dcstore.xml +++ b/dcstore.xml @@ -2,11 +2,11 @@ Packages repository - 2023.08.06 + 2023.10.06 Jean-Christian Denis Manage your Dotclear packages - https://git.dotclear.watch/JcDenis/pacKman/releases/download/v2023.08.06/plugin-pacKman.zip - 2.27 + https://github.com/JcDenis/pacKman/releases/download/v2023.10.06/plugin-pacKman.zip + 2.28 https://git.dotclear.watch/JcDenis/pacKman/src/branch/master/README.md https://git.dotclear.watch/JcDenis/pacKman/issues diff --git a/src/Backend.php b/src/Backend.php index 90561ff..271da93 100644 --- a/src/Backend.php +++ b/src/Backend.php @@ -14,7 +14,7 @@ declare(strict_types=1); namespace Dotclear\Plugin\pacKman; -use dcCore; +use Dotclear\App; use Dotclear\Core\Process; use Dotclear\Core\Backend\Favorites; @@ -33,13 +33,12 @@ class Backend extends Process My::addBackendMenuItem(); - dcCore::app()->addBehavior('adminDashboardFavoritesV2', function (Favorites $favs): void { + App::behavior()->addBehavior('adminDashboardFavoritesV2', function (Favorites $favs): void { $favs->register(My::id(), [ 'title' => My::name(), 'url' => My::manageUrl(), 'small-icon' => My::icons(), - 'large-icon' => My::icons(), - //'permissions' => dcCore::app()->auth->isSuperAdmin(), + 'large-icon' => My::icons() ]); }); diff --git a/src/Config.php b/src/Config.php index 2fb7f51..0301ff6 100644 --- a/src/Config.php +++ b/src/Config.php @@ -14,7 +14,7 @@ declare(strict_types=1); namespace Dotclear\Plugin\pacKman; -use dcCore; +use Dotclear\App; use Dotclear\Core\Process; use Dotclear\Core\Backend\Notices; use Dotclear\Helper\Html\Form\{ @@ -62,13 +62,13 @@ class Config extends Process Notices::addSuccessNotice( __('Configuration has been successfully updated.') ); - dcCore::app()->admin->url->redirect('admin.plugins', [ + App::backend()->url->redirect('admin.plugins', [ 'module' => My::id(), 'conf' => '1', - 'redir' => dcCore::app()->admin->__get('list')->getRedir(), + 'redir' => App::backend()->__get('list')->getRedir(), ]); } catch (Exception $e) { - dcCore::app()->error->add($e->getMessage()); + App::error()->add($e->getMessage()); } return true; @@ -119,8 +119,8 @@ class Config extends Process (new Note())->class('form-note')->text( sprintf( __('Preconization: %s'), - dcCore::app()->blog?->public_path ? - dcCore::app()->blog->public_path : __("Blog's public directory") + App::blog()->publicPath() ? + App::blog()->publicPath() : __("Blog's public directory") ) . ' ' . __('Leave it empty to use Dotclear VAR directory') ), // pack_overwrite diff --git a/src/Core.php b/src/Core.php index 1fcd380..ae2d6de 100644 --- a/src/Core.php +++ b/src/Core.php @@ -14,12 +14,11 @@ declare(strict_types=1); namespace Dotclear\Plugin\pacKman; -use dcCore; -use dcModuleDefine; -use dcModules; +use Dotclear\App; use Dotclear\Helper\File\Files; use Dotclear\Helper\File\Path; use Dotclear\Helper\File\Zip\Unzip; +use Dotclear\Module\ModuleDefine; use Exception; class Core @@ -59,8 +58,8 @@ class Core } $sandboxes = [ - 'theme' => clone dcCore::app()->themes, - 'plugin' => clone dcCore::app()->plugins, + 'theme' => clone App::themes(), + 'plugin' => clone App::plugins(), ]; $i = 0; @@ -73,13 +72,13 @@ class Core if ($zip_root_dir != false) { $target = dirname($zip_file); $path = $target . DIRECTORY_SEPARATOR . $zip_root_dir; - $define = $zip_root_dir . '/' . dcModules::MODULE_FILE_DEFINE; - $init = $zip_root_dir . '/' . dcModules::MODULE_FILE_INIT; + $define = $zip_root_dir . '/' . App::plugins()::MODULE_FILE_DEFINE; + $init = $zip_root_dir . '/' . App::plugins()::MODULE_FILE_INIT; } else { $target = dirname($zip_file) . DIRECTORY_SEPARATOR . preg_replace('/\.([^.]+)$/', '', basename($zip_file)); $path = $target; - $define = dcModules::MODULE_FILE_DEFINE; - $init = dcModules::MODULE_FILE_INIT; + $define = App::plugins()::MODULE_FILE_DEFINE; + $init = App::plugins()::MODULE_FILE_INIT; } if ($zip->isEmpty()) { @@ -135,7 +134,7 @@ class Core return $res; } - public static function pack(dcModuleDefine $define, string $root, array $files, bool $overwrite = false, array $exclude = [], bool $nocomment = false, bool $fixnewline = false): bool + public static function pack(ModuleDefine $define, string $root, array $files, bool $overwrite = false, array $exclude = [], bool $nocomment = false, bool $fixnewline = false): bool { // check define if (!$define->isDefined() @@ -195,7 +194,7 @@ class Core return true; } - private static function getFile(string $file, dcModuleDefine $define): string + private static function getFile(string $file, ModuleDefine $define): string { $file = str_replace( [ diff --git a/src/Install.php b/src/Install.php index f7c2d75..cfda81b 100644 --- a/src/Install.php +++ b/src/Install.php @@ -14,8 +14,7 @@ declare(strict_types=1); namespace Dotclear\Plugin\pacKman; -use dcCore; -use dcNamespace; +use Dotclear\App; use Dotclear\Core\Process; use Exception; @@ -38,7 +37,7 @@ class Install extends Process return true; } catch (Exception $e) { - dcCore::app()->error->add($e->getMessage()); + App::error()->add($e->getMessage()); return false; } @@ -46,23 +45,23 @@ class Install extends Process public static function growUp(): void { - $current = dcCore::app()->getVersion(My::id()); + $current = App::version()->getVersion(My::id()); // Update settings id, ns if ($current && version_compare($current, '2022.12.19.1', '<=')) { - $record = dcCore::app()->con->select( - 'SELECT * FROM ' . dcCore::app()->prefix . dcNamespace::NS_TABLE_NAME . ' ' . + $record = App::con()->select( + 'SELECT * FROM ' . App::con()->prefix() . App::blogWorkspace()::NS_TABLE_NAME . ' ' . "WHERE setting_ns = 'pacKman' " ); while ($record->fetch()) { if (preg_match('/^packman_(.*?)$/', $record->f('setting_id'), $match)) { - $cur = dcCore::app()->con->openCursor(dcCore::app()->prefix . dcNamespace::NS_TABLE_NAME); + $cur = App::blogWorspace()->openBlogWorkspaceCursor(); $cur->setField('setting_id', $match[1]); $cur->setField('setting_ns', My::id()); $cur->update( "WHERE setting_id = '" . $record->f('setting_id') . "' and setting_ns = 'pacKman' " . - 'AND blog_id ' . (null === $record->f('blog_id') ? 'IS NULL ' : ("= '" . dcCore::app()->con->escapeStr($record->f('blog_id')) . "' ")) + 'AND blog_id ' . (null === $record->f('blog_id') ? 'IS NULL ' : ("= '" . App::con()->escapeStr($record->f('blog_id')) . "' ")) ); } } diff --git a/src/Manage.php b/src/Manage.php index 2d2f529..95016b1 100644 --- a/src/Manage.php +++ b/src/Manage.php @@ -14,9 +14,7 @@ declare(strict_types=1); namespace Dotclear\Plugin\pacKman; -/* dotclear ns */ -use dcCore; -use dcThemes; +use Dotclear\App; use Dotclear\Core\Process; use Dotclear\Core\Backend\{ Notices, @@ -53,12 +51,9 @@ class Manage extends Process $dir = Utils::getRepositoryDir($s->pack_repository, $repo); # Modules - if (!(dcCore::app()->themes instanceof dcThemes)) { - dcCore::app()->themes = new dcThemes(); - dcCore::app()->themes->loadModules((string) dcCore::app()->blog?->themes_path, null); + if (App::themes()->isEmpty()) { + App::themes()->loadModules(App::blog()->themesPath(), null); } - $themes = dcCore::app()->themes; - $plugins = dcCore::app()->plugins; # Rights $is_writable = Utils::isWritable($dir, $s->pack_filename); @@ -85,7 +80,7 @@ class Manage extends Process && is_file($module->get('root')) && is_readable($module->get('root')) ) { # --BEHAVIOR-- packmanBeforeDownloadPackage - dcCore::app()->callBehavior('packmanBeforeDownloadPackage', $module->dump(), $type); + App::behavior()->callBehavior('packmanBeforeDownloadPackage', $module->dump(), $type); header('Content-Type: application/zip'); header('Content-Length: ' . filesize($module->get('root'))); @@ -93,7 +88,7 @@ class Manage extends Process readfile($module->get('root')); # --BEHAVIOR-- packmanAfterDownloadPackage - dcCore::app()->callBehavior('packmanAfterDownloadPackage', $module->dump(), $type); + App::behavior()->callBehavior('packmanAfterDownloadPackage', $module->dump(), $type); exit; } @@ -114,17 +109,25 @@ class Manage extends Process My::redirect([], '#packman-' . $type); } - # Pack + # Pack } elseif ($action == 'packup') { foreach ($_POST['modules'] as $root => $id) { - if (!dcCore::app()->{$type}->getDefine($id)->isDefined()) { - throw new Exception('No such module'); + if ($type == 'themes') { + if (!App::themes()->getDefine($id)->isDefined()) { + throw new Exception('No such module'); + } + + $module = App::themes()->getDefine($id); + } else { + if (!App::plugins()->getDefine($id)->isDefined()) { + throw new Exception('No such module'); + } + + $module = App::plugins()->getDefine($id); } - $module = dcCore::app()->{$type}->getDefine($id); - # --BEHAVIOR-- packmanBeforeCreatePackage - dcCore::app()->callBehavior('packmanBeforeCreatePackage', $module->dump()); + App::behavior()->callBehavior('packmanBeforeCreatePackage', $module->dump()); Core::pack( $module, @@ -137,7 +140,7 @@ class Manage extends Process ); # --BEHAVIOR-- packmanAfterCreatePackage - dcCore::app()->callBehavior('packmanAfterCreatePackage', $module->dump()); + App::behavior()->callBehavior('packmanAfterCreatePackage', $module->dump()); } Notices::addSuccessNotice( @@ -150,7 +153,7 @@ class Manage extends Process My::redirect([], '#packman-' . $type); } - # Delete + # Delete } elseif ($action == 'delete') { $del_success = false; foreach ($_POST['modules'] as $root => $id) { @@ -175,21 +178,20 @@ class Manage extends Process My::redirect([], '#packman-repository-' . $type); } - # Install + # Install } elseif ($action == 'install') { foreach ($_POST['modules'] as $root => $id) { # --BEHAVIOR-- packmanBeforeInstallPackage - dcCore::app()->callBehavior('packmanBeforeInstallPackage', $type, $id, $root); + App::behavior()->callBehavior('packmanBeforeInstallPackage', $type, $id, $root); - if ($type == 'plugins') { - $plugins->installPackage($root, $plugins); - } if ($type == 'themes') { - $themes->installPackage($root, $themes); + App::themes()->installPackage($root, App::themes()); + } else { + App::plugins()->installPackage($root, App::plugins()); } # --BEHAVIOR-- packmanAfterInstallPackage - dcCore::app()->callBehavior('packmanAfterInstallPackage', $type, $id, $root); + App::behavior()->callBehavior('packmanAfterInstallPackage', $type, $id, $root); } Notices::addSuccessNotice( @@ -202,7 +204,7 @@ class Manage extends Process My::redirect([], '#packman-repository-' . $type); } - # Copy + # Copy } elseif (strpos($action, 'copy_to_') !== false) { $dest = (string) $dir; if ($action == 'copy_to_plugins') { @@ -228,7 +230,7 @@ class Manage extends Process My::redirect([], '#packman-repository-' . $type); } - # Move + # Move } elseif (strpos($action, 'move_to_') !== false) { $dest = (string) $dir; if ($action == 'move_to_plugins') { @@ -256,7 +258,7 @@ class Manage extends Process } } } catch (Exception $e) { - dcCore::app()->error->add($e->getMessage()); + App::error()->add($e->getMessage()); } return true; @@ -301,7 +303,7 @@ class Manage extends Process My::jsLoad('backend') . # --BEHAVIOR-- packmanAdminHeader - dcCore::app()->callBehavior('packmanAdminHeader') + App::behavior()->callBehavior('packmanAdminHeader') ); echo @@ -311,7 +313,7 @@ class Manage extends Process ]) . Notices::GetNotices(); - if (dcCore::app()->error->flag() || !$is_configured || !$is_plugins_configured || !$is_themes_configured) { + if (App::error()->flag() || !$is_configured || !$is_plugins_configured || !$is_themes_configured) { echo (new Div()) ->separator(' ') @@ -322,13 +324,13 @@ class Manage extends Process ->render(); } else { Utils::modules( - dcCore::app()->plugins->getDefines((new Settings())->hide_distrib ? ['distributed' => false] : []), + App::plugins()->getDefines((new Settings())->hide_distrib ? ['distributed' => false] : []), 'plugins', __('Installed plugins') ); Utils::modules( - dcCore::app()->themes->getDefines((new Settings())->hide_distrib ? ['distributed' => false] : []), + App::themes()->getDefines((new Settings())->hide_distrib ? ['distributed' => false] : []), 'themes', __('Installed themes') ); @@ -375,7 +377,7 @@ class Manage extends Process } # --BEHAVIOR-- packmanAdminTabs - dcCore::app()->callBehavior('packmanAdminTabs'); + App::behavior()->callBehavior('packmanAdminTabs'); Page::helpBlock('pacKman'); Page::closeModule(); diff --git a/src/My.php b/src/My.php index c2c5876..0c4777d 100644 --- a/src/My.php +++ b/src/My.php @@ -14,7 +14,7 @@ declare(strict_types=1); namespace Dotclear\Plugin\pacKman; -use dcCore; +use Dotclear\App; use Dotclear\Module\MyPlugin; /** @@ -38,6 +38,6 @@ class My extends MyPlugin public static function checkCustomContext(int $context): ?bool { - return in_array($context, [My::BACKEND, My::MANAGE, My::MENU]) ? dcCore::app()->auth->isSuperAdmin() : null; + return in_array($context, [My::BACKEND, My::MANAGE, My::MENU]) ? App::auth()->isSuperAdmin() : null; } } diff --git a/src/Uninstall.php b/src/Uninstall.php index 6c28a10..e4caa89 100644 --- a/src/Uninstall.php +++ b/src/Uninstall.php @@ -14,7 +14,7 @@ declare(strict_types=1); namespace Dotclear\Plugin\pacKman; -use dcCore; +use Dotclear\App; use Dotclear\Core\Process; use Dotclear\Plugin\Uninstaller\Uninstaller; @@ -27,7 +27,7 @@ class Uninstall extends Process public static function process(): bool { - if (!self::status() || !dcCore::app()->plugins->moduleExists('Uninstaller')) { + if (!self::status() || !App::plugins()->moduleExists('Uninstaller')) { return false; } diff --git a/src/Utils.php b/src/Utils.php index 1e3efac..2f2420d 100644 --- a/src/Utils.php +++ b/src/Utils.php @@ -14,7 +14,7 @@ declare(strict_types=1); namespace Dotclear\Plugin\pacKman; -use dcCore; +use Dotclear\App; use Dotclear\Helper\Date; use Dotclear\Helper\File\Files; use Dotclear\Helper\File\Path; @@ -45,37 +45,37 @@ class Utils public static function getThemesPath(): string { - return (string) dcCore::app()->blog?->themes_path; + return App::blog()->themesPath(); } public static function isConfigured(string $repo, string $file_a, string $file_b): bool { sleep(1); if (!is_writable($repo)) { - dcCore::app()->error->add( + App::error()->add( __('Path to repository is not writable.') ); } if (empty($file_a)) { - dcCore::app()->error->add( + App::error()->add( __('You must specify the name of package to export.') ); } if (!is_writable(dirname($repo . DIRECTORY_SEPARATOR . $file_a))) { - dcCore::app()->error->add( + App::error()->add( __('Path to first export package is not writable.') ); } if (!empty($file_b) && !is_writable(dirname($repo . DIRECTORY_SEPARATOR . $file_b))) { - dcCore::app()->error->add( + App::error()->add( __('Path to second export package is not writable.') ); } - return !dcCore::app()->error->flag(); + return !App::error()->flag(); } public static function isWritable(string $path, string $file): bool @@ -209,7 +209,7 @@ class Utils if (str_contains($type, 'repository')) { $helpers_addon[] = (new Link()) ->class('button') - ->href(dcCore::app()->adminurl?->get('admin.plugin.' . My::id(), ['purge' => 1]) . '#packman-repository-' . $type) + ->href(App::backend()->url->get('admin.plugin.' . My::id(), ['purge' => 1]) . '#packman-repository-' . $type) ->text(__('Select non lastest versions')) ; } @@ -257,7 +257,7 @@ class Utils (new Text('a', Html::escapeHTML(basename($module->get('root'))))) ->class('packman-download') ->extra( - 'href="' . dcCore::app()->adminurl?->get('admin.plugin.' . My::id(), [ + 'href="' . App::backend()->url->get('admin.plugin.' . My::id(), [ 'package' => basename($module->get('root')), 'repo' => $type, ]) . '"' diff --git a/src/Zip.php b/src/Zip.php index 42ed6f8..1c14aa5 100644 --- a/src/Zip.php +++ b/src/Zip.php @@ -25,14 +25,14 @@ class Zip extends \Dotclear\Helper\File\Zip\Zip /** * Replace clearbricks fileZip::writeFile * - * @param string $name The name - * @param string $file The file - * @param string $size The size - * @param int|null $mtime The mtime + * @param string $name The name + * @param string $file The file + * @param float|int $size The size + * @param float|int $mtime The mtime * * @return void */ - protected function writeFile($name, $file, $size, $mtime) + protected function writeFile(string $name, string $file, int|float $size, int|float $mtime): void { if (!isset($this->entries[$name])) { return;