Return to Snippet

Revision: 32621
at September 30, 2010 18:59 by o0slowpaul0o


Initial Code
<?php

/**
/**
 *
 * file      : $file: class_tff.member.php,v $
 * copyright : (c) 2010, Dechesnes
 * support   : http://www.theforumframework.com
 *
 */

/**
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation; either version 2.1
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * Or visit http://www.gnu.org/copyleft/gpl.html
 *
 */

if ( !defined( 'LOAD_TFF' ) )
{

    exit ( 'Error: Unauthorized viewing attempted' );

}

/**
 * @brief The Tff_Member class represents the attributes and behaviors of a
 *        single member of the bulletin board.
 *
 * @author  Dechesnes
 */
class Tff_Member implements Tff_IObserver, Tff_IStorable
{

    /**
     * String - the Member's AOL Instant Messenger screen name.
     */
    private $_memberAim = '';

    /**
     * Integer - the Member's avatar id.
     */
    private $_memberAvatarId = 0;

    /**
     * Integer - the Member's birthday as a UNIX timestamp.
     * @since v0.1.1
     */
    private $_memberBirthday = 0;

    /**
     * String - the Member's preferred date formatting (for the PHP date
     *          function).
     */
    private $_memberDateformat = '';

    /**
     * String - the Member's email address.
     */
    private $_memberEmail = '';

    /**
     * Boolean - the Member's enabled flag.
     */
    private $_memberEnabled = false;

    /**
     * Integer - the number of the Member's failed logins.
     */
    private $_memberFailedLoginCount = 0;

    /**
     * Integer - the date of the Member's last failed login as a UNIX timestamp.
     */
    private $_memberFailedLoginDate = 0;

    /**
     * String - the Member's home page URL.
     */
    private $_memberHomepage = '';

    /**
     * String - the Member's ICQ UIN number.
     */
    private $_memberIcq = '';

    /**
     * Integer - the Member's unique id.
     */
    private $_memberId = 0;

    /**
     * String - the Member's interests.
     */
    private $_memberInterests = '';

    /**
     * String - the Member's IP address at the time of registration.
     */
    private $_memberIp = '';

    /**
     * Integer - the Member's join date as a UNIX timestamp.
     */
    private $_memberJoinDate = 0;

    /**
     * String - the Member's default display language.
     */
    private $_memberLanguage = '';

    /**
     * Integer - the Member's last visit date as a UNIX timestamp.
     */
    private $_memberLastVisit = 0;

    /**
     * String - the Member's geographic location.
     */
    private $_memberLocation = '';

    /**
     * String - the Member's login username.
     */
    private $_memberLogin = '';

    /**
     * String - the Member's MSN Messenger screen name.
     */
    private $_memberMsnm = '';

    /**
     * String - the Member's real life occupation.
     */
    private $_memberOccupation = '';

    /**
     * String - the Member's encrypted password.
     */
    private $_memberPassword = '';

    /**
     * Integer - the Member's total number of posts in the board.
     */
    private $_memberPosts = 0;

    /**
     * Integer - the Member's rank id
     */
    private $_memberRankId = 0;

    /**
     * String - the Member's screen name to display instead of the login.
     */
    private $_memberScreenname = '';

    /**
     * String - the Member's signature for posting.
     */
    private $_memberSig = '';

    /**
     * String - the Member's default board template.
     */
    private $_memberTemplate = '';

    /**
     * Integer - the Member's time zone offset from GMT (UTC).
     */
    private $_memberTimezone = 0;

    /**
     * String - the Member's title.
     */
    private $_memberTitle = '';

    /**
     * String - the Member's Yahoo! Messenger screen name.
     */
    private $_memberYim = '';

    /**
     * Tff_ObservableImpl - the Member's observer handler
     */
    private $_observable = null;

    /**
     * Boolean - the Member's option to allow incoming and outgoing instant
     *           messages.
     */
    private $_optAllowPm = false;

    /**
     * Boolean - the Member's option to always attach the signature to a Post.
     */
    private $_optAlwaysAttachSig = false;

    /**
     * Boolean - the Member's option to receive an email when a new private
     *           message arrives.
     */
    private $_optEmailPm = false;

    /**
     * Boolean - the Member's option to not show up in the board's active users
     *           list.
     */
    private $_optInvisMode = false;

    /**
     * Boolean - the Member's option to show HTML in any board post.
     */
    private $_optShowHtml = true;

    /**
     * Boolean - the Member's option to show the email address for public
     *           access
     */
    private $_optShowEmail = false;

    /**
     * Boolean - the Member's option to show emoticons in any board post.
     */
    private $_optShowEmoticons = true;

    /**
     * Boolean - the Member's option to show the profile for public access
     */
    private $_optShowProfile = true;

    /**
     * Boolean - the Member's option to show other Members' signatures in any
     *           board post.
     */
    private $_optShowSigs = true;

    /**
     * Tff_PM_Manager - the Member's private message manager.
     */
    private $_pmManager = null;

    /**
     * String - the action to display the Member profile.
     */
    const MEM_DISPLAY_PROFILE = 'viewprofile';

    /**
     * String - the URL to ICQ's Web Pager API.
     */
    const MEM_IM_URL_ICQ = 'http://wwp.icq.com/';

    /**
     * String - the URL to Yahoo! Messenger's Web messaging API.
     */
    const MEM_IM_URL_YIM = 'http://messenger.yahoo.com/edit/send/?.target=';

    /**
     * String - the code for the default Member sorting criteria.
     */
    const MEM_SORT_DEFAULT = 'screenname';

    /**
     * String - the code for sorting Members by their join date field.
     */
    const MEM_SORT_JOIN_DATE = 'join_date';

    /**
     * String - the code for sorting Members by their string field.
     */
    const MEM_SORT_NAME = 'screenname';

    /**
     * String - the code for sorting Members by their posts field.
     */
    const MEM_SORT_POSTS = 'posts';

    /**
     * String - the code for sorting Members by their posts field, and limiting
	 *          to the top ten positives.
     */
    const MEM_SORT_TOP_TEN_POSTS = 'top_ten';

    /**
     * String - the code for sorting Members by their last visit date field.
     */
    const MEM_SORT_VISIT_DATE = 'last_visit';

    /**
     * String - the name for the Member object cookie
     */
    const MEMBER_COOKIE_NAME = 'member_object';

    /**
     * Integer - the code for the default registration mode
     */
    const REG_DEFAULT = 0;

    /**
     * Integer - the code for the save registration mode
     */
    const REG_SAVE = 1;

    /**
     * Integer - the code for an unknown registration mode
     */
    const REG_UNKNOWN = -1;

    /**
     * Constructor.
     *
     * @param $taintedIdIn Integer - Optional. The unique id of this object.
     */
    public function __construct( $taintedIdIn = 0 )
    {

        $this->setObservable( new Tff_ObservableImpl() );
        $this->setPmManager(  new Tff_PM_Manager()     );

        $cleanId = intval( $taintedIdIn );

        if ( 0 < $cleanId )
        {

            $this->setId( $cleanId );

            $this->getPmManager()->setMemberId( $this->getId() );

        }

    }

