Вход Регистрация
Файл: base-sys/base/bol/user_dao.php
Строк: 816
<?php

class BOL_UserDao extends PEEP_BaseDao
{
    const 
EMAIL 'email';
    const 
USERNAME 'username';
    const 
PASSWORD 'password';
    const 
JOIN_STAMP 'joinStamp';
    const 
ACTIVITY_STAMP 'activityStamp';
    const 
CACHE_TAG_ALL_USER_LIST 'base.all_user_list';
    const 
CACHE_TAG_FEATURED_LIST 'base.featured_list';
    const 
CACHE_TAG_LATEST_LIST 'base.latest_list';
    const 
CACHE_LIFE_TIME 86400//24 hour

    /**
     * Singleton instance.
     *
     * @var BOL_UserDao
     */
    
private static $classInstance;

    
/**
     * Returns an instance of class (singleton pattern implementation).
     *
     * @return BOL_UserDao
     */
    
public static function getInstance()
    {
        if ( 
self::$classInstance === null )
        {
            
self::$classInstance = new self();
        }

        return 
self::$classInstance;
    }

    
/**
     * Constructor.
     */
    
protected function __construct()
    {
        
parent::__construct();
    }

    
/**
     * @see PEEP_BaseDao::getDtoClassName()
     *
     */
    
public function getDtoClassName()
    {
        return 
'BOL_User';
    }

    
/**
     * @see PEEP_BaseDao::getTableName()
     *
     */
    
public function getTableName()
    {
        return 
PEEP_DB_PREFIX 'base_user';
    }

    public function 
getUserQueryFilter$tableAlias$keyField$params = array() )
    {
        
$event = new BASE_CLASS_QueryBuilderEvent("base.query.user_filter"$params);

        
$userTable "base_user_table_alias";
        
$event->addJoin("INNER JOIN `" $this->getTableName() . "` $userTable ON $userTable.`id` = `$tableAlias`.`$keyField`");

        
$suspendTable "base_user_suspend_table_alias";
        
$event->addJoin("LEFT JOIN `" BOL_UserSuspendDao::getInstance()->getTableName() . "` $suspendTable ON $suspendTable.`userId` = `$userTable`.`id`");
        
$event->addWhere("`$suspendTable`.`id` IS NULL");

        if ( 
PEEP::getConfig()->getValue('base''mandatory_user_approve') )
        {
            
$approveTable "base_user_approve_table_alias";
            
$event->addJoin("LEFT JOIN `" BOL_UserApproveDao::getInstance()->getTableName() . "` $approveTable ON $approveTable.`userId` = `$userTable`.`id`");
            
$event->addWhere("`$approveTable`.`id` IS NULL");
        }

        if ( 
PEEP::getConfig()->getValue('base''confirm_email') )
        {
            
$event->addWhere("`$userTable`.`emailVerify` = 1");
        }

        
PEEP::getEventManager()->trigger($event);

        return array(
            
"join" => $event->getJoin(),
            
"where" => $event->getWhere(),
            
"order" => $event->getOrder()
        );
    }

    
/**
     * Returns user for provided username/email.
     *
     * @param string $var
     * @param string $password
     * @return BOL_User
     */
    
public function findUserByUsernameOrEmail$var )
    {
        
$example = new PEEP_Example();
        
$example->andFieldEqual(self::USERNAMEtrim($var));

        
$result $this->findObjectByExample($example);

        if ( 
$result !== null )
        {
            return 
$result;
        }

        
$example = new PEEP_Example();
        
$example->andFieldEqual(self::EMAILtrim($var));

        
$result $this->findObjectByExample($example);

        return 
$result;
    }

    public function 
findByUserName$username )
    {
        
$ex = new PEEP_Example();
        
$ex->andFieldEqual('username'$username);

        return 
$this->findObjectByExample($ex);
    }

    public function 
findByUseEmail$email )
    {
        
$ex = new PEEP_Example();
        
$ex->andFieldEqual('email'$email);

        return 
$this->findObjectByExample($ex);
    }

    public function 
