Dotclear

source: plugins/pages/_public.php @ 3874:ab8368569446

Revision 3874:ab8368569446, 11.3 KB checked in by franck <carnet.franck.paul@…>, 7 years ago (diff)

short notation for array (array() → [])

Line 
1<?php
2/**
3 * @brief pages, a plugin for Dotclear 2
4 *
5 * @package Dotclear
6 * @subpackage Plugins
7 *
8 * @copyright Olivier Meunier & Association Dotclear
9 * @copyright GPL-2.0-only
10 */
11
12if (!defined('DC_RC_PATH')) {return;}
13
14$core->addBehavior('coreBlogBeforeGetPosts', ['publicPages', 'coreBlogBeforeGetPosts']);
15
16# Localized string we find in template
17__('Published on');
18__('This page\'s comments feed');
19
20require dirname(__FILE__) . '/_widgets.php';
21
22class publicPages
23{
24    public static function coreBlogBeforeGetPosts($params)
25    {
26        global $core;
27
28        if ($core->url->type == 'search') {
29            // Add page post type for searching
30            if (isset($params['post_type'])) {
31                if (!is_array($params['post_type'])) {
32                    // Convert it in array
33                    $params['post_type'] = [$params['post_type']];
34                }
35                if (!in_array('page', $params['post_type'])) {
36                    // Add page post type
37                    $params['post_type'][] = 'page';
38                }
39            } else {
40                // Dont miss default post type (aka post)
41                $params['post_type'] = ['post', 'page'];
42            }
43        }
44    }
45}
46
47class urlPages extends dcUrlHandlers
48{
49    public static function pages($args)
50    {
51        if ($args == '') {
52            # No page was specified.
53            self::p404();
54        } else {
55            $_ctx = &$GLOBALS['_ctx'];
56            $core = &$GLOBALS['core'];
57
58            $core->blog->withoutPassword(false);
59
60            $params = new ArrayObject([
61                'post_type' => 'page',
62                'post_url'  => $args]);
63
64            $core->callBehavior('publicPagesBeforeGetPosts', $params, $args);
65
66            $_ctx->posts = $core->blog->getPosts($params);
67
68            $_ctx->comment_preview               = new ArrayObject();
69            $_ctx->comment_preview['content']    = '';
70            $_ctx->comment_preview['rawcontent'] = '';
71            $_ctx->comment_preview['name']       = '';
72            $_ctx->comment_preview['mail']       = '';
73            $_ctx->comment_preview['site']       = '';
74            $_ctx->comment_preview['preview']    = false;
75            $_ctx->comment_preview['remember']   = false;
76
77            $core->blog->withoutPassword(true);
78
79            if ($_ctx->posts->isEmpty()) {
80                # The specified page does not exist.
81                self::p404();
82            } else {
83                $post_id       = $_ctx->posts->post_id;
84                $post_password = $_ctx->posts->post_password;
85
86                # Password protected entry
87                if ($post_password != '' && !$_ctx->preview) {
88                    # Get passwords cookie
89                    if (isset($_COOKIE['dc_passwd'])) {
90                        $pwd_cookie = json_decode($_COOKIE['dc_passwd']);
91                        if ($pwd_cookie === null) {
92                            $pwd_cookie = [];
93                        } else {
94                            $pwd_cookie = (array) $pwd_cookie;
95                        }
96                    } else {
97                        $pwd_cookie = [];
98                    }
99
100                    # Check for match
101                    # Note: We must prefix post_id key with '#'' in pwd_cookie array in order to avoid integer conversion
102                    # because MyArray["12345"] is treated as MyArray[12345]
103                    if ((!empty($_POST['password']) && $_POST['password'] == $post_password)
104                        || (isset($pwd_cookie['#' . $post_id]) && $pwd_cookie['#' . $post_id] == $post_password)) {
105                        $pwd_cookie['#' . $post_id] = $post_password;
106                        setcookie('dc_passwd', json_encode($pwd_cookie), 0, '/');
107                    } else {
108                        self::serveDocument('password-form.html', 'text/html', false);
109                        return;
110                    }
111                }
112
113                $post_comment =
114                isset($_POST['c_name']) && isset($_POST['c_mail']) &&
115                isset($_POST['c_site']) && isset($_POST['c_content']) &&
116                $_ctx->posts->commentsActive();
117
118                # Posting a comment
119                if ($post_comment) {
120                    # Spam trap
121                    if (!empty($_POST['f_mail'])) {
122                        http::head(412, 'Precondition Failed');
123                        header('Content-Type: text/plain');
124                        echo "So Long, and Thanks For All the Fish";
125                        # Exits immediately the application to preserve the server.
126                        exit;
127                    }
128
129                    $name    = $_POST['c_name'];
130                    $mail    = $_POST['c_mail'];
131                    $site    = $_POST['c_site'];
132                    $content = $_POST['c_content'];
133                    $preview = !empty($_POST['preview']);
134
135                    if ($content != '') {
136                        # --BEHAVIOR-- publicBeforeCommentTransform
137                        $buffer = $core->callBehavior('publicBeforeCommentTransform', $content);
138                        if ($buffer != '') {
139                            $content = $buffer;
140                        } else {
141                            if ($core->blog->settings->system->wiki_comments) {
142                                $core->initWikiComment();
143                            } else {
144                                $core->initWikiSimpleComment();
145                            }
146                            $content = $core->wikiTransform($content);
147                        }
148                        $content = $core->HTMLfilter($content);
149                    }
150
151                    $_ctx->comment_preview['content']    = $content;
152                    $_ctx->comment_preview['rawcontent'] = $_POST['c_content'];
153                    $_ctx->comment_preview['name']       = $name;
154                    $_ctx->comment_preview['mail']       = $mail;
155                    $_ctx->comment_preview['site']       = $site;
156
157                    if ($preview) {
158                        # --BEHAVIOR-- publicBeforeCommentPreview
159                        $core->callBehavior('publicBeforeCommentPreview', $_ctx->comment_preview);
160
161                        $_ctx->comment_preview['preview'] = true;
162                    } else {
163                        # Post the comment
164                        $cur                  = $core->con->openCursor($core->prefix . 'comment');
165                        $cur->comment_author  = $name;
166                        $cur->comment_site    = html::clean($site);
167                        $cur->comment_email   = html::clean($mail);
168                        $cur->comment_content = $content;
169                        $cur->post_id         = $_ctx->posts->post_id;
170                        $cur->comment_status  = $core->blog->settings->system->comments_pub ? 1 : -1;
171                        $cur->comment_ip      = http::realIP();
172
173                        $redir = $_ctx->posts->getURL();
174                        $redir .= $core->blog->settings->system->url_scan == 'query_string' ? '&' : '?';
175
176                        try
177                        {
178                            if (!text::isEmail($cur->comment_email)) {
179                                throw new Exception(__('You must provide a valid email address.'));
180                            }
181
182                            # --BEHAVIOR-- publicBeforeCommentCreate
183                            $core->callBehavior('publicBeforeCommentCreate', $cur);
184                            if ($cur->post_id) {
185                                $comment_id = $core->blog->addComment($cur);
186
187                                # --BEHAVIOR-- publicAfterCommentCreate
188                                $core->callBehavior('publicAfterCommentCreate', $cur, $comment_id);
189                            }
190
191                            if ($cur->comment_status == 1) {
192                                $redir_arg = 'pub=1';
193                            } else {
194                                $redir_arg = 'pub=0';
195                            }
196
197                            header('Location: ' . $redir . $redir_arg);
198                        } catch (Exception $e) {
199                            $_ctx->form_error = $e->getMessage();
200                            $_ctx->form_error;
201                        }
202                    }
203                }
204
205                # The entry
206                if ($_ctx->posts->trackbacksActive()) {
207                    header('X-Pingback: ' . $core->blog->url . $core->url->getURLFor("xmlrpc", $core->blog->id));
208                }
209
210                $tplset = $core->themes->moduleInfo($core->blog->settings->system->theme, 'tplset');
211                if (!empty($tplset) && is_dir(dirname(__FILE__) . '/default-templates/' . $tplset)) {
212                    $core->tpl->setPath($core->tpl->getPath(), dirname(__FILE__) . '/default-templates/' . $tplset);
213                } else {
214                    $core->tpl->setPath($core->tpl->getPath(), dirname(__FILE__) . '/default-templates/' . DC_DEFAULT_TPLSET);
215                }
216                self::serveDocument('page.html');
217            }
218        }
219    }
220
221    public static function pagespreview($args)
222    {
223        $core = $GLOBALS['core'];
224        $_ctx = $GLOBALS['_ctx'];
225
226        if (!preg_match('#^(.+?)/([0-9a-z]{40})/(.+?)$#', $args, $m)) {
227            # The specified Preview URL is malformed.
228            self::p404();
229        } else {
230            $user_id  = $m[1];
231            $user_key = $m[2];
232            $post_url = $m[3];
233            if (!$core->auth->checkUser($user_id, null, $user_key)) {
234                # The user has no access to the entry.
235                self::p404();
236            } else {
237                $_ctx->preview = true;
238                if (defined("DC_ADMIN_URL")) {
239                    $_ctx->xframeoption = DC_ADMIN_URL;
240                }
241
242                self::pages($post_url);
243            }
244        }
245    }
246}
247
248class tplPages
249{
250    # Widget function
251    public static function pagesWidget($w)
252    {
253        global $core, $_ctx;
254
255        if ($w->offline) {
256            return;
257        }
258
259        if (($w->homeonly == 1 && $core->url->type != 'default') ||
260            ($w->homeonly == 2 && $core->url->type == 'default')) {
261            return;
262        }
263
264        $params['post_type']     = 'page';
265        $params['limit']         = abs((integer) $w->limit);
266        $params['no_content']    = true;
267        $params['post_selected'] = false;
268
269        $sort = $w->sortby;
270        if (!in_array($sort, ['post_title', 'post_position', 'post_dt'])) {
271            $sort = 'post_title';
272        }
273
274        $order = $w->orderby;
275        if ($order != 'asc') {
276            $order = 'desc';
277        }
278        $params['order'] = $sort . ' ' . $order;
279
280        $rs = $core->blog->getPosts($params);
281
282        if ($rs->isEmpty()) {
283            return;
284        }
285
286        $res = ($w->title ? $w->renderTitle(html::escapeHTML($w->title)) : '') . '<ul>';
287
288        while ($rs->fetch()) {
289            $class = '';
290            if (($core->url->type == 'pages' && $_ctx->posts instanceof record && $_ctx->posts->post_id == $rs->post_id)) {
291                $class = ' class="page-current"';
292            }
293            $res .= '<li' . $class . '><a href="' . $rs->getURL() . '">' .
294            html::escapeHTML($rs->post_title) . '</a></li>';
295        }
296
297        $res .= '</ul>';
298
299        return $w->renderDiv($w->content_only, 'pages ' . $w->class, '', $res);
300    }
301}
Note: See TracBrowser for help on using the repository browser.

Sites map