    /**
     * Saves the current object to the persistence layer.
     *
     * @return Boolean - status of the operation. <code>true</code> is success,
     *                   <code>false</code> is failure.
     * @throws Tff_BBException If any operation fails
     */
    public function add()
    {

        $selfClass = new ReflectionClass( get_class( $this ) );

        $allProperties = $selfClass->getProperties();

        ksort( $allProperties );

        $sqlCmd = 'INSERT INTO ' . TFF_DS_PREFIX . 'member ( ';

        foreach ( $allProperties as $currentProperty )
        {

            $memberProperty = $currentProperty->getName();

            if ( '_memberid' == strtolower( $memberProperty ) ||
                 !( preg_match( "/^(_member)|(_opt)/", $memberProperty ) ) )
            {

                continue;

            }

            // Drop the preceding _member or _ (for _opt)
            $memberProperty = preg_replace( "/(^_member)|(^_)/", '', $memberProperty );

            // Insert _ in front of all upper case characters
            $memberProperty = preg_replace( "/([A-Z])/", "_\$1", $memberProperty );

            // Drop the preceding _
            $memberProperty = preg_replace( "/^_/", '', $memberProperty );

            if ( false === strpos( $memberProperty, 'opt' ) )
            {

                $sqlCmd .= 'member_' . strtolower( $memberProperty ) . ', ';

            }
            else
            {

                $sqlCmd .= strtolower( $memberProperty ) . ', ';

            }

        }

        $sqlCmd = preg_replace( "/, $/", ' ) ', $sqlCmd );

        $sqlCmd .= 'VALUES ( ';

        foreach ( $allProperties as $currentProperty )
        {

            $memberProperty = $currentProperty->getName();

            if ( '_memberid' == strtolower( $memberProperty ) ||
                 !( preg_match( "/^(_member)|(_opt)/", $memberProperty ) ) )
            {

                continue;

            }

            // Drop the preceding _member or _ (for _opt)
            $memberProperty = preg_replace( "/(^_member)|(^_)/", '', $memberProperty );

            $getterMethod = 'get' . ucfirst( $memberProperty );

            if ( is_bool( $this->$getterMethod() ) )
            {

                $sqlCmd .= intval( $this->$getterMethod() ) . ', ';
                continue;

            }
            else if ( is_string( $this->$getterMethod() ) )
            {

                $sqlCmd .= "'" . $this->$getterMethod() . "', ";
                continue;

            }
            else
            {

                $sqlCmd .= $this->$getterMethod() . ', ';
                continue;

            }

        }

        $sqlCmd = preg_replace( "/, $/", ' );', $sqlCmd );

        /**
         * @TODO Check if the PLI is null?
         */
        Tff_Board::getInstance()->getPLI()->query( $sqlCmd );

        $this->setId( Tff_Board::getInstance()->getPLI()->insertId() );

        Tff_Board::getInstance()->getPLI()->freeResult();
        Tff_Board::getInstance()->getPLI()->close();

        $this->getObservable()->notifyObservers(
                                                 new Tff_Message_Memberadd(
                                                                              $this->getId(),
                                                                              $this->getDisplayName()
                                                                             )
                                                );

        return true;

    }

    /**
     * Authenticates the current Member object login and password using the
     * chosen Login adapter. If login is successful, the Member will be loaded
     * from the persistence layer.
     *
     * @throws Tff_BBException - If any operation fails.
     */
    public function authenticate()
    {

        $loginAdapterInstance = null;

        $loginAdapterClassPath = Tff_ROOT . '/login';

        ini_set( 'include_path', ini_get( 'include_path' ) . PATH_SEPARATOR . $loginAdapterClassPath );

        require_once(
                      'class_tff.login.' .
                      strtolower( Tff_Board::getInstance()->getConfigValue( 'bb_authentication' ) ) .
                      'adapter.php'
                     );

        $loginAdapterClassName = 'Tff_Login_' .
                                 ucfirst( strtolower( Tff_Board::getInstance()->getConfigValue( 'bb_authentication' ) ) ) .
                                 'Adapter';

        if ( class_exists( $loginAdapterClassName ) )
        {

            $loginAdapterClass    =  new ReflectionClass( $loginAdapterClassName );
            $factoryMethod        =  $loginAdapterClass->getMethod( 'getInstance' );
            $loginAdapterInstance =& $factoryMethod->invoke( null );

            $factoryMethod     = null;
            $loginAdapterClass = null;

        }

        if ( null != $loginAdapterInstance )
        {

            $loginAdapterInstance->login( $this->getLogin(), $this->getPassword() );

            $this->loadByLogin( $this->getLogin() );

            $this->updateLastVisit();

        }

    }

    /**
     * Authenticates the current Member object login and password for admin
     * access using the chosen Login adapter. If login is successful, the
     * Member will be loaded from the persistence layer.
     *
     * @throws Tff_BBException - If any operation fails.
     */
    public function authenticateAdmin()
    {

        $this->authenticate();

    }

    /**
     * Gets the Member's AOL Instant Messenger screen name
     *
     * @return String - The <code>$_memberAim</code> property
     */
    public function getAim()
    {

        return $this->_memberAim;

    }

    /**
     * Gets the Member's avatar id.
     * @todo add notes about avatar objects when the class is written ;-)
     *
     * @return Integer - The <code>$_memberAvatarId</code> property
     */
    public function getAvatarId()
    {

        return $this->_memberAvatarId;

    }

    /**
     * Gets the Member's birthday as a UNIX timestamp
     *
     * @return Integer - The <code>$_memberBirthday</code> property
     */
    public function getBirthday()
    {

        return $this->_memberBirthday;

    }

    /**
     * Gets the Member's preferred date formatting (for the PHP date function)
     *
     * @return String - The <code>$_memberDateformat</code> property
     */
    public function getDateformat()
    {

        return $this->_memberDateformat;

    }

    /**
     * Gets the Member's screen name, or login if screen name is blank. For security
     * reasons, the Member's login should never be displayed, which is why the member
     * has the option to create a screen name as well. Whenever a front-end board script
     * needs to display the member's 'name' this method should be called.
     *
     * @return String - The Member name to display, <code>$_memberScreenname</code> or
     *                  if that is blank, then <code>$_memberLogin</code>
     */
    public function getDisplayName()
    {

        $displayName = $this->getScreenname();

        if ( null == $displayName || '' == trim( $displayName ) )
        {

            $displayName = $this->getLogin();

        }

        return $displayName;

    }

    /**
     * Gets the Member's email address
     *
     * @return String - The <code>$_memberEmail</code> property
     */
    public function getEmail()
    {

        return $this->_memberEmail;

    }

    /**
     * Gets the Member's enabled flag. <code>true</code> indicates
     * the Member is enabled and can login, post, etc. Otherwise returns
     * <code>false</code>
     *
     * @return Boolean - The <code>$_memberEnabled</code> property
     */
    public function getEnabled()
    {

        return ( boolean )( $this->_memberEnabled );

    }