findList$first$count$admin false )
    {
        if ( 
$admin === true )
        {
            
$ex = new PEEP_Example();
            
$ex->setOrder('joinStamp DESC')
                ->
setLimitClause($first$count);

            return 
$this->findListByExample($ex);
        }

        
$queryParts $this->getUserQueryFilter("u""id", array(
            
"method" => "BOL_UserDao::findList"
        
));

        
$query "SELECT `u`.*
            FROM `
{$this->getTableName()}` as `u`
            
{$queryParts["join"]}

            WHERE 
{$queryParts["where"]}
            ORDER BY " 
. ( !empty($queryParts["order"]) ? $queryParts["order"] . ", " "" ) . " `u`.`joinStamp` DESC
            LIMIT ?,? "
;

        
$cacheLifeTime 0;
        
$tag = array();

        
// cached latest list query
        //TODO: create cache for other pages, now cached only first page.
        
if ( $first == )
        {
            
//TODO: Enable cache
            
$cacheLifeTime 0;
            
$tag = array(self::CACHE_TAG_LATEST_LISTself::CACHE_TAG_ALL_USER_LIST);
        }

        return 
$this->dbo->queryForObjectList($query$this->getDtoClassName(), array($first$count), $cacheLifeTime$tag);
    }

    public function 
findRecentlyActiveList$first$count$admin false )
    {
        
$queryParts $this->getUserQueryFilter("u""id", array(
            
"method" => "BOL_UserDao::findRecentlyActiveList"
        
));

        
$query "SELECT `u`.* FROM `{$this->getTableName()}` AS `u`"
            
. ( $admin === true 
                
"" 
                
{$queryParts["join"]} WHERE {$queryParts["where"]} "
            
) .
            
"ORDER BY `u`.`activityStamp` DESC" . ( !empty($queryParts["order"]) ? ", " $queryParts["order"] : "" ) . "
            LIMIT ?,?"
;

        return 
$this->dbo->queryForObjectList($query$this->getDtoClassName(), array($first$count));
    }

    public function 
getRecentlyActiveOrderedIdList$userIdList )
    {
        if ( empty(
$userIdList) )
        {
            return array();
        }

        
$query "SELECT `u`.id
            FROM `
{$this->getTableName()}` as `u`
            WHERE `u`.id IN ( " 
$this->dbo->mergeInClause($userIdList) . " )
            ORDER BY `u`.`activityStamp` DESC"
;

        return 
$this->dbo->queryForList($query);
    }

    public function 
count$isAdmin false )
    {
        
$cacheLifeTime 0;
        
$tag = array();

        if ( 
$isAdmin == true )
        {
            
$query "SELECT COUNT(*)
                FROM `
{$this->getTableName()}`";
        }
        else
        {
            
$queryParts $this->getUserQueryFilter("u""id", array(
                
"method" => "BOL_UserDao::count"
            
));

            
$query "SELECT COUNT(*) FROM `{$this->getTableName()}` as `u`
                
{$queryParts["join"]} WHERE {$queryParts["where"]}";

            
// cached latest list query count
            //TODO: create cache for other pages, now cached only first page.
            
$cacheLifeTime self::CACHE_LIFE_TIME;
            
$tag = array(self::CACHE_TAG_LATEST_LISTself::CACHE_TAG_ALL_USER_LIST);
        }

        return 
$this->dbo->queryForColumn($querynull$cacheLifeTime$tag);
    }

    public function 
findFeaturedList$first$count )
    {
        
$queryParts $this->getUserQueryFilter("u""id", array(
            
"method" => "BOL_UserDao::findFeaturedList"
        
));

        
$query "SELECT `u`.* FROM `{$this->getTableName()}` AS `u`
            
{$queryParts["join"]}
            INNER JOIN `" 
BOL_UserFeaturedDao::getInstance()->getTableName() . "` AS `f`
                ON( `u`.`id` = `f`.`userId` )
            WHERE 
{$queryParts["where"]}
            " 
. ( !empty($queryParts["order"]) ? " ORDER BY " $queryParts["order"] : "" ) . "
            LIMIT ?,?"
;

        
// cached featured list query
        
$cacheLifeTime 0;
        
$tag = array();

        
//TODO: create cache for other pages, now cached only first page.
        
if ( $first == )
        {
            
//TODO: Enable cache
            
$cacheLifeTime 0;
            
$tag = array(self::CACHE_TAG_FEATURED_LISTself::CACHE_TAG_ALL_USER_LIST);
        }

        return 
$this->dbo->queryForObjectList($query$this->getDtoClassName(), array($first$count), $cacheLifeTime$tag);
    }

    public function 
countFeatured()
    {
        
$queryParts $this->getUserQueryFilter("u""id", array(
            
"method" => "BOL_UserDao::countFeatured"
        
));

        
$query "SELECT COUNT(*) FROM `{$this->getTableName()}` AS `u`
            
{$queryParts["join"]}
            INNER JOIN `" 
BOL_UserFeaturedDao::getInstance()->getTableName() . "` AS `f`
                ON( `u`.`id` = `f`.`userId` )
            WHERE 
{$queryParts["where"]}";

        
// cached featured users count query
        
$cacheLifeTime self::CACHE_LIFE_TIME;
        
$tag = array(self::CACHE_TAG_FEATURED_LISTself::CACHE_TAG_ALL_USER_LIST);

        return 
$this->dbo->queryForColumn($querynull$cacheLifeTime$tag);
    }

    public function 
