Skip to content

Commit bd9e99c

Browse files
committed
- added feature to clone module
1 parent 219b502 commit bd9e99c

File tree

7 files changed

+170
-48
lines changed

7 files changed

+170
-48
lines changed

admin/modules.php

Lines changed: 148 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,21 @@
2222
*
2323
*/
2424

25+
use Xmf\Request;
26+
2527
// Define main template
2628
$templateMain = 'modulebuilder_modules.tpl';
2729

2830
require __DIR__ . '/header.php';
2931
// Recovered value of argument op in the URL $
30-
$op = \Xmf\Request::getString('op', 'list');
31-
$modId = \Xmf\Request::getInt('mod_id');
32+
$op = Request::getString('op', 'list');
33+
$modId = Request::getInt('mod_id');
3234

3335
switch ($op) {
3436
case 'list':
3537
default:
36-
$start = \Xmf\Request::getInt('start', 0);
37-
$limit = \Xmf\Request::getInt('limit', $helper->getConfig('modules_adminpager'));
38+
$start = Request::getInt('start', 0);
39+
$limit = Request::getInt('limit', $helper->getConfig('modules_adminpager'));
3840
$GLOBALS['xoTheme']->addScript('modules/modulebuilder/assets/js/functions.js');
3941
$GLOBALS['xoTheme']->addStylesheet('modules/modulebuilder/assets/css/admin/style.css');
4042
$GLOBALS['xoopsTpl']->assign('navigation', $adminObject->displayNavigation('modules.php'));
@@ -89,29 +91,29 @@
8991
} else {
9092
$modulesObj = $helper->getHandler('Modules')->create();
9193
}
92-
$moduleDirname = \preg_replace('/[^a-zA-Z0-9]\s+/', '', \mb_strtolower(\Xmf\Request::getString('mod_dirname', '', 'POST')));
94+
$moduleDirname = \preg_replace('/[^a-zA-Z0-9]\s+/', '', \mb_strtolower(Request::getString('mod_dirname', '', 'POST')));
9395
//Form module save
9496
$modulesObj->setVars(
9597
[
96-
'mod_name' => \Xmf\Request::getString('mod_name', '', 'POST'),
98+
'mod_name' => Request::getString('mod_name', '', 'POST'),
9799
'mod_dirname' => $moduleDirname,
98-
'mod_version' => \Xmf\Request::getString('mod_version', '', 'POST'),
99-
'mod_since' => \Xmf\Request::getString('mod_since', '', 'POST'),
100-
'mod_min_php' => \Xmf\Request::getString('mod_min_php', '', 'POST'),
101-
'mod_min_xoops' => \Xmf\Request::getString('mod_min_xoops', '', 'POST'),
102-
'mod_min_admin' => \Xmf\Request::getString('mod_min_admin', '', 'POST'),
103-
'mod_min_mysql' => \Xmf\Request::getString('mod_min_mysql', '', 'POST'),
104-
'mod_description' => \Xmf\Request::getString('mod_description', '', 'POST'),
105-
'mod_author' => \Xmf\Request::getString('mod_author', '', 'POST'),
106-
'mod_author_mail' => \Xmf\Request::getString('mod_author_mail', '', 'POST'),
107-
'mod_author_website_url' => \Xmf\Request::getString('mod_author_website_url', '', 'POST'),
108-
'mod_author_website_name' => \Xmf\Request::getString('mod_author_website_name', '', 'POST'),
109-
'mod_credits' => \Xmf\Request::getString('mod_credits', '', 'POST'),
110-
'mod_license' => \Xmf\Request::getString('mod_license', '', 'POST'),
111-
'mod_release_info' => \Xmf\Request::getString('mod_release_info', '', 'POST'),
112-
'mod_release_file' => \Xmf\Request::getString('mod_release_file', '', 'POST'),
113-
'mod_manual' => \Xmf\Request::getString('mod_manual', '', 'POST'),
114-
'mod_manual_file' => \Xmf\Request::getString('mod_manual_file', '', 'POST'),
100+
'mod_version' => Request::getString('mod_version', '', 'POST'),
101+
'mod_since' => Request::getString('mod_since', '', 'POST'),
102+
'mod_min_php' => Request::getString('mod_min_php', '', 'POST'),
103+
'mod_min_xoops' => Request::getString('mod_min_xoops', '', 'POST'),
104+
'mod_min_admin' => Request::getString('mod_min_admin', '', 'POST'),
105+
'mod_min_mysql' => Request::getString('mod_min_mysql', '', 'POST'),
106+
'mod_description' => Request::getString('mod_description', '', 'POST'),
107+
'mod_author' => Request::getString('mod_author', '', 'POST'),
108+
'mod_author_mail' => Request::getString('mod_author_mail', '', 'POST'),
109+
'mod_author_website_url' => Request::getString('mod_author_website_url', '', 'POST'),
110+
'mod_author_website_name' => Request::getString('mod_author_website_name', '', 'POST'),
111+
'mod_credits' => Request::getString('mod_credits', '', 'POST'),
112+
'mod_license' => Request::getString('mod_license', '', 'POST'),
113+
'mod_release_info' => Request::getString('mod_release_info', '', 'POST'),
114+
'mod_release_file' => Request::getString('mod_release_file', '', 'POST'),
115+
'mod_manual' => Request::getString('mod_manual', '', 'POST'),
116+
'mod_manual_file' => Request::getString('mod_manual_file', '', 'POST'),
115117
]
116118
);
117119
//Form mod_image
@@ -128,24 +130,24 @@
128130
$modulesObj->setVar('mod_image', $uploader->getSavedFileName());
129131
}
130132
} else {
131-
$modulesObj->setVar('mod_image', \Xmf\Request::getString('mod_image', '', 'POST'));
133+
$modulesObj->setVar('mod_image', Request::getString('mod_image', '', 'POST'));
132134
}
133135
//Form module save
134136
$modulesObj->setVars(
135137
[
136-
'mod_demo_site_url' => \Xmf\Request::getString('mod_demo_site_url', '', 'POST'),
137-
'mod_demo_site_name' => \Xmf\Request::getString('mod_demo_site_name', '', 'POST'),
138-
'mod_support_url' => \Xmf\Request::getString('mod_support_url', '', 'POST'),
139-
'mod_support_name' => \Xmf\Request::getString('mod_support_name', '', 'POST'),
140-
'mod_website_url' => \Xmf\Request::getString('mod_website_url', '', 'POST'),
141-
'mod_website_name' => \Xmf\Request::getString('mod_website_name', '', 'POST'),
142-
'mod_release' => \Xmf\Request::getString('mod_release', '', 'POST'),
143-
'mod_status' => \Xmf\Request::getString('mod_status', '', 'POST'),
144-
'mod_donations' => \Xmf\Request::getString('mod_donations', '', 'POST'),
145-
'mod_subversion' => \Xmf\Request::getString('mod_subversion', '', 'POST'),
138+
'mod_demo_site_url' => Request::getString('mod_demo_site_url', '', 'POST'),
139+
'mod_demo_site_name' => Request::getString('mod_demo_site_name', '', 'POST'),
140+
'mod_support_url' => Request::getString('mod_support_url', '', 'POST'),
141+
'mod_support_name' => Request::getString('mod_support_name', '', 'POST'),
142+
'mod_website_url' => Request::getString('mod_website_url', '', 'POST'),
143+
'mod_website_name' => Request::getString('mod_website_name', '', 'POST'),
144+
'mod_release' => Request::getString('mod_release', '', 'POST'),
145+
'mod_status' => Request::getString('mod_status', '', 'POST'),
146+
'mod_donations' => Request::getString('mod_donations', '', 'POST'),
147+
'mod_subversion' => Request::getString('mod_subversion', '', 'POST'),
146148
]
147149
);
148-
$moduleOption = \Xmf\Request::getArray('module_option', []);
150+
$moduleOption = Request::getArray('module_option', []);
149151
$modulesObj->setVar('mod_admin', \in_array('admin', $moduleOption));
150152
$modulesObj->setVar('mod_user', \in_array('user', $moduleOption));
151153
$modulesObj->setVar('mod_blocks', \in_array('blocks', $moduleOption));
@@ -157,9 +159,9 @@
157159