    /**
     * Gets the number of the Member's failed logins.
     *
     * @return Integer - The <code>$_memberFailedLoginCount</code> property
     */
    public function getFailedLoginCount()
    {

        return $this->_memberFailedLoginCount;

    }

    /**
     * Gets the date of the Member's last failed login as a UNIX timestamp.
     *
     * @return Integer - The <code>$_memberFailedLoginDate</code> property
     */
    public function getFailedLoginDate()
    {

        return $this->_memberFailedLoginDate;

    }

    /**
     * Gets the Member's home page URL
     *
     * @return String - The <code>$_memberHomepage</code> property
     */
    public function getHomepage()
    {

        return $this->_memberHomepage;

    }

    /**
     * Gets the Member's ICQ UIN number
     *
     * @return String - The <code>$_memberIcq</code> property
     */
    public function getIcq()
    {

        return $this->_memberIcq;

    }

    /**
     * Gets the Member's unique id
     *
     * @return Integer - The <code>$_memberId</code> property
     */
    public function getId()
    {

        return $this->_memberId;

    }

    /**
     * Gets the Member's interests
     *
     * @return String - The <code>$_memberInterests</code> property
     */
    public function getInterests()
    {

        return $this->_memberInterests;

    }

    /**
     * Gets the Member's IP address at the time of registration
     *
     * @return String - The <code>$_memberIp</code> property
     */
    public function getIp()
    {

        return $this->_memberIp;

    }

    /**
     * Gets the Member's join date as a UNIX timestamp
     *
     * @return Integer - The <code>$_memberJoinDate</code> property
     */
    public function getJoinDate()
    {

        return $this->_memberJoinDate;

    }

    /**
     * Gets the Member's chosen display language
     *
     * @return String - The <code>$_memberLanguage</code> property
     */
    public function getLanguage()
    {

        return $this->_memberLanguage;

    }

    /**
     * Gets the Member's last visit date as a UNIX timestamp
     *
     * @return Integer - The <code>$_memberLastVisit</code> property
     */
    public function getLastVisit()
    {

        return $this->_memberLastVisit;

    }

    /**
     * Gets the Member's geographic location
     *
     * @return String - The <code>$_memberLocation</code> property
     */
    public function getLocation()
    {

        return $this->_memberLocation;

    }

    /**
     * Gets the Member's login username
     *
     * @return String - The <code>$_memberLogin</code> property
     */
    public function getLogin()
    {

        return $this->_memberLogin;

    }

    /**
     * Gets the Member's MSN Messenger screen name
     *
     * @return String - The <code>$_memberMsnm</code> property
     */
    public function getMsnm()
    {

        return $this->_memberMsnm;

    }

    /**
     * Gets the Member's observer handler.
     *
     * @return Tff_IObservable - the <code>$_observable</code> property
     */
    public function getObservable()
    {

        return $this->_observable;

    }

    /**
     * Gets the Member's real life occupation
     *
     * @return String - The <code>$_memberOccupation</code> property
     */
    public function getOccupation()
    {

        return $this->_memberOccupation;

    }

    /**
     * Gets the Member's option to allow incoming and outgoing instant messages.
     * This will be <code>true</code> or <code>false</code>
     *
     * @return Boolean - The <code>$_optAllowPm</code> property
     */
    public function getOptAllowPm()
    {

        return ( boolean )( $this->_optAllowPm );

    }

    /**
     * Gets the Member's option to always attach the signature to a Post.
     * This will be <code>true</code> or <code>false</code>
     *
     * @return Boolean - The <code>$_optAlwaysAttachSig</code> property
     */
    public function getOptAlwaysAttachSig()
    {

        return ( boolean )( $this->_optAlwaysAttachSig );

    }

    /**
     * Gets the Member's option to receive an email when a new private message arrives.
     * This will be <code>true</code> or <code>false</code>
     *
     * @return Boolean - The <code>$_optEmailPm</code> property
     */
    public function getOptEmailPm()
    {

        return ( boolean )( $this->_optEmailPm );

    }

    /**
     * Gets the Member's option to not show up in the board's active users list.
     * This will be <code>true</code> or <code>false</code>
     *
     * @return Boolean - The <code>$_optInvisMode</code> property
     */
    public function getOptInvisMode()
    {

        return ( boolean )( $this->_optInvisMode );

    }

    /**
     * Gets the Member's option to show BBML in any board post.
     * This will be <code>true</code> or <code>false</code>
     *
     * @return Boolean - The <code>$_optShowBbml</code> property
     */
    public function getOptShowHtml()
    {

        return ( boolean )( $this->_optShowHtml );

    }

    /**
     * Gets the Member's option to show the email address for public access.
     * This will be <code>true</code> or <code>false</code>
     *
     * @return Boolean - The <code>$_optShowEmail</code> property
     */
    public function getOptShowEmail()
    {

        return ( boolean )( $this->_optShowEmail );

    }

    /**
     * Gets the Member's option to show emoticons in any board post.
     * This will be <code>true</code> or <code>false</code>
     *
     * @return Boolean - The <code>$_optShowEmoticons</code> property
     */
    public function getOptShowEmoticons()
    {

        return ( boolean )( $this->_optShowEmoticons );

    }

    /**
     * Gets the Member's option to show the profile for public access.
     * This will be <code>true</code> or <code>false</code>
     *
     * @return Boolean - The <code>$_optShowProfile</code> property
     */
    public function getOptShowProfile()
    {

        return ( boolean )( $this->_optShowProfile );

    }

    /**
     * Gets the Member's option to show other Members' signatures in any board post.
     * This will be <code>true</code> or <code>false</code>
     *
     * @return Boolean - The <code>$_optShowSigs</code> property
     */
    public function getOptShowSigs()
    {

        return ( boolean )( $this->_optShowSigs );

    }

    /**
     * Gets the Member's encrypted password
     *
     * @return String - The <code>$_memberPassword</code> property
     */
    public function getPassword()
    {

        return $this->_memberPassword;

    }

    /**
     * Gets the Member's percentage of total posts for the Board.
     *
     * @return Float - The Member's percentage of total posts for the Board.
     */
    public function getPercentageOfTotalPosts()
    {

        $percentPosts = 0;

        /**
         * Temp variable to decrease line length and make it more readable...
         * So sue me =P
         */
        $totalBoardPosts = Tff_Board::getInstance()->getConfigValue( 'total_posts' );

        if ( 0 < $this->getPosts() )
        {

            /**
             * 100 is for percentage, not a magic number
             */
            $percentPosts = $totalBoardPosts ?
                            min( 100, ( $this->getPosts() / $totalBoardPosts ) * 100 ) : 0;

        }

        return $percentPosts;

    }

    /**
     * Gets the Member's private message manager.
     *
     * @return Tff_PM_Manager - the <code>$_pmManager</code> property
     */
    public function getPmManager()
    {

        return $this->_pmManager;

    }