findOnlineList$first$count )
    {
        
$queryParts $this->getUserQueryFilter("u""id", array(
            
"method" => "BOL_UserDao::findOnlineList"
        
));

        
$query "SELECT `u`.* FROM `{$this->getTableName()}` AS `u`
            
{$queryParts["join"]}
            INNER JOIN `" 
BOL_UserOnlineDao::getInstance()->getTableName() . "` AS `o`
                ON(`u`.`id` = `o`.`userId`)
            WHERE 
{$queryParts["where"]}
            ORDER BY " 
. ( !empty($queryParts["order"]) ? $queryParts["order"] . ", " "" ) . " `o`.`activityStamp` DESC
            LIMIT ?, ?"
;

        return 
$this->dbo->queryForObjectList($query$this->getDtoClassName(), array($first$count));
    }

    public function 
countOnline()
    {
        
$queryParts $this->getUserQueryFilter("u""id", array(
            
"method" => "BOL_UserDao::countOnline"
        
));

        
$query "SELECT  COUNT(*) FROM `{$this->getTableName()}` AS `u`
            
{$queryParts["join"]}
            INNER JOIN `" 
BOL_UserOnlineDao::getInstance()->getTableName() . "` AS `o`
                ON(`u`.`id` = `o`.`userId`)
            WHERE 
{$queryParts["where"]}";

        return 
$this->dbo->queryForColumn($query);
    }

    public function 
findSuspendedList$first$count )
    {
        
$query "SELECT `u`.*
            FROM `
{$this->getTableName()}` as `u`
            LEFT JOIN `" 
BOL_UserSuspendDao::getInstance()->getTableName() . "` as `s`
                ON( `u`.`id` = `s`.`userId` )
            WHERE `s`.`id` IS NOT NULL
            ORDER BY `u`.`activityStamp` DESC
            LIMIT ?,?
        "
;

        return 
$this->dbo->queryForObjectList($query$this->getDtoClassName(), array($first$count));
    }

    public function 
countSuspended()
    {
        
$query "SELECT COUNT(*)
            FROM `
{$this->getTableName()}` as `u`
            LEFT JOIN `" 
BOL_UserSuspendDao::getInstance()->getTableName() . "` as `s`
                ON( `u`.`id` = `s`.`userId` )
            WHERE `s`.`id` IS NOT NULL
        "
;

        return 
$this->dbo->queryForColumn($query);
    }

    public function 
findUnverifiedList$first$count )
    {
        
$query "
            SELECT `u`.*
            FROM `
{$this->getTableName()}` AS `u`
            WHERE `u`.`emailVerify` = 0
            ORDER BY `u`.`activityStamp` DESC
            LIMIT ?, ?
        "
;

        return 
$this->dbo->queryForObjectList($query$this->getDtoClassName(), array($first$count));
    }

    public function 
countUnverified()
    {
        
$query "SELECT COUNT(*)
            FROM `
{$this->getTableName()}` as `u`
            WHERE `u`.`emailVerify` = 0
        "
;

        return 
$this->dbo->queryForColumn($query);
    }

    public function 
findUnapprovedList$first$count )
    {
        
$query "SELECT `u`.*
            FROM `
{$this->getTableName()}` as `u`
            LEFT JOIN `" 
BOL_UserApproveDao::getInstance()->getTableName() . "` as `d`
                ON( `u`.`id` = `d`.`userId` )
            WHERE `d`.`id` IS NOT NULL
            ORDER BY `u`.`activityStamp` DESC
            LIMIT ?,?
        "
;

        return 
$this->dbo->queryForObjectList($query$this->getDtoClassName(), array($first$count));
    }

    public function 
countUnapproved()
    {
        
$query "SELECT COUNT(*)
            FROM `
{$this->getTableName()}` as `u`
            LEFT JOIN `" 
BOL_UserApproveDao::getInstance()->getTableName() . "` as `d`
                ON( `u`.`id` = `d`.`userId` )
            WHERE `d`.`id` IS NOT NULL
        "
;

        return 
$this->dbo->queryForColumn($query);
    }

    public function 
replaceAccountTypeForUsers$oldType$newType )
    {
        
$sql "UPDATE `{$this->getTableName()}` SET `accountType`=? WHERE `accountType`=?";
        
$this->dbo->update($sql, array($newType$oldType));
    }

    public function 