158160
if ($helper->getHandler('Modules')->insert($modulesObj)) {
159161
if ($modulesObj->isNew()) {
160-
\redirect_header('tables.php', 5, \sprintf(\_AM_MODULEBUILDER_MODULE_FORM_CREATED_OK, \Xmf\Request::getString('mod_name', '', 'POST')));
162+
\redirect_header('tables.php', 5, \sprintf(\_AM_MODULEBUILDER_MODULE_FORM_CREATED_OK, Request::getString('mod_name', '', 'POST')));
161163
} else {
162-
\redirect_header('modules.php', 5, \sprintf(\_AM_MODULEBUILDER_MODULE_FORM_UPDATED_OK, \Xmf\Request::getString('mod_name', '', 'POST')));
164+
\redirect_header('modules.php', 5, \sprintf(\_AM_MODULEBUILDER_MODULE_FORM_UPDATED_OK, Request::getString('mod_name', '', 'POST')));
163165
}
164166
}
165167

@@ -208,7 +210,7 @@
208210
} else {
209211
$xoopsconfirm = new \XoopsModules\Modulebuilder\Common\XoopsConfirm(
210212
['ok' => 1, 'mod_id' => $modId, 'op' => 'delete'],
211-
\Xmf\Request::getString('REQUEST_URI', '', 'SERVER'),
213+
Request::getString('REQUEST_URI', '', 'SERVER'),
212214
$modulesObj->getVar('mod_name')
213215
);
214216
$form = $xoopsconfirm->getFormXoopsConfirm();
@@ -217,7 +219,7 @@
217219
break;
218220
case 'display':
219221
$modFieldArray = ['admin', 'user', 'blocks', 'search', 'comments', 'notifications', 'permissions'];
220-
$id = \Xmf\Request::getInt('mod_id', 0, 'POST');
222+
$id = Request::getInt('mod_id', 0, 'POST');
221223
if ($id > 0) {
222224
$modulesObj = $helper->getHandler('Modules')->get($id);
223225
foreach ($modFieldArray as $moduleField) {
@@ -231,8 +233,114 @@
231233
}
232234
$GLOBALS['xoopsTpl']->assign('error', $modulesObj->getHtmlErrors());
233235
}
236+
break;
237+
case 'clone':
238+
$modIdSource = Request::getInt('mod_id', 0);
239+
if ($modIdSource > 0) {
240+
//clone data table modules
241+
$modulesHandler = $helper->getHandler('Modules');
242+
$tablesHandler = $helper->getHandler('Tables');
243+
$fieldsHandler = $helper->getHandler('Fields');
244+
$moduleSource = $modulesHandler->get($modIdSource);
245+
$moduleTarget = $modulesHandler->create();
246+
$sourceVars = $moduleSource->getVars();
247+
foreach ($sourceVars as $varKey => $varArray) {
248+
if ('mod_id' !== $varKey) {
249+
if (in_array($varKey, ['mod_name', 'mod_dirname'])) {
250+
for ($i = 1; $i <= 10; $i++) {
251+
$uniqValue = $varArray['value'] . $i;
252+
$result = $GLOBALS['xoopsDB']->query(
253+
'SELECT * FROM ' . $GLOBALS['xoopsDB']->prefix('modulebuilder_modules') . " as ms WHERE ms.{$varKey} = '{$uniqValue}'"
254+
);
255+
$num_rows = $GLOBALS['xoopsDB']->getRowsNum($result);
256+
if ($num_rows == 0) {
257+
break;
258+
}
259+
}
260+
$moduleTarget->setVar($varKey, $uniqValue);
261+
} else {
262+
$moduleTarget->setVar($varKey, $varArray['value']);
263+
}
264+
}
265+
}
266+
267+
if ($modulesHandler->insert($moduleTarget)) {
268+
//get new mod_id
269+
$modIdTarget = $GLOBALS['xoopsDB']->getInsertId();
270+
} else {
271+
\redirect_header('modules.php', 5, \_AM_MODULEBUILDER_MODULE_CLONE_ERROR);
272+
}
273+
274+
//clone data table tables
275+
$resultTables = $GLOBALS['xoopsDB']->query(
276+
'SELECT table_id FROM ' . $GLOBALS['xoopsDB']->prefix('modulebuilder_tables') . " as ts WHERE ts.table_mid = '{$modIdSource}'"
277+
);
278+
$num_rows1 = $GLOBALS['xoopsDB']->getRowsNum($resultTables);
279+
if ($num_rows1 > 0) {
280+
while (false !== ($myTables = $GLOBALS['xoopsDB']->fetchArray($resultTables))) {
281+
$tableIdSource = $myTables['table_id'];
282+
$tableSource = $tablesHandler->get($tableIdSource);
283+
$tableTarget = $tablesHandler->create();
284+
$sourceVars = $tableSource->getVars();
285+
foreach ($sourceVars as $varKey => $varArray) {
286+
//skip table_id
287+
if ('table_id' !== $varKey) {
288+
//replace mod_id by new mod_id
289+
if ('table_mid' === $varKey) {
290+
$tableTarget->setVar($varKey, $modIdTarget);
291+
} else {
292+
$tableTarget->setVar($varKey, $varArray['value']);
293+
}
294+
}
295+
}
296+
if ($tablesHandler->insert($tableTarget)) {
297+
//get new table_id
298+
$tableIdTarget = $GLOBALS['xoopsDB']->getInsertId();
299+
} else {
300+
\redirect_header('modules.php', 5, \_AM_MODULEBUILDER_MODULE_CLONE_ERROR);
301+
}
302+
303+
//clone data table fields
304+
$resultFields = $GLOBALS['xoopsDB']->query(
305+
'SELECT field_id FROM ' . $GLOBALS['xoopsDB']->prefix('modulebuilder_fields') . " as fs WHERE fs.field_tid = '{$tableIdSource}'"
306+
);
307+
$num_rows2 = $GLOBALS['xoopsDB']->getRowsNum($resultFields);
308+
if ($num_rows2 > 0) {
309+
while (false !== ($myField = $GLOBALS['xoopsDB']->fetchArray($resultFields))) {
310+
$fieldIdSource = $myField['field_id'];
311+
$fieldsSource = $fieldsHandler->get($fieldIdSource);
312+
$fieldsTarget = $fieldsHandler->create();
313+
$sourceVars = $fieldsSource->getVars();
314+
foreach ($sourceVars as $varKey => $varArray) {
315+
//skip field_id
316+
if ('field_id' !== $varKey) {
317+
if ('field_mid' === $varKey) {
318+
//replace mod_id by new mod_id
319+
$fieldsTarget->setVar($varKey, $modIdTarget);
320+
} elseif ('field_tid' === $varKey) {
321+
//replace table_id by new table_id
322+
$fieldsTarget->setVar($varKey, $tableIdTarget);
323+
} else {
324+
$fieldsTarget->setVar($varKey, $varArray['value']);
325+
}
326+
}
327+
}
328+
if (!$fieldsHandler->insert($fieldsTarget)) {
329+
\redirect_header('modules.php', 5, \_AM_MODULEBUILDER_MODULE_CLONE_ERROR);
330+
}
331+
}
332+
}
333+
}
334+
}
335+
336+
\redirect_header('modules.php', 5, \_AM_MODULEBUILDER_MODULE_CLONE_SUCCESS);
337+
}
338+
339+
340+
341+
342+
234343
break;
235344
}
236345

