1 <?php
2 
3 /**
4  * DokuWiki Plugin randomtable (Action Component)
5  *
6  * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
7  * @author  Oscar Merida <oscar@oscarm.org>
8  */
9 
10 class action_plugin_randomtables_ajax extends \dokuwiki\Extension\ActionPlugin
11 {
12 	public function register(Doku_Event_Handler $controller)
13 	{
14 		$controller->register_hook('randomtables_save', 'AFTER', $this, 'save');
15 		$controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this,'ajax_call');
16 	}
17 
18 	public function save(Doku_Event $event, $param): void
19 	{
20 		try {
21 			$helper = $this->loadHelper('randomtables_helper');
22 			$db = $helper->getDB();
23 		} catch (Exception $e) {
24 			msg($e->getMessage(), -1);
25 			return;
26 		}
27 
28 		$data = $event->data;
29 		$id = $data['id'];
30 		if (!$id) {
31 			return;
32 		}
33 
34 		$json = [];
35 		foreach ($data['lines'] as $l) {
36 			$json[] = ['min' => $l[0], 'max' => $l[1], 'result' => $l[2]];
37 		}
38 
39 		$db->storeEntry('rtables', [
40 			'id' => $id,
41 			'rows' => json_encode($json)
42 		]);
43 	}
44 
45 	function ajax_call(Doku_Event $event, $param):void
46 	{
47 		if ($event->data !== 'plugin_randomtable_roll') {
48 			return;
49 		}
50 
51 		//no other ajax call handlers needed
52 		$event->stopPropagation();
53 		$event->preventDefault();
54 
55 
56 		$tableId = isset($_POST['table_id']) ? trim($_POST['table_id']) : null;
57 		if (!$tableId || !preg_match('/^[A-Za-z0-9_]+$/', $tableId)) {
58 			return;
59 		}
60 
61 		// get the DB
62 		try {
63 			$helper = $this->loadHelper('randomtables_helper');
64 			$db = $helper->getDB();
65 		} catch (Exception $e) {
66 			msg($e->getMessage(), -1);
67 			return;
68 		}
69 
70 		$this->setupAutoloader();
71 
72 
73 		$manager = new TableRoller\Table\Manager($db);
74 		$pick = $manager->rollOn($tableId);
75 		$pick = trim(htmlentities($pick, ENT_QUOTES | ENT_SUBSTITUTE | ENT_XHTML));
76 		header('Content-Type: application/json');
77 		echo json_encode(['result' => $pick]);
78 	}
79 
80 	private function setupAutoloader()
81 	{
82 		spl_autoload_register(function ($class) {
83 
84 			// project-specific namespace prefix
85 			$prefix = 'TableRoller\\';
86 
87 			// base directory for the namespace prefix
88 			$base_dir = __DIR__ . '/../table-roller/src/';
89 
90 			// does the class use the namespace prefix?
91 			$len = strlen($prefix);
92 			if (strncmp($prefix, $class, $len) !== 0) {
93 				// no, move to the next registered autoloader
94 				return;
95 			}
96 
97 			// get the relative class name
98 			$relative_class = substr($class, $len);
99 
100 			// replace the namespace prefix with the base directory, replace namespace
101 			// separators with directory separators in the relative class name, append
102 			// with .php
103 			$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
104 
105 			// if the file exists, require it
106 			if (file_exists($file)) {
107 				require $file;
108 			}
109 		});
110 	}
111 }
112