    /**
     * Gets the Member's posting rate per day for the board
     *
     * @param  $adjustedTimeIn - Integer - The current timestamp, pre-adjusted
     *                           for timezone, as a UNIX timestamp.
     * @return Float - The Member's posting rate per day for the board
     */
    public function getPostRatePerDay( $adjustedTimeIn )
    {

        $daysOld  = max( 1, round( ( intval( $adjustedTimeIn ) - $this->getJoinDate() ) /
                                   ( Tff_BBUtil::NUM_HOURS_IN_DAY * Tff_BBUtil::NUM_SECS_IN_HOUR ) ) );

        return ( $this->getPosts() / $daysOld );

    }

    /**
     * Gets the Member's total number of posts in the board
     *
     * @return Integer - The <code>$_memberPosts</code> property
     */
    public function getPosts()
    {

        return $this->_memberPosts;

    }

    /**
     * Gets the Member's rank id
     * @todo Tie this in with the Rank class when it exists ;-)
     *
     * @return Integer - The <code>$_memberRankId</code> property
     */
    public function getRankId()
    {

        return $this->_memberRankId;

    }

    /**
     * Gets the Member's screen name
     *
     * @return String - The <code>$_memberScreenname</code> property
     */
    public function getScreenname()
    {

        return $this->_memberScreenname;

    }

    /**
     * Gets the Member's signature for posting
     *
     * @return String - The <code>$_memberSig</code> property
     */
    public function getSig()
    {

        return $this->_memberSig;

    }

    /**
     * Gets the Member's chosen board display template.
     *
     * @return String - The <code>$_memberTemplate</code> property
     */
    public function getTemplate()
    {

        return $this->_memberTemplate;

    }

    /**
     * Gets the Member's time zone offset from GMT (UTC)
     *
     * @return Integer - The <code>$_memberTimezone</code> property
     */
    public function getTimezone()
    {

        return $this->_memberTimezone;

    }

    /**
     * Gets the Member's title
     *
     * @return String - The <code>$_memberTitle</code> property
     */
    public function getTitle()
    {

        return $this->_memberTitle;

    }

    /**
     * Gets the Member's Yahoo! Messenger screen name
     *
     * @return String - The <code>$_memberYim</code> property
     */
    public function getYim()
    {

        return $this->_memberYim;

    }

    /**
     * Updates the current object based on the message received.
     *
     * @param $msgIn - Tff_IMessage - the message to handle
     * @throws Tff_BBException If any operation fails
     */
    public function handleMessage( Tff_IMessage $msgIn )
    {

        switch ( $msgIn->getMsgType() )
        {

            case Tff_Message_Replyadd::MSG_TYPE:

                $sqlCmd  = 'UPDATE ' . TFF_DS_PREFIX . 'member SET ';
                $sqlCmd .= 'member_posts = member_posts + 1, ';
                $sqlCmd .= 'member_last_visit = ' . $msgIn->getTimeStamp() . ' ';
                $sqlCmd .= 'WHERE ( member_id = ' . $msgIn->getAuthorId() . ' );';

                Tff_Board::getInstance()->getPLI()->query( $sqlCmd );

                break;

            case Tff_Message_Threadadd::MSG_TYPE:

                $sqlCmd  = 'UPDATE ' . TFF_DS_PREFIX . 'member SET ';
                $sqlCmd .= 'member_posts = member_posts + 1, ';
                $sqlCmd .= 'member_last_visit = ' . $msgIn->getTimeStamp() . ' ';
                $sqlCmd .= 'WHERE ( member_id = ' . $msgIn->getAuthorId() . ' );';

                Tff_Board::getInstance()->getPLI()->query( $sqlCmd );

                break;

        }

    }

    /**
     * Retrieves an object from the persistence layer based on the given object
     * id and loads it into memory.
     * The parameter must greater than zero.
     *
     * @param  $taintedId Integer - The unique id of the object to load.
     * @return Boolean - status of the operation. <code>true</code> is success,
     *                   <code>false</code> is failure.
     * @throws Tff_BBException If any operation fails
     */
    public function load( $taintedId )
    {

        $cleanId = intval( $taintedId );

        $sqlCmd  = 'SELECT * ';
        $sqlCmd .= 'FROM ' . TFF_DS_PREFIX . 'member ';
        $sqlCmd .= 'WHERE ( member_id = ' . $cleanId . ' );';

        if ( !( is_numeric( $cleanId ) ) || 0 >= $cleanId )
        {

            throw new Tff_BBException( LANG_TFF_MEM_ERROR_NO_MEM . $cleanId );

        }

        $retrievedObject = Tff_Board::getInstance()->getPLI()->queryFirst( $sqlCmd );

        if ( null == $retrievedObject || !( $retrievedObject ) )
        {

            Tff_Board::getInstance()->getPLI()->close();

            throw new Tff_BBException( LANG_TFF_MEM_ERROR_NO_MEM . $cleanId );

        }

        Tff_Board::getInstance()->getPLI()->freeResult();
        Tff_Board::getInstance()->getPLI()->close();

        foreach ( array_keys( get_object_vars( $retrievedObject ) ) as $memberProperty )
        {

            // Drop the preceding member_
            $parsedMemberProperty = preg_replace( "/(^member_)/", '', $memberProperty );

            // Replace underscores with blank spaces and upper case the first letter of each 'word'
            $parsedMemberProperty = ucwords( strtolower( str_replace( '_', ' ', $parsedMemberProperty ) ) );

            // Strip out the spaces
            $parsedMemberProperty = str_replace( ' ', '', $parsedMemberProperty );

            $setterMethod = 'set' . $parsedMemberProperty;

            $this->$setterMethod( $retrievedObject->$memberProperty );

        }

        $this->getPmManager()->setMemberId( $this->getId() );

        $retrivedObject = null;

        return true;

    }

    /**
     * Retrieves an object from the persistence layer based on the given object
     * id and loads it into memory.
     * The parameter must greater than zero.
     *
     * @param  $taintedLogin String - The login of the Member to load.
     * @return Boolean - status of the operation. <code>true</code> is success,
     *                   <code>false</code> is failure.
     * @throws Tff_BBException If any operation fails
     */
    public function loadByLogin( $taintedLogin )
    {

        /**
         * @TODO CLEANSE THIS!!!
         */
        $cleanLogin = strip_tags( $taintedLogin );

        $sqlCmd  = 'SELECT * ';
        $sqlCmd .= 'FROM ' . TFF_DS_PREFIX . 'member ';
        $sqlCmd .= "WHERE ( member_login = '" . $cleanLogin . "' );";

        $retrievedObject = Tff_Board::getInstance()->getPLI()->queryFirst( $sqlCmd );

        if ( null == $retrievedObject || !( $retrievedObject ) )
        {

            Tff_Board::getInstance()->getPLI()->close();

            throw new Tff_BBException( LANG_TFF_MEM_ERROR_NO_MEM . $cleanLogin );

        }

        Tff_Board::getInstance()->getPLI()->freeResult();
        Tff_Board::getInstance()->getPLI()->close();

        foreach ( array_keys( get_object_vars( $retrievedObject ) ) as $memberProperty )
        {

            // Drop the preceding member_
            $parsedMemberProperty = preg_replace( "/(^member_)/", '', $memberProperty );

            // Replace underscores with blank spaces and upper case the first letter of each 'word'
            $parsedMemberProperty = ucwords( strtolower( str_replace( '_', ' ', $parsedMemberProperty ) ) );

            // Strip out the spaces
            $parsedMemberProperty = str_replace( ' ', '', $parsedMemberProperty );

            $setterMethod = 'set' . $parsedMemberProperty;

            $this->$setterMethod( $retrievedObject->$memberProperty );

        }

        $this->getPmManager()->setMemberId( $this->getId() );

        $retrivedObject = null;

        return true;

    }