237346
require __DIR__ . '/footer.php';
238-
958 Bytes
Loading

docs/changelog.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
<h5>3.05 RC2 [2021-10-13]</h5> Dev: XOOPS 2.5.11, PHP 7.4.5
2+
<hr>
3+
- added icon for clone (goffy)
4+
- added feature to clone module (mamba/goffy)
5+
16
<h5>3.05 RC1 [2020-11-11]</h5> Dev: XOOPS 2.5.11, PHP 7.4.5
27
<hr>
38
- fixed bug with l\trim (alain/goffy)

include/install.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,5 +99,13 @@ function xoops_module_install_modulebuilder(\XoopsModule $module)
9999
}
100100
}
101101

102+
// --- COPY page_copy.png ---------------
103+
// needed for clone feature of by modulebuilder created modules
104+
$dest =\XOOPS_ROOT_PATH . '/Frameworks/moduleclasses/icons/32/page_copy.png';
105+
if (!\file_exists($dest)) {
106+
$file = \dirname(__DIR__) . '/assets/images/icons/32/page_copy.png';
107+
$utility::copyFile($file, $dest);
108+
}
109+
102110
return true;
103111
}

language/english/admin.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,8 @@
195195
\define('_AM_MODULEBUILDER_MODULE_FORM_UPDATED_OK', "The module <b class='green'>%s</b> is successfully updated");
196196
\define('_AM_MODULEBUILDER_MODULE_BUTTON_NEW_LOGO', 'Create new Logo');
197197
\define('_AM_MODULEBUILDER_MODULE_NOACTSET', 'Error: No active setting found');
198+
\define('_AM_MODULEBUILDER_MODULE_CLONE_SUCCESS', 'Module successfully cloned');
199+
\define('_AM_MODULEBUILDER_MODULE_CLONE_ERROR', 'An error occured when cloning module');
198200
//
199201
// ------------------- Tables --------------------------------- //
200202
// buttons