findMassMailingUsers$start$count$ignoreUnsubscribe false$userRoles = array() )
    {
        
$join '';
        
$where '';

        
$queryParts $this->getUserQueryFilter("u""id", array(
            
"method" => "BOL_UserDao::findMassMailingUsers"
        
));

        if ( 
$ignoreUnsubscribe !== true )
        {
            
$join .= " LEFT JOIN `" . (BOL_PreferenceDataDao::getInstance()->getTableName()) . "` AS `preference`
                    ON (`u`.`id` = `preference`.`userId` AND `preference`.`key` = 'mass_mailing_subscribe') "
;
            
$where .= " AND  ( `preference`.`value` = 'true' OR `preference`.`id` IS NULL ) ";
        }

        if ( !empty(
$userRoles) && is_array($userRoles) )
        {
            
$join .= " INNER JOIN `" . (BOL_AuthorizationUserRoleDao::getInstance()->getTableName()) . "` AS `userRole`
                    ON (`u`.`id` = `userRole`.`userId`)
                    INNER JOIN `" 
. (BOL_AuthorizationRoleDao::getInstance()->getTableName()) . "` AS `role`
                        ON (`userRole`.`roleId` = `role`.`id`) "
;
            
$where .= " AND  ( `role`.`name` IN ( " PEEP::getDbo()->mergeInClause($userRoles) . " ) ) ";
        }

        
$query "
            SELECT  DISTINCT `u`.* FROM `
{$this->getTableName()}` AS `u`
                
{$queryParts["join"]}
                
{$join}
            WHERE 
{$queryParts["where"]} {$where}
            LIMIT :start, :count "
;

        return 
$this->dbo->queryForObjectList($query$this->getDtoClassName(), array('start' => (int) $start'count' => (int) $count));
    }

    public function 
findMassMailingUserCount$ignoreUnsubscribe false$userRoles = array() )
    {
        
$join '';
        
$where '';

        
$queryParts $this->getUserQueryFilter("u""id", array(
            
"method" => "BOL_UserDao::findMassMailingUserCount"
        
));

        if ( 
$ignoreUnsubscribe !== true )
        {
            
$join .= " LEFT JOIN `" . (BOL_PreferenceDataDao::getInstance()->getTableName()) . "` AS `preference`
                    ON (`u`.`id` = `preference`.`userId` AND `preference`.`key` = 'mass_mailing_subscribe') "
;
            
$where .= " AND  ( `preference`.`value` = 'true' OR `preference`.`id` IS NULL ) ";
        }

        if ( !empty(
$userRoles) && is_array($userRoles) )
        {
            
$join .= " INNER JOIN `" . (BOL_AuthorizationUserRoleDao::getInstance()->getTableName()) . "` AS `userRole`
                    ON (`u`.`id` = `userRole`.`userId`)
                    INNER JOIN `" 
. (BOL_AuthorizationRoleDao::getInstance()->getTableName()) . "` AS `role`
                        ON (`userRole`.`roleId` = `role`.`id`) "
;
            
$where .= " AND  ( `role`.`name` IN ( " PEEP::getDbo()->mergeInClause($userRoles) . " ) ) ";
        }

        
$query "
            SELECT  COUNT( DISTINCT `u`.`id`) FROM `
{$this->getTableName()}` AS `u`
                
{$queryParts["join"]}
                
{$join}
            WHERE 
{$queryParts["where"]}  {$where} ";

        return 
$this->dbo->queryForColumn($query);
    }

    public function 
updateEmail$userId$email )
    {
        
$userId = (int) $userId;
        
$email trim($email);

        
$sql " UPDATE `{$this->getTableName()}` SET email = ? WHERE id = ? LIMIT 1 ";
        
$this->dbo->update($sql, array($email$userId));
    }

    public function 
updatePassword$userId$password )
    {
        
$userId = (int) $userId;

        
$sql " UPDATE `{$this->getTableName()}` SET password = ? WHERE id = ? LIMIT 1 ";
        
$this->dbo->update($sql, array($password$userId));
    }

    public function 
findListByRoleId$roleId$first$count )
    {
        
$query "SELECT `u`.*
             FROM `
{$this->getTableName()}` as `u`

             INNER JOIN `" 
BOL_AuthorizationUserRoleDao::getInstance()->getTableName() . "` as `ur`
                 ON( `u`.`id` = `ur`.`userId` )
             WHERE `ur`.`roleId` = ?
             LIMIT ?, ?"
;

        return 
$this->dbo->queryForObjectList($query$this->getDtoClassName(), array($roleId$first$count));
    }

    public function 
