]> git.bts.cx Git - cx.git/blob - cx/cx.php
Basic support for pagination
[cx.git] / cx / cx.php
1 <?php
2
3 function cx_require(...$segments) {
4 array_unshift($segments, CX_PATH);
5 require_once(join(DIRECTORY_SEPARATOR, $segments));
6 }
7
8 define('CX_PATH', __DIR__);
9
10 cx_require('lib', 'admin.php');
11 cx_require('lib', 'form.php');
12 cx_require('lib', 'http.php');
13 cx_require('lib', 'images.php');
14 cx_require('lib', 'posts.php');
15 cx_require('lib', 'sessions.php');
16 cx_require('lib', 'setup.php');
17 cx_require('lib', 'site.php');
18 cx_require('lib', 'system.php');
19 cx_require('lib', 'template.php');
20 cx_require('lib', 'url.php');
21 cx_require('lib', 'user_data.php');
22 cx_require('lib', 'users.php');
23
24 function cx($db_path, $data_folder_path, $public_data_folder_path) {
25 define('CX_DATABASE_FILE', $db_path);
26 define('CX_USER_DATA_PATH', $data_folder_path);
27 define('CX_PUBLIC_USER_DATA_PATH', $public_data_folder_path);
28
29 if (cx_setup_required()) {
30 cx_setup_run();
31
32 require('../setup.php');
33 $new_author = cx_users_add_user(CX_SETUP_USER, CX_SETUP_PASSWORD);
34 $new_site = cx_sites_add_site(CX_SETUP_URL, CX_SETUP_TITLE, CX_SETUP_BYLINE, CX_SETUP_COPYRIGHT);
35 cx_sites_site_add_user($new_site, $new_author, true);
36
37 exit;
38 }
39
40 $path = '/';
41
42 if (isset($_SERVER['REQUEST_URI'])) {
43 $route_details = parse_url($_SERVER['REQUEST_URI']);
44 if (isset($route_details['path'])) {
45 $path = $route_details['path'];
46 }
47 }
48
49 $script_name = $_SERVER['SCRIPT_NAME'];
50 $script_name_len = strlen($script_name);
51 if (substr_compare($path, $script_name, 0, $script_name_len) == 0) {
52 $path = substr($path, $script_name_len);
53 }
54
55 cx_route($path);
56 }
57
58 function cx_route($path) {
59 $path_components = explode('/', $path, 10);
60 $path_components = array_filter($path_components);
61 $path_components = array_values($path_components); // re-index
62
63 $template = null;
64 $template_class = 'public';
65 $template_variables = [];
66
67 if (count($path_components) == 0) {
68 $template = 'list';
69 $template_variables['page_number'] = 0;
70 } else if (count($path_components) >= 1 && $path_components[0] == 'feed') {
71 header('Content-type: application/atom+xml;');
72 $template = 'atom';
73 } else if (count($path_components) >= 1 && $path_components[0] == 'cx') {
74 if (count($path_components) >= 2 && $path_components[1] == 'login') {
75 if (cx_admin_logged_in()) {
76 cx_http_redirect(cx_url_admin('/'));
77 exit(0);
78 } else {
79 $username = cx_form_input_sanitized('id');
80 $password = cx_form_input_sanitized('password');
81
82 if ($username != null && $password != null && cx_admin_login($username, $password)) {
83 cx_http_redirect(cx_url_admin('/'));
84 exit(0);
85 }
86
87 $template_class = 'admin';
88 $template = 'login';
89 }
90 } else {
91 if (cx_admin_logged_in() == false) {
92 cx_http_redirect(cx_url_admin('/login/'));
93 exit(0);
94 } else {
95 if (count($path_components) >= 2 && $path_components[1] == 'logout') {
96 cx_admin_logout();
97 cx_http_redirect(cx_url_admin('/'));
98 exit(0);
99 } else if (count($path_components) >= 3 && $path_components[1] == 'posts' && $path_components[2] == 'add') {
100 $template_variables['post_id'] = '0';
101 $template_variables['post_title'] = '';
102 $template_variables['post_slug'] = '';
103 $template_variables['post_date'] = '';
104 $template_variables['post_data'] = '';
105 $template_variables['post_is_draft'] = true;
106
107
108 $template_class = 'admin';
109 $template = 'post';
110 } else if (count($path_components) >= 3 && $path_components[1] == 'posts' && $path_components[2] == 'edit') {
111 $post = cx_posts_find_post($_GET['id']);
112
113 $template_variables['post_id'] = $post->id;
114 $template_variables['post_title'] = $post->title;
115 $template_variables['post_slug'] = $post->slug;
116 $template_variables['post_date'] = $post->date;
117 $template_variables['post_data'] = $post->data;
118 $template_variables['post_is_draft'] = $post->is_draft;
119
120 $template_class = 'admin';
121 $template = 'post';
122 } else if (count($path_components) >= 3 && $path_components[1] == 'posts' && $path_components[2] == 'update') {
123 $title = cx_form_input_sanitized('post_title');
124 $slug = cx_form_input_sanitized('post_slug');
125 if (isset($slug) == false) $slug = null;
126 $date = cx_form_input_sanitized_date_time('post_date');
127 if (isset($date) == false) $date = null;
128 $draft = cx_form_input_sanitized('post_is_draft') == 'draft';
129 $data = cx_form_input_sanitized_allowing_html('post_data');
130
131 if (isset($_GET['id']) == false or $_GET['id'] == 0) {
132 cx_posts_add_post(1, $title, $slug, $date, $draft, $data);
133 } else {
134 $id = $_GET['id'];
135 cx_posts_update_post($id, $title, $slug, $date, $draft, $data);
136 }
137
138 cx_http_redirect(cx_url_admin('/'));
139 exit(0);
140 } else if (count($path_components) >= 3 && $path_components[1] == 'posts' && $path_components[2] == 'delete') {
141 cx_posts_delete_post($_GET['id']);
142 cx_http_redirect(cx_url_admin('/'));
143 exit(0);
144 } else if (count($path_components) >= 3 && $path_components[1] == 'images' && $path_components[2] == 'add') {
145 $template_variables['image_id'] = '0';
146 $template_variables['image_alt_text'] = '';
147
148 $template_class = 'admin';
149 $template = 'image';
150 } else if (count($path_components) >= 3 && $path_components[1] == 'images' && $path_components[2] == 'update') {
151 $alt_text = cx_form_input_sanitized('image_alt_text');
152
153 $filename = $_FILES['image_file']['tmp_name'];
154 $original_filename = $_FILES['image_file']['name'];
155
156 cx_images_add_image(1, $alt_text, $filename, $original_filename);
157
158 cx_http_redirect(cx_url_admin('/'));
159 exit(0);
160 } else {
161 $template_class = 'admin';
162 $template = 'main';
163 }
164 }
165 }
166 } else if (count($path_components) >= 2 && $path_components[0] == 'page') { // FIXME sometime, needs more flexibility...
167 $page_number = $path_components[1];
168
169 $template = 'list';
170 $template_variables['page_number'] = $page_number;
171 } else if (count($path_components) >= 3) { // FIXME sometime, needs more flexibility...
172 $year = $path_components[0];
173 $month = $path_components[1];
174 $slug = $path_components[2];
175
176 $template = 'post';
177 $template_variables['post_id'] = cx_posts_find_post_id($slug);
178 }
179
180 if ($template != null) {
181 $output = cx_template_render($template_class, $template, $template_variables);
182 echo($output);
183 } else {
184 http_response_code(404);
185 exit(0);
186 }
187 }