templates/admin/modulebuilder_modules.tpl

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,13 @@
7474
</td>
7575
<td class='xo-actions txtcenter width5'>
7676
<a href="modules.php?op=edit&amp;mod_id=<{$module.id}>" title="<{$smarty.const._EDIT}>">
77-
<img src="<{xoModuleIcons16 edit.png}>" alt="<{$smarty.const._EDIT}>"/>
78-
</a>
77+
<img src="<{xoModuleIcons16 edit.png}>" alt="<{$smarty.const._EDIT}>"/></a>
7978
<a href="modules.php?op=delete&amp;mod_id=<{$module.id}>" title="<{$smarty.const._DELETE}>">
80-
<img src="<{xoModuleIcons16 delete.png}>" alt="<{$smarty.const._DELETE}>"/>
81-
</a>
82-
<a href="building.php?op=build&amp;mod_id=<{$module.id}>"><img src="<{xoModuleIcons16 forward.png}>"
83-
alt="<{$smarty.const._AM_MODULEBUILDER_ADMIN_CONST}>"
84-
title="<{$smarty.const._AM_MODULEBUILDER_ADMIN_CONST}>"></a>
79+
<img src="<{xoModuleIcons16 delete.png}>" alt="<{$smarty.const._DELETE}>"/></a>
80+
<a href="building.php?op=build&amp;mod_id=<{$module.id}>">
81+
<img src="<{xoModuleIcons16 forward.png}>" alt="<{$smarty.const._AM_MODULEBUILDER_ADMIN_CONST}>" title="<{$smarty.const._AM_MODULEBUILDER_ADMIN_CONST}>"></a>
82+
<a href="modules.php?op=clone&amp;mod_id=<{$module.id}>" title="<{$smarty.const._CLONE}>">
83+
<img src="<{xoModuleIcons16 editcopy.png}>" alt="<{$smarty.const._CLONE}>"/></a>
8584
</td>
8685
</tr>
8786
<{/foreach}>

xoops_version.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
$moduleDirNameUpper = \mb_strtoupper($moduleDirName);
2828

2929
$modversion['version'] = 3.05;
30-
$modversion['module_status'] = 'RC1';
30+
$modversion['module_status'] = 'RC2';
3131
$modversion['release_date'] = '2020/11/11';
3232
$modversion['name'] = \_MI_MODULEBUILDER_NAME;
3333
$modversion['description'] = \_MI_MODULEBUILDER_DESC;

0 commit comments

Comments
 (0)