countByRoleId$roleId )
    {
        
$query "SELECT COUNT(*)
             FROM `
{$this->getTableName()}` as `u`

             INNER JOIN `" 
BOL_AuthorizationUserRoleDao::getInstance()->getTableName() . "` as `ur`
                 ON( `u`.`id` = `ur`.`userId` )
             WHERE `ur`.`roleId` = ? "
;

        return 
$this->dbo->queryForColumn($query, array($roleId));
    }

    public function 
findListByEmailList$emailList )
    {
        
$ex = new PEEP_Example();
        
$ex->andFieldInArray('email'$emailList);

        return 
$this->findListByExample($ex);
    }

    public function 
findDisapprovedList$first$count )
    {
        
$q "SELECT `u`.* FROM `{$this->getTableName()}` as `u`
            INNER JOIN `" 
BOL_UserApproveDao::getInstance()->getTableName() . '` as `ud`
                ON(`u`.`id` = `ud`.`userId`)
            LIMIT ?, ?
            '
;

        return 
$this->dbo->queryForObjectList($q$this->getDtoClassName(), array((int) $first, (int) $count));
    }

    public function 
countDisapproved()
    {
        
$q "SELECT COUNT(*) FROM `{$this->getTableName()}` as `u`
            INNER JOIN `" 
BOL_UserApproveDao::getInstance()->getTableName() . '` as `ud`
                ON(`u`.`id` = `ud`.`userId`)
            '
;

        return (int) 
$this->dbo->queryForColumn($q);
    }

    public function 
findUnverifyStatusForUserList$idList )
    {
        
$query "SELECT `id` FROM `" $this->getTableName() . "`
            WHERE `emailVerify` = 0
            AND `id` IN (" 
$this->dbo->mergeInClause($idList) . ")";

        return 
$this->dbo->queryForColumnList($query);
    }

    public function 
findUserListByQuestionValues$questionValues$first$count$isAdmin false$aditionalParams = array() )
    {
        
$userIdList $this->findUserIdListByQuestionValues($questionValues$first$count$isAdmin$aditionalParams);

        if ( 
count($userIdList) === )
        {
            return array();
        }

        
$ex = new PEEP_Example();
        
$ex->andFieldInArray('id'$userIdList);

        return 
$this->findListByExample($ex);
    }

    public function 
countUsersByQuestionValues$questionValues$isAdmin false$aditionalParams = array() )
    {
        
$questionNameList array_keys($questionValues);

        
$questions BOL_QuestionService::getInstance()->findQuestionByNameList($questionNameList);

        
$prefix 'qd';
        
$counter 0;
        
$innerJoin '';
        
$where '';

        foreach ( 
$questions as $question )
        {
            if ( !empty(
$questionValues[$question->name]) && $question->name != 'password' )
            {
                if ( 
$question->base == )
                {
                    
$where .= ' AND `user`.`' $this->dbo->escapeString($question->name) . '` LIKE '' . $this->dbo->escapeString($questionValues[$question->name]) . '%'';
                }
                else
                {
                    
$params = array(
                        
'question' => $question,
                        
'value' => $questionValues[$question->name],
                        
'prefix' => $prefix $counter
                    
);

                    
$event = new BASE_CLASS_QueryBuilderEvent("base.question.search_sql"$params);

                    
PEEP::getEventManager()->trigger($event);

                    
$data $event->getData();

                    if ( !empty(
$data['join']) || !empty($data['where']) )
                    {
                        
$innerJoin .= $event->getJoin();
                        
$where .= ' AND ' $event->getWhere();
                    }
                    else
                    {
                        
$questionString $this->getQuestionWhereString($question$questionValues[$question->name], $prefix $counter);

                        if ( !empty(
$questionString) )
                        {
                            
$innerJoin .= " INNER JOIN `" BOL_QuestionDataDao::getInstance()->getTableName() . "` `" $prefix $counter "`
                                ON ( `user`.`id` = `" 
$prefix $counter "`.`userId` AND `" $prefix $counter "`.`questionName` = '" $this->dbo->escapeString($question->name) . "' AND " $questionString " ) ";
                        }
                    }
                }

                
$counter++;
            }
        }

        if ( !empty(
$aditionalParams['join']) )
        {
            
$innerJoin .= $aditionalParams['join'];
        }

        if ( !empty(
$aditionalParams['where']) )
        {
            
$where .= $aditionalParams['where'];
        }

        if ( !empty(
$questionValues['accountType']) )
        {
            
$where .= " AND `user`.`accountType` = '" $this->dbo->escapeString($questionValues['accountType']) . "' ";
        }

        
$queryParts $this->getUserQueryFilter("user""id", array(
            
"method" => "BOL_UserDao::countUsersByQuestionValues"
        
));

        
$query "SELECT DISTINCT COUNT(`user`.id) FROM `" $this->getTableName() . "` `user`
            " 
$innerJoin "
            
{$queryParts["join"]}

            WHERE 
{$queryParts["where"]} " $where;

        if ( 
$isAdmin === true )
        {
            
$query "SELECT DISTINCT COUNT(`user`.`id` ) FROM `" $this->getTableName() . "` `user`
                " 
$innerJoin "
                WHERE 1 " 
$where;
        }

        return 
$this->dbo->queryForColumn($query);
    }

    
