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;
27 public function __construct($dict) {
28 $this->id = $dict['post_id']; // FIXME, hide when not used?
29 $this->title = $dict['post_title'];
30 $this->slug = $dict['post_slug'];
31 $this->date = $dict['post_date'];
32 $this->is_draft = $dict['post_is_draft'];
33 $this->data = $dict['post_data'];
34 $this->html_content = cx_markdown_generate_html($this->data);
35 $this->html_excerpt = null;
38 $segments = explode('---', $this->data, 2);
39 if (count($segments) > 1) {
40 $this->html_excerpt = cx_markdown_generate_html($segments[0]);
44 public function get_metadata() {
47 $doc = new DOMDocument();
48 $doc->loadHTML($this->html_content);
50 $image_tag = $doc->getElementsByTagName('img')[0];
52 if ($image_tag != null) {
53 $data['post_hero_image'] = $image_tag->getAttribute('src');
54 $data['post_hero_image_alt'] = htmlspecialchars($image_tag->getAttribute('alt'));
57 return new PostMetadata($data);
61 function cx_post_make_slug($title) {
62 $alnum_title = preg_replace('/[^A-Za-z0-9 ]?/', '', $title);
64 $slug_components = explode(' ', $alnum_title, 10);
65 $slug_components = array_filter($slug_components);
66 $slug_components = array_values($slug_components); // re-index
68 $slug = join('-', $slug_components);
69 $slug = strtolower($slug);
74 function cx_posts_add_post($site_id, $title, $slug, $date, $page, $draft, $data) {
75 $creation_time = $update_time = time();
78 $slug = cx_post_make_slug($title);
85 $sql = 'INSERT INTO posts (
96 VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);';
97 cx_db_exec($sql, $site_id, $creation_time, $update_time, $slug, $date, $page, $draft, $title, $data, 1);
100 function cx_posts_update_post($post_id, $title, $slug, $date, $page, $draft, $data) {
101 $update_time = time();
104 $slug = cx_post_make_slug($title);
108 $date = $update_time;
112 SET post_update_time = ?,
119 WHERE post_id == ?;';
121 cx_db_exec($sql, $update_time, $slug, $date, $page, $draft, $title, $data, $post_id);
124 function cx_posts_delete_post($post_id) {
125 $sql = 'DELETE FROM posts
126 WHERE post_id == ?;';
128 cx_db_exec($sql, $post_id);
131 function cx_posts_get(int $limit = 0, int $offset = 0, bool $include_drafts = false) {
140 WHERE post_is_page == FALSE';
142 if ($include_drafts == false) {
143 $sql .= ' AND post_is_draft == FALSE';
146 $sql .= ' ORDER BY post_date DESC';
149 $sql .= ' LIMIT ' . $limit;
153 $sql .= ' OFFSET ' . $offset;
158 foreach (cx_db_query($sql) as $post) {
159 $p = new Post($post);
164 function cx_posts_count(bool $include_drafts = false) {
166 COUNT(post_id) AS _count
168 WHERE post_is_page == FALSE';
170 if ($include_drafts == false) {
171 $sql .= ' AND post_is_draft == FALSE';
177 foreach (cx_db_query($sql) as $count_details) {
178 return $count_details['_count'];
184 function cx_posts_find_post($post_id) {
196 foreach (cx_db_query($sql, $post_id) as $post) {
197 $p = new Post($post);
204 function cx_posts_find_article_id($post_slug) {
209 AND post_is_page == FALSE
210 AND post_is_draft == FALSE
213 foreach (cx_db_query($sql, $post_slug) as $post) {
214 return $post['post_id'];
220 function cx_posts_find_page_id($post_slug) {
225 AND post_is_page == TRUE
226 AND post_is_draft == FALSE
229 foreach (cx_db_query($sql, $post_slug) as $post) {
230 return $post['post_id'];
236 function cx_pages_get() {
245 WHERE post_is_page == TRUE
246 AND post_is_draft == FALSE
247 ORDER BY post_creation_time DESC;';
249 foreach (cx_db_query($sql) as $post) {
250 $p = new Post($post);
255 cx_setup_register(1, function() {
256 cx_db_exec('CREATE TABLE posts (
257 post_id INTEGER PRIMARY KEY,
258 post_site_id INTEGER,
259 post_creation_time INTEGER,
260 post_update_time INTEGER,
263 post_is_page BOOLEAN,
264 post_is_draft BOOLEAN,
267 post_data_version INTEGER,
269 FOREIGN KEY(post_site_id) REFERENCES sites(site_id)