    /**
     * Permanently removes the object from the persistence layer based on its
     * id.
     *
     * @return Boolean - status of the operation. <code>true</code> is success,
     *                   <code>false</code> is failure.
     * @throws Tff_BBException If any operation fails
     */
    public function remove()
    {

        /**
         * @TODO decide if it's worth it to properly clean up all the member
         *       posts, etc. or just orphan everything
         */
        return true;

    }

    /**
     * Sets the Member's AOL Instant Messenger screen name
     *
     * @param $taintedValue String - the AOL Instant Messenger screen name
     */
    public function setAim( $taintedValue )
    {

        $this->_memberAim = trim( $taintedValue );

    }

    /**
     * Sets the Member's avatar id.
     * This must not be null, must be numeric and greater than zero
     *
     * @param $taintedValue Integer - the avatar id
     * @throws Tff_BBException If value is invalid
     */
    public function setAvatarId( $taintedValue )
    {

        if ( is_null( $taintedValue ) || !( is_numeric( $taintedValue ) ) || 0 > $taintedValue )
        {

            throw new Tff_BBException( LANG_TFF_MEM_BAD_AVATAR_ID . $taintedValue );

        }

        $this->_memberAvatarId = intval( $taintedValue );

    }

    /**
     * Sets the Member's birthday as a UNIX timestamp.
     * This must not be null, must be numeric and greater than zero
     *
     * @param  $taintedValue Integer - the birthday timestamp
     * @throws Tff_BBException If value is invalid
     */
    public function setBirthday( $taintedValue )
    {

        if ( is_null( $taintedValue ) || !( is_numeric( $taintedValue ) ) || 0 > $taintedValue )
        {

            throw new Tff_BBException( LANG_TFF_MEM_BAD_BIRTHDAY . $taintedValue );

        }

        $this->_memberBirthday = intval( $taintedValue );

    }

    /**
     * Sets the Member's preferred date formatting (for the PHP date function).
     * This must not be null and must be a non-empty string
     *
     * @param $taintedValue String - the date format
     * @throws Tff_BBException If value is invalid
     */
    public function setDateformat( $taintedValue )
    {

        $taintedValue = trim( $taintedValue );

        if ( is_null( $taintedValue ) || !( is_string( $taintedValue ) ) )
        {

            throw new Tff_BBException( LANG_TFF_MEM_BAD_DATE_FORMAT . $taintedValue );

        }

        $this->_memberDateformat = $taintedValue;

    }

    /**
     * Sets the Member's email address.
     * This must not be null and must be a non-empty string
     *
     * @param $taintedValue String - the email address
     * @throws Tff_BBException If value is invalid
     */
    public function setEmail( $taintedValue )
    {

        $taintedValue = trim( $taintedValue );

        if ( is_null( $taintedValue ) || !( is_string( $taintedValue ) ) || '' == $taintedValue )
        {

            throw new Tff_BBException( LANG_TFF_MEM_BAD_EMAIL . $taintedValue );

        }

        $this->_memberEmail = $taintedValue;

    }

    /**
     * Sets the Member's enabled flag. <code>true</code> indicates
     * the Member is enabled and can login, post, etc. Otherwise returns
     * <code>false</code>.
     * This must not be null, and must be numeric or must be a boolean value
     *
     * @param $taintedValue Boolean - the enabled flag
     * @throws Tff_BBException If value is invalid
     */
    public function setEnabled( $taintedValue )
    {

        if ( is_null( $taintedValue ) || ( !( is_numeric( $taintedValue ) ) && !( is_bool( $taintedValue ) ) ) )
        {

            throw new Tff_BBException( LANG_TFF_MEM_BAD_ENABLED_OPT . $taintedValue );

        }

        $this->_memberEnabled = ( boolean )( $taintedValue );

    }

    /**
     * Sets the number of the Member's failed logins.
     * This must not be null, must be numeric and greater than zero
     *
     * @param  $taintedValue Integer - the number of failed logins
     * @throws BuBOL_BBException If value is invalid
     * @since  v0.1.2
     */
    public function setFailedLoginCount( $taintedValue )
    {

        if ( is_null( $taintedValue ) || !( is_numeric( $taintedValue ) ) || 0 > $taintedValue )
        {

            throw new BuBOL_BBException( LANG_TFF_MEM_BAD_FAILED_LOGIN_COUNT . $taintedValue );

        }

        $this->_memberFailedLoginCount = intval( $taintedValue );

    }

    /**
     * Sets the date of the Member's last failed login as a UNIX timestamp.
     * This must not be null, must be numeric and greater than zero
     *
     * @param  $taintedValue Integer - the last failed login date
     * @throws BuBOL_BBException If value is invalid
     * @since  v0.1.2
     */
    public function setFailedLoginDate( $taintedValue )
    {

        if ( is_null( $taintedValue ) || !( is_numeric( $taintedValue ) ) || 0 > $taintedValue )
        {

            throw new BuBOL_BBException( LANG_TFF_MEM_BAD_FAILED_LOGIN_DATE . $taintedValue );

        }

        $this->_memberFailedLoginDate = intval( $taintedValue );

    }

    /**
     * Sets the Member's home page URL
     *
     * @param $taintedValue String - the home page URL
     */
    public function setHomepage( $taintedValue )
    {

        if ( null != $taintedValue && '' != trim( $taintedValue ) )
        {

            if ( 0 !== strpos( $taintedValue, 'http://' ) )
            {

                $taintedValue = "http://$taintedValue";

            }

        }

        $this->_memberHomepage = trim( $taintedValue );

    }

    /**
     * Sets the Member's ICQ UIN number
     *
     * @param $taintedValue String - the ICQ UIN number
     */
    public function setIcq( $taintedValue )
    {

        $this->_memberIcq = trim( $taintedValue );

    }

    /**
     * Sets the Member's unique id.
     * This must not be null, must be numeric and greater than zero
     *
     * @param $taintedValue Integer - the unique id
     * @throws BuBOL_BBException If value is invalid
     */
    public function setId( $taintedValue )
    {

        if ( is_null( $taintedValue ) || !( is_numeric( $taintedValue ) ) || 0 >= $taintedValue )
        {

            throw new BuBOL_BBException( LANG_TFF_MEM_BAD_ID . $taintedValue );

        }

        $this->_memberId = intval( $taintedValue );

    }

    /**
     * Sets the Member's IP address at the time of registration
     *
     * @param $taintedValue String - the IP address
     */
    public function setIp( $taintedValue )
    {

        $this->_memberIp = trim( $taintedValue );

    }

