Дима Яковлев

Как получить полное имя и адрес почты автора страницы в GetSimple CMS

Автором страницы в GetSimple CMS считается пользователь, создавший или сохранивший страницу последним. Именем автора страницы является логин пользователя, который автоматически сохраняется в XML-документе страницы в поле author. Стандартная функция, возвращающая значение поля author для текущей страницы, отсутствует, поэтому для получения автора страницы в шаблоне оформления, следует обратиться к глобальной переменной $data_index->author. При этом в GetSimple CMS предусмотрена возможность задания расширенного набора данных для пользователей - стандартно в GetSimple CMS 3.3.16 можно задать полное имя и адрес электронной почты. Имея доступ к этим данным, можно не ограничиваться только логином, а выводить расширенную информацию об авторе страницы в шаблоне оформления. Для этого потребуется добавить собственные функции в тему оформления.

Предлагаю рассмотреть примеры реализации таких функций: функция get_page_author_name() возвращает полное имя автора текущей страницы, функция get_page_author_email() возвращает адрес его электронной почты.

/**
 * Get Page Author Name
 *
 * @uses $data_index
 * @uses GSUSERSPATH
 * @uses strip_decode
 * @author Dmitry Yakovlev
 *
 * @param bool $echo    Optional, default is true. False will 'return' value
 * @return string Echos or returns page author name based on param $echo
 */
function get_page_author_name($echo = true) {
    global $data_index;
    $author = strip_decode($data_index->author);
    $usrFile = GSUSERSPATH.$author.'.xml';
    if (file_exists($usrFile)) {
        $data = getXML($usrFile);
        $name = stripslashes($data->NAME);
    } else {
        $name = '';
    }
    if ($echo) {
        echo $name;
    } else {
        return $name;
    }
}

/**
 * Get Page Author Email
 *
 * @uses $data_index
 * @uses GSUSERSPATH
 * @uses strip_decode
 * @author Dmitry Yakovlev
 *
 * @param bool $echo        Optional, default is true. False will 'return' value
 * @param bool $obfuscate   Optional, default is false. True will obfuscate value
 * @return string Echos obfuscated or returns clean page author email based on param $echo
 */
function get_page_author_email($echo = true, $obfuscate = false) {
    global $data_index;
    $author = strip_decode($data_index->author);
    $usrFile = GSUSERSPATH.$author.'.xml';
    if (file_exists($usrFile)) {
        $data = getXML($usrFile);
        $email = stripslashes($data->EMAIL);
    } else {
        $email = '';
    }
    if ($email && $obfuscate) {
        $obfuscated = '';
        foreach(str_split($email) as $letter) {
            switch(rand(1, 3)) {
                case 1:
                    $obfuscated .= $letter;
                    break;
                case 2:
                    $obfuscated .= '&#' . ord($letter) . ';';
                    break;
                case 3:
                    $obfuscated .= '&#x' . dechex(ord($letter)) . ';';
                    break;
            }
        }
        $email = $obfuscated;
    }
    if ($echo) {
        echo $email;
    } else {
        return $email;
    }
}

Минус реализации приведённых функций - обращение к файлу XML-документа пользователя GetSimple CMS, соответствующего автору страницы, выполняется при вызове каждой из них. Этот момент можно оптимизировать, использовав глобальную переменную темы оформления, сохранив в неё XML-объект при первом обращении к XML-документу. Кроме того, так как существует возможность добавлять при помощи плагинов собственные поля для расширения описания пользователя, удобно использовать функцию, возвращающую значение поля по его имени.

/**
 * Get Page Author Profile Field
 *
 * @uses $data_index
 * @uses $data_author
 * @uses GSUSERSPATH
 * @uses strip_decode
 * @author Dmitry Yakovlev
 *
 * @param string $field Required. Name of author profile field
 * @param bool $echo    Optional, default is true. False will 'return' value
 * @return string Echos or returns author profile field value on param $echo
 */
function get_page_author_field($field, $echo = true) {
    global $data_index;
    global $data_author;
    $value = '';
    if (!$data_author) {
        $author = strip_decode($data_index->author);
        $usrFile = GSUSERSPATH.$author.'.xml';
        if (file_exists($usrFile)) {
            $data_author = getXML($usrFile);
            unset($data_author->PWD);
        }
    }
    if ($data_author) {
        $value = stripslashes($data_author->$field);
    }
    if ($echo) {
        echo $value;
    } else {
        return $value;
    }
}

Теперь функцию для получения адреса электронной почты автора можно переписать так:

/**
 * Get Page Author Email
 *
 * @uses get_page_author_field
 * @author Dmitry Yakovlev
 *
 * @param bool $echo        Optional, default is true. False will 'return' value
 * @param bool $obfuscate   Optional, default is false. True will obfuscate value
 * @return string Echos obfuscated or returns clean page author email based on param $echo
 */
function get_page_author_email($echo = true, $obfuscate = false) {
    $email = get_page_author_field('EMAIL', false);
    if ($email && $obfuscate) {
        $obfuscated = '';
        foreach(str_split($email) as $letter) {
            switch(rand(1, 3)) {
                case 1:
                    $obfuscated .= $letter;
                    break;
                case 2:
                    $obfuscated .= '&#' . ord($letter) . ';';
                    break;
                case 3:
                    $obfuscated .= '&#x' . dechex(ord($letter)) . ';';
                    break;
            }
        }
        $email = $obfuscated;
    }
    if ($echo) {
        echo $email;
    } else {
        return $email;
    }
}

Используя рассмотренные функции, вывести расширенную информацию о странице можно так:

<p>Page was updated: <?php get_page_date('Y-m-d'); ?> by <a href="mailto:<?php get_page_author_email(true, true); ?>"><?php get_page_author_field('NAME', true); ?></a></p>