source: trunk/bin/module_maker/module.cli.php @ 1

Last change on this file since 1 was 1, checked in by scdev, 19 years ago

Initial import.

File size: 17.3 KB
Line 
1#!/usr/local/bin/php -q
2<?php
3/**
4 * module.cli.php
5 * Code by Strangecode :: www.strangecode.com :: This document contains copyrighted information
6 */
7
8include_once dirname(__FILE__) . '/_config.inc.php';
9
10$op = null;
11$valid_ops = array('clean');
12
13// Test for a single argument.
14if (isset($_SERVER['argv'][2]) && isset($_SERVER['argv'][3])) {
15    $module_name_singular = $_SERVER['argv'][2];
16    $module_name_plural = $_SERVER['argv'][3];
17} else {
18    die(basename($_SERVER['argv'][0]) . " Error: invalid arguments. Try like this:
19   
20    " . basename($_SERVER['argv'][0]) . " site_directory name_singular name_plural [clean]
21
22The following files will be generated by this script:
23<site_directory>/admin/nameplural.php
24<site_directory>/admin/_templates/namesingular_list.ihtml
25<site_directory>/admin/_templates/namesingular_form.ihtml
26<site_directory>/html/nameplural.php
27<site_directory>/html/_templates/namesingular_list.ihtml
28<site_directory>/html/_templates/namesingular.ihtml
29
30");
31}
32
33// Test for operation.
34if (isset($_SERVER['argv'][4])) {
35    // Optional fourth arg is op.
36    $op = $_SERVER['argv'][4];
37    // Make sure op is valid.
38    if (!in_array($op, $valid_ops)) {
39        die(basename($_SERVER['argv'][0]) . " Warning: Operation '$op' is not something I know how to do Please select one of: " . join(", ", $valid_ops) . "\n");
40    }
41}
42
43/******************************************************************************
44 * CONFIG
45 *****************************************************************************/
46
47// Where deleted files go:
48$user_trash_folder = $_SERVER['HOME'] . '/.Trash';
49
50// Directories
51$skel_dir = realpath(dirname(__FILE__) . '/skel');
52$admin_dir = realpath(COMMON_BASE . '/admin');
53$admin_tpl_dir = realpath(COMMON_BASE . '/admin/_templates');
54$public_dir = realpath(COMMON_BASE . '/html');
55$public_tpl_dir = realpath(COMMON_BASE . '/html/_templates');
56
57// Names
58$module_title = ucwords($module_name_plural);
59$item_title = ucwords($module_name_singular);
60$module_name_upper = strtoupper($module_name_plural);
61
62// Admin files
63$admin_script = $module_name_plural . '.php';
64$admin_list_template = $module_name_singular . '_list.ihtml';
65$admin_form_template = $module_name_singular . '_form.ihtml';
66
67// Public files
68$public_script = $module_name_plural . '.php';
69$public_list_template = $module_name_singular . '_list.ihtml';
70$public_detail_template = $module_name_singular . '_view.ihtml';
71
72// Databaes names
73$db_tbl = $module_name_singular . '_tbl';
74$primary_key = $module_name_singular . '_id';
75
76// Only after we've defined essential files can we clean.
77if ('clean' == $op) {
78    cleanFiles();
79    die;
80}
81
82// Go!
83echo 'Runing Module Maker. Using database: ' . $app->getParam('db_name') . "\n";
84
85
86/******************************************************************************
87 * PREPROCESSING
88 *****************************************************************************/
89
90// Ensure skel files exist.
91if (
92    !file_exists("$skel_dir/admin.php") ||
93    !file_exists("$skel_dir/public.php") ||
94    !file_exists("$skel_dir/public.ihtml") ||
95    !file_exists("$skel_dir/public_list.ihtml")
96) {
97    die(basename($_SERVER['argv'][0]) . " Warning: one or more skeleton source files missing. Please check directory: $skel_dir.\n");
98}
99
100// Ensure essential directories exist.
101if (!is_dir("$admin_dir")) {
102    die(basename($_SERVER['argv'][0]) . " Error: $admin_dir directory not found.\n");
103}
104if (!is_dir("$admin_tpl_dir")) {
105    die(basename($_SERVER['argv'][0]) . " Error: $admin_tpl_dir directory not found.\n");
106}
107if (!is_dir("$public_dir")) {
108    die(basename($_SERVER['argv'][0]) . " Error: $public_dir directory not found.\n");
109}
110if (!is_dir("$public_tpl_dir")) {
111    die(basename($_SERVER['argv'][0]) . " Error: $public_tpl_dir directory not found.\n");
112}
113
114// Get DB tables.
115$qid = DB::query("SHOW TABLES");
116while (list($row) = mysql_fetch_row($qid)) {
117    $tables[] = $row;
118}
119
120// Make sure requested table is in database.
121if (!in_array($db_tbl, $tables)) {
122    die(sprintf("%s Warning: %s does not exist in database %s. Please select one of: \n\n%s\n\n", basename($_SERVER['argv'][0]), $db_tbl, App::getParam('db_name'), join("\n", $tables)));
123}
124
125// Ensure requested table contains columns.
126// Get DB table column info.
127$qid = DB::query("DESCRIBE " . addslashes($db_tbl));
128while ($row = mysql_fetch_row($qid)) {
129    $cols[] = $row;
130}
131if (!is_array($cols) || empty($cols)) {
132    die(basename($_SERVER['argv'][0]) . " Warning: $db_tbl does not have any columns.\n");
133}
134
135
136/******************************************************************************
137 * SETUP VARIABLES
138 *****************************************************************************/
139
140
141// Loop through columns
142$multipart_form_required = false;
143$headers = array();
144$public_list_page_vars = array();
145$public_detail_page_vars = array();
146$set_values_default = array();
147if (is_array($cols) && !empty($cols)) {
148    foreach ($cols as $col) {
149       
150        // Human readable.
151        $field = $col[0];
152        $field_title = ucfirst(str_replace('_', ' ', $field));
153        $type = preg_replace('/^(\w+).*$/', '\\1', $col[1]);
154        $default = $col[4];
155       
156        // Get primary key.
157//         if ('PRI' == $col[3]) {
158//             $primary_key = $field;
159//         }
160       
161        // Our form will require type="multipart/form-data".
162        if (preg_match('/file/i', $field)) {
163            $multipart_form_required = true;
164        }
165       
166        // Column headers.
167        $headers[$field] = $field_title;
168       
169        // Get php code for printing variables.
170        $public_list_page_vars[] = "<\x3fphp echo oTxt(\$" . $module_name_singular . "_list[\$i]['$field']); \x3f>";
171        $public_detail_page_vars[] = "<\x3fphp echo oTxt(\$item['$field']); \x3f>";
172        $set_values_default[] = "'$field' => '$default'";
173    }
174}
175
176// -------------FILES-------------
177
178$skel_files['admin_script'] = file_get_contents($skel_dir . '/admin.php');
179$skel_files['admin_list_template'] = file_get_contents($skel_dir . '/adm_list.ihtml');
180$skel_files['admin_form_template'] = file_get_contents($skel_dir . '/adm_form.ihtml');
181$skel_files['public_script'] = file_get_contents($skel_dir . '/public.php');
182$skel_files['public_list_template'] = file_get_contents($skel_dir . '/public_list.ihtml');
183$skel_files['public_detail_template'] = file_get_contents($skel_dir . '/public.ihtml');
184
185
186// -------------VARS-------------
187
188// Simple...
189
190$search['date'] = '/%DATE%/';
191$replace['date'] = date(App::getParam('date_format'));
192
193$search['name_plural'] = '/%NAME_PLURAL%/';
194$replace['name_plural'] = $module_name_plural;
195
196$search['name_singular'] = '/%NAME_SINGULAR%/';
197$replace['name_singular'] = $module_name_singular;
198
199$search['title'] = '/%TITLE%/';
200$replace['title'] = $module_title;
201
202$search['item_title'] = '/%ITEM_TITLE%/';
203$replace['item_title'] = $item_title;
204
205$search['primary_key'] = '/%PRIMARY_KEY%/';
206$replace['primary_key'] = $primary_key;
207
208$search['db_tbl'] = '/%DB_TBL%/';
209$replace['db_tbl'] = $db_tbl;
210
211$search['name_upper'] = '/%NAME_UPPER%/';
212$replace['name_upper'] = $module_name_upper;
213
214$search['admin_script'] = '/%ADMIN_SCRIPT%/';
215$replace['admin_script'] = $admin_script;
216
217$search['admin_list_template'] = '/%ADMIN_LIST_TEMPLATE%/';
218$replace['admin_list_template'] = $admin_list_template;
219
220$search['admin_form_template'] = '/%ADMIN_FORM_TEMPLATE%/';
221$replace['admin_form_template'] = $admin_form_template;
222
223$search['public_script'] = '/%PUBLIC_SCRIPT%/';
224$replace['public_script'] = $public_script;
225
226$search['public_list_template'] = '/%PUBLIC_LIST_TEMPLATE%/';
227$replace['public_list_template'] = $public_list_template;
228
229$search['public_detail_template'] = '/%PUBLIC_DETAIL_TEMPLATE%/';
230$replace['public_detail_template'] = $public_detail_template;
231
232$search['public_detail_page_vars'] = '/%PUBLIC_DETAIL_PAGE_VARS%/';
233$replace['public_detail_page_vars'] = join("\n", $public_detail_page_vars);
234
235$search['public_list_page_vars'] = '/%PUBLIC_LIST_PAGE_VARS%/';
236$replace['public_list_page_vars'] = join("\n", $public_list_page_vars);
237
238$search['set_values_default'] = '/%SET_VALUES_DEFAULT%/';
239$replace['set_values_default'] = join(",\n        ", $set_values_default);
240
241$search['search_fields'] = '/%SEARCH_FIELDS%/';
242$replace['search_fields'] = join(", ", $headers);
243
244$search['admin_form_tag_init'] = '/%ADMIN_FORM_TAG_INIT%/';
245if ($multipart_form_required) {
246    $replace['admin_form_tag_init'] = "<form enctype=\"multipart/form-data\" method=\"post\" action=\"<\x3fphp echo \$_SERVER['PHP_SELF']; \x3f>\">\n<input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"12000000\">";
247} else {
248    $replace['admin_form_tag_init'] = "<form method=\"post\" action=\"<\x3fphp echo \$_SERVER['PHP_SELF']; \x3f>\">";
249}
250
251
252// Complex....
253
254echo "Generating admin form table rows...\n";
255$output = array();
256exec(dirname($_SERVER['argv'][0]) . "/form_template.cli.php " . COMMON_BASE . " $db_tbl", $output, $return_val);
257if ($return_val == 0) {
258    $search['adm_form_table_rows'] = '/%ADM_FORM_TABLE_ROWS%/';
259    $replace['adm_form_table_rows'] = join("\n", $output);
260} else {
261    die(basename($_SERVER['argv'][0]) . " Error: could not execute form_template.cli.php.\n");
262}
263
264echo "Generating admin list table header rows...\n";
265$output = array();
266exec(dirname($_SERVER['argv'][0]) . "/list_template.cli.php " . COMMON_BASE . " $db_tbl headerrows", $output, $return_val);
267if ($return_val == 0) {
268    $search['adm_list_header_rows'] = '/%ADM_LIST_HEADER_ROWS%/';
269    $replace['adm_list_header_rows'] = join("\n", $output);
270} else {
271    die(basename($_SERVER['argv'][0]) . " Error: could not execute list_template.cli.php.\n");
272}
273
274echo "Generating admin list table rows...\n";
275$output = array();
276exec(dirname($_SERVER['argv'][0]) . "/list_template.cli.php " . COMMON_BASE . " $db_tbl listrows", $output, $return_val);
277if ($return_val == 0) {
278    $search['adm_list_rows'] = '/%ADM_LIST_ROWS%/';
279    $replace['adm_list_rows'] = join("\n", $output);
280} else {
281    die(basename($_SERVER['argv'][0]) . " Error: could not execute list_template.cli.php.\n");
282}
283
284echo "Generating sortorder...\n";
285$output = array();
286exec(dirname($_SERVER['argv'][0]) . "/sql.cli.php " . COMMON_BASE . " $db_tbl sortorder", $output, $return_val);
287if ($return_val == 0) {
288    $search['sort_order'] = '/%SORT_ORDER%/';
289    $replace['sort_order'] = join("\n", $output);
290} else {
291    die(basename($_SERVER['argv'][0]) . " Error: could not execute sql.cli.php.\n");
292}
293
294echo "Generating insert data...\n";
295$output = array();
296exec(dirname($_SERVER['argv'][0]) . "/sql.cli.php " . COMMON_BASE . " $db_tbl insert", $output, $return_val);
297if ($return_val == 0) {
298    $search['insert'] = '/%INSERT%/';
299    $replace['insert'] = join("\n", $output);
300} else {
301    die(basename($_SERVER['argv'][0]) . " Error: could not execute sql.cli.php.\n");
302}
303
304echo "Generating update data...\n";
305$output = array();
306exec(dirname($_SERVER['argv'][0]) . "/sql.cli.php " . COMMON_BASE . " $db_tbl update", $output, $return_val);
307if ($return_val == 0) {
308    $search['update'] = '/%UPDATE%/';
309    $replace['update'] = join("\n", $output);
310} else {
311    die(basename($_SERVER['argv'][0]) . " Error: could not execute sql.cli.php.\n");
312}
313
314echo "Generating search data...\n";
315$output = array();
316exec(dirname($_SERVER['argv'][0]) . "/sql.cli.php " . COMMON_BASE . " $db_tbl search", $output, $return_val);
317if ($return_val == 0) {
318    $search['search'] = '/%SEARCH%/';
319    $replace['search'] = join("\n", $output);
320} else {
321    die(basename($_SERVER['argv'][0]) . " Error: could not execute sql.cli.php.\n");
322}
323
324echo "Generating form validation data...\n";
325$output = array();
326exec(dirname($_SERVER['argv'][0]) . "/validation.cli.php " . COMMON_BASE . " $db_tbl", $output, $return_val);
327if ($return_val == 0) {
328    $search['form_validation'] = '/%FORM_VALIDATION%/';
329    $replace['form_validation'] = join("\n", $output);
330} else {
331    die(basename($_SERVER['argv'][0]) . " Error: could not execute validation.cli.php.\n");
332}
333
334/******************************************************************************
335 * WRITE FILES
336 *****************************************************************************/
337
338// (1) Admin script.
339if (file_exists("$admin_dir/$admin_script")) {
340    echo "Admin script already exists: $admin_dir/$admin_script\n";
341} else {
342    echo "Writing admin script: $admin_dir/$admin_script\n";
343    $fp = fopen("$admin_dir/$admin_script", "w");
344    fwrite($fp, preg_replace($search, $replace, $skel_files['admin_script']));
345    fclose($fp);
346}
347
348// (2) Admin list template.
349if (file_exists("$admin_tpl_dir/$admin_list_template")) {
350    echo "Admin list template already exists: $admin_tpl_dir/$admin_list_template\n";
351} else {
352    echo "Writing admin list template: $admin_tpl_dir/$admin_list_template\n";
353    $fp = fopen("$admin_tpl_dir/$admin_list_template", "w");
354    fwrite($fp, preg_replace($search, $replace, $skel_files['admin_list_template']));
355    fclose($fp);
356}
357
358// (3) Admin form template.
359if (file_exists("$admin_tpl_dir/$admin_form_template")) {
360    echo "Admin form template already exists: $admin_tpl_dir/$admin_form_template\n";
361} else {
362    echo "Writing admin form template: $admin_tpl_dir/$admin_form_template\n";
363    $fp = fopen("$admin_tpl_dir/$admin_form_template", "w");
364    fwrite($fp, preg_replace($search, $replace, $skel_files['admin_form_template']));
365    fclose($fp);
366}
367
368// (4) Public script.
369if (file_exists("$public_dir/$public_script")) {
370    echo "Public script already exists: $public_dir/$public_script\n";
371} else {
372    echo "Writing public script: $public_dir/$public_script\n";
373    $fp = fopen("$public_dir/$public_script", "w");
374    fwrite($fp, preg_replace($search, $replace, $skel_files['public_script']));
375    fclose($fp);
376}
377
378// (5) Public list template.
379if (file_exists("$public_tpl_dir/$public_list_template")) {
380    echo "Public list template already exists: $public_tpl_dir/$public_list_template\n";
381} else {
382    echo "Writing public list template: $public_tpl_dir/$public_list_template\n";
383    $fp = fopen("$public_tpl_dir/$public_list_template", "w");
384    fwrite($fp, preg_replace($search, $replace, $skel_files['public_list_template']));
385    fclose($fp);
386}
387
388// (6) Public detail template.
389if (file_exists("$public_tpl_dir/$public_detail_template")) {
390    echo "Public detail template already exists: $public_tpl_dir/$public_detail_template\n";
391} else {
392    echo "Writing public detail template: $public_tpl_dir/$public_detail_template\n";
393    $fp = fopen("$public_tpl_dir/$public_detail_template", "w");
394    fwrite($fp, preg_replace($search, $replace, $skel_files['public_detail_template']));
395    fclose($fp);
396}
397
398echo "Done!\n";
399
400
401/******************************************************************************
402 * FUNCTIONS
403 *****************************************************************************/
404
405/**
406 * Removes existing modules files. Danger!
407 */
408function cleanFiles()
409{
410    global $user_trash_folder;
411    global $admin_dir;
412    global $admin_script;
413    global $admin_tpl_dir;
414    global $admin_list_template;
415    global $admin_form_template;
416    global $public_dir;
417    global $public_script;
418    global $public_tpl_dir;
419    global $public_detail_template;
420    global $public_list_template;
421   
422    echo "Beginning file cleanup\n";
423
424    if (!dir($user_trash_folder)) {
425        mkdir($user_trash_folder);
426        chmod($user_trash_folder, 0777);
427        echo "Attempting to create user trash folder: $user_trash_folder/\n";
428    }
429    if (!dir("$user_trash_folder/") || !is_writable("$user_trash_folder/")) {
430        die("User trash directory not available: $user_trash_folder/\n");
431    }
432
433    if (file_exists("$admin_dir/$admin_script")) {
434        rename("$admin_dir/$admin_script", "$user_trash_folder/$admin_script" . '_' . md5(microtime()));
435        printf("Moved to trash: %s\n", "$admin_dir/$admin_script");
436    } else {
437        printf("File not found: %s\n", "$admin_dir/$admin_script");
438    }
439
440    if (file_exists("$admin_tpl_dir/$admin_list_template")) {
441        rename("$admin_tpl_dir/$admin_list_template", "$user_trash_folder/$admin_list_template" . '_' . md5(microtime()));
442        printf("Moved to trash: %s\n", "$admin_tpl_dir/$admin_list_template");
443    } else {
444        printf("File not found: %s\n", "$admin_tpl_dir/$admin_list_template");
445    }
446
447    if (file_exists("$admin_tpl_dir/$admin_form_template")) {
448        rename("$admin_tpl_dir/$admin_form_template", "$user_trash_folder/$admin_form_template" . '_' . md5(microtime()));
449        printf("Moved to trash: %s\n", "$admin_tpl_dir/$admin_form_template");
450    } else {
451        printf("File not found: %s\n", "$admin_tpl_dir/$admin_form_template");
452    }
453
454    if (file_exists("$public_dir/$public_script")) {
455        rename("$public_dir/$public_script", "$user_trash_folder/$public_script" . '_' . md5(microtime()));
456        printf("Moved to trash: %s\n", "$public_dir/$public_script");
457    } else {
458        printf("File not found: %s\n", "$public_dir/$public_script");
459    }
460
461    if (file_exists("$public_tpl_dir/$public_list_template")) {
462        rename("$public_tpl_dir/$public_list_template", "$user_trash_folder/$public_list_template" . '_' . md5(microtime()));
463        printf("Moved to trash: %s\n", "$public_tpl_dir/$public_list_template");
464    } else {
465        printf("File not found: %s\n", "$public_tpl_dir/$public_list_template");
466    }
467
468    if (file_exists("$public_tpl_dir/$public_detail_template")) {
469        rename("$public_tpl_dir/$public_detail_template", "$user_trash_folder/$public_detail_template" . '_' . md5(microtime()));
470        printf("Moved to trash: %s\n", "$public_tpl_dir/$public_detail_template");
471    } else {
472        printf("File not found: %s\n", "$public_tpl_dir/$public_detail_template");
473    }
474   
475    echo "End file cleanup\n";
476}
477
478?>
Note: See TracBrowser for help on using the repository browser.