    /**
     * Sets the Member's interests
     *
     * @param $taintedValue String - the interests
     */
    public function setInterests( $taintedValue )
    {

        $this->_memberInterests = trim( $taintedValue );

    }

    /**
     * Sets the Member's join date as a UNIX timestamp.
     * This must not be null, must be numeric and greater than zero
     *
     * @param $taintedValue Integer - the join date
     * @throws BuBOL_BBException If value is invalid
     */
    public function setJoinDate( $taintedValue )
    {

        if ( is_null( $taintedValue ) || !( is_numeric( $taintedValue ) ) || 0 > $taintedValue )
        {

            throw new BuBOL_BBException( LANG_TFF_MEM_BAD_JOIN_DATE . $taintedValue );

        }

        $this->_memberJoinDate = intval( $taintedValue );

    }

    /**
     * Sets the Member's chosen language.
     *
     * @param $taintedValue String - the language
     * @since v0.1.2
     */
    public function setLanguage( $taintedValue )
    {

        $this->_memberLanguage = trim( $taintedValue );

    }

    /**
     * Sets the Member's last visit date as a UNIX timestamp.
     * This must not be null, must be numeric and greater than zero
     *
     * @param $taintedValue Integer - the last visit date
     * @throws BuBOL_BBException If value is invalid
     */
    public function setLastVisit( $taintedValue )
    {

        if ( is_null( $taintedValue ) || !( is_numeric( $taintedValue ) ) || 0 > $taintedValue )
        {

            throw new BuBOL_BBException( LANG_TFF_MEM_BAD_LAST_VISIT . $taintedValue );

        }

        $this->_memberLastVisit = intval( $taintedValue );

    }

    /**
     * Sets the Member's geographic location
     *
     * @param $taintedValue String - the location
     */
    public function setLocation( $taintedValue )
    {

        $this->_memberLocation = trim( $taintedValue );

    }

    /**
     * Sets the Member's login username.
     * This must not be null and must be a non-empty string
     *
     * @param $taintedValue String - the login
     * @throws BuBOL_BBException If value is invalid
     */
    public function setLogin( $taintedValue )
    {

        $taintedValue = trim( $taintedValue );

        if ( is_null( $taintedValue ) || !( is_string( $taintedValue ) ) || '' == $taintedValue )
        {

            throw new BuBOL_BBException( LANG_TFF_MEM_BAD_LOGIN . $taintedValue );

        }

        $this->_memberLogin = $taintedValue;

    }

    /**
     * Sets the Member's MSN Messenger screen name
     *
     * @param $taintedValue String - the MSN Messenger screen name
     */
    public function setMsnm( $taintedValue )
    {

        $this->_memberMsnm = trim( $taintedValue );

    }

    /**
     * Sets the Member's observer handle.
     *
     * @param $observableIn BuBOL_IObservable - the observer handle
     */
    public function setObservable( $observableIn )
    {

        $this->_observable = $observableIn;

    }

    /**
     * Sets the Member's real life occupation
     *
     * @param $taintedValue String - the real life occupation
     */
    public function setOccupation( $taintedValue )
    {

        $this->_memberOccupation = trim( $taintedValue );

    }

    /**
     * Sets the Member's option to allow incoming and outgoing instant messages.
     * This must not be null, and must be numeric or must be a boolean value
     *
     * @param $taintedValue Boolean - the allow pm option
     * @throws BuBOL_BBException If value is invalid
     */
    public function setOptAllowPm( $taintedValue )
    {

        if ( is_null( $taintedValue ) || ( !( is_numeric( $taintedValue ) ) && !( is_bool( $taintedValue ) ) ) )
        {

            throw new BuBOL_BBException( LANG_TFF_MEM_BAD_ALLOW_PM_OPT . $taintedValue );

        }

        $this->_optAllowPm = ( boolean )( $taintedValue );

    }

    /**
     * Sets the Member's option to always attach the signature to a Post.
     * This must not be null, and must be numeric or must be a boolean value
     *
     * @param $taintedValue Boolean - the always attach signatures option
     * @throws BuBOL_BBException If value is invalid
     * @since  v0.1.3
     */
    public function setOptAlwaysAttachSig( $taintedValue )
    {

        if ( is_null( $taintedValue ) || ( !( is_numeric( $taintedValue ) ) && !( is_bool( $taintedValue ) ) ) )
        {

            throw new BuBOL_BBException( LANG_TFF_MEM_BAD_ALWAYS_ATT_SIG_OPT . $taintedValue );

        }

        $this->_optAlwaysAttachSig = ( boolean )( $taintedValue );

    }

    /**
     * Sets the Member's option to receive an email when a new private message arrives.
     * This must not be null, and must be numeric or must be a boolean value
     *
     * @param $taintedValue Boolean - the email on new pm option
     * @throws BuBOL_BBException If value is invalid
     */
    public function setOptEmailPm( $taintedValue )
    {

        if ( is_null( $taintedValue ) || ( !( is_numeric( $taintedValue ) ) && !( is_bool( $taintedValue ) ) ) )
        {

            throw new BuBOL_BBException( LANG_TFF_MEM_BAD_EMAIL_ON_PM_OPT . $taintedValue );

        }

        $this->_optEmailPm = ( boolean )( $taintedValue );

    }

    /**
     * Sets the Member's option to not show up in the board's active users list.
     * This must not be null, and must be numeric or must be a boolean value
     *
     * @param $taintedValue Boolean - the invisible mode option
     * @throws BuBOL_BBException If value is invalid
     */
    public function setOptInvisMode( $taintedValue )
    {

        if ( is_null( $taintedValue ) || ( !( is_numeric( $taintedValue ) ) && !( is_bool( $taintedValue ) ) ) )
        {

            throw new BuBOL_BBException( LANG_TFF_MEM_BAD_INVIS_MODE_OPT . $taintedValue );

        }

        $this->_optInvisMode = ( boolean )( $taintedValue );

    }

    /**
     * Sets the Member's option to show BBML in any board post.
     * This must not be null, and must be numeric or must be a boolean value
     *
     * @param $taintedValue Boolean - the show BBML option
     * @throws BuBOL_BBException If value is invalid
     */
    public function setOptShowBbml( $taintedValue )
    {

        if ( is_null( $taintedValue ) || ( !( is_numeric( $taintedValue ) ) && !( is_bool( $taintedValue ) ) ) )
        {

            throw new BuBOL_BBException( LANG_TFF_MEM_BAD_SHOW_BBML_OPT . $taintedValue );

        }

        $this->_optShowBbml = ( boolean )( $taintedValue );

    }

    /**
     * Sets the Member's option to show the email address for public access.
     * This must not be null, and must be numeric or must be a boolean value
     *
     * @param $taintedValue Boolean - the show email option
     * @throws BuBOL_BBException If value is invalid
     */
    public function setOptShowEmail( $taintedValue )
    {

        if ( is_null( $taintedValue ) || ( !( is_numeric( $taintedValue ) ) && !( is_bool( $taintedValue ) ) ) )
        {

            throw new BuBOL_BBException( LANG_TFF_MEM_BAD_SHOW_EMAIL_OPT . $taintedValue );

        }

        $this->_optShowEmail = ( boolean )( $taintedValue );

    }