/**
     * Returns user for provided username/email.
     *
     * @param array $questionValues
     * @param int $first
     * @param int $count
     * @param boolean $isAdmin
     * @param boolean $type
     *
     * @return BOL_User
     */
    
public function findUserIdListByQuestionValues$questionValues$first$count$isAdmin false$aditionalParams = array() )
    {
        
$questionNameList array_keys($questionValues);

        
$questions BOL_QuestionService::getInstance()->findQuestionByNameList($questionNameList);

        
$prefix 'qd';
        
$counter 0;
        
$innerJoin '';
        
$where '';

        foreach ( 
$questions as $question )
        {
            if ( !empty(
$questionValues[$question->name]) && $question->name != 'password' )
            {
                if ( 
$question->base == )
                {
                    
$where .= ' AND `user`.`' $this->dbo->escapeString($question->name) . '` LIKE '' . $this->dbo->escapeString($questionValues[$question->name]) . '%'';
                }
                else
                {
                    
$params = array(
                        
'question' => $question,
                        
'value' => $questionValues[$question->name],
                        
'prefix' => $prefix $counter
                    
);

                    
$event = new BASE_CLASS_QueryBuilderEvent("base.question.search_sql"$params);

                    
PEEP::getEventManager()->trigger($event);

                    
$data $event->getData();

                    if ( !empty(
$data['join']) || !empty($data['where']) )
                    {
                        
$innerJoin .= $event->getJoin();
                        
$where .= ' AND ' $event->getWhere();
                    }
                    else
                    {
                        
$questionString $this->getQuestionWhereString($question$questionValues[$question->name], $prefix $counter);
                        if ( !empty(
$questionString) )
                        {
                            
$innerJoin .= " INNER JOIN `" BOL_QuestionDataDao::getInstance()->getTableName() . "` `" $prefix $counter "`
                                ON ( `user`.`id` = `" 
$prefix $counter "`.`userId` AND `" $prefix $counter "`.`questionName` = '" $this->dbo->escapeString($question->name) . "' AND " $questionString " ) ";
                        }
                    }

                    
$counter++;
                }
            }
        }

        if ( !empty(
$aditionalParams['join']) )
        {
            
$innerJoin .= $aditionalParams['join'];
        }

        if ( !empty(
$aditionalParams['where']) )
        {
            
$where $aditionalParams['where'];
        }

        if ( !empty(
$questionValues['accountType']) )
        {
            
$where .= " AND `user`.`accountType` = '" $this->dbo->escapeString($questionValues['accountType']) . "' ";
        }

        
$queryParts $this->getUserQueryFilter("user""id", array(
            
"method" => "BOL_UserDao::findUserIdListByQuestionValues"
        
));

        
$order '`user`.`activityStamp` DESC';

        if ( !empty(
$aditionalParams['order']) )
        {
            
$order $aditionalParams['order'];
        }

        
$query "SELECT DISTINCT `user`.id, `user`.`activityStamp` FROM `" $this->getTableName() . "` `user`
                " 
$innerJoin "
                
{$queryParts["join"]}

                WHERE 
{$queryParts["where"]} " $where "
                ORDER BY " 
$order "
                LIMIT :first, :count "
;

        if ( 
$isAdmin === true )
        {
            
$query "SELECT DISTINCT `user`.id FROM `" $this->getTableName() . "` `user`
                " 
$innerJoin "
                WHERE 1 " 
$where "
                ORDER BY '.
$order.'
                LIMIT :first, :count "
;
        }
        
        return 
$this->dbo->queryForColumnList($queryarray_merge(array('first' => $first'count' => $count)));
    }

    public function 
