source: trunk/content/plugins/users/users.php @ 1375

Revision 1375, 17.6 KB checked in by nick_ramsay, 3 years ago (diff)

[Trunk] Hotaru 1.1.3 [Run upgrade script]

Line 
1<?php
2/**
3 * name: Users
4 * description: Provides profile, settings and permission pages
5 * version: 1.7
6 * folder: users
7 * type: users
8 * class: Users
9 * requires: sb_base 0.1
10 * hooks: pagehandling_getpagename, sb_base_theme_index_top, header_include, sb_base_functions_preparelist, breadcrumbs, theme_index_main, users_edit_profile_save, user_settings_save, admin_theme_main_stats, header_meta
11 * author: Nick Ramsay
12 * authorurl: http://hotarucms.org/member.php?1-Nick
13 *
14 * PHP version 5
15 *
16 * LICENSE: Hotaru CMS is free software: you can redistribute it and/or
17 * modify it under the terms of the GNU General Public License as
18 * published by the Free Software Foundation, either version 3 of
19 * the License, or (at your option) any later version.
20 *
21 * Hotaru CMS is distributed in the hope that it will be useful, but WITHOUT
22 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
23 * FITNESS FOR A PARTICULAR PURPOSE.
24 *
25 * You should have received a copy of the GNU General Public License along
26 * with Hotaru CMS. If not, see http://www.gnu.org/licenses/.
27 *
28 * @category  Content Management System
29 * @package   HotaruCMS
30 * @author    Nick Ramsay <admin@hotarucms.org>
31 * @copyright Copyright (c) 2009, Hotaru CMS
32 * @license   http://www.gnu.org/copyleft/gpl.html GNU General Public License
33 * @link      http://www.hotarucms.org/
34 */
35
36class Users
37{
38    /**
39     * Check if we're looking at a user page
40     */
41    public function pagehandling_getpagename($h, $query_vars)
42    {
43        // we already know that there's no "page" parameter, so...
44        if ($h->cage->get->keyExists('user')) {
45            return 'profile'; // sets $h->pageName to "profile"
46        }
47    }
48   
49   
50    /**
51     * Determine what page we're looking at
52     */
53    public function sb_base_theme_index_top($h)
54    {
55        $user = $h->cage->get->testUsername('user');
56        if ($user) {
57            $h->subPage = 'user';
58        }
59       
60        switch ($h->pageName)
61        {
62            case 'profile':
63                $h->pageTitle = $h->lang["users_profile"] . '[delimiter]' . $user;
64                $h->pageType = 'user';
65                break;
66            case 'account':
67                $h->pageTitle = $h->lang["users_account"] . '[delimiter]' . $user;
68                $h->pageType = 'user';
69                break;
70            case 'edit-profile':
71                $h->pageTitle = $h->lang["users_profile_edit"] . '[delimiter]' . $user;
72                $h->pageType = 'user';
73                break;
74            case 'user-settings':
75                $h->pageTitle = $h->lang["users_settings"] . '[delimiter]' . $user;
76                $h->pageType = 'user';
77                break;
78            case 'permissions':
79                if (!$user) { // when the permissions form is submitted
80                    $userid = $h->cage->post->testInt('userid');
81                    $user = $h->getUserNameFromId($userid);
82                }
83                $h->pageTitle = $h->lang["users_permissions"] . '[delimiter]' . $user;
84                $h->pageType = 'user';
85                break;
86            case 'index':
87                if ($h->subPage == 'user') { $h->pageTitle = $h->lang["sb_base_top"] . '[delimiter]' . $user . '[delimiter]' . $h->pageTitle = $h->lang["sb_base_site_name"]; }
88                break;
89            case 'latest':
90                if ($h->subPage == 'user') { $h->pageTitle = $h->lang["sb_base_latest"] . '[delimiter]' . $user; }
91                break;
92            case 'upcoming':
93                if ($h->subPage == 'user') { $h->pageTitle = $h->lang["sb_base_upcoming"] . '[delimiter]' . $user; }
94                break;
95            case 'all':
96                if ($h->subPage == 'user') { $h->pageTitle = $h->lang["sb_base_all"] . '[delimiter]' . $user; }
97                break;
98            case 'sort':
99                if ($h->subPage == 'user') {
100                    $sort = $h->cage->get->testPage('sort');
101                    $sort_lang = 'sb_base_' . str_replace('-', '_', $sort);
102                    $h->pageTitle = $h->lang[$sort_lang] . '[delimiter]' . $user;
103                }
104                break;
105        }
106       
107        // read this user into the global hotaru object for later use on this page
108        if ($h->pageType != 'user') { return false; }
109       
110        $h->vars['user'] = new UserAuth();
111        if ($user) {
112            $result = $h->vars['user']->getUserBasic($h, 0, $user);
113        } else {
114            // when the account page has been submitted (get id in case username has changed)
115            $userid = $h->cage->post->testInt('userid');
116            if ($userid) {
117                $result = $h->vars['user']->getUserBasic($h, $userid);
118            } else {
119                $result = $h->vars['user']->getUserBasic($h, $h->currentUser->id); // default to self
120            }
121        }
122       
123        if (isset($result)) {
124            $h->vars['profile'] = $h->vars['user']->getProfileSettingsData($h, 'user_profile');
125            $h->vars['settings'] = $h->vars['user']->getProfileSettingsData($h, 'user_settings');
126        } else {
127            $h->pageTitle = $h->lang["main_theme_page_not_found"];
128            $h->pageType = '';
129            $h->vars['user'] = false;
130        }
131       
132        /* check for account updates */
133        if ($h->pageName == 'account') {
134            $h->vars['checks'] = $h->vars['user']->updateAccount($h);
135            $h->vars['user']->name = $h->vars['checks']['username_check'];
136            $h->pageTitle = $h->lang["users_account"] . '[delimiter]' . $h->vars['user']->name;
137            $h->pageType = 'user';
138        }
139    }
140   
141   
142    /**
143     * Match meta tags when browsing results for individual users
144     */
145    public function header_meta($h)
146    {
147        if ($h->pageName == 'profile') {
148            if (isset($h->vars['profile']['bio']) && ($h->vars['profile']['bio'] != $h->lang['users_profile_default_bio'])) {
149                echo '<meta name="description" content="' . $h->vars['profile']['bio'] . '" />' . "\n";
150            } else {
151                echo '<meta name="description" content="' . $h->lang['users_default_meta_description_before'] . $h->vars['user']->name . $h->lang['users_default_meta_description_after'] . '" />' . "\n";  // default profile meta description (see language file)
152            }
153           
154            echo '<meta name="keywords" content="' . $h->vars['user']->name . $h->lang['users_profile_meta_keywords_more'] . '" />' . "\n";  // default profile meta keywords (see language file)
155           
156            return true;
157        }
158       
159       
160        if ($h->subPage == 'user' && ($h->pageName != 'profile'))
161        {
162            $user = $h->cage->get->testUsername('user');
163            if ($user) {
164                $first_word = $h->pageName;
165                if ($first_word == 'sort') { $first_word = $h->cage->get->testPage('sort'); }
166                if ($first_word == 'index') { $first_word = $h->lang['users_meta_description_popular']; }
167                $first_word = ucfirst(strtolower(make_name($first_word, '-')));
168                echo '<meta name="description" content="' . $h->lang['users_meta_description_results_before'] . $first_word . $h->lang['users_meta_description_results_middle'] . $user . $h->lang['users_meta_description_results_after'] . '" />' . "\n";
169                echo '<meta name="keywords" content="' . $user . $h->lang['users_profile_meta_keywords_more'] . '" />' . "\n";  // default profile meta keywords (see language file)
170                return true;
171            }
172        }
173    }
174   
175   
176   
177    /**
178     * Filter posts to this user
179     */
180    public function sb_base_functions_preparelist($h)
181    {
182        $username = $h->cage->get->testUsername('user');
183        if ($username) {
184            $h->vars['filter']['post_author = %d'] = $h->getUserIdFromName($username);
185        }
186    }
187   
188   
189    /**
190     * Replace the default breadcrumbs in specific circumstances
191     */
192    public function breadcrumbs($h)
193    {
194        if (isset($h->vars['user'])) {
195            $userlink = "<a href='" . $h->url(array('user'=>$h->vars['user']->name)) . "'>";
196            $userlink .= $h->vars['user']->name . "</a>";
197        }
198       
199        // This is for user pages, e.g. account, edit profile, etc:
200        switch ($h->pageName)
201        {
202            case 'profile':
203                $crumbs = $userlink . ' &raquo; ' . $h->lang["users_profile"];
204                return $crumbs;
205                break;
206            case 'account':
207                $crumbs = $userlink . ' &raquo; ' . $h->lang["users_account"];
208                return $crumbs;
209                break;
210            case 'edit-profile':
211                $crumbs = $userlink . ' &raquo; ' . $h->lang["users_profile_edit"];
212                return $crumbs;
213                break;
214            case 'user-settings':
215                $crumbs = $userlink . ' &raquo; ' . $h->lang["users_settings"];
216                return $crumbs;
217                break;
218            case 'permissions':
219                $crumbs = $userlink . ' &raquo; ' . $h->lang["users_permissions"];
220                return $crumbs;
221                break;
222        }
223       
224        // This is used for filtered story pages, e.g. popular, latest, etc:
225        if ($h->subPage == 'user' && $h->pageType == 'list') {
226            switch ($h->pageName) {
227                case 'index':
228                    $title = $h->lang["sb_base_top"];
229                    break;
230                case 'latest':
231                    $title = $h->lang["sb_base_latest"];
232                    break;
233                case 'upcoming':
234                    $title = $h->lang["sb_base_upcoming"];
235                    break;
236                case 'all':
237                    $title = $h->lang["sb_base_all"];
238                    break;
239                case 'sort':
240                    $sort = $h->cage->get->testPage('sort');
241                    $sort_lang = 'sb_base_' . str_replace('-', '_', $sort);
242                    $title = $h->lang[$sort_lang];
243                    break;
244                default:
245                    $title = $h->lang['users_posts'];
246                    break;
247            }
248
249            $user = $h->cage->get->testUsername('user');
250            $crumbs = "<a href='" . $h->url(array('user'=>$user)) . "'>\n";
251            $crumbs .= $user . "</a>\n ";
252            $crumbs .= " &raquo; " . $title;
253           
254            return $crumbs . $h->rssBreadcrumbsLink('', array('user'=>$user));
255        }
256    }
257   
258   
259    /**
260     * Display the right page
261     */
262    public function theme_index_main($h)
263    {
264        if ($h->pageType != 'user') { return false; }
265       
266        // determine permissions
267        $admin = false; $own = false; $denied = false;
268        if ($h->currentUser->getPermission('can_access_admin') == 'yes') { $admin = true; }
269        if ($h->currentUser->id == $h->vars['user']->id) { $own = true; }
270       
271        $h->displayTemplate('users_navigation');
272       
273        switch($h->pageName) {
274            case 'profile':
275                $h->displayTemplate('users_profile');
276                return true;
277                break;
278            case 'account':
279                if (!$admin && !$own) { $denied = true; break; }
280                $h->displayTemplate('users_account');
281                return true;
282                break;
283            case 'edit-profile':
284                if (!$admin && !$own) { $denied = true; break; }
285                $h->displayTemplate('users_edit_profile');
286                return true;
287                break;
288            case 'user-settings':
289                if (!$admin && !$own) { $denied = true; break; }
290                $h->displayTemplate('users_settings');
291                return true;
292                break;
293            case 'permissions':
294                if (!$admin) { $denied = true; break; }
295                $this->editPermissions($h);
296                $h->displayTemplate('users_permissions');
297                return true;
298                break;
299        }
300       
301        if ($denied) {
302            $h->messages[$h->lang["main_access_denied"]] = 'red';
303            $h->showMessages();
304        }
305    }
306   
307   
308    /**
309     * Save profile data (from hook in edit_profile.php)
310     */
311    public function users_edit_profile_save($h, $vars)
312    {
313        $username = $vars[0];
314        $profile = $vars[1];
315       
316        // check CSRF key
317        if (!$h->csrf()) {
318            $h->message = $h->lang['error_csrf'];
319            $h->messageType = "red";
320            return false;
321        }
322       
323        $h->vars['user']->saveProfileSettingsData($h, $profile, 'user_profile', $h->vars['user']->id);
324       
325        /*  Problem! The previous profile data is cached and we don't want to disable caching for profiles,
326            nor do we want to clear the entire db_cache, so instead, we'll delete the cache file that holds
327            the previous profile for this user. */
328        $sql = "SELECT usermeta_value FROM " . DB_PREFIX . "usermeta WHERE usermeta_userid = %d AND usermeta_key = %s";
329        $query = $h->db->prepare($sql, $h->vars['user']->id, 'user_profile');
330        $cache_file = CACHE . 'db_cache/' . md5($query);
331        if (file_exists($cache_file)) {
332            unlink($cache_file); // delete cache file.
333        }
334       
335        $h->message = $h->lang["users_profile_edit_saved"] . "<br />\n";
336        $h->message .= "<a href='" . $h->url(array('user'=>$h->vars['user']->name)) . "'>";
337        $h->message .= $h->lang["users_profile_edit_view_profile"] . "</a>\n";
338        $h->messageType = "green";
339    }
340   
341   
342    /**
343     * Save settings data (from hook in user_settings.php)
344     */
345    public function user_settings_save($h, $vars)
346    {
347        $username = $vars[0];
348        $settings = $vars[1];
349       
350        // check CSRF key
351        if (!$h->csrf()) {
352            $h->message = $h->lang['error_csrf'];
353            $h->messageType = "red";
354            return false;
355        }
356       
357        $h->vars['user']->saveProfileSettingsData($h, $settings, 'user_settings', $h->vars['user']->id);
358       
359        /*  Problem! The previous settings data is cached and we don't want to disable caching for settings,
360            nor do we want to clear the entire db_cache, so instead, we'll delete the cache file that holds
361            the previous settings for this user. */
362        $sql = "SELECT usermeta_value FROM " . DB_PREFIX . "usermeta WHERE usermeta_userid = %d AND usermeta_key = %s";
363        $query = $h->db->prepare($sql, $h->vars['user']->id, 'user_settings');
364        $cache_file = CACHE . 'db_cache/' . md5($query);
365        if (file_exists($cache_file)) {
366            unlink($cache_file); // delete cache file.
367        }
368       
369        $h->message = $h->lang["users_settings_saved"] . "<br />\n";
370        $h->messageType = "green";
371    }
372   
373   
374    /**
375     * Enable admins to edit a user
376     */
377    public function editPermissions($h)
378    {
379        // prevent non-admin user viewing permissions of admin user
380        if (($h->vars['user']->role) == 'admin' && ($h->currentUser->role != 'admin')) {
381            $h->messages[$h->lang["users_account_admin_admin"]] = 'red';
382            $h->showMessages();
383            return true;
384        }
385       
386        $perm_options = $h->getDefaultPermissions('', 'site', true);
387        $perms = $h->vars['user']->getAllPermissions();
388       
389        // If the form has been submitted...
390        if ($h->cage->post->keyExists('permissions')) {
391       
392            // check CSRF key
393            if (!$h->csrf()) {
394                $h->messages[$h->lang['error_csrf']] = 'red';
395                return false;
396            }
397       
398           foreach ($perm_options as $key => $options) {
399                if ($value = $h->cage->post->testAlnumLines($key)) {
400                    $h->vars['user']->setPermission($key, $value);
401                }
402            }
403
404            $h->vars['user']->updatePermissions($h);   // physically store changes in the database
405           
406            // get the newly updated latest permissions:
407            $perm_options = $h->getDefaultPermissions('', 'site', true);
408            $perms = $h->vars['user']->getAllPermissions();
409            $h->messages[$h->lang['users_permissions_updated']] = 'green';
410        }
411       
412        $h->vars['perm_options'] = '';
413        foreach ($perm_options as $key => $options) {
414            $h->vars['perm_options'] .= "<tr><td>" . make_name($key) . ": </td>\n";
415            foreach($options as $value) {
416                if (isset($perms[$key]) && ($perms[$key] == $value)) { $checked = 'checked'; } else { $checked = ''; }
417                if ($key == 'can_access_admin' && $h->vars['user']->role == 'admin') { $disabled = 'disabled'; } else { $disabled = ''; }
418                $h->vars['perm_options'] .= "<td><input type='radio' name='" . $key . "' value='" . $value . "' " . $checked . " " . $disabled . "> " . $value . " &nbsp;</td>\n";
419            }
420            $h->vars['perm_options'] .= "</tr>";
421        }
422    }
423   
424
425    /**
426     * Show stats on Admin home page
427     */
428    public function admin_theme_main_stats($h, $vars)
429    {
430        require_once(LIBS . 'UserInfo.php');
431        $ui = new UserInfo();
432       
433        echo "<li>&nbsp;</li>";
434
435        foreach ($vars as $stat_type) {
436            $users = $ui->stats($h, $stat_type);
437            if (!$users) { $users = 0; }
438            $lang_name = 'users_admin_stats_' . $stat_type;
439            echo "<li>" . $h->lang[$lang_name] . ": " . $users . "</li>";
440        }
441    }
442}
443
444?>
Note: See TracBrowser for help on using the repository browser.