    /**
     * Sets the Member's option to show emoticons in any board post.
     * This must not be null, and must be numeric or must be a boolean value
     *
     * @param $taintedValue Boolean - the show emoticons option
     * @throws BuBOL_BBException If value is invalid
     */
    public function setOptShowEmoticons( $taintedValue )
    {

        if ( is_null( $taintedValue ) || ( !( is_numeric( $taintedValue ) ) && !( is_bool( $taintedValue ) ) ) )
        {

            throw new BuBOL_BBException( LANG_TFF_MEM_BAD_SHOW_EMOT_OPT . $taintedValue );

        }

        $this->_optShowEmoticons = ( boolean )( $taintedValue );

    }

    /**
     * Sets the Member's option to show the profile for public access.
     * This must not be null, and must be numeric or must be a boolean value
     *
     * @param $taintedValue Boolean - the show profile option
     * @throws BuBOL_BBException If value is invalid
     * @since  v0.1.3
     */
    public function setOptShowProfile( $taintedValue )
    {

        if ( is_null( $taintedValue ) || ( !( is_numeric( $taintedValue ) ) && !( is_bool( $taintedValue ) ) ) )
        {

            throw new BuBOL_BBException( LANG_TFF_MEM_BAD_SHOW_PROFILE_OPT . $taintedValue );

        }

        $this->_optShowProfile = ( boolean )( $taintedValue );

    }

    /**
     * Sets the Member's option to show other Members' signatures in any board post.
     * This must not be null, and must be numeric or must be a boolean value
     *
     * @param $taintedValue Boolean - the show sigs option
     * @throws BuBOL_BBException If value is invalid
     */
    public function setOptShowSigs( $taintedValue )
    {

        if ( is_null( $taintedValue ) || ( !( is_numeric( $taintedValue ) ) && !( is_bool( $taintedValue ) ) ) )
        {

            throw new BuBOL_BBException( LANG_TFF_MEM_BAD_SHOW_SIGS_OPT . $taintedValue );

        }

        $this->_optShowSigs = ( boolean )( $taintedValue );

    }

    /**
     * Sets the Member's encrypted password
     * This must not be null and must be a non-empty string
     *
     * @param $taintedValue String - the encrypted password
     * @throws BuBOL_BBException If value is invalid
     */
    public function setPassword( $taintedValue )
    {

        $taintedValue = trim( $taintedValue );

        if ( is_null( $taintedValue ) || !( is_string( $taintedValue ) ) || '' == $taintedValue )
        {

            throw new BuBOL_BBException( LANG_TFF_MEM_BAD_PASSWORD . $taintedValue );

        }

        $this->_memberPassword = $taintedValue;

    }

    /**
     * Sets the Member's private message manager.
     *
     * @param $pmManagerIn BuBOL_PM_Manager - the private message manager.
     * @since v0.1.3
     */
    public function setPmManager( $pmManagerIn )
    {

        $this->_pmManager = $pmManagerIn;

    }

    /**
     * Sets the Member's total number of posts in the board.
     * This must not be null, must be numeric and greater than zero
     *
     * @param $taintedValue Integer - the number of member posts
     * @throws BuBOL_BBException If value is invalid
     */
    public function setPosts( $taintedValue )
    {

        if ( is_null( $taintedValue ) || !( is_numeric( $taintedValue ) ) || 0 > $taintedValue )
        {

            throw new BuBOL_BBException( LANG_TFF_MEM_BAD_POSTS . $taintedValue );

        }

        $this->_memberPosts = intval( $taintedValue );

    }

    /**
     * Sets the Member's rank id.
     * This must not be null, must be numeric and greater than zero
     *
     * @param $taintedValue Integer - the rank id
     * @throws BuBOL_BBException If value is invalid
     */
    public function setRankId( $taintedValue )
    {

        if ( is_null( $taintedValue ) || !( is_numeric( $taintedValue ) ) || 0 > $taintedValue )
        {

            throw new BuBOL_BBException( LANG_TFF_MEM_BAD_RANK_ID . $taintedValue );

        }

        $this->_memberRankId = intval( $taintedValue );

    }

    /**
     * Sets the Member's screen name to display instead of the login
     *
     * @param $taintedValue String - the screen name
     */
    public function setScreenname( $taintedValue )
    {

        $this->_memberScreenname = trim( $taintedValue );

    }

    /**
     * Sets the Member's signature for posting
     *
     * @param $taintedValue String - the signature
     */
    public function setSig( $taintedValue )
    {

        $this->_memberSig = trim( $taintedValue );

    }

    /**
     * Sets the Member's chosen board display template.
     *
     * @param $taintedValue String - the display template name
     * @since v0.1.2
     */
    public function setTemplate( $taintedValue )
    {

        $this->_memberTemplate = trim( $taintedValue );

    }

    /**
     * Sets the Member's time zone offset from GMT (UTC).
     * This must not be null and must be numeric.
     *
     * @param $taintedValue Integer - the timezone offset from GMT
     * @throws Tff_BBException If value is invalid
     */
    public function setTimezone( $taintedValue )
    {

        if ( is_null( $taintedValue ) || !( is_numeric( $taintedValue ) ) )
        {

            throw new BuBOL_BBException( LANG_TFF_MEM_BAD_TIMEZONE . $taintedValue );

        }

        $this->_memberTimezone = intval( $taintedValue );

    }

    /**
     * Sets the Member's title
     *
     * @param $taintedValue String - the title
     */
    public function setTitle( $taintedValue )
    {

        $this->_memberTitle = trim( $taintedValue );

    }

    /**
     * Sets the Member's Yahoo! Messenger screen name
     *
     * @param $taintedValue String - the Yahoo! Messenger screen name
     */
    public function setYim( $taintedValue )
    {

        $this->_memberYim = trim( $taintedValue );

    }

    /**
     * Logs the Member in by setting _SESSION and optionally, _COOKIE
     * variables.
     *
     * @param  $setCookies Boolean - true or false for whether or not to use
     *                               cookies.
     * @param  $salt       String  - A string used to further secure the cookie
     *                               data
     * @return Boolean - Always true unless $setCookies is true, then it will
     *                   return the status of setting the cookie.
     */
    public function signIn( $setCookies, $salt )
    {

        /**
         * @TODO This should throw an Exception, not boolean return values >=/
         */
        $cookieSuccess = true;

        $_SESSION[ 'member_auth' ] = true;
        $_SESSION[ self::MEMBER_COOKIE_NAME ] = base64_encode( serialize( $this ) );

        if ( $setCookies )
        {

            $cookieExpiry  = Tff_BBUtil::getGmtTimestamp();
            $cookieExpiry += ( $this->getTimezone() * Tff_BBUtil::NUM_SECS_IN_HOUR );
            $cookieExpiry += (
                               Tff_Board::getInstance()->getConfigValue( 'visitor_cookie_expire' ) *
                               Tff_BBUtil::NUM_HOURS_IN_DAY *
                               Tff_BBUtil::NUM_SECS_IN_HOUR
                              );

            /**
             * Extra security here. Found this on a php.net user comment
             * at: http://www.php.net/manual/en/function.setcookie.php
             *
             * 1. Serialize and encode the Member object
             */
            $cookieData = base64_encode( serialize( $this ) );

            /**
             * 2. Generate a checksum of the serialized Member object
             *    and salt the checksum with the board token constant
             */
            $checkSum = Tff_BBUtil::generateDataChecksum( $cookieData, $salt );

            /**
             * 3. Wrap up the data and the checksum
             */
            $strongCookieData = serialize( array( $cookieData, $checkSum ) );

            $cookieSuccess = @setcookie(
                                         self::MEMBER_COOKIE_NAME,
                                         $strongCookieData,
                                         $cookieExpiry,
                                         Tff_Board::getInstance()->getConfigValue( 'visitor_cookie_path' ),
                                         Tff_Board::getInstance()->getConfigValue( 'visitor_cookie_domain' )
                                        );

         }

         return $cookieSuccess;

    }