findSearchResultList$listId$first$count )
    {
        
$userIdList BOL_SearchService::getInstance()->getUserIdList($listId$first$count);

        if ( empty(
$userIdList) )
        {
            return array();
        }

        
$queryParts $this->getUserQueryFilter("user""id", array(
            
"method" => "BOL_UserDao::findUserIdListByQuestionValues"
        
));

        
$sql "SELECT `user`.* FROM `" $this->getTableName() . "` `user`
            
{$queryParts["join"]}
            WHERE `user`.`id` IN (" 
$this->dbo->mergeInClause($userIdList) . ")
            ORDER BY " 
. (!empty($queryParts["order"]) ? $queryParts["order"] . ", " "" ) . " `user`.`activityStamp` DESC";

        return 
$this->dbo->queryForObjectList($sql$this->getDtoClassName());
    }

    private function 
getQuestionWhereStringBOL_Question $question$value$prefix '' )
    {
        
$result '';
        
$prefix $this->dbo->escapeString($prefix);

        
/* $event = new PEEP_Event('base.questions_get_search_sql', array(
          'presentation' => $question->presentation,
          'fieldName' => $question->name,
          'value' => $value,
          'tablePrefix' => $prefix,
          'questionDto' => $question
          ));

          PEEP::getEventManager()->trigger($event);

          $result = $event->getData();

          if ( !empty($result) )
          {
          return $result;
          } */

        
switch ( $question->presentation )
        {
            case 
BOL_QuestionService::QUESTION_PRESENTATION_URL :
            case 
BOL_QuestionService::QUESTION_PRESENTATION_TEXT :
            case 
BOL_QuestionService::QUESTION_PRESENTATION_TEXTAREA :
                
$result " LCASE(`" $prefix "`.`textValue`) LIKE '" $this->dbo->escapeString(strtolower($value)) . "%'";
                break;

            case 
BOL_QuestionService::QUESTION_PRESENTATION_CHECKBOX :
                
$result " `" $prefix "`.`intValue` = " . (boolean) $value;

                break;

            case 
BOL_QuestionService::QUESTION_PRESENTATION_RADIO :
            case 
BOL_QuestionService::QUESTION_PRESENTATION_SELECT :
                
                if ( !empty(
$value) )
                {
                    if ( 
is_array($value) )
                    {
                        
$result ' `' $this->dbo->escapeString($prefix) . '`.`intValue` IN ( ' $this->dbo->mergeInClause($value) . ') ';
                    }                    
                    else if ( (int) 
$value )
                    {
                        
$result ' `' $this->dbo->escapeString($prefix) . '`.`intValue` & '' . ((int)$value) . '' ';
                    }
                }

                break;
            case 
BOL_QuestionService::QUESTION_PRESENTATION_MULTICHECKBOX :
                
                if ( !empty ( 
$value ) )
                {
                    if ( 
is_array($value) )
                    {
                        
$result " `" $prefix "`.`intValue` & '" $this->dbo->escapeString(array_sum($value)) . "'";
                    }                    
                    else if ( (int) 
$value )
                    {
                        
$result " `" $prefix "`.`intValue` & '" . ((int) $value) . "'";
                    }
                }
                
                
                break;

            case 
BOL_QuestionService::QUESTION_PRESENTATION_BIRTHDATE :
            case 
BOL_QuestionService::QUESTION_PRESENTATION_AGE :

                if ( isset(
$value['from']) && isset($value['to']) )
                {
                    
$maxDate = ( date('Y') - (int) $value['from'] ) . '-12-31';
                    
$minDate = ( date('Y') - (int) $value['to'] ) . '-01-01';

                    
$result " `" $prefix "`.`dateValue` BETWEEN  '" $this->dbo->escapeString($minDate) . "' AND '" $this->dbo->escapeString($maxDate) . "'";
                }

                break;

            case 
BOL_QuestionService::QUESTION_PRESENTATION_DATE :

                
$dateFrom UTIL_DateTime::parseDate($value['from']);
                
$dateTo UTIL_DateTime::parseDate($value['to']);

                if ( isset(
$dateFrom) )
                {
                    if ( 
UTIL_Validator::isDateValid($dateFrom[UTIL_DateTime::PARSE_DATE_MONTH], $dateFrom[UTIL_DateTime::PARSE_DATE_DAY], $dateFrom[UTIL_DateTime::PARSE_DATE_YEAR]) )
                    {
                        
$valueFrom $dateFrom[UTIL_DateTime::PARSE_DATE_YEAR] . '-' $dateFrom[UTIL_DateTime::PARSE_DATE_MONTH] . '-' $dateFrom[UTIL_DateTime::PARSE_DATE_DAY];
                    }
                }

                if ( isset(
$dateTo) )
                {
                    if ( 
UTIL_Validator::isDateValid($dateTo[UTIL_DateTime::PARSE_DATE_MONTH], $dateTo[UTIL_DateTime::PARSE_DATE_DAY], $dateTo[UTIL_DateTime::PARSE_DATE_YEAR]) )
                    {
                        
$valueTo $dateTo[UTIL_DateTime::PARSE_DATE_YEAR] . '-' $dateTo[UTIL_DateTime::PARSE_DATE_MONTH] . '-' $dateTo[UTIL_DateTime::PARSE_DATE_DAY];
                    }
                }

                if ( isset(
$valueFrom) && isset($valueTo) )
                {
                    
$result " `" $prefix "`.`dateValue` BETWEEN  '" $valueFrom "' AND '" $valueTo "'";
                }

                break;
        }

        return 
$result;
    }

    public function 
