3 cx_require('lib', 'db.php');
4 cx_require('lib', 'setup.php');
5 cx_require('lib', 'markdown.php');
9 public $hero_image_alt;
11 public function __construct($dict) {
12 $this->hero_image = isset($dict['post_hero_image']) ? $dict['post_hero_image'] : null;
13 $this->hero_image_alt = isset($dict['post_hero_image_alt']) ? $dict['post_hero_image_alt'] : null;
29 public function __construct($dict) {
30 $this->id = $dict['post_id']; // FIXME, hide when not used?
31 $this->title = $dict['post_title'];
32 $this->slug = $dict['post_slug'];
33 $this->date = $dict['post_date'];
34 $this->is_page = $dict['post_is_page'];
35 $this->is_draft = $dict['post_is_draft'];
36 $this->nav_index = $dict['post_navigation_index'];
37 $this->data = $dict['post_data'];
38 $this->html_content = cx_markdown_generate_html($this->data);
39 $this->html_excerpt = null;
42 $segments = explode('---', $this->data, 2);
43 if (count($segments) > 1) {
44 $this->html_excerpt = cx_markdown_generate_html($segments[0]);
48 public function get_permalink_path() {
49 $permalink = '/' . $this->slug;
50 if ($this->is_page == false) {
51 $permalink = '/' . date('Y', $this->date) . '/' . date('m', $this->date) . '/' . $this->slug;
56 public function get_metadata() {
59 $doc = new DOMDocument();
60 $doc->loadHTML($this->html_content);
62 $image_tag = $doc->getElementsByTagName('img')[0];
64 if ($image_tag != null) {
65 $data['post_hero_image'] = $image_tag->getAttribute('src');
66 $data['post_hero_image_alt'] = htmlspecialchars($image_tag->getAttribute('alt'));
69 return new PostMetadata($data);
73 function cx_post_make_slug($title) {
74 $alnum_title = preg_replace('/[^A-Za-z0-9 ]?/', '', $title);
76 $slug_components = explode(' ', $alnum_title, 10);
77 $slug_components = array_filter($slug_components);
78 $slug_components = array_values($slug_components); // re-index
80 $slug = join('-', $slug_components);
81 $slug = strtolower($slug);
86 function cx_posts_add_post($site_id, $title, $slug, $date, $page, $draft, $nav_index, $data) {
87 $creation_time = $update_time = time();
90 $slug = cx_post_make_slug($title);
97 $sql = 'INSERT INTO posts (
105 post_navigation_index,
109 VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);';
110 $id = cx_db_exec($sql, $site_id, $creation_time, $update_time, $slug, $date, $page, $draft, $nav_index, $title, $data, 1);
114 function cx_posts_update_post($post_id, $title, $slug, $date, $page, $draft, $nav_index, $data) {
115 $update_time = time();
118 $slug = cx_post_make_slug($title);
122 $date = $update_time;
126 SET post_update_time = ?,
131 post_navigation_index = ?,
134 WHERE post_id == ?;';
136 cx_db_exec($sql, $update_time, $slug, $date, $page, $draft, $nav_index, $title, $data, $post_id);
139 function cx_posts_delete_post($post_id) {
140 $sql = 'DELETE FROM posts
141 WHERE post_id == ?;';
143 cx_db_exec($sql, $post_id);
146 function cx_posts_get(int $limit = 0, int $offset = 0, bool $include_drafts = false) {
153 post_navigation_index,
157 WHERE post_is_page == FALSE';
159 if ($include_drafts == false) {
160 $sql .= ' AND post_is_draft == FALSE';
163 $sql .= ' ORDER BY post_date DESC';
166 $sql .= ' LIMIT ' . $limit;
170 $sql .= ' OFFSET ' . $offset;
175 foreach (cx_db_query($sql) as $post) {
176 $p = new Post($post);
181 function cx_posts_count(bool $include_drafts = false) {
183 COUNT(post_id) AS _count
185 WHERE post_is_page == FALSE';
187 if ($include_drafts == false) {
188 $sql .= ' AND post_is_draft == FALSE';
194 foreach (cx_db_query($sql) as $count_details) {
195 return $count_details['_count'];
201 function cx_posts_find_post($post_id) {
208 post_navigation_index,
215 foreach (cx_db_query($sql, $post_id) as $post) {
216 $p = new Post($post);
223 function cx_posts_find_article_id($post_slug, bool $include_drafts = false) {
228 AND post_is_page == FALSE';
230 if ($include_drafts == false) {
231 $sql .= ' AND post_is_draft == FALSE';
238 foreach (cx_db_query($sql, $post_slug) as $post) {
239 return $post['post_id'];
246 function cx_posts_find_page_id($post_slug, bool $include_drafts = false) {
251 AND post_is_page == TRUE';
253 if ($include_drafts == false) {
254 $sql .= ' AND post_is_draft == FALSE';
261 foreach (cx_db_query($sql, $post_slug) as $post) {
262 return $post['post_id'];
268 function cx_pages_get(bool $navigation_only = true, bool $include_drafts = false) {
275 post_navigation_index,
279 WHERE post_is_page == TRUE';
281 if ($navigation_only) {
282 $sql .= ' AND post_navigation_index != ""';
285 if ($include_drafts == false) {
286 $sql .= ' AND post_is_draft == FALSE';
289 $sql .= ' ORDER BY post_navigation_index ASC, post_date DESC';
293 foreach (cx_db_query($sql) as $post) {
294 $p = new Post($post);
299 cx_setup_register(1, function() {
300 cx_db_exec('CREATE TABLE posts (
301 post_id INTEGER PRIMARY KEY,
302 post_site_id INTEGER,
303 post_creation_time INTEGER,
304 post_update_time INTEGER,
307 post_is_page BOOLEAN,
308 post_is_draft BOOLEAN,
309 post_navigation_index INTEGER,
312 post_data_version INTEGER,
314 FOREIGN KEY(post_site_id) REFERENCES sites(site_id)