    /**
     * Logs the Member out by destroying _SESSION and _COOKIE variables.
     *
     * @return Boolean - Always true unless cookies are detected, then it will
     *                   return the status of setting the cookie.
     */
    public static function signOut()
    {

        /**
         * Normally I'd want to default to false, but in this case we don't know
         * if cookies are even being used.
         * @TODO This should throw an Exception, not boolean return values >=/
         */
        $cookieSuccess = true;

        $_SESSION = array();


        /**
         * Set expiration to 24 hours ago, GMT
         */
        $cookieExpiry = Tff_BBUtil::getGmtTimestamp() -
                        ( Tff_BBUtil::NUM_HOURS_IN_DAY * Tff_BBUtil::NUM_SECS_IN_HOUR );

        if ( isset( $_COOKIE[ session_name() ] ) )
        {

            @setcookie(
                        session_name(),
                        '',
                        $cookieExpiry,
                        '/'
                      );

        }

        session_destroy();

        if ( isset( $_COOKIE[ self::MEMBER_COOKIE_NAME ] ) )
        {

            /**
             * Attempt to destroy cookie
             */
            $cookieSuccess = @setcookie(
                                         self::MEMBER_COOKIE_NAME,
                                         '',
                                         $cookieExpiry,
                                         Tff_Board::getInstance()->getConfigValue( 'visitor_cookie_path' ),
                                         Tff_Board::getInstance()->getConfigValue( 'visitor_cookie_domain' )
                                        );

        }

        return $cookieSuccess;

    }

    /**
     * Updates the current object in the persistence layer.
     *
     * @return Boolean - status of the operation. <code>true</code> is success,
     *                   <code>false</code> is failure.
     * @throws Tff_BBException If any operation fails
     */
    public function update()
    {

        $selfClass = new ReflectionClass( get_class( $this ) );

        $allProperties = $selfClass->getProperties();

        ksort( $allProperties );

        $sqlCmd = 'UPDATE ' . TFF_DS_PREFIX . 'member SET ';

        foreach ( $allProperties as $currentProperty )
        {

            $memberProperty = $currentProperty->getName();

            /**
             * The member_ip field should never be updated
             * as it is stored only on member sign-up to be used
             * as a counter-measure against member sign up flood attacks
             * if you feel it must be updated... just comment-out the line below
             */
            if ( '_memberid' == strtolower( $memberProperty ) ||
                 '_memberip' == strtolower( $memberProperty ) ||
                 !( preg_match( "/^(_member)|(_opt)/", $memberProperty ) ) )
            {

                continue;

            }

            // Drop the preceding _member or _ (for _opt)
            $memberProperty = preg_replace( "/(^_member)|(^_)/", '', $memberProperty );

            $getterMethod = 'get' . ucfirst( $memberProperty );

            // Insert _ in front of all upper case characters
            $memberProperty = preg_replace( "/([A-Z])/", "_\$1", $memberProperty );

            // Drop the preceding _
            $memberProperty = preg_replace( "/^_/", '', $memberProperty );

            if ( false === strpos( $memberProperty, 'opt' ) )
            {

                $sqlCmd .= 'member_' . strtolower( $memberProperty ) . ' = ';

            }
            else
            {

                $sqlCmd .= strtolower( $memberProperty ) . ' = ';

            }

            if ( is_bool( $this->$getterMethod() ) )
            {

                $sqlCmd .= intval( $this->$getterMethod() ) . ', ';
                continue;

            }
            else if ( is_string( $this->$getterMethod() ) )
            {

                $sqlCmd .= "'" . $this->$getterMethod() . "', ";
                continue;

            }
            else
            {

                $sqlCmd .= $this->$getterMethod() . ', ';
                continue;

            }

        }

        $sqlCmd = preg_replace( "/, $/", '', $sqlCmd );

        $sqlCmd .= ' WHERE ( member_id = ' . $this->getId() . ' );';

        /**
         * @TODO Check if the PLI is null?
         */
        Tff_Board::getInstance()->getPLI()->query( $sqlCmd );
        Tff_Board::getInstance()->getPLI()->freeResult();
        Tff_Board::getInstance()->getPLI()->close();

        /**
         * @TODO A little notifyObserver action here? =D
         * Does anything really care if a Member updates itself?
         * Logging maybe?
         */
        return true;

    }

    /**
     * Incremends the current Thread's view count in memory and in the
     * persistence layer by the given number of views, default increment by 1.
     *
     * @throws Tff_BBException If persistence layer operation fails.
     */
    public function updateLastVisit()
    {

        $rightNow = Tff_BBUtil::getGmtTimestamp();

        $sqlCmd  = 'UPDATE ' . Tff_DS_PREFIX . 'member SET ';
        $sqlCmd .= 'member_last_visit = ' . $rightNow . ' ';
        $sqlCmd .= 'WHERE ( member_id = ' . $this->getId() . ' );';

        Tff_Board::getInstance()->getPLI()->query( $sqlCmd );

        $this->setLastVisit( $rightNow );

    }

    /**
     * Dumps out the name and value of each property, for debugging purposes.
     */
    public function debugDumpProperties()
    {

        $selfClass = new ReflectionClass( get_class( $this ) );

        $properties = "Current " . get_class( $this ) . " properties: \n";

        foreach ( $selfClass->getProperties() as $reflectedProperty )
        {

            if ( '_observable' == $reflectedProperty->getName() ||
                 '_pmManager'  == $reflectedProperty->getName() )
            {

                continue;

            }

            $property = preg_replace( "/(^_member)|(^_)/", '', $reflectedProperty->getName() );

            $getterMethod = 'get' . ucfirst( $property );

            $properties .= $property . ': ';

            /**
             * If the value is false, get the integer value so something printable will be returned!
             * @TODO Replace this dynamic method crap with Reflection?
             */
            if ( false === $this->$getterMethod() )
            {

                $properties .= intval( $this->$getterMethod() );

            }
            else
            {

                $properties .= $this->$getterMethod();

            }

            $properties .= "\n";

        }

        return $properties;

    }

}

/* EOF */

Initial URL


Initial Description


Initial Title
The Forum Framework

Initial Tags


Initial Language
PHP