addBehavior( 'adminModulesListGetActions', ['tinyPacker', 'adminModulesGetActions'] ); dcCore::app()->addBehavior( 'adminModulesListDoActions', ['tinyPacker', 'adminModulesDoActions'] ); /** * @ingroup DC_PLUGIN_TINYPACKER * @brief Quick create packages of modules from admin to public dir. * @since 2.6 */ class tinyPacker { /** * Blog's public sub-directory where to put packages * @var string */ public static $sub_dir = 'packages'; /** * Add button to create package to modules lists * @param object $list adminModulesList instance * @param string $id Module id * @param arrray $_ Module properties * @return string HTML submit button */ public static function adminModulesGetActions($list, $id, $_) { if ($list->getList() != 'plugin-activate' && $list->getList() != 'theme-activate') { return null; } return ''; } /** * Create package on modules lists action * @param object $list adminModulesList instance * @param array $modules Selected modules ids * @param string $type List type (plugins|themes) * @throws Exception If no public dir or module * @return null Null */ public static function adminModulesDoActions($list, $modules, $type) { # Pack action if (empty($_POST['tinypacker']) || !is_array($_POST['tinypacker'])) { return null; } $modules = array_keys($_POST['tinypacker']); $id = $modules[0]; # Repository directory if (($root = self::repositoryDir()) === false) { throw new Exception( __( 'Destination directory is not writable.' ) ); } # Module to pack if (!$list->modules->moduleExists($id)) { throw new Exception(__('No such module.')); } $module = $list->modules->getModules($id); # Excluded files and dirs $exclude = [ '\.', '\.\.', '__MACOSX', '\.svn', '\.hg.*?', '\.git.*?', 'CVS', '\.directory', '\.DS_Store', 'Thumbs\.db', ]; # Packages names $files = [ $type . '-' . $id . '.zip', $type . '-' . $id . '-' . $module['version'] . '.zip', ]; # Create zip foreach ($files as $f) { @set_time_limit(300); $fp = fopen($root . '/' . $f, 'wb'); $zip = new fileZip($fp); foreach ($exclude as $e) { $zip->addExclusion(sprintf( '#(^|/)(%s)(/|$)#', $e )); } $zip->addDirectory($module['root'], $id, true); $zip->write(); $zip->close(); unset($zip); } dcPage::addSuccessNotice( __('Task successfully executed.') ); http::redirect($list->getURL()); } /** * Check and create directories used by packer * @return string|boolean Cleaned path or false on error */ public static function repositoryDir() { $dir = path::real( dcCore::app()->blog->public_path . '/' . tinyPacker::$sub_dir, false ); try { if (!is_dir($dir)) { files::makeDir($dir, true); } if (is_writable($dir)) { return $dir; } } catch(Exception $e) { } return false; } }