findUserIdListByPreferenceValues$preferenceValues )
    {
        if ( empty(
$preferenceValues) || !is_array($preferenceValues) )
        {
            return array();
        }

        
$sqlList = array();

        foreach ( 
$preferenceValues as $key => $value )
        {
            
$sqlList[$key] = " SELECT d.userId FROM " . (BOL_PreferenceDao::getInstance()->getTableName()) . " p
                LEFT JOIN " 
. (BOL_PreferenceDataDao::getInstance()->getTableName()) . " d ON ( d.`key` = p.`key` )
                WHERE p.`key` = '" 
$this->dbo->escapeString($key) . "' AND ( d.value = '" $this->dbo->escapeString($value) . "' OR d.value IS NULL AND p.defaultValue = '" $this->dbo->escapeString($value) . "' ) ";

            if ( !empty(
$value) && is_array($value) )
            {
                
$sqlList[$key] = " SELECT d.userId FROM " . (BOL_PreferenceDao::getInstance()->getTableName()) . " p
                    LEFT JOIN " 
. (BOL_PreferenceDataDao::getInstance()->getTableName()) . " d ON ( d.`key` = p.`key` )
                    WHERE p.`key` = '" 
$this->dbo->escapeString($key) . "' AND ( d.value IN " $this->dbo->mergeInClause($value) . " OR d.value IS NULL AND p.defaultValue IN " $this->dbo->mergeInClause($value) . " ) ";
            }
        }

        
$sqlString '';

        
$queryNumber 0;

        foreach ( 
$sqlList as $sql )
        {
            if ( 
$queryNumber )
            {
                
$sqlString .= ' UNION ';
            }

            
$queryNumber++;
            
$sqlString .= $sql;
        }

        return 
$this->dbo->queryForColumnList($sqlString);
    }
    protected 
$cachedItems = array();

    public function 
findById$id$cacheLifeTime 0$tags = array() )
    {
        
$id intval($id);
        
        if ( empty(
$this->cachedItems[$id]) )
        {
            
$this->cachedItems[$id] = parent::findById($id$cacheLifeTime$tags);
        }

        return 
$this->cachedItems[$id];
    }
    
    public function 
findByIdWithoutCache$id )
    {
        
$id intval($id);
        
        return 
parent::findById($id);
    }

    public function 
findByIdList( array $idList$cacheLifeTime 0$tags = array() )
    {
        
$idList array_map('intval'$idList);

        
$idsToRequire = array();
        
$result = array();

        foreach ( 
$idList as $id )
        {
            if ( empty(
$this->cachedItems[$id]) )
            {
                
$idsToRequire[] = $id;
            }
            else
            {
                
$result[] = $this->cachedItems[$id];
            }
        }

        
$items = array();

        if ( !empty(
$idsToRequire) )
        {
            
$items parent::findByIdList($idsToRequire$cacheLifeTime$tags);
        }

        foreach ( 
$items as $item )
        {
            
$result[] = $item;
            
$this->cachedItems[(int) $item->getId()] = $item;
        }

        return 
$result;
    }

    public function 
findIdListByIdList( array $idList$cacheLifeTime 0$tags = array() )
    {
        
$idList array_map('intval'$idList);

        
$idsToRequire = array();
        
$result = array();

        foreach ( 
$idList as $id )
        {
            if ( empty(
$this->cachedIds[$id]) )
            {
                
$idsToRequire[] = $id;
            }
            else
            {
                
$result[] = $this->cachedIds[$id];
            }
        }

        
$items = array();

        if ( !empty(
$idsToRequire) )
        {
            
$example = new PEEP_Example();
            
$example->andFieldInArray('id'$idsToRequire);
            
$items parent::findIdListByExample($example);
        }

        foreach ( 
$items as $item )
        {
            
$result[] = $item;
            
$this->cachedIds[(int) $item] = (int)$item;
        }

        return 
$result;
    }
}
Онлайн: 0
Реклама